summaryrefslogtreecommitdiffstats
path: root/solenv
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:06:44 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:06:44 +0000
commited5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch)
tree7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /solenv
parentInitial commit. (diff)
downloadlibreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.tar.xz
libreoffice-ed5640d8b587fbcfed7dd7967f3de04b37a76f26.zip
Adding upstream version 4:7.4.7.upstream/4%7.4.7upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'solenv')
-rw-r--r--solenv/CompilerTest_compilerplugins_clang-c++03.mk20
-rw-r--r--solenv/CompilerTest_compilerplugins_clang.mk136
-rw-r--r--solenv/CustomTarget_gbuildtesttools.mk17
-rw-r--r--solenv/Executable_concat-deps.mk16
-rw-r--r--solenv/Executable_g++-wrapper.mk20
-rw-r--r--solenv/Executable_gbuildtojson.mk16
-rw-r--r--solenv/Executable_gcc-wrapper.mk20
-rw-r--r--solenv/Executable_lockfile.mk23
-rw-r--r--solenv/Makefile14
-rw-r--r--solenv/Module_solenv.mk51
-rw-r--r--solenv/PythonTest_solenv_python.mk18
-rw-r--r--solenv/README.md45
-rw-r--r--solenv/StaticLibrary_wrapper.mk16
-rwxr-xr-xsolenv/bin/add-modelines169
-rwxr-xr-xsolenv/bin/assemble-flatpak-appdata-step1.sh96
-rwxr-xr-xsolenv/bin/assemble-flatpak-appdata-step2.sh26
-rwxr-xr-xsolenv/bin/assemble-flatpak-desktop.sh42
-rwxr-xr-xsolenv/bin/assemble-flatpak.sh73
-rwxr-xr-xsolenv/bin/bin_library_info.sh188
-rwxr-xr-xsolenv/bin/call_installer.sh47
-rw-r--r--solenv/bin/clipatchconfig.pl122
-rw-r--r--solenv/bin/concat-deps.c1235
-rwxr-xr-xsolenv/bin/constructors.py27
-rwxr-xr-xsolenv/bin/create-ids18
-rwxr-xr-xsolenv/bin/create-tags47
-rw-r--r--solenv/bin/createcomponent.xslt87
-rw-r--r--solenv/bin/dbgsv.ini20
-rw-r--r--solenv/bin/desktop-translate.py167
-rw-r--r--solenv/bin/exectest.pl103
-rwxr-xr-xsolenv/bin/finish-gbuild-trace.py137
-rwxr-xr-xsolenv/bin/fix-includes.pl95
-rwxr-xr-xsolenv/bin/gdb-core-bt.sh51
-rw-r--r--solenv/bin/gdb_cxa-atexit_trace-stdout8
-rw-r--r--solenv/bin/gdbtrycatchtrace21
-rw-r--r--solenv/bin/gdbtrycatchtrace-stdout14
-rwxr-xr-xsolenv/bin/generate-flatpak-manifest.sh23
-rw-r--r--solenv/bin/generate-tokens.py80
-rw-r--r--solenv/bin/gentoken.py54
-rw-r--r--solenv/bin/getcompver.awk84
-rwxr-xr-xsolenv/bin/hrcex39
-rw-r--r--solenv/bin/id-lang.map114
-rw-r--r--solenv/bin/image-sort.py155
-rwxr-xr-xsolenv/bin/install-gdb-printers143
-rwxr-xr-xsolenv/bin/install-sh3
-rwxr-xr-xsolenv/bin/localestr20
-rw-r--r--solenv/bin/macosx-change-install-names.pl95
-rwxr-xr-xsolenv/bin/macosx-codesign-app-bundle135
-rw-r--r--solenv/bin/macosx_menubar_modification.xsl43
-rwxr-xr-xsolenv/bin/make-raspbian-root-tarball81
-rw-r--r--solenv/bin/make_installer.pl26
-rw-r--r--solenv/bin/mkdocs.Makefile46
-rwxr-xr-xsolenv/bin/mkdocs.sh281
-rwxr-xr-xsolenv/bin/mkdocs_portal.sh157
-rwxr-xr-xsolenv/bin/mkonedoc.sh45
-rw-r--r--solenv/bin/modules/RepositoryHelper.pm161
-rw-r--r--solenv/bin/modules/installer.pm1713
-rw-r--r--solenv/bin/modules/installer/control.pm474
-rw-r--r--solenv/bin/modules/installer/converter.pm187
-rw-r--r--solenv/bin/modules/installer/copyproject.pm105
-rw-r--r--solenv/bin/modules/installer/download.pm666
-rw-r--r--solenv/bin/modules/installer/environment.pm131
-rw-r--r--solenv/bin/modules/installer/epmfile.pm2669
-rw-r--r--solenv/bin/modules/installer/exiter.pm33
-rw-r--r--solenv/bin/modules/installer/filelists.pm154
-rw-r--r--solenv/bin/modules/installer/files.pm120
-rw-r--r--solenv/bin/modules/installer/globals.pm290
-rw-r--r--solenv/bin/modules/installer/helppack.pm530
-rw-r--r--solenv/bin/modules/installer/languagepack.pm509
-rw-r--r--solenv/bin/modules/installer/languages.pm142
-rw-r--r--solenv/bin/modules/installer/logger.pm256
-rw-r--r--solenv/bin/modules/installer/packagelist.pm840
-rw-r--r--solenv/bin/modules/installer/parameter.pm552
-rw-r--r--solenv/bin/modules/installer/pathanalyzer.pm66
-rw-r--r--solenv/bin/modules/installer/profiles.pm223
-rw-r--r--solenv/bin/modules/installer/remover.pm50
-rw-r--r--solenv/bin/modules/installer/scpzipfiles.pm143
-rw-r--r--solenv/bin/modules/installer/scriptitems.pm2404
-rw-r--r--solenv/bin/modules/installer/setupscript.pm486
-rw-r--r--solenv/bin/modules/installer/simplepackage.pm732
-rw-r--r--solenv/bin/modules/installer/strip.pm136
-rw-r--r--solenv/bin/modules/installer/systemactions.pm1329
-rw-r--r--solenv/bin/modules/installer/windows/admin.pm515
-rw-r--r--solenv/bin/modules/installer/windows/assembly.pm279
-rw-r--r--solenv/bin/modules/installer/windows/binary.pm67
-rw-r--r--solenv/bin/modules/installer/windows/component.pm505
-rw-r--r--solenv/bin/modules/installer/windows/createfolder.pm154
-rw-r--r--solenv/bin/modules/installer/windows/directory.pm634
-rw-r--r--solenv/bin/modules/installer/windows/feature.pm403
-rw-r--r--solenv/bin/modules/installer/windows/featurecomponent.pm165
-rw-r--r--solenv/bin/modules/installer/windows/file.pm1019
-rw-r--r--solenv/bin/modules/installer/windows/font.pm69
-rw-r--r--solenv/bin/modules/installer/windows/icon.pm68
-rw-r--r--solenv/bin/modules/installer/windows/idtglobal.pm1862
-rw-r--r--solenv/bin/modules/installer/windows/inifile.pm121
-rw-r--r--solenv/bin/modules/installer/windows/language.pm41
-rw-r--r--solenv/bin/modules/installer/windows/media.pm202
-rw-r--r--solenv/bin/modules/installer/windows/mergemodule.pm1703
-rw-r--r--solenv/bin/modules/installer/windows/msiglobal.pm1684
-rw-r--r--solenv/bin/modules/installer/windows/msishortcutproperty.pm143
-rw-r--r--solenv/bin/modules/installer/windows/msp.pm1264
-rw-r--r--solenv/bin/modules/installer/windows/property.pm566
-rw-r--r--solenv/bin/modules/installer/windows/registry.pm407
-rw-r--r--solenv/bin/modules/installer/windows/removefile.pm141
-rw-r--r--solenv/bin/modules/installer/windows/shortcut.pm659
-rw-r--r--solenv/bin/modules/installer/windows/strip.pm149
-rw-r--r--solenv/bin/modules/installer/windows/update.pm620
-rw-r--r--solenv/bin/modules/installer/windows/upgrade.pm80
-rw-r--r--solenv/bin/modules/installer/worker.pm921
-rw-r--r--solenv/bin/modules/installer/ziplist.pm828
-rw-r--r--solenv/bin/modules/par2script/check.pm337
-rw-r--r--solenv/bin/modules/par2script/converter.pm52
-rw-r--r--solenv/bin/modules/par2script/exiter.pm112
-rw-r--r--solenv/bin/modules/par2script/files.pm64
-rw-r--r--solenv/bin/modules/par2script/globals.pm67
-rw-r--r--solenv/bin/modules/par2script/module.pm255
-rw-r--r--solenv/bin/modules/par2script/parameter.pm145
-rw-r--r--solenv/bin/modules/par2script/remover.pm42
-rw-r--r--solenv/bin/modules/par2script/undefine.pm135
-rw-r--r--solenv/bin/modules/par2script/work.pm414
-rw-r--r--solenv/bin/modules/pre2par/directory.pm45
-rw-r--r--solenv/bin/modules/pre2par/exiter.pm61
-rw-r--r--solenv/bin/modules/pre2par/files.pm55
-rw-r--r--solenv/bin/modules/pre2par/globals.pm51
-rw-r--r--solenv/bin/modules/pre2par/language.pm135
-rw-r--r--solenv/bin/modules/pre2par/parameter.pm144
-rw-r--r--solenv/bin/modules/pre2par/pathanalyzer.pm67
-rw-r--r--solenv/bin/modules/pre2par/remover.pm34
-rw-r--r--solenv/bin/modules/pre2par/systemactions.pm81
-rw-r--r--solenv/bin/modules/pre2par/work.pm297
-rw-r--r--solenv/bin/modules/t/installer-packagelist.t40
-rw-r--r--solenv/bin/modules/t/installer-profiles.t43
-rw-r--r--solenv/bin/modules/t/installer-scpzipfiles.t54
-rw-r--r--solenv/bin/modules/t/installer-setupscript.t58
-rwxr-xr-xsolenv/bin/native-code.py981
-rwxr-xr-xsolenv/bin/ooinstall115
-rw-r--r--solenv/bin/optionalimplementations.xslt21
-rw-r--r--solenv/bin/pack_images.py612
-rw-r--r--solenv/bin/packcomponents.xslt45
-rw-r--r--solenv/bin/packregistry.xslt80
-rw-r--r--solenv/bin/par2script.pl106
-rw-r--r--solenv/bin/polib.py1868
-rw-r--r--solenv/bin/pre2par.pl62
-rwxr-xr-xsolenv/bin/run-configure9
-rwxr-xr-xsolenv/bin/uiex38
-rw-r--r--solenv/bin/uiimagelist.xsl36
-rwxr-xr-xsolenv/bin/version.py49
-rwxr-xr-xsolenv/bin/write_classpath.sh16
-rw-r--r--solenv/buck/build.defs51
-rw-r--r--solenv/clang-cl/config_global.h21
-rw-r--r--solenv/clang-format/ClangFormat.pm128
-rw-r--r--solenv/clang-format/README35
-rwxr-xr-xsolenv/clang-format/check-last-commit98
-rw-r--r--solenv/clang-format/excludelist16163
-rwxr-xr-xsolenv/clang-format/generate-style-excludelist31
-rwxr-xr-xsolenv/clang-format/reformat-formatted-files49
-rwxr-xr-xsolenv/clang-format/remove_not_existent_files_from_clang_excludelist37
-rw-r--r--solenv/doc/gbuild/doxygen.cfg1890
-rw-r--r--solenv/doc/gbuild/solenv/gbuild/executable.mk43
-rw-r--r--solenv/doc/gbuild/solenv/gbuild/gbuild.mk89
-rw-r--r--solenv/doc/gbuild/solenv/gbuild/helper.mk54
-rw-r--r--solenv/doc/gbuild/solenv/gbuild/library.mk59
-rw-r--r--solenv/doc/gbuild/solenv/gbuild/linktarget.mk144
-rw-r--r--solenv/doc/gbuild/solenv/gbuild/package.mk48
-rw-r--r--solenv/doc/gbuild/solenv/gbuild/sdi.mk41
-rw-r--r--solenv/doc/gbuild/solenv/gbuild/static_library.mk55
-rw-r--r--solenv/doc/gbuild/solenv/gbuild/types.mk162
-rw-r--r--solenv/flatpak-manifest.in728
-rw-r--r--solenv/gbuild/AllLangHelp.mk172
-rw-r--r--solenv/gbuild/AllLangMoTarget.mk100
-rw-r--r--solenv/gbuild/AllLangPackage.mk124
-rw-r--r--solenv/gbuild/AutoInstall.mk76
-rw-r--r--solenv/gbuild/CliAssembly.mk209
-rw-r--r--solenv/gbuild/CliLibrary.mk148
-rw-r--r--solenv/gbuild/CliNativeLibrary.mk111
-rw-r--r--solenv/gbuild/CliUnoApi.mk122
-rw-r--r--solenv/gbuild/CompilerTest.mk53
-rw-r--r--solenv/gbuild/ComponentTarget.mk109
-rw-r--r--solenv/gbuild/Conditions.mk39
-rw-r--r--solenv/gbuild/Configuration.mk456
-rw-r--r--solenv/gbuild/CppunitTest.mk495
-rw-r--r--solenv/gbuild/CustomTarget.mk136
-rw-r--r--solenv/gbuild/Deliver.mk69
-rw-r--r--solenv/gbuild/Dictionary.mk401
-rw-r--r--solenv/gbuild/Executable.mk173
-rw-r--r--solenv/gbuild/Extension.mk494
-rw-r--r--solenv/gbuild/ExtensionPackage.mk95
-rw-r--r--solenv/gbuild/ExternalExecutable.mk216
-rw-r--r--solenv/gbuild/ExternalPackage.mk207
-rw-r--r--solenv/gbuild/ExternalProject.mk238
-rw-r--r--solenv/gbuild/Gallery.mk183
-rw-r--r--solenv/gbuild/GeneratedPackage.mk106
-rw-r--r--solenv/gbuild/HelpTarget.mk836
-rw-r--r--solenv/gbuild/Helper.mk354
-rw-r--r--solenv/gbuild/InstallModule.mk88
-rw-r--r--solenv/gbuild/InstallModuleTarget.mk312
-rw-r--r--solenv/gbuild/InstallScript.mk84
-rw-r--r--solenv/gbuild/InternalUnoApi.mk82
-rw-r--r--solenv/gbuild/Jar.mk287
-rw-r--r--solenv/gbuild/JavaClassSet.mk195
-rw-r--r--solenv/gbuild/JunitTest.mk234
-rw-r--r--solenv/gbuild/Library.mk296
-rw-r--r--solenv/gbuild/LinkTarget.mk2264
-rw-r--r--solenv/gbuild/Module.mk495
-rw-r--r--solenv/gbuild/Output.mk157
-rw-r--r--solenv/gbuild/Package.mk227
-rw-r--r--solenv/gbuild/PackageSet.mk77
-rw-r--r--solenv/gbuild/Pagein.mk61
-rw-r--r--solenv/gbuild/Postprocess.mk56
-rw-r--r--solenv/gbuild/PrecompiledHeaders.mk184
-rw-r--r--solenv/gbuild/PythonTest.mk129
-rw-r--r--solenv/gbuild/Pyuno.mk79
-rw-r--r--solenv/gbuild/README17
-rw-r--r--solenv/gbuild/Rdb.mk75
-rw-r--r--solenv/gbuild/SdiTarget.mk83
-rw-r--r--solenv/gbuild/StaticLibrary.mk118
-rw-r--r--solenv/gbuild/TargetLocations.mk487
-rw-r--r--solenv/gbuild/Tempfile.mk45
-rw-r--r--solenv/gbuild/TestHelpers.mk47
-rw-r--r--solenv/gbuild/Trace.mk61
-rw-r--r--solenv/gbuild/UIConfig.mk358
-rw-r--r--solenv/gbuild/UITest.mk157
-rw-r--r--solenv/gbuild/UnoApi.mk104
-rw-r--r--solenv/gbuild/UnoApiTarget.mk250
-rw-r--r--solenv/gbuild/UnpackedTarball.mk455
-rw-r--r--solenv/gbuild/WinResTarget.mk123
-rw-r--r--solenv/gbuild/Zip.mk154
-rw-r--r--solenv/gbuild/empty.zipbin0 -> 22 bytes
-rw-r--r--solenv/gbuild/extensions/post_Counters.mk22
-rw-r--r--solenv/gbuild/extensions/post_Fuzzers.mk17
-rw-r--r--solenv/gbuild/extensions/post_GbuildToJson.mk202
-rw-r--r--solenv/gbuild/extensions/post_PackageInfo.mk116
-rw-r--r--solenv/gbuild/extensions/post_SpeedUpTargets.mk88
-rw-r--r--solenv/gbuild/extensions/pre_BuildTools.mk54
-rw-r--r--solenv/gbuild/extensions/pre_Counters.mk31
-rw-r--r--solenv/gbuild/extensions/pre_MergedLibsList.mk122
-rw-r--r--solenv/gbuild/gbuild.help.txt159
-rw-r--r--solenv/gbuild/gbuild.mk406
-rw-r--r--solenv/gbuild/gen-autoinstall.py98
-rw-r--r--solenv/gbuild/partial_build.mk46
-rw-r--r--solenv/gbuild/platform/ANDROID_AARCH64_GCC.mk17
-rw-r--r--solenv/gbuild/platform/ANDROID_ARM_GCC.mk17
-rw-r--r--solenv/gbuild/platform/ANDROID_INTEL_GCC.mk17
-rw-r--r--solenv/gbuild/platform/ANDROID_X86_64_GCC.mk15
-rw-r--r--solenv/gbuild/platform/DRAGONFLY_INTEL_GCC.mk18
-rw-r--r--solenv/gbuild/platform/DRAGONFLY_X86_64_GCC.mk16
-rw-r--r--solenv/gbuild/platform/DeclareDPIAware.manifest7
-rw-r--r--solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk95
-rw-r--r--solenv/gbuild/platform/FREEBSD_AARCH64_GCC.mk14
-rw-r--r--solenv/gbuild/platform/FREEBSD_INTEL_GCC.mk16
-rw-r--r--solenv/gbuild/platform/FREEBSD_POWERPC64_GCC.mk17
-rw-r--r--solenv/gbuild/platform/FREEBSD_POWERPC_GCC.mk16
-rw-r--r--solenv/gbuild/platform/FREEBSD_X86_64_GCC.mk14
-rw-r--r--solenv/gbuild/platform/HAIKU_INTEL_GCC.mk16
-rw-r--r--solenv/gbuild/platform/HAIKU_X86_64_GCC.mk14
-rw-r--r--solenv/gbuild/platform/LINUX_AARCH64_GCC.mk12
-rw-r--r--solenv/gbuild/platform/LINUX_ARM_GCC.mk16
-rw-r--r--solenv/gbuild/platform/LINUX_AXP_GCC.mk16
-rw-r--r--solenv/gbuild/platform/LINUX_GODSON64_GCC.mk16
-rw-r--r--solenv/gbuild/platform/LINUX_GODSON_GCC.mk16
-rw-r--r--solenv/gbuild/platform/LINUX_HPPA_GCC.mk14
-rw-r--r--solenv/gbuild/platform/LINUX_IA64_GCC.mk14
-rw-r--r--solenv/gbuild/platform/LINUX_INTEL_GCC.mk16
-rw-r--r--solenv/gbuild/platform/LINUX_M68K_GCC.mk15
-rw-r--r--solenv/gbuild/platform/LINUX_POWERPC64_GCC.mk15
-rw-r--r--solenv/gbuild/platform/LINUX_POWERPC_GCC.mk15
-rw-r--r--solenv/gbuild/platform/LINUX_S390X_GCC.mk14
-rw-r--r--solenv/gbuild/platform/LINUX_S390_GCC.mk14
-rw-r--r--solenv/gbuild/platform/LINUX_SPARC64_GCC.mk15
-rw-r--r--solenv/gbuild/platform/LINUX_SPARC_GCC.mk15
-rw-r--r--solenv/gbuild/platform/LINUX_X86_64_GCC.mk14
-rw-r--r--solenv/gbuild/platform/MACOSX_AARCH64_GCC.mk13
-rw-r--r--solenv/gbuild/platform/MACOSX_X86_64_GCC.mk13
-rw-r--r--solenv/gbuild/platform/NETBSD_INTEL_GCC.mk21
-rw-r--r--solenv/gbuild/platform/NETBSD_X86_64_GCC.mk20
-rw-r--r--solenv/gbuild/platform/OPENBSD_INTEL_GCC.mk17
-rw-r--r--solenv/gbuild/platform/OPENBSD_X86_64_GCC.mk16
-rw-r--r--solenv/gbuild/platform/SOLARIS_INTEL_GCC.mk14
-rw-r--r--solenv/gbuild/platform/SOLARIS_SPARC_GCC.mk16
-rw-r--r--solenv/gbuild/platform/WNT_AARCH64_MSC.mk26
-rw-r--r--solenv/gbuild/platform/WNT_INTEL_MSC.mk26
-rw-r--r--solenv/gbuild/platform/WNT_X86_64_MSC.mk26
-rw-r--r--solenv/gbuild/platform/android.mk129
-rw-r--r--solenv/gbuild/platform/com_GCC_class.mk255
-rw-r--r--solenv/gbuild/platform/com_GCC_defs.mk335
-rw-r--r--solenv/gbuild/platform/com_MSC_class.mk742
-rw-r--r--solenv/gbuild/platform/com_MSC_defs.mk352
-rwxr-xr-xsolenv/gbuild/platform/filter-creatingLibrary.awk46
-rwxr-xr-xsolenv/gbuild/platform/filter-showIncludes.awk99
-rwxr-xr-xsolenv/gbuild/platform/filter-sourceName.awk32
-rw-r--r--solenv/gbuild/platform/iOS.mk269
-rw-r--r--solenv/gbuild/platform/iOS_AARCH64_GCC.mk22
-rw-r--r--solenv/gbuild/platform/iOS_X86_64_GCC.mk22
-rw-r--r--solenv/gbuild/platform/linux.mk24
-rw-r--r--solenv/gbuild/platform/macosx.mk381
-rw-r--r--solenv/gbuild/platform/solaris.mk357
-rwxr-xr-xsolenv/gbuild/platform/unittest-failed-MACOSX.sh46
-rwxr-xr-xsolenv/gbuild/platform/unittest-failed-WNT.sh47
-rwxr-xr-xsolenv/gbuild/platform/unittest-failed-default.sh51
-rw-r--r--solenv/gbuild/platform/unxgcc.mk427
-rw-r--r--solenv/gbuild/platform/win_compatibility.manifest15
-rw-r--r--solenv/gbuild/platform/windows.mk60
-rw-r--r--solenv/gbuild/static.mk247
-rwxr-xr-xsolenv/gbuild/uitest-failed-default.sh45
-rw-r--r--solenv/gbuildtojson/gbuildtojson.cxx74
-rw-r--r--solenv/gcc-wrappers/g++.cxx29
-rw-r--r--solenv/gcc-wrappers/gcc.cxx29
-rw-r--r--solenv/gcc-wrappers/wrapper.cxx332
-rw-r--r--solenv/gcc-wrappers/wrapper.hxx28
-rw-r--r--solenv/gdb/autoload.template32
-rw-r--r--solenv/gdb/boost/__init__.py32
-rw-r--r--solenv/gdb/boost/lib/__init__.py0
-rw-r--r--solenv/gdb/boost/lib/unordered.py129
-rw-r--r--solenv/gdb/boost/optional.py56
-rw-r--r--solenv/gdb/boost/ptr_container.py248
-rw-r--r--solenv/gdb/boost/smart_ptr.py76
-rw-r--r--solenv/gdb/boost/unordered.py112
-rw-r--r--solenv/gdb/boost/util/__init__.py3
-rw-r--r--solenv/gdb/boost/util/compatibility.py32
-rw-r--r--solenv/gdb/boost/util/printing.py137
-rw-r--r--solenv/gdb/libreoffice/__init__.py10
-rw-r--r--solenv/gdb/libreoffice/basegfx.py196
-rw-r--r--solenv/gdb/libreoffice/cppu.py156
-rw-r--r--solenv/gdb/libreoffice/sal.py167
-rw-r--r--solenv/gdb/libreoffice/svl.py93
-rw-r--r--solenv/gdb/libreoffice/sw.py305
-rw-r--r--solenv/gdb/libreoffice/tl.py220
-rw-r--r--solenv/gdb/libreoffice/util/__init__.py11
-rw-r--r--solenv/gdb/libreoffice/util/compatibility.py20
-rw-r--r--solenv/gdb/libreoffice/util/printing.py125
-rw-r--r--solenv/gdb/libreoffice/util/string.py75
-rw-r--r--solenv/gdb/libreoffice/util/uno.py516
-rw-r--r--solenv/gdb/libreoffice/utl.py39
-rw-r--r--solenv/gdb/libreoffice/vcl.py123
-rw-r--r--solenv/gdb/libreoffice/writerfilter.py88
-rw-r--r--solenv/gdb/six.py980
-rw-r--r--solenv/inc/ant.properties29
-rw-r--r--solenv/inc/doxygen.cfg2402
-rw-r--r--solenv/inc/doxygen_doc.cfg2402
-rw-r--r--solenv/inc/doxygen_tag.cfg2402
-rw-r--r--solenv/inc/langlist.mk171
-rw-r--r--solenv/inc/mime.types216
-rw-r--r--solenv/lldb/libreoffice/LO.py106
-rw-r--r--solenv/lockfile/README6
-rw-r--r--solenv/lockfile/autoconf.h.in30
-rw-r--r--solenv/lockfile/dotlockfile.c457
-rw-r--r--solenv/lockfile/lockfile.c611
-rw-r--r--solenv/lockfile/lockfile.h72
-rw-r--r--solenv/lockfile/maillock.h1
-rw-r--r--solenv/maven/BUCK44
-rw-r--r--solenv/maven/README.md384
-rw-r--r--solenv/maven/VERSION7
-rwxr-xr-xsolenv/maven/mvn.py78
-rw-r--r--solenv/maven/package.defs28
-rw-r--r--solenv/qa/python/gbuildtojson.py157
-rw-r--r--solenv/qa/python/selftest/Executable_gbuildselftestexe.mk16
-rw-r--r--solenv/qa/python/selftest/Library_gbuildselftest.mk37
-rw-r--r--solenv/qa/python/selftest/Library_gbuildselftestdep.mk15
-rw-r--r--solenv/qa/python/selftest/Makefile21
-rw-r--r--solenv/qa/python/selftest/Module_selftest.mk18
-rw-r--r--solenv/qa/python/selftest/selftestdepobject.cxx0
-rw-r--r--solenv/qa/python/selftest/selftestexeobject.cxx1
-rw-r--r--solenv/qa/python/selftest/selftestobject.cxx0
-rw-r--r--solenv/sanitizers/ubsan-suppressions21
-rw-r--r--solenv/sanitizers/ui/cui.false4
-rw-r--r--solenv/sanitizers/ui/cui.suppr224
-rw-r--r--solenv/sanitizers/ui/dbaccess.suppr75
-rw-r--r--solenv/sanitizers/ui/desktop.suppr20
-rw-r--r--solenv/sanitizers/ui/filter.suppr25
-rw-r--r--solenv/sanitizers/ui/formula.suppr9
-rw-r--r--solenv/sanitizers/ui/fps.suppr4
-rw-r--r--solenv/sanitizers/ui/libreofficekit.suppr9
-rw-r--r--solenv/sanitizers/ui/modules/BasicIDE.suppr7
-rw-r--r--solenv/sanitizers/ui/modules/dbreport.suppr10
-rw-r--r--solenv/sanitizers/ui/modules/sabpilot.suppr18
-rw-r--r--solenv/sanitizers/ui/modules/sbibliography.suppr0
-rw-r--r--solenv/sanitizers/ui/modules/scalc.false66
-rw-r--r--solenv/sanitizers/ui/modules/scalc.suppr160
-rw-r--r--solenv/sanitizers/ui/modules/scanner.suppr5
-rw-r--r--solenv/sanitizers/ui/modules/schart.suppr50
-rw-r--r--solenv/sanitizers/ui/modules/sdraw.suppr8
-rw-r--r--solenv/sanitizers/ui/modules/simpress.suppr29
-rw-r--r--solenv/sanitizers/ui/modules/smath.suppr35
-rw-r--r--solenv/sanitizers/ui/modules/spropctrlr.suppr15
-rw-r--r--solenv/sanitizers/ui/modules/swriter.false14
-rw-r--r--solenv/sanitizers/ui/modules/swriter.suppr199
-rw-r--r--solenv/sanitizers/ui/sfx.suppr51
-rw-r--r--solenv/sanitizers/ui/svt.suppr40
-rw-r--r--solenv/sanitizers/ui/svx.false0
-rw-r--r--solenv/sanitizers/ui/svx.suppr86
-rw-r--r--solenv/sanitizers/ui/uui.suppr18
-rw-r--r--solenv/sanitizers/ui/vcl.suppr38
-rw-r--r--solenv/sanitizers/ui/xmlsec.suppr37
-rw-r--r--solenv/sanitizers/valgrind-suppressions39
-rw-r--r--solenv/vs/LibreOffice.natvis496
-rw-r--r--solenv/wsl/wsl-lo-helper.cpp246
395 files changed, 97874 insertions, 0 deletions
diff --git a/solenv/CompilerTest_compilerplugins_clang-c++03.mk b/solenv/CompilerTest_compilerplugins_clang-c++03.mk
new file mode 100644
index 000000000..8abe03220
--- /dev/null
+++ b/solenv/CompilerTest_compilerplugins_clang-c++03.mk
@@ -0,0 +1,20 @@
+# -*- 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_CompilerTest_CompilerTest,compilerplugins_clang-c++03))
+
+$(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang-c++03, \
+ compilerplugins/clang/test/stringview-c++03 \
+))
+
+$(eval $(call gb_CompilerTest_add_cxxflags,compilerplugins_clang-c++03,$(gb_CXX03FLAGS)))
+
+$(eval $(call gb_CompilerTest_set_external_code,compilerplugins_clang-c++03))
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/CompilerTest_compilerplugins_clang.mk b/solenv/CompilerTest_compilerplugins_clang.mk
new file mode 100644
index 000000000..1af3b951a
--- /dev/null
+++ b/solenv/CompilerTest_compilerplugins_clang.mk
@@ -0,0 +1,136 @@
+# -*- 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_CompilerTest_CompilerTest,compilerplugins_clang))
+
+$(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang, \
+ compilerplugins/clang/test/badstatics \
+ compilerplugins/clang/test/blockblock \
+ compilerplugins/clang/test/bufferadd \
+ compilerplugins/clang/test/buriedassign \
+ compilerplugins/clang/test/casttovoid \
+ compilerplugins/clang/test/classmemaccess \
+ compilerplugins/clang/test/collapseif \
+ compilerplugins/clang/test/commaoperator \
+ compilerplugins/clang/test/conditionalstring \
+ $(if $(filter-out WNT,$(OS)),compilerplugins/clang/test/constfields) \
+ compilerplugins/clang/test/constmethod \
+ compilerplugins/clang/test/constparams \
+ compilerplugins/clang/test/consttobool \
+ compilerplugins/clang/test/constvars \
+ compilerplugins/clang/test/convertlong \
+ compilerplugins/clang/test/cow_wrapper \
+ compilerplugins/clang/test/cppunitassertequals \
+ compilerplugins/clang/test/cstylecast \
+ compilerplugins/clang/test/datamembershadow \
+ compilerplugins/clang/test/dbgunhandledexception \
+ compilerplugins/clang/test/dodgyswitch \
+ compilerplugins/clang/test/doubleconvert \
+ compilerplugins/clang/test/elidestringvar \
+ compilerplugins/clang/test/emptyif \
+ compilerplugins/clang/test/expressionalwayszero \
+ compilerplugins/clang/test/external \
+ compilerplugins/clang/test/faileddyncast \
+ compilerplugins/clang/test/fakebool \
+ compilerplugins/clang/test/flatten \
+ compilerplugins/clang/test/fragiledestructor \
+ compilerplugins/clang/test/getstr \
+ compilerplugins/clang/test/implicitboolconversion \
+ compilerplugins/clang/test/indentation \
+ compilerplugins/clang/test/intvsfloat \
+ compilerplugins/clang/test/logexceptionnicely \
+ compilerplugins/clang/test/loopvartoosmall \
+ compilerplugins/clang/test/mapindex \
+ compilerplugins/clang/test/makeshared \
+ compilerplugins/clang/test/moveit \
+ compilerplugins/clang/test/moveparam \
+ compilerplugins/clang/test/namespaceindentation \
+ compilerplugins/clang/test/noexcept \
+ compilerplugins/clang/test/noexceptmove \
+ compilerplugins/clang/test/nullptr \
+ compilerplugins/clang/test/oncevar \
+ compilerplugins/clang/test/oslendian-1 \
+ compilerplugins/clang/test/oslendian-2 \
+ compilerplugins/clang/test/oslendian-3 \
+ compilerplugins/clang/test/overridevirtual \
+ compilerplugins/clang/test/passparamsbyref \
+ compilerplugins/clang/test/passstuffbyref \
+ compilerplugins/clang/test/pointerbool \
+ compilerplugins/clang/test/reducevarscope \
+ compilerplugins/clang/test/redundantcast \
+ compilerplugins/clang/test/redundantfcast \
+ compilerplugins/clang/test/redundantinline \
+ compilerplugins/clang/test/redundantpointerops \
+ compilerplugins/clang/test/redundantpreprocessor \
+ compilerplugins/clang/test/refcounting \
+ compilerplugins/clang/test/referencecasting \
+ compilerplugins/clang/test/returnconstval \
+ compilerplugins/clang/test/salcall \
+ compilerplugins/clang/test/sallogareas \
+ compilerplugins/clang/test/salunicodeliteral \
+ compilerplugins/clang/test/selfinit \
+ compilerplugins/clang/test/sequentialassign \
+ compilerplugins/clang/test/shouldreturnbool \
+ compilerplugins/clang/test/simplifyconstruct \
+ compilerplugins/clang/test/simplifydynamiccast \
+ compilerplugins/clang/test/simplifypointertobool \
+ compilerplugins/clang/test/singlevalfields \
+ compilerplugins/clang/test/staticconstfield \
+ compilerplugins/clang/test/staticdynamic \
+ compilerplugins/clang/test/staticvar \
+ compilerplugins/clang/test/stdfunction \
+ compilerplugins/clang/test/stringadd \
+ compilerplugins/clang/test/stringconcatauto \
+ compilerplugins/clang/test/stringconcatliterals \
+ compilerplugins/clang/test/stringconstant \
+ compilerplugins/clang/test/stringliteralvar \
+ compilerplugins/clang/test/stringliteraldefine \
+ compilerplugins/clang/test/stringloop \
+ compilerplugins/clang/test/stringstatic \
+ compilerplugins/clang/test/stringview \
+ compilerplugins/clang/test/stringviewdangle \
+ compilerplugins/clang/test/stringviewparam \
+ compilerplugins/clang/test/stringviewvar \
+ compilerplugins/clang/test/trivialconstructor \
+ compilerplugins/clang/test/trivialdestructor \
+ compilerplugins/clang/test/typedefparam \
+ compilerplugins/clang/test/typeidcomparison \
+ compilerplugins/clang/test/unnecessarycatchthrow \
+ compilerplugins/clang/test/unnecessaryoverride \
+ compilerplugins/clang/test/unnecessaryoverride-dtor \
+ compilerplugins/clang/test/unnecessaryparen \
+ compilerplugins/clang/test/unnecessarylocking \
+ compilerplugins/clang/test/unoany \
+ compilerplugins/clang/test/unoquery \
+ compilerplugins/clang/test/unreffun \
+ compilerplugins/clang/test/unsignedcompare \
+ compilerplugins/clang/test/unusedcapturedefault \
+ compilerplugins/clang/test/unusedenumconstants \
+ compilerplugins/clang/test/unusedfields \
+ compilerplugins/clang/test/unusedindex \
+ compilerplugins/clang/test/unusedmember \
+ compilerplugins/clang/test/unusedvariablecheck \
+ compilerplugins/clang/test/unusedvariablemore \
+ compilerplugins/clang/test/unusedvarsglobal \
+ compilerplugins/clang/test/useuniqueptr \
+ compilerplugins/clang/test/vclwidgets \
+ compilerplugins/clang/test/weakbase \
+ compilerplugins/clang/test/weakobject \
+ compilerplugins/clang/test/writeonlyvars \
+ compilerplugins/clang/test/xmlimport \
+))
+
+$(eval $(call gb_CompilerTest_use_externals,compilerplugins_clang, \
+ boost_headers \
+ cppunit \
+))
+
+$(eval $(call gb_CompilerTest_use_udk_api,compilerplugins_clang))
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/CustomTarget_gbuildtesttools.mk b/solenv/CustomTarget_gbuildtesttools.mk
new file mode 100644
index 000000000..1b3df0702
--- /dev/null
+++ b/solenv/CustomTarget_gbuildtesttools.mk
@@ -0,0 +1,17 @@
+# -*- 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,solenv/gbuildtesttools))
+
+$(call gb_CustomTarget_get_target,solenv/gbuildtesttools) :
+ echo -n "{ \"MAKE\": \"$(if $(filter WNT,$(OS)),$(shell cygpath -u $(MAKE)),$(MAKE))\"" > $@
+ echo -n ", \"BASH\": \"$(if $(filter WNT,$(OS)),$(shell cygpath -m `which bash`),bash)\"" >> $@
+ echo -n ", \"GBUILDTOJSON\": \"$(call gb_Executable_get_target,gbuildtojson)\" }" >> $@
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/Executable_concat-deps.mk b/solenv/Executable_concat-deps.mk
new file mode 100644
index 000000000..a69b75717
--- /dev/null
+++ b/solenv/Executable_concat-deps.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_Executable_Executable,concat-deps))
+
+$(eval $(call gb_Executable_add_cobjects,concat-deps,\
+ solenv/bin/concat-deps, $(gb_COMPILEROPTFLAGS) \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/Executable_g++-wrapper.mk b/solenv/Executable_g++-wrapper.mk
new file mode 100644
index 000000000..1c4eb8dae
--- /dev/null
+++ b/solenv/Executable_g++-wrapper.mk
@@ -0,0 +1,20 @@
+# -*- 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_Executable_Executable,g++-wrapper))
+
+$(eval $(call gb_Executable_add_exception_objects,g++-wrapper,\
+ solenv/gcc-wrappers/g++, $(gb_COMPILEROPTFLAGS) \
+))
+
+$(eval $(call gb_Executable_use_static_libraries,g++-wrapper,\
+ wrapper \
+))
+
+# vim:set noet sw=4 ts=4:
diff --git a/solenv/Executable_gbuildtojson.mk b/solenv/Executable_gbuildtojson.mk
new file mode 100644
index 000000000..bffc99049
--- /dev/null
+++ b/solenv/Executable_gbuildtojson.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_Executable_Executable,gbuildtojson))
+
+$(eval $(call gb_Executable_add_exception_objects,gbuildtojson,\
+ solenv/gbuildtojson/gbuildtojson, $(gb_COMPILEROPTFLAGS) \
+))
+
+# vim:set noet sw=4 ts=4:
diff --git a/solenv/Executable_gcc-wrapper.mk b/solenv/Executable_gcc-wrapper.mk
new file mode 100644
index 000000000..207e91584
--- /dev/null
+++ b/solenv/Executable_gcc-wrapper.mk
@@ -0,0 +1,20 @@
+# -*- 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_Executable_Executable,gcc-wrapper))
+
+$(eval $(call gb_Executable_add_exception_objects,gcc-wrapper,\
+ solenv/gcc-wrappers/gcc, $(gb_COMPILEROPTFLAGS) \
+))
+
+$(eval $(call gb_Executable_use_static_libraries,gcc-wrapper,\
+ wrapper \
+))
+
+# vim:set noet sw=4 ts=4:
diff --git a/solenv/Executable_lockfile.mk b/solenv/Executable_lockfile.mk
new file mode 100644
index 000000000..00f634c60
--- /dev/null
+++ b/solenv/Executable_lockfile.mk
@@ -0,0 +1,23 @@
+# -*- 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_Executable_Executable,lockfile))
+
+$(eval $(call gb_Executable_set_include,lockfile, \
+ -I$(SRCDIR)/solenv/lockfile \
+ -I$(BUILDDIR)/solenv/lockfile \
+))
+
+$(eval $(call gb_Executable_add_cobjects,lockfile, \
+ solenv/lockfile/dotlockfile \
+ solenv/lockfile/lockfile \
+ , $(gb_COMPILEROPTFLAGS) \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/Makefile b/solenv/Makefile
new file mode 100644
index 000000000..0997e6284
--- /dev/null
+++ b/solenv/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/solenv/Module_solenv.mk b/solenv/Module_solenv.mk
new file mode 100644
index 000000000..89e40c6d4
--- /dev/null
+++ b/solenv/Module_solenv.mk
@@ -0,0 +1,51 @@
+# -*- 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,solenv))
+
+$(eval $(call gb_Module_add_targets_for_build,solenv,\
+ Executable_concat-deps \
+ Executable_gbuildtojson \
+))
+
+ifeq (,$(LOCKFILE))
+$(eval $(call gb_Module_add_targets_for_build,solenv,\
+ $(call gb_CondExeLockfile,Executable_lockfile) \
+))
+endif
+
+ifeq ($(COM),MSC)
+$(eval $(call gb_Module_add_targets,solenv,\
+ StaticLibrary_wrapper \
+ Executable_gcc-wrapper \
+ Executable_g++-wrapper \
+))
+endif
+
+ifneq ($(DISABLE_PYTHON),TRUE)
+ifneq ($(OS),WNT) # disable on Windows for now, causes gerrit/jenkins failures
+ifneq ($(OS),MACOSX) # disable on macOS too, fails at least for me and would be pointless anyway surely
+$(eval $(call gb_Module_add_subsequentcheck_targets,solenv,\
+ CustomTarget_gbuildtesttools \
+ PythonTest_solenv_python \
+))
+endif
+endif
+endif
+
+ifneq ($(COMPILER_PLUGINS),)
+ifeq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(eval $(call gb_Module_add_check_targets,solenv, \
+ CompilerTest_compilerplugins_clang \
+ CompilerTest_compilerplugins_clang-c++03 \
+))
+endif
+endif
+
+# vim: set shiftwidth=4 tabstop=4 noexpandtab:
diff --git a/solenv/PythonTest_solenv_python.mk b/solenv/PythonTest_solenv_python.mk
new file mode 100644
index 000000000..27145a4e5
--- /dev/null
+++ b/solenv/PythonTest_solenv_python.mk
@@ -0,0 +1,18 @@
+# -*- 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_PythonTest_PythonTest,solenv_python))
+
+$(eval $(call gb_PythonTest_add_modules,solenv_python,$(SRCDIR)/solenv/qa/python,\
+ gbuildtojson \
+))
+
+$(call gb_PythonTest_get_target,solenv_python): $(call gb_CustomTarget_get_target,solenv/gbuildtesttools)
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/README.md b/solenv/README.md
new file mode 100644
index 000000000..98c92f5b9
--- /dev/null
+++ b/solenv/README.md
@@ -0,0 +1,45 @@
+# Tools and Makefile Fragments Necessary for Compilation
+
+This module contains many tools and makefile configuration pieces,
+critical for building LibreOffice:
+
+- `bin/`
+
+ - contains lots of tools used during the build:
+
+ - `concat-deps*`
+ these aggregate, and remove duplicates from module
+ dependencies, to accelerate build times.
+
+ - `make_installer.pl`
+ this script executes the compiled instructions from
+ the `scp2/` module to create an installer, and/or to
+ do a local install for the smoketest.
+
+- `gbuild/`
+
+ implementation of the LibreOffice build system
+ See `gbuild/README` for more info.
+
+- `gdb/`
+
+ lots of nice python helpers to make debugging -much- easier
+ that (eg.) print UCS2 strings as UTF-8 on the console to
+ help with debugging.
+
+- `inc/`
+
+ old `/` increasingly obsolete dmake setup and includes, we are
+ trying to entirely rid ourselves of this
+
+- `src/`
+
+ useful standard `/` re-usable component map files for components
+ which shouldn't export anything more than a few registration
+ symbols.
+
+- `flatpak-manifest.in`
+
+ This file is copied manually to https://github.com/flathub/org.libreoffice.LibreOffice/blob/master/org.libreoffice.LibreOffice.json
+ The `flatpak/build.sh` in the LO `dev-tools` repository is obsolete.
+
diff --git a/solenv/StaticLibrary_wrapper.mk b/solenv/StaticLibrary_wrapper.mk
new file mode 100644
index 000000000..403c66c68
--- /dev/null
+++ b/solenv/StaticLibrary_wrapper.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_StaticLibrary_StaticLibrary,wrapper))
+
+$(eval $(call gb_StaticLibrary_add_exception_objects,wrapper,\
+ solenv/gcc-wrappers/wrapper, $(gb_COMPILEROPTFLAGS) \
+))
+
+# vim:set noet sw=4 ts=4:
diff --git a/solenv/bin/add-modelines b/solenv/bin/add-modelines
new file mode 100755
index 000000000..a3f59fe8e
--- /dev/null
+++ b/solenv/bin/add-modelines
@@ -0,0 +1,169 @@
+#!/usr/bin/env bash
+#
+# 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/.
+#
+
+# add-modelines, a simple script to add comments to
+# the beginning and end of source files for LibreOffice devs
+
+# Blame goes to Jesse Adelman (at least at first)
+# someone AT boldandbusted dotty-dot com
+# http://www.boldandbusted.com/
+# (c) 2010 Bold and Busted LLC
+
+# NOTE: At present, this script only works for files with C-like comments.
+# NOTE: If you don't specify -p, the script will act on the current working directory.
+# NOTE: If no arguments are specified, the definitions below are in effect.
+
+# TO DO
+# - Deuglify?
+# - Make source file type agnostic modelines?
+# - Too many/too few comments?
+# - Handle top level source directories with whitespace names? (Do they exist?)
+
+# Turn off globbing, helps with SourceFiles
+set -f
+
+# POSIX
+set -o posix
+
+# Change these to taste
+FirstLine='/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */'
+LastLine='/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */'
+SourceFiles='*.cxx *.cpp *.hxx *.hpp *.c *.h *.m *.mm *.idl *.src *.hrc'
+
+# Set defaults (don't change these)
+ModelineReplace="false"
+
+# Functions
+
+function SetEnvironment()
+{
+ if [ -n "$(which tail)" ] && [ -n "$(which head)" ]; then
+ {
+ headCMD=$(which head)
+ tailCMD=$(which tail)
+ }
+ else
+ {
+ echo "Missing head or tail, exiting..."
+ exit 1
+ }
+ fi
+ if [ -n "$(which find)" ]; then
+ findCMD=$(which find)
+ else
+ {
+ echo "Missing find, exiting..."
+ exit 1
+ }
+ fi
+}
+
+function EditFile()
+{
+ local FileToEdit
+ local currentFirstLine
+ local currentLastLine
+
+ FileToEdit="$1"
+
+ currentFirstLine=$($headCMD -1 "$FileToEdit")
+ currentLastLine=$($tailCMD -1 "$FileToEdit")
+
+ case "$ModelineReplace" in
+ "true" )
+ if [ "${currentFirstLine:0:6}" = "${FirstLine:0:6}" ]; then
+ {
+ echo "$FirstLine" > "$FileToEdit".new
+ $tailCMD -n +2 "$FileToEdit" >> "$FileToEdit".new
+ }
+ fi
+ if [ -e "$FileToEdit.new" ]; then
+ {
+ echo "$LastLine" >> "$FileToEdit".new
+ }
+ fi
+ if [ "${currentLastLine:0:6}" = "${LastLine:0:6}" ]; then
+ {
+ $headCMD -n -1 "$FileToEdit" > "$FileToEdit".new
+ echo "$LastLine" >> "$FileToEdit".new
+ }
+ fi
+ mv "$FileToEdit".new "$FileToEdit"
+ echo "$FileToEdit updated" ;;
+ "false" )
+ if [ "${currentFirstLine:0:6}" != "${FirstLine:0:6}" ]; then
+ if [ "${currentLastLine:0:6}" != "${LastLine:0:6}" ]; then
+ {
+ echo "$FirstLine" > "$FileToEdit".new
+ cat "$FileToEdit" >> "$FileToEdit".new
+ if [ "x${currentLastLine}" != "x" ] ; then
+ echo "" >> "$FileToEdit".new
+ fi
+ echo "$LastLine" >> "$FileToEdit".new
+ mv "$FileToEdit".new "$FileToEdit"
+ echo "$FileToEdit updated"
+ }
+ fi
+ fi ;;
+ esac
+}
+
+function PrintUsage()
+{
+ echo "Usage: $0 [-z] [-s \"<sourcefile glob>\"] [-p <path to source>]"
+}
+
+# Main
+
+SetEnvironment
+
+# Get command line options
+
+while getopts "zs:p:" opt; do
+ case $opt in
+ z) ModelineReplace="true" ;;
+ s) SourceFiles="$OPTARG" ;;
+ p) findPath="$OPTARG" ;;
+ *) PrintUsage
+ exit 1 ;;
+ esac
+done
+
+if [ $OPTIND -gt 1 ]; then
+ shift $((OPTIND - 1))
+fi
+
+if [ $# -gt 1 ]; then
+{
+ PrintUsage
+ echo "Remember to quote the source file globs after -s"
+ exit 1
+}
+fi
+
+# Create GNU find expressions that traverse the filesystem once and only once
+if [ -z "$findPath" ]; then
+ findArgs='.'
+ else
+ findArgs="$findPath"
+fi
+
+for FileType in ${SourceFiles}; do
+ findArgs="$findArgs"' ( -iname '"$FileType"' -print -o -true ) -a '
+done
+
+# This gets rid of the final " -a " in the find argument list
+findArgs=(${findArgs:0:(${#findArgs}-3)})
+
+for file in $($findCMD "${findArgs[@]}"); do
+ EditFile "$file"
+ echo "Completed: " "$file"
+done
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/bin/assemble-flatpak-appdata-step1.sh b/solenv/bin/assemble-flatpak-appdata-step1.sh
new file mode 100755
index 000000000..4896cf3f2
--- /dev/null
+++ b/solenv/bin/assemble-flatpak-appdata-step1.sh
@@ -0,0 +1,96 @@
+#! /bin/bash
+#
+# 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/.
+#
+
+# Part of solenv/bin/assemble-flatpak.sh that is shared with a downstream mechanism of building a
+# Flatpak from a Fedora libreoffice.spec file.
+#
+# Arguments:
+# $1 pathname, ending in a slash, of the directory into which to put the target
+# org.libreoffice.LibreOffice.appdata.xml file
+# $2 "1" if a <releases> section shall be included in the target
+# org.libreoffice.LibreOffice.appdata.xml file, "0" if not
+
+set -e
+
+## org.libreoffice.LibreOffice.appdata.xml is manually derived from the various
+## inst/share/metainfo/libreoffice-*.appdata.xml (at least recent GNOME Software
+## doesn't show more than five screenshots anyway, so restrict to one each from
+## the five libreoffice-*.appdata.xml: Writer, Calc, Impress, Draw, Base):
+cat <<\EOF >"${1?}"org.libreoffice.LibreOffice.appdata.xml
+<?xml version="1.0" encoding="UTF-8"?>
+<component type="desktop">
+ <id>org.libreoffice.LibreOffice.desktop</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>MPL-2.0</project_license>
+ <name>LibreOffice</name>
+ <summary>The LibreOffice productivity suite</summary>
+ <description>
+ <p>LibreOffice is a powerful office suite. Its clean interface and
+ feature-rich tools help you unleash your creativity and enhance your
+ productivity. LibreOffice includes several applications that make it the most
+ powerful Free and Open Source office suite on the market: Writer (word
+ processing), Calc (spreadsheets), Impress (presentations), Draw (vector
+ graphics and flowcharts), Base (databases), and Math (formula editing).</p>
+ <p>LibreOffice supports opening and saving into a wide variety of formats, so
+ you can easily share documents with users of other popular office suites
+ without worrying about compatibility.</p>
+ </description>
+ <url type="homepage">http://www.libreoffice.org/discover/libreoffice/</url>
+ <url type="bugtracker">https://bugs.documentfoundation.org/</url>
+ <url type="donation">https://donate.libreoffice.org/</url>
+ <url type="faq">https://wiki.documentfoundation.org/Faq</url>
+ <url type="help">http://www.libreoffice.org/get-help/documentation/</url>
+ <url type="translate">https://wiki.documentfoundation.org/Translating_LibreOffice</url>
+ <screenshots>
+ <screenshot type="default">
+ <image>https://hub.libreoffice.org/screenshots/writer-01.png</image>
+ <caption><!-- Describe this screenshot in less than ~10 words --></caption>
+ </screenshot>
+ <screenshot>
+ <image>https://hub.libreoffice.org/screenshots/calc-02.png</image>
+ <caption><!-- Describe this screenshot in less than ~10 words --></caption>
+ </screenshot>
+ <screenshot>
+ <image>https://hub.libreoffice.org/screenshots/impress-01.png</image>
+ <caption><!-- Describe this screenshot in less than ~10 words --></caption>
+ </screenshot>
+ <screenshot>
+ <image>https://hub.libreoffice.org/screenshots/draw-02.png</image>
+ <caption><!-- Describe this screenshot in less than ~10 words --></caption>
+ </screenshot>
+ <screenshot>
+ <image>https://hub.libreoffice.org/screenshots/base-02.png</image>
+ <caption><!-- Describe this screenshot in less than ~10 words --></caption>
+ </screenshot>
+ </screenshots>
+ <developer_name>The Document Foundation</developer_name>
+ <update_contact>libreoffice_at_lists.freedesktop.org</update_contact>
+ <kudos>
+ <kudo>HiDpiIcon</kudo>
+ <kudo>HighContrast</kudo>
+ <kudo>ModernToolkit</kudo>
+ <kudo>UserDocs</kudo>
+ </kudos>
+ <content_rating type="oars-1.0"/>
+EOF
+
+if [ "${2?}" = 1 ]
+then
+ cat <<EOF >>"${1?}"org.libreoffice.LibreOffice.appdata.xml
+ <releases>
+ <release
+ version="${LIBO_VERSION_MAJOR?}.${LIBO_VERSION_MINOR?}.${LIBO_VERSION_MICRO?}.${LIBO_VERSION_PATCH?}"
+ date="$(date +%Y-%m-%d)"/>
+ </releases>
+EOF
+fi
+
+cat <<\EOF >>"${1?}"org.libreoffice.LibreOffice.appdata.xml
+</component>
+EOF
diff --git a/solenv/bin/assemble-flatpak-appdata-step2.sh b/solenv/bin/assemble-flatpak-appdata-step2.sh
new file mode 100755
index 000000000..4f06e6b19
--- /dev/null
+++ b/solenv/bin/assemble-flatpak-appdata-step2.sh
@@ -0,0 +1,26 @@
+#! /bin/bash
+#
+# 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/.
+#
+
+# Part of solenv/bin/assemble-flatpak.sh that is shared with a downstream mechanism of building a
+# Flatpak from a Fedora libreoffice.spec file.
+#
+# Arguments:
+# $1 pathname, ending in a slash, of the directory containing the source libreoffice-*.appdata.xml
+# files
+# $2 pathname, ending in a slash, of the directory containing the target
+# org.libreoffice.LibreOffice.appdata.xml file
+
+set -e
+
+# append the appdata for the different components
+for i in "${1?}"libreoffice-*.appdata.xml
+do
+ sed "1 d; s/<id>libreoffice-/<id>org.libreoffice.LibreOffice./" "$i" \
+ >>"${2?}"org.libreoffice.LibreOffice.appdata.xml
+done
diff --git a/solenv/bin/assemble-flatpak-desktop.sh b/solenv/bin/assemble-flatpak-desktop.sh
new file mode 100755
index 000000000..6d06de4fb
--- /dev/null
+++ b/solenv/bin/assemble-flatpak-desktop.sh
@@ -0,0 +1,42 @@
+#! /bin/bash
+#
+# 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/.
+#
+
+# Part of solenv/bin/assemble-flatpak.sh that is shared with a downstream mechanism of building a
+# Flatpak from a Fedora libreoffice.spec file.
+#
+# Arguments:
+# $1 pathname, ending in a slash, of the directory containing the source libreoffice-*.desktop
+# files
+# $2 pathname, ending in a slash, of the directory into which to put the target
+# org.libreoffice.LibreOffice.*.desktop files
+
+set -e
+
+## libreoffice-*.desktop -> org.libreoffice.LibreOffice.*.desktop:
+for i in "${1?}"libreoffice-*.desktop
+do
+ sed -e 's/^Icon=libreoffice-/Icon=org.libreoffice.LibreOffice./' "$i" \
+ >"${2?}"org.libreoffice.LibreOffice."${i#"${1?}"libreoffice-}"
+done
+mv "${2?}"org.libreoffice.LibreOffice.startcenter.desktop "${2?}"org.libreoffice.LibreOffice.desktop
+
+# Flatpak .desktop exports take precedence over system ones due to
+# the order of XDG_DATA_DIRS - re-associating text/plain seems a bit much
+sed -i "s/text\/plain;//" "${2?}"org.libreoffice.LibreOffice.writer.desktop
+
+desktop-file-edit --set-key=X-Endless-Alias --set-value=libreoffice-startcenter \
+ --set-key=X-Flatpak-RenamedFrom --set-value='libreoffice-startcenter.desktop;' \
+ "${2?}"org.libreoffice.LibreOffice.desktop
+for i in base calc draw impress math writer xsltfilter
+do
+ desktop-file-edit --set-key=X-Endless-Alias --set-value=libreoffice-"$i" \
+ --set-key=X-Flatpak-RenamedFrom \
+ --set-value="libreoffice-$i.desktop;org.libreoffice.LibreOffice-$i.desktop;" \
+ "${2?}"org.libreoffice.LibreOffice."$i".desktop
+done
diff --git a/solenv/bin/assemble-flatpak.sh b/solenv/bin/assemble-flatpak.sh
new file mode 100755
index 000000000..9991a0d0d
--- /dev/null
+++ b/solenv/bin/assemble-flatpak.sh
@@ -0,0 +1,73 @@
+#! /bin/bash
+#
+# 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/.
+#
+
+# Assemble Flatpak app files and metadata under /app/, copying from the
+# installation tree generated by 'make distro-pack-install' (at
+# $PREFIXDIR):
+
+set -e
+
+cp -r "${PREFIXDIR?}"/lib/libreoffice /app/
+ln -s /app/libreoffice/program/soffice /app/bin/libreoffice
+
+mkdir -p /app/share/applications
+"${SRCDIR?}"/solenv/bin/assemble-flatpak-desktop.sh "${PREFIXDIR?}"/share/applications/ \
+ /app/share/applications/
+
+## icons/hicolor/*/apps/libreoffice-* ->
+## icons/hicolor/*/apps/org.libreoffice.LibreOffice-*:
+mkdir -p /app/share/icons
+for i in "${PREFIXDIR?}"/share/icons/hicolor/*/apps/libreoffice-*
+do
+ mkdir -p \
+ "$(dirname /app/share/icons/hicolor/"${i#"${PREFIXDIR?}"/share/icons/hicolor/}")"
+ cp -a "$i" \
+ "$(dirname /app/share/icons/hicolor/"${i#"${PREFIXDIR?}"/share/icons/hicolor/}")"/"$(basename "$i")"
+ cp -a "$i" \
+ "$(dirname /app/share/icons/hicolor/"${i#"${PREFIXDIR?}"/share/icons/hicolor/}")"/org.libreoffice.LibreOffice."${i##*/apps/libreoffice-}"
+done
+
+mkdir -p /app/share/runtime/locale
+for i in $(ls /app/libreoffice/program/resource)
+do
+ lang="${i%[_@]*}"
+ mkdir -p /app/share/runtime/locale/"${lang}"/resource
+ mv /app/libreoffice/program/resource/"${i}" /app/share/runtime/locale/"${lang}"/resource
+ ln -s ../../../share/runtime/locale/"${lang}"/resource/"${i}" /app/libreoffice/program/resource
+done
+
+for i in /app/libreoffice/share/registry/Langpack-*.xcd /app/libreoffice/share/registry/res/{fcfg_langpack,registry}_*.xcd
+do
+ basename="$(basename "${i}" .xcd)"
+ lang="${basename#Langpack-}"
+ lang="${lang#fcfg_langpack_}"
+ lang="${lang#registry_}"
+
+ # ship the base app with at least one Langpack/fcfg_langpack
+ if [ "${lang}" = "en-US" ]
+ then
+ continue
+ fi
+
+ lang="${lang%-*}"
+ mkdir -p /app/share/runtime/locale/"${lang}"/registry
+ mv "${i}" /app/share/runtime/locale/"${lang}"/registry
+ ln -rs /app/share/runtime/locale/"${lang}"/registry/"${basename}".xcd "${i}"
+done
+
+mkdir -p /app/share/appdata
+"${SRCDIR?}"/solenv/bin/assemble-flatpak-appdata-step1.sh /app/share/appdata/ 1
+"${SRCDIR?}"/solenv/bin/assemble-flatpak-appdata-step2.sh "${PREFIXDIR?}"/share/metainfo/ \
+ /app/share/appdata/
+
+## see <https://github.com/flatpak/flatpak/blob/master/app/
+## flatpak-builtins-build-finish.c> for further places where build-finish would
+## look for data:
+## cp ... /app/share/dbus-1/services/
+## cp ... /app/share/gnome-shell/search-providers/
diff --git a/solenv/bin/bin_library_info.sh b/solenv/bin/bin_library_info.sh
new file mode 100755
index 000000000..fcd68c0e8
--- /dev/null
+++ b/solenv/bin/bin_library_info.sh
@@ -0,0 +1,188 @@
+#!/usr/bin/env bash
+#
+# Copyright (C) 2013 Norbert Thiebaud
+# License: GPLv3
+#
+
+do_help()
+{
+cat <<EOF
+bin_library_info.sh is a tool that create a unique filename for a binary tar file that
+contain the build of the given source tarfile. the unicity is based on the source tarfile which contains
+a md5 already and the calculated sha1 of config_host_.mk and of the tree object associated with the top_level_module
+in git.
+
+syntax: bin_library_info.sh -m|--module <top_level_module> -l|--location <TARFILE_LOCATION> -s|--srcdir <SRCDIR> -b <BUILDDIR> -r|--tarfile <LIBRARY_TARFILE> [ -m|--mode verify|name ]
+
+the default mode is 'name' which just print the associated binary tarfile name.
+in 'verify' mode the program print the name if the associated binary tarfile exist
+and print nothing and return an error code if the file does not exist
+
+Note: --location --builddir and --srcdir are optional if they are already in the env in the form of TARFILE_LOCATION and BUILDDIR SRCDIR respectively
+EOF
+
+exit 0;
+}
+
+die()
+{
+ [ "$V" ] && echo "Error:" "$@"
+ exit -1;
+}
+
+
+get_config_sha()
+{
+ pushd "${SRCDIR?}" > /dev/null
+ git hash-object "${BUILDDIR?}"/config_host.mk
+ popd > /dev/null
+}
+
+get_library_gbuild_sha()
+{
+ local module="$1"
+
+ pushd "${SRCDIR?}" > /dev/null
+ if [ -d "${SRCDIR}/external/${module?}" ] ; then
+ git ls-tree -d HEAD "external/${module?}" | cut -f 1 | cut -d " " -f 3
+ else
+ git ls-tree -d HEAD | "{module?}" | cut -f 1 | cut -d " " -f 3
+ fi
+ popd > /dev/null
+}
+
+
+determine_binary_package_name()
+{
+ local module="$1"
+ local tarball="$2"
+ local csha=""
+ local gsha=""
+ local binfile=""
+
+ csha=$(get_config_sha)
+ gsha=$(get_library_gbuild_sha "${module?}")
+ if [ -n "${csha?}" -a -n "${gsha}" ] ; then
+ binfile="${csha?}_${gsha?}_${tarball?}.${PLATFORM?}.tar.gz"
+ fi
+ echo "${binfile}"
+
+}
+
+MODULE=""
+SOURCE_TARFILE=""
+MODE="name"
+V=1
+
+while [ "${1}" != "" ]; do
+ parm=${1%%=*}
+ arg=${1#*=}
+ has_arg=
+ if [ "${1}" != "${parm?}" ] ; then
+ has_arg=1
+ else
+ arg=""
+ fi
+
+ case "${parm}" in
+ -h|--help) # display help
+ do_help
+ exit
+ ;;
+ -b|--builddir)
+ if [ -z "${has_arg}" ] ; then
+ shift;
+ arg="$1"
+ fi
+ BUILDDIR="${arg}"
+ ;;
+ -o|--module)
+ if [ -z "${has_arg}" ] ; then
+ shift;
+ arg="$1"
+ fi
+ MODULE="${arg}"
+ ;;
+
+ -l|--location)
+ if [ -z "${has_arg}" ] ; then
+ shift;
+ arg="$1"
+ fi
+ TARFILE_LOCATION="${arg}"
+ ;;
+ -m|--mode)
+ # test if the binary package exist
+ if [ -z "${has_arg}" ] ; then
+ shift;
+ arg="$1"
+ fi
+ MODE="$arg"
+ ;;
+ -p|--platform)
+ # test if the binary package exist
+ if [ -z "${has_arg}" ] ; then
+ shift;
+ arg="$1"
+ fi
+ PLATFORM="$arg"
+ ;;
+ -q)
+ V=0
+ ;;
+ -s|--srcdir) # do not override the local autogen.lastrun if present
+ if [ -z "${has_arg}" ] ; then
+ shift;
+ arg="$1"
+ fi
+ SRCDIR="${arg}"
+ ;;
+
+ -t|--tarfile)
+ if [ -z "${has_arg}" ] ; then
+ shift;
+ arg="$1"
+ fi
+ SOURCE_TARFILE="${arg}"
+ ;;
+ -*)
+ die "Invalid option $1"
+ ;;
+ *)
+ die "Invalid argument $1"
+ ;;
+ esac
+ shift
+done
+
+if [ -z "${MODULE?}" ] ; then
+ die "Missing --module"
+fi
+if [ -z "${TARFILE_LOCATION}" ] ; then
+ die "Missing --location"
+fi
+if [ -z "${SOURCE_TARFILE}" ] ; then
+ die "Missing --tarfile"
+fi
+if [ -z "${SRCDIR}" ] ; then
+ die "Missing --srcdir"
+fi
+
+
+BINARY_TARFILE="$(determine_binary_package_name ${MODULE?} ${SOURCE_TARFILE?})"
+
+if [ -z "${BINARY_TARFILE}" ] ; then
+ exit 2
+fi
+
+if [ "${MODE?}" = "verify" ] ; then
+ if [ -f "${TARFILE_LOCATION?}/${BINARY_TARFILE?}" ] ; then
+ echo "${BINARY_TARFILE?}"
+ else
+ exit 1
+ fi
+else
+ echo "${BINARY_TARFILE?}"
+fi
+
+exit 0
diff --git a/solenv/bin/call_installer.sh b/solenv/bin/call_installer.sh
new file mode 100755
index 000000000..8b8032f7f
--- /dev/null
+++ b/solenv/bin/call_installer.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+# unpack parameters
+VERBOSITY=$1; shift
+MSITEMPL=$(echo "$@" | cut -d ':' -f 1)
+LANG=$(echo "$@" | cut -d ':' -f 2)
+PRODNAME=$(echo "$@" | cut -d ':' -f 3)
+EXTENSION=$(echo "$@" | cut -d ':' -f 4)
+PKGFORMAT=$(echo "$@" | cut -d ':' -f 5)
+STRIP=$(echo "$@" | cut -d ':' -f 6)
+
+# need to hack buildid?
+if [ "${PKGFORMAT}${LIBO_VERSION_PATCH}" = "deb0" ] || \
+ [ "${PKGFORMAT}${LIBO_VERSION_PATCH}" = "rpm0" ] ; then
+ LIBO_VERSION_PATCH=1
+fi
+
+# switch to verbose?
+if [ "${VERBOSITY}" = "-verbose" ] ; then
+ set -x
+fi
+
+# add extra params for Windows
+EXTRA_PARAMS=
+if [ "${OS}" = "WNT" ] && [ -n "${MSITEMPL}" ]; then
+ EXTRA_PARAMS="${EXTRA_PARAMS} -msitemplate ${WORKDIR}/CustomTarget/instsetoo_native/install/msi_templates/${MSITEMPL}"
+ EXTRA_PARAMS="${EXTRA_PARAMS} -msilanguage ${WORKDIR}/CustomTarget/instsetoo_native/install/win_ulffiles"
+fi
+
+# need to strip?
+if [ "${STRIP}" = "strip" ] ; then
+ export ENABLE_STRIP=1
+fi
+
+# shellcheck disable=SC2086
+# shellcheck disable=SC2154
+${PERL} -w "${SRCDIR}"/solenv/bin/make_installer.pl \
+ -f "${BUILDDIR}"/instsetoo_native/util/openoffice.lst \
+ -l "${LANG}" \
+ -p "${PRODUCTNAME_WITHOUT_SPACES}${PRODNAME}" \
+ -u "${instsetoo_OUT}" \
+ -packer "${COMPRESSIONTOOL}" \
+ -buildid "${LIBO_VERSION_PATCH}" \
+ ${EXTRA_PARAMS:+$EXTRA_PARAMS} \
+ ${EXTENSION:+"$EXTENSION"} \
+ -format "${PKGFORMAT}" \
+ "${VERBOSITY}"
diff --git a/solenv/bin/clipatchconfig.pl b/solenv/bin/clipatchconfig.pl
new file mode 100644
index 000000000..389fffc5c
--- /dev/null
+++ b/solenv/bin/clipatchconfig.pl
@@ -0,0 +1,122 @@
+#
+# 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 warnings;
+use strict;
+
+sub trim;
+sub readRedirectionValues($);
+
+my $usage =
+ "Usage is: \n clipatchconfig.pl configTemplate redirections policyConfig
+
+ configTemplate: The config file which is used for the policy assembly. It
+ contains place holders for the binding redirection.
+
+ redirections: file containing the values for oldVersion and newVersion tags
+ which are used in the BindingRedirect element of the config files.
+
+ policyConfig: Name of the file in which we want to write the config file.
+";
+
+
+if (scalar @ARGV < 3) {
+ print $usage;
+ exit -1;
+}
+
+
+my %redirectionValue = readRedirectionValues($ARGV[1]);
+
+
+#Read config file in which we will replace the versions
+$/ = undef;
+open TEMPLATE, $ARGV[0] or die $!;
+my $templ = <TEMPLATE>;
+
+#Open the config file we are goint to write to
+open CONFIG, "> $ARGV[2]" or die "Cannot write to $ARGV[2] $!";
+
+#No substitute the place holders for oldVersion and new Version in the config template with
+#the values obtained from the redirections file
+for (keys %redirectionValue) {
+ $templ=~ s/\b$_\b/$redirectionValue{$_}/;
+}
+#Write the config file
+print CONFIG $templ;
+
+#Reads the key value pairs from the files, which name must be passed in
+#the parameter. The file contains lines of the form name=value, for example
+#CLI_URETYPES_OLD_VERSION=1.1.0.0-1.1.1.0
+sub readRedirectionValues($)
+{
+ #Read in the values for the version redirection
+ open REDIR, $_[0] or die $!;
+
+ my %redirectionValues;
+
+ while (<REDIR>)
+ {
+ chomp;
+ my $trimmed;
+ #Skip empty lines
+ if (length($trimmed = trim($_)) == 0) {
+ next;
+ }
+
+ #Skip comment symbol: #
+ if ($trimmed =~ /^#/) {
+ next;
+ }
+
+ my @lineParts = split /=/,$_;
+
+ #Check if we have valid name value pairs.
+ if (scalar @lineParts != 2) {
+ print "Error: Values in $ARGV[1] are not correct (Entries must have the form name=value). Invalid line: \n$_\n";
+ exit -1;
+ }
+
+ #Trim the strings and check if they still contain characters
+ my $name = trim($lineParts[0]);
+ my $value = trim($lineParts[1]);
+ if (length($name) == 0 || length($value) == 0) {
+ print "Error: Values in $ARGV[1] are not correct. Invalid line: \n$_\n";
+ exit -1;
+ }
+
+ #Check if we have duplicate key names
+ for (keys %redirectionValues) {
+ if ( $name eq $_) {
+ print "Error: Values in $ARGV[1] are not correct. The name $_ is not unique.\n";
+ exit -1;
+ }
+ }
+
+ $redirectionValues{$name} = $value;
+ }
+ return %redirectionValues;
+}
+
+sub trim($)
+{
+ my $string = shift;
+ $string =~ s/^\s+//;
+ $string =~ s/\s+$//;
+ return $string;
+} \ No newline at end of file
diff --git a/solenv/bin/concat-deps.c b/solenv/bin/concat-deps.c
new file mode 100644
index 000000000..fd128f6e3
--- /dev/null
+++ b/solenv/bin/concat-deps.c
@@ -0,0 +1,1235 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Copyright (C) 2011 Norbert Thiebaud
+ * License: GPLv3
+ */
+
+/* define to activate stats reporting on hash usage*/
+/* #define HASH_STAT */
+
+/* ===============================================
+ * Set-up: defines to identify the system and system related properties
+ * ===============================================
+ */
+
+#ifdef __APPLE__
+#ifdef __x86_64__
+#undef CORE_BIG_ENDIAN
+#define CORE_LITTLE_ENDIAN
+#else
+#define CORE_BIG_ENDIAN
+#undef CORE_LITTLE_ENDIAN
+#endif
+
+#endif
+#ifdef _AIX
+#define CORE_BIG_ENDIAN
+#undef CORE_LITTLE_ENDIAN
+#endif /* Def _AIX */
+
+#ifdef _MSC_VER
+#undef CORE_BIG_ENDIAN
+#define CORE_LITTLE_ENDIAN
+#endif /* Def _MSC_VER */
+
+#if defined(__linux) || defined(__FreeBSD__)
+#include <sys/param.h>
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#undef CORE_BIG_ENDIAN
+#define CORE_LITTLE_ENDIAN
+#else /* !(__BYTE_ORDER == __LITTLE_ENDIAN) */
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define CORE_BIG_ENDIAN
+#undef CORE_LITTLE_ENDIAN
+#endif /* __BYTE_ORDER == __BIG_ENDIAN */
+#endif /* !(__BYTE_ORDER == __LITTLE_ENDIAN) */
+#endif /* Def __linux */
+
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || \
+ defined(__NetBSD__) || defined(__DragonFly__)
+#include <machine/endian.h>
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+#undef CORE_BIG_ENDIAN
+#define CORE_LITTLE_ENDIAN
+#else /* !(_BYTE_ORDER == _LITTLE_ENDIAN) */
+#if _BYTE_ORDER == _BIG_ENDIAN
+#define CORE_BIG_ENDIAN
+#undef CORE_LITTLE_ENDIAN
+#endif /* _BYTE_ORDER == _BIG_ENDIAN */
+#endif /* !(_BYTE_ORDER == _LITTLE_ENDIAN) */
+#endif /* Def *BSD */
+
+#if defined(__HAIKU__)
+#include <endian.h>
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#undef CORE_BIG_ENDIAN
+#define CORE_LITTLE_ENDIAN
+#else /* !(__BYTE_ORDER == __LITTLE_ENDIAN) */
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define CORE_BIG_ENDIAN
+#undef CORE_LITTLE_ENDIAN
+#endif /* __BYTE_ORDER == __BIG_ENDIAN */
+#endif /* !(__BYTE_ORDER == __LITTLE_ENDIAN) */
+#endif /* Def __HAIKU__ */
+
+#ifdef __sun
+#ifdef __sparc
+#define CORE_BIG_ENDIAN
+#undef CORE_LITTLE_ENDIAN
+#else /* Ndef __sparc */
+#undef CORE_BIG_ENDIAN
+#define CORE_LITTLE_ENDIAN
+#endif /* Ndef __sparc */
+#endif /* Def __sun */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef _MSC_VER
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+#include <config_options.h>
+
+/* modes */
+#ifdef _MSC_VER
+#define FILE_O_RDONLY _O_RDONLY
+#define FILE_O_BINARY _O_BINARY
+#define PATHNCMP _strnicmp /* MSVC converts paths to lower-case sometimes? */
+#define ssize_t long
+#define S_ISREG(mode) (((mode) & _S_IFMT) == (_S_IFREG)) /* MSVC does not have this macro */
+#else /* not windaube */
+#define FILE_O_RDONLY O_RDONLY
+#define FILE_O_BINARY 0
+#define PATHNCMP strncmp
+#endif /* not windaube */
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+static int internal_boost = 0;
+static char* base_dir;
+static char* work_dir;
+static size_t work_dir_len;
+
+#ifdef __GNUC__
+#define clz __builtin_clz
+#else
+static int clz(unsigned int value)
+{
+ int result = 32;
+
+ while(value)
+ {
+ value >>= 1;
+ result -= 1;
+ }
+ return result;
+}
+#endif
+
+static unsigned int get_unaligned_uint(const unsigned char* cursor)
+{
+ unsigned int result;
+
+ memcpy(&result, cursor, sizeof(unsigned int));
+ return result;
+}
+
+/* ===============================================
+ * memory pool for fast fix-size allocation (non-thread-safe)
+ * ===============================================
+ */
+struct pool
+{
+ void* head_free; /**< head of a linked list of freed element */
+ char* fresh; /**< top of a memory block to dig new element */
+ char* tail; /**< to detect end of extent... when fresh pass tail */
+ void* extent; /**< pointer to the primary extent block */
+ int size_elem; /**< size of an element. */
+ int primary; /**< primary allocation in bytes */
+ int secondary; /**< secondary allocation in bytes */
+};
+#define POOL_ALIGN_INCREMENT 8 /**< alignment, must be a power of 2 and of size > to sizeof(void*) */
+
+
+static void* pool_take_extent(struct pool* pool, int allocate)
+{
+ unsigned int size = 0;
+ void* extent;
+ void* data = NULL;
+
+ if(pool->extent)
+ {
+ /* we already have an extent, so this is a secondary */
+ if(pool->secondary)
+ {
+ size = pool->secondary;
+ }
+ }
+ else
+ {
+ assert(pool->primary);
+ size = pool->primary;
+ }
+ if(size)
+ {
+ extent = malloc(size);
+ if(extent)
+ {
+ *(void**)extent = pool->extent;
+ pool->extent = extent;
+ if(allocate)
+ {
+ data = ((char*)extent) + POOL_ALIGN_INCREMENT;
+ pool->fresh = ((char*)data) + pool->size_elem;
+ pool->tail = pool->fresh + (size - pool->size_elem);
+ }
+ else
+ {
+ pool->fresh = ((char*)extent) + POOL_ALIGN_INCREMENT;
+ pool->tail = pool->fresh + (size - pool->size_elem);
+ }
+ }
+ }
+ return data;
+}
+
+/* Create a memory pool for fix size objects
+ * this is a simplified implementation that
+ * is _not_ thread safe.
+ */
+static struct pool* pool_create(int size_elem, int primary, int secondary)
+{
+ struct pool* pool;
+
+ assert(primary > 0);
+ assert(secondary >= 0);
+ assert(size_elem > 0);
+
+ pool = (struct pool*)calloc(1, sizeof(struct pool));
+ if(!pool) return NULL;
+ /* Adjust the element size so that it be aligned, and so that an element could
+ * at least contain a void*
+ */
+ pool->size_elem = size_elem = (size_elem + POOL_ALIGN_INCREMENT - 1) & ~(POOL_ALIGN_INCREMENT - 1);
+
+ pool->primary = (size_elem * primary) + POOL_ALIGN_INCREMENT;
+ pool->secondary = secondary > 0 ? (size_elem * secondary) + POOL_ALIGN_INCREMENT : 0;
+ pool_take_extent(pool, FALSE);
+
+ return pool;
+
+}
+
+static void pool_destroy(struct pool* pool)
+{
+ void* extent;
+ void* next;
+
+ if(pool != NULL)
+ {
+ extent = pool->extent;
+ while(extent)
+ {
+ next = *(void**)extent;
+ free(extent);
+ extent = next;
+ }
+ free(pool);
+ }
+}
+
+static void* pool_alloc(struct pool* pool)
+{
+ void* data;
+
+ data = pool->head_free;
+ if(data == NULL)
+ {
+ /* we have no old-freed elem */
+ if(pool->fresh <= pool->tail)
+ {
+ /* pick a slice of the current extent */
+ data = (void*)pool->fresh;
+ pool->fresh += pool->size_elem;
+ }
+ else
+ {
+ /* allocate a new extent */
+ data = pool_take_extent(pool, TRUE);
+ }
+ }
+ else
+ {
+ /* re-used old freed element by chopping the head of the free list */
+ pool->head_free = *(void**)data;
+ }
+
+ return data;
+}
+
+
+/* ===============================================
+ * Hash implementation customized to be just tracking
+ * a unique list of string (i.e no data associated
+ * with the key, no need for retrieval, etc...
+ *
+ * This is tuned for the particular use-case we have here
+ * measures in tail_build showed that
+ * we can get north of 4000 distinct values stored in a hash
+ * the collision rate is at worse around 2%
+ * the collision needing an expensive memcmp to resolve
+ * have a rate typically at 1 per 1000
+ * for tail_build we register 37229 unique key
+ * with a total of 377 extra memcmp needed
+ * which is completely negligible compared to the
+ * number of memcmp required to eliminate duplicate
+ * entry (north of 2.5 millions for tail_build)
+ * ===============================================
+ */
+
+struct hash_elem
+{
+ struct hash_elem* next;
+ const char* key;
+ int key_len;
+};
+
+struct hash
+{
+ struct hash_elem** array;
+ struct pool* elems_pool;
+ unsigned int used;
+ unsigned int size;
+ unsigned int load_limit;
+#ifdef HASH_STAT
+ int stored;
+ int collisions;
+ int cost;
+ int memcmp;
+#endif
+};
+
+/* The following hash_compute function was adapted from :
+ * lookup3.c, by Bob Jenkins, May 2006, Public Domain.
+ *
+ * The changes from the original are mostly cosmetic
+ */
+#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
+
+
+#if defined CORE_BIG_ENDIAN
+#define MASK_C1 0xFFFFFF00
+#define MASK_C2 0xFFFF0000
+#define MASK_C3 0xFF000000
+#elif defined CORE_LITTLE_ENDIAN
+#define MASK_C1 0xFFFFFF
+#define MASK_C2 0xFFFF
+#define MASK_C3 0xFF
+#else
+#error "Missing Endianness definition"
+#endif
+
+
+#define mix(a,b,c) \
+{ \
+ a -= c; a ^= rot(c, 4); c += b; \
+ b -= a; b ^= rot(a, 6); a += c; \
+ c -= b; c ^= rot(b, 8); b += a; \
+ a -= c; a ^= rot(c,16); c += b; \
+ b -= a; b ^= rot(a,19); a += c; \
+ c -= b; c ^= rot(b, 4); b += a; \
+}
+#define final(a,b,c) \
+{ \
+ c ^= b; c -= rot(b,14); \
+ a ^= c; a -= rot(c,11); \
+ b ^= a; b -= rot(a,25); \
+ c ^= b; c -= rot(b,16); \
+ a ^= c; a -= rot(c,4); \
+ b ^= a; b -= rot(a,14); \
+ c ^= b; c -= rot(b,24); \
+}
+
+static unsigned int hash_compute( struct hash const * hash, const char* key, int length)
+{
+ unsigned int a;
+ unsigned int b;
+ unsigned int c; /* internal state */
+ const unsigned char* uk = (const unsigned char*)key;
+
+ /* Set up the internal state */
+ a = b = c = 0xdeadbeef + (length << 2);
+
+ /* we use this to 'hash' full path with mostly a common root
+ * let's now waste too much cycles hashing mostly constant stuff
+ */
+ if(length > 36)
+ {
+ uk += length - 36;
+ length = 36;
+ }
+ /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
+ while (length > 12)
+ {
+ a += get_unaligned_uint(uk);
+ b += get_unaligned_uint(uk+4);
+ c += get_unaligned_uint(uk+8);
+ mix(a,b,c);
+ length -= 12;
+ uk += 12;
+ }
+
+ /*----------------------------- handle the last (probably partial) block */
+ /* Note: we possibly over-read, which would trigger complaint from VALGRIND
+ * but we mask the undefined stuff if any, so we are still good, thanks
+ * to alignment of memory allocation and tail-memory management overhead
+ * we always can read 3 bytes past the official end without triggering
+ * a segfault -- if you find a platform/compiler couple for which that postulate
+ * is false, then you just need to over-allocate by 2 more bytes in file_load()
+ * file_load already over-allocate by 1 to stick a \0 at the end of the buffer.
+ */
+ switch(length)
+ {
+ case 12: c+=get_unaligned_uint(uk+8); b+=get_unaligned_uint(uk+4); a+=get_unaligned_uint(uk); break;
+ case 11: c+=get_unaligned_uint(uk+8) & MASK_C1; b+=get_unaligned_uint(uk+4); a+=get_unaligned_uint(uk); break;
+ case 10: c+=get_unaligned_uint(uk+8) & MASK_C2; b+=get_unaligned_uint(uk+4); a+=get_unaligned_uint(uk); break;
+ case 9 : c+=get_unaligned_uint(uk+8) & MASK_C3; b+=get_unaligned_uint(uk+4); a+=get_unaligned_uint(uk); break;
+ case 8 : b+=get_unaligned_uint(uk+4); a+=get_unaligned_uint(uk); break;
+ case 7 : b+=get_unaligned_uint(uk+4) & MASK_C1; a+=get_unaligned_uint(uk); break;
+ case 6 : b+=get_unaligned_uint(uk+4) & MASK_C2; a+=get_unaligned_uint(uk); break;
+ case 5 : b+=get_unaligned_uint(uk+4) & MASK_C3; a+=get_unaligned_uint(uk); break;
+ case 4 : a+=get_unaligned_uint(uk); break;
+ case 3 : a+=get_unaligned_uint(uk) & MASK_C1; break;
+ case 2 : a+=get_unaligned_uint(uk) & MASK_C2; break;
+ case 1 : a+=get_unaligned_uint(uk) & MASK_C3; break;
+ case 0 : return c & hash->size; /* zero length strings require no mixing */
+ }
+
+ final(a,b,c);
+ return c & hash->size;
+}
+
+static void hash_destroy(struct hash* hash)
+{
+ if(hash)
+ {
+ if(hash->array)
+ {
+ free(hash->array);
+ }
+ if(hash->elems_pool)
+ {
+ pool_destroy(hash->elems_pool);
+ }
+ free(hash);
+ }
+}
+
+static struct hash* hash_create(unsigned int size)
+{
+ struct hash* hash;
+
+ assert(size > 0);
+ hash = (struct hash*)(calloc(1, sizeof(struct hash)));
+ if(hash)
+ {
+ size += (size >> 2) + 1; /* ~ 75% load factor */
+ if(size >= 15)
+ {
+ hash->size = (((unsigned int)0xFFFFFFFF) >> clz((unsigned int)size));
+ }
+ else
+ {
+ hash->size = size = 15;
+ }
+ hash->load_limit = hash->size - (hash->size >> 2);
+ hash->used = 0;
+ hash->array = (struct hash_elem**)calloc(hash->size + 1, sizeof(struct hash_elem*));
+ if(hash->array == NULL)
+ {
+ hash_destroy(hash);
+ hash = NULL;
+ }
+ }
+ if(hash)
+ {
+ hash->elems_pool = pool_create(sizeof(struct hash_elem),
+ size, size << 1);
+ if(!hash->elems_pool)
+ {
+ hash_destroy(hash);
+ hash = NULL;
+ }
+ }
+ return hash;
+}
+
+static void hash_resize(struct hash* hash)
+{
+ unsigned int old_size = hash->size;
+ unsigned int hashed;
+ struct hash_elem* hash_elem;
+ struct hash_elem* next;
+ struct hash_elem** array;
+ unsigned int i;
+
+ hash->size = (old_size << 1) + 1;
+ /* we really should avoid to get there... so print a message to alert of the condition */
+ fprintf(stderr, "resize hash %u -> %u\n", old_size, hash->size);
+ if(hash->size == old_size)
+ {
+ return;
+ }
+ array = (struct hash_elem**)calloc(hash->size + 1, sizeof(struct hash_elem*));
+ if(array)
+ {
+ hash->load_limit = hash->size - (hash->size >> 2);
+ for(i=0; i <= old_size; i++)
+ {
+ hash_elem = (struct hash_elem*)hash->array[i];
+ while(hash_elem)
+ {
+ next = hash_elem->next;
+
+ hashed = hash_compute(hash, hash_elem->key, hash_elem->key_len);
+ hash_elem->next = array[hashed];
+ array[hashed] = hash_elem;
+ hash_elem = next;
+ }
+ }
+ free(hash->array);
+ hash->array = (struct hash_elem**)array;
+ }
+ else
+ {
+ hash->size = old_size;
+ }
+}
+
+static int compare_key(struct hash const * hash, const char* a, const char* b, int len, int const * cost)
+{
+#ifdef HASH_STAT
+ *cost += 1;
+ hash->memcmp += 1;
+#else
+ (void) hash;
+ (void) cost;
+#endif
+ return memcmp(a,b, len);
+}
+
+/* a customized hash_store function that just store the key and return
+ * TRUE if the key was effectively stored, or FALSE if the key was already there
+ */
+static int hash_store(struct hash* hash, const char* key, int key_len)
+{
+ unsigned int hashed;
+ struct hash_elem* hash_elem;
+ int cost = 0;
+
+ (void) cost;
+ hashed = hash_compute(hash, key, key_len);
+#ifdef HASH_STAT
+ hash->stored += 1;
+#endif
+ hash_elem = (struct hash_elem*)hash->array[hashed];
+ while(hash_elem && (hash_elem->key_len != key_len || compare_key(hash, hash_elem->key, key, key_len, &cost)))
+ {
+ hash_elem = hash_elem->next;
+ }
+
+ if(!hash_elem)
+ {
+ hash_elem = (struct hash_elem*)pool_alloc(hash->elems_pool);
+ if(hash_elem)
+ {
+ hash_elem->key = key;
+ hash_elem->key_len = key_len;
+ hash_elem->next = hash->array[hashed];
+
+#ifdef HASH_STAT
+ if(hash_elem->next)
+ {
+ hash->collisions += 1;
+ hash->cost += cost;
+ }
+#endif
+ hash->array[hashed] = hash_elem;
+ hash->used += 1;
+ if(hash->used > hash->load_limit)
+ {
+ hash_resize(hash);
+ }
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static int file_stat(const char* name, struct stat* buffer_stat, int* rc)
+{
+ int rc_local = stat(name, buffer_stat);
+ if (rc_local < 0)
+ {
+ *rc = errno;
+ }
+ return rc_local;
+}
+
+static off_t file_get_size(const char* name, int* rc)
+{
+ struct stat buffer_stat;
+ off_t size = -1;
+
+ if (!file_stat(name, &buffer_stat, rc))
+ {
+ if(S_ISREG(buffer_stat.st_mode))
+ {
+ size = buffer_stat.st_size;
+ }
+ else
+ {
+ *rc = EINVAL;
+ }
+ }
+ return size;
+}
+
+#if !ENABLE_RUNTIME_OPTIMIZATIONS
+static void * file_load_buffers[100000];
+static size_t file_load_buffer_count = 0;
+#endif
+
+static char* file_load(const char* name, off_t* size, int* return_rc)
+{
+ off_t local_size = 0;
+ int rc = 0;
+ char* buffer = NULL;
+ int fd;
+
+ assert(name != NULL);
+
+ if(!size)
+ {
+ size = &local_size;
+ }
+ *size = file_get_size(name, &rc);
+ if (!rc && *size >= 0)
+ {
+ fd = open(name, FILE_O_RDONLY | FILE_O_BINARY);
+ if (!(fd == -1))
+ {
+ buffer = (char*)malloc((size_t)(*size + 1));
+#if !ENABLE_RUNTIME_OPTIMIZATIONS
+ if (buffer != NULL)
+ {
+ if (file_load_buffer_count == 100000)
+ {
+ free(buffer);
+ buffer = NULL;
+ }
+ else
+ {
+ file_load_buffers[file_load_buffer_count++] = buffer;
+ }
+ }
+#endif
+ if (buffer == NULL)
+ {
+ rc = ENOMEM;
+ }
+ else
+ {
+ ssize_t i;
+
+ REDO:
+ i = read(fd, buffer, (size_t)(*size));
+ if(i == -1)
+ {
+ if(errno == EINTR)
+ {
+ goto REDO;
+ }
+ else
+ {
+ rc = errno;
+ }
+ }
+ else
+ {
+ if (i != *size)
+ {
+ rc = EIO;
+ }
+ }
+ buffer[*size] = 0;
+ }
+ close(fd);
+ }
+ }
+
+ if(rc && buffer)
+ {
+ free(buffer);
+ buffer = NULL;
+ }
+ if(return_rc)
+ {
+ *return_rc = rc;
+ }
+ return buffer;
+}
+
+static void cancel_relative(char const * base, char** ref_cursor, char** ref_cursor_out, char const * end)
+{
+ char* cursor = *ref_cursor;
+ char* cursor_out = *ref_cursor_out;
+
+ do
+ {
+ cursor += 3;
+ while(cursor_out > base && cursor_out[-1] == '/')
+ cursor_out--;
+ while(cursor_out > base && *--cursor_out != '/');
+ }
+ while(cursor + 3 < end && !memcmp(cursor, "/../", 4));
+ *ref_cursor = cursor;
+ *ref_cursor_out = cursor_out;
+}
+
+static void eat_space(char ** token)
+{
+ while ((' ' == **token) || ('\t' == **token)) {
+ ++(*token);
+ }
+}
+
+/*
+ * Prune LibreOffice specific duplicate dependencies to improve
+ * gnumake startup time, and shrink the disk-space footprint.
+ */
+static int
+elide_dependency(const char* key, int key_len, const char **unpacked_end)
+{
+#if 0
+ {
+ int i;
+ fprintf (stderr, "elide?%d!: '", internal_boost);
+ for (i = 0; i < key_len; i++) {
+ fprintf (stderr, "%c", key[i]);
+ }
+ fprintf (stderr, "'\n");
+ }
+#endif
+
+ /* boost brings a plague of header files */
+ int i;
+ int unpacked = 0;
+ /* walk down path elements */
+ for (i = 0; i < key_len - 1; i++)
+ {
+ if (key[i] == '/')
+ {
+ if (0 == unpacked)
+ {
+ if (!PATHNCMP(key + i + 1, "workdir/", 8))
+ {
+ unpacked = 1;
+ continue;
+ }
+ }
+ else
+ {
+ if (!PATHNCMP(key + i + 1, "UnpackedTarball/", 16))
+ {
+ if (unpacked_end)
+ *unpacked_end = strchr(key + i + 17, '/');
+ return 1;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * We collapse tens of internal boost headers to the unpacked target, such
+ * that you can re-compile / install boost and all is well.
+ */
+static void emit_single_boost_header(void)
+{
+#define BOOST_TARGET "/UnpackedTarball/boost.done"
+ fprintf(stdout, "%s" BOOST_TARGET " ", work_dir);
+}
+
+static void emit_unpacked_target(const char* token, const char* end)
+{
+ fwrite(token, 1, end-token, stdout);
+ fputs(".done ", stdout);
+}
+
+/* prefix paths to absolute */
+static void print_fullpaths(char* line)
+{
+ char* token;
+ char* end;
+ int boost_count = 0;
+ int token_len;
+ const char * unpacked_end = NULL; /* end of UnpackedTarget match (if any) */
+ /* for UnpackedTarget the target is GenC{,xx}Object, don't mangle! */
+ int target_seen = 0;
+
+ token = line;
+ eat_space(&token);
+ while (*token)
+ {
+ end = token;
+ /* hard to believe that in this day and age drive letters still exist */
+ if (*end && (':' == *(end+1)) &&
+ (('\\' == *(end+2)) || ('/' == *(end+2))) &&
+ isalpha((unsigned char)*end))
+ {
+ end = end + 3; /* only one cross, err drive letter per filename */
+ }
+ while (*end && (' ' != *end) && ('\t' != *end) && (':' != *end)) {
+ ++end;
+ }
+ token_len = end - token;
+ if (target_seen &&
+ elide_dependency(token, token_len, &unpacked_end))
+ {
+ if (unpacked_end)
+ {
+ if (internal_boost && !PATHNCMP(unpacked_end - 5, "boost", 5))
+ {
+ ++boost_count;
+ if (boost_count == 1)
+ emit_single_boost_header();
+ else
+ {
+ /* don't output, and swallow trailing \\\n if any */
+ token = end;
+ eat_space(&token);
+ if (token[0] == '\\' && token[1] == '\n')
+ end = token + 2;
+ }
+ }
+ else
+ {
+ emit_unpacked_target(token, unpacked_end);
+ }
+ unpacked_end = NULL;
+ }
+ }
+ else
+ {
+ if (fwrite(token, token_len, 1, stdout) != 1)
+ abort();
+ fputc(' ', stdout);
+ }
+ token = end;
+ eat_space(&token);
+ if (!target_seen && ':' == *token)
+ {
+ target_seen = 1;
+ fputc(':', stdout);
+ ++token;
+ eat_space(&token);
+ }
+ }
+}
+
+static char * eat_space_at_end(char * end)
+{
+ char * real_end;
+ assert('\0' == *end);
+ real_end = end - 1;
+ while (' ' == *real_end || '\t' == *real_end || '\n' == *real_end
+ || ':' == *real_end)
+ { /* eat colon and whitespace at end */
+ --real_end;
+ }
+ return real_end;
+}
+
+static char* phony_content_buffer;
+static char* generate_phony_line(char const * phony_target, char const * extension)
+{
+ char const * src;
+ char* dest;
+ char* last_dot = NULL;
+ //fprintf(stderr, "generate_phony_line called with phony_target %s and extension %s\n", phony_target, extension);
+ for(dest = phony_content_buffer+work_dir_len+1, src = phony_target; *src != 0; ++src, ++dest)
+ {
+ *dest = *src;
+ if(*dest == '.')
+ {
+ last_dot = dest;
+ }
+ }
+ //fprintf(stderr, "generate_phony_line after phony_target copy: %s\n", phony_content_buffer);
+ for(dest = last_dot+1, src = extension; *src != 0; ++src, ++dest)
+ {
+ *dest = *src;
+ }
+ //fprintf(stderr, "generate_phony_line after extension add: %s\n", phony_content_buffer);
+ strcpy(dest, ": $(gb_Helper_PHONY)\n");
+ //fprintf(stderr, "generate_phony_line after phony add: %s\n", phony_content_buffer);
+ return phony_content_buffer;
+}
+
+static int generate_phony_file(char* fn, char const * content)
+{
+ FILE* depfile;
+ depfile = fopen(fn, "w");
+ if(!depfile)
+ {
+ fprintf(stderr, "Could not open '%s' for writing: %s\n", fn, strerror(errno));
+ }
+ else
+ {
+ fputs(content, depfile);
+ fclose(depfile);
+ }
+ return !depfile;
+}
+
+static int process(struct hash* dep_hash, char* fn)
+{
+ int rc;
+ char* buffer;
+ char* end;
+ char* cursor;
+ char* cursor_out;
+ char* base;
+ char* created_line = NULL;
+ char* src_relative;
+ int continuation = 0;
+ char last_ns = 0;
+ off_t size;
+
+ buffer = file_load(fn, &size, &rc);
+ if(!rc)
+ {
+ base = cursor_out = cursor = end = buffer;
+ end += size;
+
+ /* first eat unneeded space at the beginning of file
+ */
+ while(cursor < end && (*cursor == ' ' || *cursor == '\\'))
+ ++cursor;
+
+ while(cursor < end)
+ {
+ if(*cursor == '\\')
+ {
+ continuation = 1;
+ *cursor_out++ = *cursor++;
+ }
+ else if(*cursor == '/')
+ {
+ if(cursor + 2 < end)
+ {
+ if(!memcmp(cursor, "/./", 3))
+ {
+ cursor += 2;
+ continue;
+ }
+ }
+ if(cursor + 3 < end)
+ {
+ if(!memcmp(cursor, "/../", 4))
+ {
+ cancel_relative(base, &cursor, &cursor_out, end);
+ }
+ }
+ *cursor_out++ = *cursor++;
+ }
+ else if(*cursor == '\n')
+ {
+ if(!continuation)
+ {
+ *cursor_out = 0;
+ if(base < cursor)
+ {
+ /* here we have a complete rule */
+ if(last_ns == ':')
+ {
+ /* if the rule ended in ':' that is a no-dep rule
+ * these are the one for which we want to filter
+ * duplicate out
+ */
+ int key_len = eat_space_at_end(cursor_out) - base;
+ if (!elide_dependency(base,key_len + 1, NULL)
+ && hash_store(dep_hash, base, key_len))
+ {
+ /* DO NOT modify base after it has been added
+ as key by hash_store */
+ print_fullpaths(base);
+ putc('\n', stdout);
+ }
+ }
+ else
+ {
+ /* rule with dep, just write it */
+ print_fullpaths(base);
+ putc('\n', stdout);
+ }
+ last_ns = ' '; // cannot hurt to reset it
+ }
+ cursor += 1;
+ base = cursor_out = cursor;
+ }
+ else
+ {
+ /* here we have a '\' followed by \n this is a continuation
+ * i.e not a complete rule yet
+ */
+ *cursor_out++ = *cursor++;
+ continuation = 0; // cancel current one (empty lines!)
+ }
+ }
+ else
+ {
+ continuation = 0;
+ /* not using isspace() here save 25% of I refs and 75% of D refs based on cachegrind */
+ if(*cursor != ' ' && *cursor != '\n' && *cursor != '\t' )
+ {
+ last_ns = *cursor;
+ }
+ *cursor_out++ = *cursor++;
+ }
+ }
+
+ /* just in case the file did not end with a \n, there may be a pending rule */
+ if(base < cursor_out)
+ {
+ if(last_ns == ':')
+ {
+ int key_len = eat_space_at_end(cursor_out) - base;
+ if (!elide_dependency(base,key_len + 1, NULL) &&
+ hash_store(dep_hash, base, key_len))
+ {
+ puts(base);
+ putc('\n', stdout);
+ }
+ }
+ else
+ {
+ puts(base);
+ putc('\n', stdout);
+ }
+ }
+ }
+ else
+ {
+ if(strncmp(fn, work_dir, work_dir_len) == 0)
+ {
+ if(strncmp(fn+work_dir_len, "/Dep/", 5) == 0)
+ {
+ src_relative = fn+work_dir_len+5;
+ // cases ordered by frequency
+ if(strncmp(src_relative, "CxxObject/", 10) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "GenCxxObject/", 13) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "CObject/", 8) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "GenCObject/", 11) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "SdiObject/", 10) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "AsmObject/", 10) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "ObjCxxObject/", 13) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "ObjCObject/", 11) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "GenObjCxxObject/", 16) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "GenObjCObject/", 14) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "GenNasmObject/", 14) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "CxxClrObject/", 13) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else if(strncmp(src_relative, "GenCxxClrObject/", 16) == 0)
+ {
+ created_line = generate_phony_line(src_relative, "o");
+ rc = generate_phony_file(fn, created_line);
+ }
+ else
+ {
+ fprintf(stderr, "no magic for %s(%s) in %s\n", fn, src_relative, work_dir);
+ }
+ }
+ if(!rc)
+ {
+ puts(created_line);
+ }
+ }
+ }
+ /* Note: yes we are going to leak 'buffer'
+ * this is on purpose, to avoid cloning the 'key' out of it and our special
+ * 'hash' just store the pointer to the key inside of buffer, hence it need
+ * to remain allocated
+ */
+ // coverity[leaked_storage] - this is on purpose
+ return rc;
+}
+
+static void usage(void)
+{
+ fputs("Usage: concat-deps <file that contains dep_files>\n", stderr);
+}
+
+#define kDEFAULT_HASH_SIZE 4096
+#define PHONY_TARGET_BUFFER 4096
+
+static int get_var(char **var, const char *name)
+{
+ *var = (char *)getenv(name);
+ if(!*var)
+ {
+ fprintf(stderr,"Error: %s is missing in the environment\n", name);
+ return 1;
+ }
+ return 0;
+}
+
+int main(int argc, char** argv)
+{
+ int rc = 0;
+ off_t in_list_size = 0;
+ char* in_list;
+ char* in_list_cursor;
+ char* in_list_base;
+ struct hash* dep_hash = NULL;
+ const char *env_str;
+
+ if(argc < 2)
+ {
+ usage();
+ return 1;
+ }
+ if(get_var(&base_dir, "SRCDIR") || get_var(&work_dir, "WORKDIR"))
+ return 1;
+ work_dir_len = strlen(work_dir);
+ phony_content_buffer = (char*)malloc(PHONY_TARGET_BUFFER);
+ assert(phony_content_buffer); // Don't handle OOM conditions
+ strcpy(phony_content_buffer, work_dir);
+ phony_content_buffer[work_dir_len] = '/';
+
+ env_str = getenv("SYSTEM_BOOST");
+ internal_boost = !env_str || strcmp(env_str,"TRUE");
+
+ in_list = file_load(argv[1], &in_list_size, &rc);
+ if(!rc)
+ {
+ dep_hash = hash_create( kDEFAULT_HASH_SIZE);
+ in_list_base = in_list_cursor = in_list;
+
+ /* extract filename of dep file from a 'space' separated list */
+ while(*in_list_cursor)
+ {
+ /* the input here may contain Win32 \r\n EOL */
+ if(*in_list_cursor == ' '
+ || *in_list_cursor == '\n' || *in_list_cursor == '\r')
+ {
+ *in_list_cursor = 0;
+ if(in_list_base < in_list_cursor)
+ {
+ rc = process(dep_hash, in_list_base);
+ if(rc)
+ {
+ break;
+ }
+ }
+ in_list_cursor += 1;
+ in_list_base = in_list_cursor;
+ }
+ else
+ {
+ in_list_cursor += 1;
+ }
+ }
+ if(!rc)
+ {
+ /* catch the last entry in case the input did not terminate with a 'space' */
+ if(in_list_base < in_list_cursor)
+ {
+ rc = process(dep_hash, in_list_base);
+ }
+ }
+#ifdef HASH_STAT
+ fprintf(stderr, "stats: u:%d s:%d l:%d t:%d c:%d m:%d $:%d\n",
+ dep_hash->used, dep_hash->size, dep_hash->load_limit, dep_hash->stored,
+ dep_hash->collisions, dep_hash->memcmp, dep_hash->cost);
+#endif
+ }
+#if !ENABLE_RUNTIME_OPTIMIZATIONS
+ {
+ size_t i;
+ hash_destroy(dep_hash);
+ for (i = 0; i != file_load_buffer_count; ++i)
+ {
+ free(file_load_buffers[i]);
+ }
+ }
+#endif
+ return rc;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/solenv/bin/constructors.py b/solenv/bin/constructors.py
new file mode 100755
index 000000000..1237da171
--- /dev/null
+++ b/solenv/bin/constructors.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+
+# Call $0 <file with a list of component file paths>
+# Dumps all the implementing constructors to stdout
+
+import xml.sax
+import os.path
+import sys
+
+constructors = list()
+
+class ComponentHandler(xml.sax.ContentHandler):
+ def startElement(self, tag, attributes):
+ if tag == "implementation" and "constructor" in attributes:
+ constructors.append(attributes["constructor"])
+
+if __name__ == "__main__":
+ parser = xml.sax.make_parser()
+ parser.setFeature(xml.sax.handler.feature_namespaces, 0)
+ parser.setContentHandler(ComponentHandler())
+ for filename in sys.argv[1:]:
+ with open(filename, "r") as components_listfile:
+ for line in components_listfile:
+ for component_filename in line.strip().split():
+ parser.parse(component_filename)
+ constructors.sort()
+ print("\n".join(constructors))
diff --git a/solenv/bin/create-ids b/solenv/bin/create-ids
new file mode 100755
index 000000000..67f35d17c
--- /dev/null
+++ b/solenv/bin/create-ids
@@ -0,0 +1,18 @@
+#!/bin/sh
+#
+# 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/.
+#
+
+# create ID file for the whole LibO tree. run it in toplevel dir
+
+if [ "$1" = "--with-outpath" ]; then
+ # Include workdir generated files but without workdir/UnpackedTarball workdir/UnpackedTarget
+ dirs="$(ls -d ./*/* | sed -e '/\(\/\(cscope\.\|tags\|ID\)\)\|^\.\/\(workdir\/UnpackedTar\|\(instdir\/\)\)/d')"
+else
+ dirs="$(ls -d ./*/* | sed -e '/\(\/\(cscope\.\|tags\|ID\)\)\|^\.\/\(workdir\|instdir\)\//d')"
+fi
+mkid --lang-map="$(dirname "$0")"/id-lang.map --include='C C++ asm perl java make' --statistics $dirs
diff --git a/solenv/bin/create-tags b/solenv/bin/create-tags
new file mode 100755
index 000000000..4adf3db11
--- /dev/null
+++ b/solenv/bin/create-tags
@@ -0,0 +1,47 @@
+#!/usr/bin/env bash
+#
+# 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/.
+#
+
+ctags="ctags $@"
+saloptions="-ISAL_DELETED_FUNCTION -ISAL_OVERRIDE -ISAL_FINAL"
+omnicppoptions="--c++-kinds=+p --fields=+iaS --extra=+q"
+
+if LC_ALL=C ${ctags} -D "foo=bar" --license 2>&1 >/dev/null | grep -q -- 'ctags: Unknown option: -D'; then
+ echo "note: your ctags does not support defining macros with -D"
+ no_defines=" "
+fi
+
+$ctags -h "+.hdl.hrc" --langmap=c:+.hrc.src,c++:+.hdl $saloptions $omnicppoptions \
+ ${no_defines:-"-D CPPUNIT_TEST_FIXTURE(TestClass, TestName)=class TestName : public TestClass {};"} \
+ --languages=-HTML,Java,JavaScript \
+ --langdef=UNOIDL \
+ --langmap=UNOIDL:.idl \
+ --regex-UNOIDL="/^[ \t]*(published)?[ \t]*interface[ \t]*([a-zA-Z0-9_]+[ \t]*::[ \t]*)*([a-zA-Z0-9_]+)[ \t]*(:[^:]|\{|$)/\3/i,interface/" \
+ --regex-UNOIDL="/^[ \t]*([a-zA-Z0-9:]+)[ \t]+([a-zA-Z0-9]+)\(.*\)/\2/f,function/" \
+ --regex-UNOIDL="/^[ \t]*\[.*property.*\][ \t]+([a-zA-Z0-9_]+)[ \t]+([a-zA-Z0-9]+);/\2/p,property/" \
+ --regex-UNOIDL="/^[ \t]*(published)?[ \t]*service[ \t]+([a-zA-Z0-9_]+)[ \t]*(:[^:]|\{|$)/\2/g,service/" \
+ --regex-UNOIDL="/^[ \t]*(published)?[ \t]*singleton[ \t]+([a-zA-Z0-9_]+)[ \t]*(:[^:]|\{|$)/\2/g,singleton/" \
+ --regex-UNOIDL="/^[ \t]*(published)?[ \t]*struct[ \t]+([a-zA-Z0-9_]+)[ \t]*(:[^:]|\{|\<|$)/\2/s,struct/" \
+ --regex-UNOIDL="/^[ \t]*(published)?[ \t]*enum[ \t]+([a-zA-Z0-9_]+)[ \t]*(\{|$)/\2/e,enum/" \
+ --regex-UNOIDL="/^[ \t]*(published)?[ \t]*exception[ \t]+([a-zA-Z0-9_]+)[ \t]*(:[^:]|\{|$)/\2/x,exception/" \
+ --regex-UNOIDL="/^[ \t]*([a-zA-Z0-9_]+)[ \t]+([a-zA-Z0-9_]+);/\2/m,member/" \
+ -R --exclude=instdir --exclude=instdir_for_build --exclude=workdir --exclude=workdir_for_build \
+ --exclude=external --totals=yes ${SRCDIR:-*}
+
+if test -d workdir_for_build; then
+ w=workdir_for_build
+else
+ w=workdir
+fi
+
+$ctags -h "+.hdl.hrc" --langmap=c:+.hrc.src,c++:+.hdl $saloptions $omnicppoptions \
+ --languages=-HTML,Java,JavaScript \
+ -R --append=yes --totals=yes \
+ $w/UnoApiHeadersTarget/udkapi/normal \
+ $w/UnoApiHeadersTarget/offapi/normal \
+ $w/CustomTarget/officecfg/registry
diff --git a/solenv/bin/createcomponent.xslt b/solenv/bin/createcomponent.xslt
new file mode 100644
index 000000000..ee60221df
--- /dev/null
+++ b/solenv/bin/createcomponent.xslt
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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 .
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ exclude-result-prefixes="uc"
+ xmlns="http://openoffice.org/2010/uno-components"
+ xmlns:uc="http://openoffice.org/2010/uno-components">
+ <xsl:param name="uri"/>
+ <xsl:param name="cppu_env"/>
+ <xsl:param name="filtered"/>
+ <xsl:strip-space elements="*"/>
+ <xsl:template match="uc:component">
+ <components>
+ <xsl:copy>
+ <xsl:apply-templates select="@*"/>
+ <xsl:attribute name="uri">
+ <xsl:value-of select="$uri"/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </components>
+ </xsl:template>
+ <xsl:template match="uc:implementation">
+ <xsl:if test="not(contains($filtered,@name))">
+ <xsl:copy>
+ <xsl:apply-templates select="@*"/>
+ <xsl:apply-templates select="uc:optional"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template match="uc:optional"/>
+ <xsl:template match="*">
+ <xsl:copy>
+ <xsl:apply-templates select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match="@environment">
+ <xsl:attribute name="environment">
+ <xsl:call-template name="replace">
+ <xsl:with-param name="input" select="current()"/>
+ <xsl:with-param name="pattern" select="'@CPPU_ENV@'"/>
+ <xsl:with-param name="replace" select="$cppu_env"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:template>
+ <xsl:template match="@*">
+ <xsl:copy/>
+ </xsl:template>
+ <xsl:template name="replace">
+ <xsl:param name="input"/>
+ <xsl:param name="pattern"/>
+ <xsl:param name="replace"/>
+ <xsl:choose>
+ <xsl:when test="contains($input, $pattern)">
+ <xsl:value-of select="substring-before($input, $pattern)"/>
+ <xsl:value-of select="$replace"/>
+ <xsl:call-template name="replace">
+ <xsl:with-param
+ name="input" select="substring-after($input, $pattern)"/>
+ <xsl:with-param name="pattern" select="$pattern"/>
+ <xsl:with-param name="replace" select="$replace"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$input"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/solenv/bin/dbgsv.ini b/solenv/bin/dbgsv.ini
new file mode 100644
index 000000000..31bc03a04
--- /dev/null
+++ b/solenv/bin/dbgsv.ini
@@ -0,0 +1,20 @@
+=
+= 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 .
+=
+
+[output]
+error=shell
diff --git a/solenv/bin/desktop-translate.py b/solenv/bin/desktop-translate.py
new file mode 100644
index 000000000..639fa89af
--- /dev/null
+++ b/solenv/bin/desktop-translate.py
@@ -0,0 +1,167 @@
+#
+# 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 .
+#
+
+#
+# Translates multiple .desktop files at once with strings from .ulf
+# files; if you add new translatable .ulf files please add them to
+# l10ntools/source/localize.cxx
+#
+
+import os, sys, argparse, io
+
+def encodeDesktopString(s):
+ # <https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.1.html#
+ # value-types> says "The escape sequences \s, \n, \t, \r, and \\ are supported for values of
+ # type string and localestring, meaning ASCII space, newline, tab, carriage return, and
+ # backslash, respectively." <https://specifications.freedesktop.org/desktop-entry-spec/
+ # desktop-entry-spec-1.1.html#basic-format> says "A file is interpreted as a series of lines
+ # that are separated by linefeed characters", so it is apparently necessary to escape at least
+ # linefeed and backslash characters. It is unclear why that spec talks about "linefeed" in
+ # one place and about "newline" ("\n") and "carriage return" ("\r") in another, and how they are
+ # supposed to relate, so just escape any U+000A LINE FEED as "\n" and any U+000D CARRIAGE RETURN
+ # as "\r"; it is unclear exactly which occurrences of U+0020 SPACE and U+0009 CHARACTER
+ # TABULATION would need to be escaped, so they are mostly left unescaped, for readability:
+ s = s.replace('\\', '\\\\').replace('\n', '\\n').replace('\r', '\\r');
+ if s.startswith(' '):
+ # <https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.1.html#
+ # entries> says "Space before and after the equals sign should be ignored", so escape a
+ # leading U+0020 SPACE as "\s" (while it is not clear whether "space" there means just
+ # U+0020 SPACE or any kind of white space, in which case at least a leading U+0009 CHARACTER
+ # TABULATION should similarly be escaped as "\t"; also, it is unclear whether such
+ # characters should also be escaped at the end):
+ s = '\\s' + s[1:]
+ return s
+
+parser = argparse.ArgumentParser()
+parser.add_argument('-p', dest='productname', default='LibreOffice')
+parser.add_argument('-d', dest='workdir', default='.')
+parser.add_argument('--key', dest='key')
+parser.add_argument('--prefix', dest='prefix', default='')
+parser.add_argument('--ext', dest='ext')
+parser.add_argument('--template-dir', dest='template_dir', default=None)
+parser.add_argument('ifile')
+
+o = parser.parse_args()
+
+if o.template_dir is None:
+ template_dir = '{}/{}'.format(o.workdir, o.prefix)
+else:
+ template_dir = o.template_dir
+
+# hack for unity section
+if o.key == "UnityQuickList":
+ outkey = "Name"
+else:
+ outkey = o.key
+
+
+templates = {}
+
+# open input file
+source = io.open(o.ifile, encoding='utf-8')
+
+template = None
+
+# read ulf file
+for line in source:
+ if line.strip() == '':
+ continue
+ if line[0] == "[":
+ template = line.split(']', 1)[0][1:]
+ entry = {}
+ # For every section in the specified ulf file there should exist
+ # a template file in $workdir ..
+ entry['outfile'] = "{}{}.{}".format(template_dir, template, o.ext)
+ entry['translations'] = {}
+ templates[template] = entry
+ else:
+ # split locale = "value" into 2 strings
+ if ' = ' not in line:
+ continue
+ locale, value = line.split(' = ')
+
+ if locale != line:
+ # replace en-US with en
+ locale = locale.replace('en-US', 'en')
+
+ # use just anything inside the ""
+ assert(value[0] == '"')
+ # Some entries span multiple lines.
+ # An entry will always end on a double quote.
+ while not value.endswith('"\n'):
+ value += source.readline()
+ value = value[1:-2]
+
+ # replace resource placeholder
+ value = value.replace('%PRODUCTNAME', o.productname)
+
+ locale = locale.replace('-', '_')
+
+ templates[template]['translations'][locale] = value
+
+source.close()
+
+processed = 0
+# process templates
+for template in templates:
+ outfilename = templates[template]['outfile']
+
+ # open the template file - ignore sections for which no
+ # templates exist
+ try:
+ template_file = io.open(outfilename, encoding='utf-8')
+ except Exception:
+ # string files processed one by one
+ if o.ext == 'str':
+ continue
+ sys.exit("Warning: No template found for item '{}' : '{}' : '{}': $!\n".format(template, outfile, line))
+ processed += 1
+
+ # open output file
+ tmpfilename = '{}.tmp'.format(outfilename)
+ outfile = io.open(tmpfilename, 'w', encoding='utf-8')
+
+ # emit the template to the output file
+ for line in template_file:
+ keyline = line
+ if keyline.startswith(o.key):
+ keyline = outkey + keyline[len(o.key):]
+ outfile.write(keyline)
+ if o.key in line:
+ translations = templates[template]['translations']
+ for locale in sorted (translations.keys()):
+ value = translations.get(locale, None)
+ # print "locale is $locale\n";
+ # print "value is $value\n";
+ if value:
+ if o.ext == "desktop" or o.ext == "str":
+ if o.ext == "desktop":
+ value = encodeDesktopString(value)
+ outfile.write(u"""{}[{}]={}\n""".format(outkey, locale, value))
+ else:
+ outfile.write(u"""\t[{}]{}={}\n""".format(locale, outkey, value))
+
+ template_file.close()
+
+ outfile.close()
+ if os.path.exists(outfilename):
+ os.unlink(outfilename)
+ os.rename(tmpfilename, outfilename)
+
+if o.ext == 'str' and processed == 0:
+ sys.exit("Warning: No matching templates processed")
diff --git a/solenv/bin/exectest.pl b/solenv/bin/exectest.pl
new file mode 100644
index 000000000..248cd7b0c
--- /dev/null
+++ b/solenv/bin/exectest.pl
@@ -0,0 +1,103 @@
+#
+# 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 .
+#
+
+sub encode($)
+{
+ my ($arg) = @_;
+ $arg =~ s/'/'\\''/g;
+ return $arg
+}
+
+$#ARGV >= 3
+ or die "Usage: $0 <input file> <temp file> <new?> <command> <arguments...>";
+open INPUT, '<', $ARGV[0] or die "cannot open $ARGV[0]: $!";
+shift @ARGV;
+$temp = $ARGV[0];
+shift @ARGV;
+$new = $ARGV[0];
+shift @ARGV;
+$failed = 0;
+$open = 0;
+while (1) {
+ $eof = eof INPUT;
+ $in = <INPUT> unless $eof;
+ if ($eof
+ || $in =~ /^EXPECT (SUCCESS|FAILURE|NEW-FAILURE|OLD-FAILURE) "([^"]*)"?:\n$/)
+ {
+ if ($open)
+ {
+ close OUTPUT;
+ my $prog = '';
+ my $assigns = 1;
+ for ($i = 0; $i != scalar(@ARGV); ++$i)
+ {
+ $prog .= ' ' unless $i == 0;
+ if ($assigns && $ARGV[$i] =~ /^([A-Za-z_][A-Za-z0-9_]+)=(.*)$/)
+ {
+ $prog .= $1 . "='" . encode($2) . "'";
+ }
+ else
+ {
+ if ($ARGV[$i] =~ /^{}$/)
+ {
+ $prog .= "'" . encode($temp) . "'";
+ }
+ else
+ {
+ $prog .= "'" . encode($ARGV[$i]) . "'";
+ }
+ $assigns = 0;
+ }
+ }
+ system("$prog");
+ unlink $temp;
+ if ($? % 256 == 0)
+ {
+ $exit = $? / 256;
+ $ok = ($? == 0) == ($expect eq "SUCCESS");
+ }
+ else
+ {
+ $exit = "signal";
+ $ok = 0;
+ }
+ print "\"$title\" expected $expect, got $exit ($?): ";
+ if ($ok)
+ {
+ print "ok\n";
+ }
+ else
+ {
+ print "FAILED!\n";
+ exit(1);
+ }
+ }
+ last if $eof;
+ $expect = $1;
+ $expect = ($new ? 'FAILURE' : 'SUCCESS') if $expect eq 'NEW-FAILURE';
+ $expect = ($new ? 'SUCCESS' : 'FAILURE') if $expect eq 'OLD-FAILURE';
+ $title = $2;
+ open OUTPUT, '>', $temp or die "cannot open $temp: $!";
+ $open = 1;
+ }
+ elsif ($open)
+ {
+ print OUTPUT $in or die "cannot write to $temp: $!";
+ }
+}
+exit(0);
diff --git a/solenv/bin/finish-gbuild-trace.py b/solenv/bin/finish-gbuild-trace.py
new file mode 100755
index 000000000..fcd31fc23
--- /dev/null
+++ b/solenv/bin/finish-gbuild-trace.py
@@ -0,0 +1,137 @@
+#!/usr/bin/env python3
+
+# Process file generated by using GBUILD_TRACE=file with make.
+# The file needs adjusting for viewing in Chromium's "chrome://tracing' URL.
+# See solenv/gbuild/Trace.mk for details.
+
+import os
+import re
+import sys
+
+if len(sys.argv) != 2:
+ print ("Usage: " + sys.argv[0] + " [trace.json]", file=sys.stderr)
+ sys.exit(1)
+
+filename=sys.argv[1]
+
+with open(filename) as infile:
+ lines = [ line.rstrip('\n') for line in infile ]
+
+if len(lines) == 0 :
+ print( "Empty file?", file=sys.stderr)
+ sys.exit(1)
+
+if lines[0] == '{"traceEvents": [':
+ print( "File already processed", file=sys.stderr)
+ sys.exit(3)
+
+# sort items by time (parallel writes may not write them in time order)
+def linekey(line):
+ match = re.match( r'^.*, "ts": ([0-9]*)[0-9][0-9][0-9],.*$', line )
+ assert match, "Unknown line: " + line
+ return int(match.group(1))
+lines.sort( key=linekey )
+
+# 'chrome://tracing' shows several rows, we use those to show build parallelism,
+# but we need to assign the proper ids by allocating them as slots.
+slots = []
+# start time of each slot
+slot_start_time = []
+
+def make_slot_string(type, detail):
+ return type + '#' + detail
+
+def allocate_slot(type, detail):
+ for index in range(len(slots)):
+ if slots[index] == "":
+ slots[index] = make_slot_string(type, detail)
+ return index + 1
+ index = len(slots)
+ slots.append(make_slot_string(type, detail))
+ slot_start_time.append(0)
+ return index + 1
+
+def free_slot(type, detail):
+ for index in range(len(slots)):
+ if slots[index] == make_slot_string(type, detail):
+ slots[index] = ""
+ return index + 1
+ assert False, "free_slot(" + type + "," + detail + ") not found"
+
+# key: Type (e.g. CXX), value: time total
+totals_time = {}
+totals_count = {}
+
+# time of the first item, to rebase all times to 0
+start_time = 0
+
+with open(filename + ".tmp", "w") as outfile:
+ print( '{"traceEvents": [', file=outfile)
+ for iline in range(len(lines)):
+ line = lines[iline]
+ # "ts" needs converting nanoseconds -> milliseconds
+ match = re.match( r'^{"name": "([^"]*)", "ph": "(.)",.*"ts": ([0-9]*)[0-9][0-9][0-9],"args":{"message":"([^"]*)"}.*$', line )
+ if not match:
+ print( "Unknown line: " + line, file=sys.stderr)
+ sys.exit(2)
+ if start_time == 0:
+ start_time = int(match.group(3))
+ # "tid" needs replacing with proper slot
+ tid = "0"
+ # "ph"
+ if match.group(2) == 'B':
+ tid = allocate_slot(match.group(1), match.group(4)) # "name", "args"
+ slot_start_time[tid-1] = int(match.group(3))
+ elif match.group(2) == 'E':
+ tid = free_slot(match.group(1), match.group(4)) # "name", "args"
+ if not match.group(1) in totals_time:
+ totals_time[match.group(1)] = 0
+ totals_count[match.group(1)] = 0
+ totals_time[match.group(1)] += int(match.group(3)) - slot_start_time[tid-1]
+ totals_count[match.group(1)] += 1
+ line = re.sub( r'"ts": [0-9]+,', '"ts": ' + str(int(match.group(3)) - start_time) + ",", line)
+ line = re.sub( r'"tid": 1,', '"tid": ' + str(tid) + ",", line)
+ if match.group(2) == 'i':
+ rline = line
+ # mark as affecting all slots
+ line = re.sub( r'}},$', '}, "s": "p"},', line)
+ print(line, file=outfile)
+ # Chromium search doesn't find 'i' items, add extra 'R' for that
+ rline = re.sub( r', "ph": "i",', ', "ph": "R",', rline)
+ rline = re.sub( r', "tid": [0-9]+,', ',', rline)
+ print(rline, file=outfile)
+ else:
+ print(line, file=outfile)
+ # TODO: By the first time "[DEP]: LNK:Executable/makedepend.exe" is invoked the build tools
+ # are not built yet, so the invocation fails, doesn't abort the build for some reason,
+ # but the matching line about it ending is missing. So add the missing end line if it is
+ # by another start line for it instead of an end line.
+ if match.group(1) == "DEP" and match.group(4) == "[DEP]: LNK:Executable/makedepend.exe" and match.group(2) == "B":
+ for iline2 in range(iline+1,len(lines)): # search following lines
+ line2 = lines[iline2]
+ match2 = re.match( r'^{"name": "([^"]*)", "ph": "(.)",.*"ts": ([0-9]*)[0-9][0-9][0-9],"args":{"message":"([^"]*)"}.*$', line2 )
+ if match2.group(1) == "DEP" and match2.group(4) == "[DEP]: LNK:Executable/makedepend.exe":
+ if match2.group(2) == "E":
+ break # it has a matching close
+ if match2.group(2) == "B":
+ print(re.sub( r', "ph": "B",', ', "ph": "E",', line), file=outfile) # close the starting line
+ free_slot(match.group(1), match.group(4))
+ break
+
+ total_num = 0
+ for total in sorted(totals_time, key=totals_time.get, reverse=True):
+ note = ""
+ if total == "EXTERNAL":
+ note = ',"note": "minimum (cannot detect parallelism)"'
+ print( '{"pid":2,"tid":' + str(total_num) + ',"ts":0,"dur":' + str(totals_time[total]) + ',"ph":"X","name":"' + total
+ + '","args":{"count":"' + str(totals_count[total]) + '"' + note + '}},', file=outfile)
+ total_num += 1
+
+ print( '{"pid":1,"tid":0,"ts":0,"ph":"M","name":"process_name","args":{"name":"gbuild"}},', file=outfile)
+ print( '{"pid":2,"tid":0,"ts":0,"ph":"M","name":"process_name","args":{"name":"totals"}}]}', file=outfile)
+
+for index in range(len(slots)):
+ if slots[index] != "":
+ print( "Unclosed range: " + slots[index], file=sys.stderr)
+
+os.rename(filename + ".tmp", filename)
diff --git a/solenv/bin/fix-includes.pl b/solenv/bin/fix-includes.pl
new file mode 100755
index 000000000..837fcf2d8
--- /dev/null
+++ b/solenv/bin/fix-includes.pl
@@ -0,0 +1,95 @@
+#!/usr/bin/env perl
+# 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/.
+#
+#
+# fix-includes, a simple script replace local includes which should be global
+# , to global includes. And global includes which should be local, to local includes.
+# The script is expected to run in the root of the git repo, so it can fetch all the include directory's.
+#
+use strict;
+use warnings;
+use File::Basename;
+use File::Find;
+use IO::All;
+
+my $dirname = "include";
+
+# Fetch the list of includes
+my @subdirs = map {basename $_} grep {-d} glob("$dirname/*");
+
+# Add boost
+push(@subdirs,"boost");
+
+# Simple function to check and replace headers
+sub check_headers
+{
+ my ($dir,$file, @includes) = @_;
+ open(my $fh,"+<",$file) or die "Couldn't open file $file $!\n";
+ my @content = <$fh>;
+ my $line;
+
+ # seek to the first line, so we can replace then lines correctly
+ seek $fh,0,0;
+ foreach $line (@content){
+ if($line =~ m/#include "(\w*)\//){
+ # If an include is local and it should be global, make it global
+ if($1 ~~ @includes){
+ print "local header $line\n";
+ $line =~ s/"/</;
+ $line =~ s/"/>/;
+ print $fh $line;
+ print "converted to global header $line\n";
+ }
+ else {
+ print $fh $line;
+ }
+ }
+ # If a local file is defined global, make it local
+ elsif($line =~ /#include <((\w*)\.(hxx|h|hrc|src))>/){
+ # check if file exists, then it must be local so replace the <> to ""
+ if(-e "$dir/$1" ){
+ print "global header $line\n";
+ $line =~ s/</"/g;
+ $line =~ s/>/"/g;
+ print $fh $line;
+ print "converted to local header $line\n";
+ }
+ else {
+ print $fh $line;
+ }
+ }
+ else {
+ print $fh $line;
+ }
+ }
+ close($fh);
+}
+
+# routine that checks the headers of every cxx,hxx,c,h,hrc,src file in a directory
+sub check_routine
+{
+ my ($dir) = @_;
+ opendir(my $fh, $dir) or die "Program stopping, couldn't open directory \n";
+ while(my $file = readdir($fh)){
+ if($file =~ m/\.(cxx|hxx|c|h|hrc|src)$/i ){
+ check_headers($dir,"$dir/$file",@subdirs);
+ }
+ }
+ closedir($fh);
+}
+
+# Expect ARGV[0] to be a directory, then fetch all subdirectory's and check the header files.
+if(-d $ARGV[0]){
+ my @directories = io->dir($ARGV[0])->All_Dirs;
+ foreach my $dir (@directories){
+ print "checking header files in $dir\n";
+ check_routine($dir);
+ }
+}
+else{
+ print "$ARGV[0] isn't a directory\n";
+}
diff --git a/solenv/bin/gdb-core-bt.sh b/solenv/bin/gdb-core-bt.sh
new file mode 100755
index 000000000..855782580
--- /dev/null
+++ b/solenv/bin/gdb-core-bt.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+#
+#
+# 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/.
+#
+#
+
+EXECUTABLE=${1}
+COREDIR=${2}
+EXITCODE=${3}
+
+if test -n "$(which gdb)"
+then
+ found=
+ for COREFILE in "$COREDIR"/core*
+ do
+ if [ -f "$COREFILE" ]
+ then
+ guess=$(file "$COREFILE")
+ guess=${guess#* execfn: \'}
+ guess=${guess%%\'*}
+ if [ ! -x "$guess" ]; then guess=$EXECUTABLE; fi
+ printf '\nIt looks like %s generated %s\nBacktraces:\n' \
+ "$guess" "$COREFILE"
+ GDBCOMMANDFILE=$(mktemp)
+ printf "info registers\nthread apply all backtrace full\n" \
+ >"$GDBCOMMANDFILE"
+ PYTHONWARNINGS=default gdb -iex "add-auto-load-safe-path ${INSTDIR?}" \
+ -x "$GDBCOMMANDFILE" --batch "$guess" "$COREFILE" && found=x
+ rm "$GDBCOMMANDFILE"
+ echo
+ fi
+ done
+ if [ -z "$found" -a "$EXITCODE" -ge 128 ]; then
+ echo
+ echo "No core file identified in directory ${COREDIR}"
+ echo "To show backtraces for crashes during test execution,"
+ echo "enable core files with:"
+ echo
+ echo " ulimit -c unlimited"
+ echo
+ exit 1
+ fi
+else
+ echo "You need gdb in your path to show backtraces"
+ exit 1
+fi
diff --git a/solenv/bin/gdb_cxa-atexit_trace-stdout b/solenv/bin/gdb_cxa-atexit_trace-stdout
new file mode 100644
index 000000000..25cfe9897
--- /dev/null
+++ b/solenv/bin/gdb_cxa-atexit_trace-stdout
@@ -0,0 +1,8 @@
+set pagination off
+break __cxa_atexit
+commands
+ bt
+ cont
+end
+run
+quit
diff --git a/solenv/bin/gdbtrycatchtrace b/solenv/bin/gdbtrycatchtrace
new file mode 100644
index 000000000..636985a14
--- /dev/null
+++ b/solenv/bin/gdbtrycatchtrace
@@ -0,0 +1,21 @@
+set pagination off
+catch throw
+commands
+ bt
+ cont
+end
+catch catch
+commands
+ bt
+ cont
+end
+echo log will be saved as gdbtrace.log, this will take some time, patience...\n
+set logging redirect on
+set logging file gdbtrace.log
+set logging on
+set logging overwrite on
+run
+bt
+quit
+set logging off
+echo log is saved as gdbtrace.log\n
diff --git a/solenv/bin/gdbtrycatchtrace-stdout b/solenv/bin/gdbtrycatchtrace-stdout
new file mode 100644
index 000000000..e606a4f12
--- /dev/null
+++ b/solenv/bin/gdbtrycatchtrace-stdout
@@ -0,0 +1,14 @@
+set pagination off
+catch throw
+commands
+ bt
+ cont
+end
+catch catch
+commands
+ bt
+ cont
+end
+run
+bt
+quit
diff --git a/solenv/bin/generate-flatpak-manifest.sh b/solenv/bin/generate-flatpak-manifest.sh
new file mode 100755
index 000000000..2e0f8e314
--- /dev/null
+++ b/solenv/bin/generate-flatpak-manifest.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+# usage:
+# make -s cmd cmd='${SRCDIR}/solenv/bin/generate-flatpak-manifest.sh master' > org.libreoffice.LibreOffice.json
+
+set -euo pipefail
+
+# convert FOO := BAR$(MICRO) to export FOO=BAR$MICRO
+source <(sed -e's#\([^ ]\{1,\}\) := #export \1=#g' ${SRCDIR}/download.lst | sed -e 's#[)(]##g')
+
+my_gitbranch="${1?}"
+subst="-e s!@BRANCH@!${my_gitbranch?}!"
+
+subst="${subst} $(
+ < ${SRCDIR}/solenv/flatpak-manifest.in \
+ sed ${subst} | \
+ grep -o '@[A-Z0-9_]*@' | while read var; do
+ temp=${var:1:-1}
+ echo -n " -e s/${var}/${!temp}/"
+ done
+)"
+
+exec sed ${subst} < "${SRCDIR}"/solenv/flatpak-manifest.in
diff --git a/solenv/bin/generate-tokens.py b/solenv/bin/generate-tokens.py
new file mode 100644
index 000000000..2dc3c3fd4
--- /dev/null
+++ b/solenv/bin/generate-tokens.py
@@ -0,0 +1,80 @@
+# 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 .
+#
+
+import sys, re
+
+infile_name = sys.argv[1]
+idfile_out_name = sys.argv[2]
+namefile_out_name = sys.argv[3]
+gperffile_out_name = sys.argv[4]
+
+idfile = open(idfile_out_name, 'w')
+namefile = open(namefile_out_name, 'w')
+gperffile = open(gperffile_out_name, 'w')
+
+gperffile.write("""%language=C++
+%global-table
+%null-strings
+%struct-type
+struct xmltoken {
+ const char *name;
+ sal_Int32 nToken;
+};
+%%
+""")
+
+token_count = 0;
+tokens = {}
+
+with open(infile_name) as infile:
+ for line in infile:
+ line = line.strip()
+ # check for valid characters
+ if not re.match(r'[a-zA-Z0-9-_]+$', line):
+ sys.exit("Error: invalid character in token '{}'".format(line));
+ cur_id = "XML_" + line;
+ # we have two ids with similar names("cut-offs" and "cut_offs")
+ if cur_id == "XML_cut_offs":
+ cur_id = "cut_offs2";
+ cur_id = cur_id.replace('-', '_')
+ tokens[line] = cur_id
+ idfile.write("const sal_Int32 {} = {};\n".format(cur_id, token_count))
+ namefile.write("\"{}\",\n".format(line));
+ gperffile.write("{},{}\n".format(line, cur_id));
+ token_count += 1
+
+idfile.write("const sal_Int32 XML_TOKEN_COUNT = {};\n".format(token_count))
+gperffile.write("%%\n")
+
+idfile.close()
+namefile.close()
+gperffile.close()
+
+def fix_linefeeds(fname):
+ # Gperf requires LF newlines, not CRLF, even on Windows.
+ # Making this work on both Python 2 and 3 is difficult.
+ # When Python 2 is dropped, delete this and add
+ # newline = '\n' to the open() calls above.
+ with open(fname, 'rb') as ifile:
+ d = ifile.read()
+ d = d.replace(b'\r', b'')
+ with open(fname, 'wb') as ofile:
+ ofile.write(d)
+
+fix_linefeeds(idfile_out_name)
+fix_linefeeds(namefile_out_name)
+fix_linefeeds(gperffile_out_name)
diff --git a/solenv/bin/gentoken.py b/solenv/bin/gentoken.py
new file mode 100644
index 000000000..0fa793ea3
--- /dev/null
+++ b/solenv/bin/gentoken.py
@@ -0,0 +1,54 @@
+#
+# 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 .
+#
+
+import sys
+
+gperf_header = """%language=C++
+%global-table
+%null-strings
+%struct-type
+struct xmltoken
+{
+ const char *name; XMLTokenEnum nToken;
+};
+%%
+"""
+
+token_input_file = sys.argv[1]
+gperf_output_file = sys.argv[2]
+
+tokens = {}
+
+with open(token_input_file) as ifile:
+ for line in ifile:
+ line = line.strip()
+ if line:
+ token = "XML_" + line
+ token = token.replace("-", "_").replace(".", "_").replace(":", "_")
+ token = token.replace("+", "PLUS")
+ tokens[line] = token.upper()
+
+with open(gperf_output_file, "wb") as gperf:
+ gperf.write(gperf_header.encode("utf-8"))
+
+ for token in sorted(tokens.keys()):
+ gperf.write("{},{}\n".format(token, tokens[token]).encode("utf-8"))
+
+ gperf.write("%%\n".encode("utf-8"))
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/bin/getcompver.awk b/solenv/bin/getcompver.awk
new file mode 100644
index 000000000..6744c4dc5
--- /dev/null
+++ b/solenv/bin/getcompver.awk
@@ -0,0 +1,84 @@
+#
+# 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 .
+#
+BEGIN {
+ CCversion = 0
+ compiler_matched = 0
+}
+# Sun c++ compiler
+/Sun WorkShop/ || /Forte Developer/ || /Sun/{
+ compiler_matched = 1
+ # version number right after "C++"
+ x = match( $0, /C\+\+ .*/ )
+ btwn = substr( $0, RSTART, RLENGTH)
+ # extract version, whitespaces get striped later
+ x = match( btwn, / .*\..*[ $\t]/)
+ CCversion = substr( btwn, RSTART, RLENGTH)
+}
+# Microsoft c++ compiler
+/Microsoft/ && /..\...\...../ {
+ compiler_matched = 1
+ # match on the format of the ms versions ( dd.dd.dddd )
+ x = match( $0, /..\...\...../ )
+ CCversion = substr( $0, RSTART, RLENGTH)
+}
+# Java
+/java version/ || /openjdk version/ {
+ compiler_matched = 1
+ # match on the format of the java versions ( d[d].d[d].d[d] )
+ if (match($0, /[0-9]+\.[0-9]+\.[0-9]+/)) {
+ CCversion = substr($0, RSTART, RLENGTH)
+ } else if (match($0, /[0-9]+\.[0-9]+/)) {
+ CCversion = substr($0, RSTART, RLENGTH) "."
+ } else if (match($0, /[0-9]+/)) {
+ CCversion = substr($0, RSTART, RLENGTH) ".."
+ }
+}
+/^[0-9]*[.][0-9]*\r*$/ {
+ if ( compiler_matched == 0 ) {
+# need to blow to x.xx.xx for comparing
+ CCversion = $0 ".0"
+ }
+}
+/^[0-9]*[.][0-9]*[.][0-9]*\r*$/ {
+ if ( compiler_matched == 0 ) {
+ CCversion = $0
+ }
+}
+/^[0-9]*[.][0-9]*[.][0-9]*-[0-9a-z]*$/ {
+ if ( compiler_matched == 0 ) {
+ CCversion = substr($0, 0, index($0, "-") - 1)
+ }
+}
+# NDK r8b has "4.6.x-google"
+/^[0-9]*[.][0-9]*[.][a-z]*-[0-9a-z]*$/ {
+ if ( compiler_matched == 0 ) {
+ # Include the second period in the match so that
+ # we will get a micro version of zero
+ x = match( $0, /^[0-9]*[.][0-9]*[.]/ )
+ CCversion = substr($0, RSTART, RLENGTH)
+ }
+}
+END {
+ if ( num == "true" ) {
+ tokencount = split (CCversion,vertoken,".")
+ for ( i = 1 ; i <= tokencount ; i++ ) {
+ printf ("%04d",vertoken[i] )
+ }
+ } else
+ print CCversion
+}
diff --git a/solenv/bin/hrcex b/solenv/bin/hrcex
new file mode 100755
index 000000000..0645f79fc
--- /dev/null
+++ b/solenv/bin/hrcex
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+import polib
+import binascii
+import getopt
+import sys
+import os.path
+from subprocess import check_output, Popen, PIPE
+
+try:
+ myopts, args = getopt.getopt(sys.argv[1:], "i:o:")
+except getopt.GetoptError as e:
+ print(" Syntax: hrcex -i FileIn -o FileOut")
+ print(" FileIn: Source files (*.hrc)")
+ print(" FileOut: Destination file (*.*)")
+ sys.exit(2)
+
+for o, a in myopts:
+ if o == '-i':
+ ifile = a
+ elif o == '-o':
+ ofile = a
+
+with open(ofile, "a") as output:
+ xgettext = Popen(["xgettext", "-C", "--add-comments", "--keyword=NC_:1c,2", "--keyword=NNC_:1c,2,3", "--from-code=UTF-8", "--no-wrap", ifile, "-o", "-"], stdout=PIPE, encoding="UTF-8")
+ # while overall format is c++, all of the strings use custom placeholders and don't follow c-format
+ # esp. plain percent sign never is escaped explicitly
+ input = check_output(['sed', '-e', '/^#, c-format$/d'], stdin=xgettext.stdout, encoding="UTF-8")
+ xgettext.wait()
+ xgettext.stdout.close()
+ po = polib.pofile(input)
+ if len(po) != 0:
+ print("", file=output)
+ for entry in po:
+ keyid = entry.msgctxt + '|' + entry.msgid
+ print('#. ' + polib.genKeyId(keyid), file=output)
+ for i, occurrence in enumerate(entry.occurrences):
+ entry.occurrences[i] = os.path.relpath(occurrence[0], os.environ['SRCDIR']), occurrence[1]
+ print(entry, file=output)
diff --git a/solenv/bin/id-lang.map b/solenv/bin/id-lang.map
new file mode 100644
index 000000000..050388e8b
--- /dev/null
+++ b/solenv/bin/id-lang.map
@@ -0,0 +1,114 @@
+#
+# 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/.
+#
+# Welcome to the mkid language mapper.
+#
+# The format of each line is:
+#
+# <pattern> <language> [options]
+#
+# Filenames are matched top-to-bottom against the patterns, and the
+# first match is chosen. The special language `IGNORE' means that
+# this file should be ignored by mkid. The options are
+# language-specific command-line options to mkid.
+#
+# If a file name doesn't match any pattern, it is assigned the default
+# language. The default language may be specified here with the
+# special pattern `**', or overridden from the mkid command-line with
+# the `--default-lang=LANG' option.
+#
+# The special pattern `***' means to include the named file that
+# immediately follows. If no file is named, then the default system
+# language mapper file (i.e., this file) is included.
+
+# Default language
+** IGNORE # Although this is listed first,
+ # the default language pattern is
+ # logically matched last.
+
+# Backup files
+*~ IGNORE
+*.bak IGNORE
+*.bk[0-9] IGNORE
+
+# SCCS files
+[sp].* IGNORE
+
+# C dependencies created by automake
+*/.deps/* IGNORE
+
+*.h C
+*.h.in C
+*.H C++
+*.hh C++
+*.hpp C++
+*.hxx C++
+
+*.l C
+*.lex C
+*.y C
+*.yacc C
+
+*.c C
+*.C C++
+*.cc C++
+*.cpp C++
+*.cxx C++
+
+*.java Java
+
+ChangeLog* Cdoc
+
+*.[sS] asm --comment=;
+*.asm asm --comment=;
+
+# [nt]roff
+*.[0-9] roff
+*.ms roff
+*.me roff
+*.mm roff
+
+*.tex TeX
+*.ltx TeX
+*.texi texinfo
+*.texinfo texinfo
+
+# portable object (i18n)
+*.po po
+
+*.el lisp
+*.elc lisp
+*.lisp lisp
+*.scm lisp
+
+*.am make
+Makefile make
+Makefile.* make
+
+*.doc text
+*.txt text
+
+*.m4 m4
+
+*.pl perl
+*.pm perl
+
+*.gz FILTER gzip -d <%s
+*.Z FILTER gzip -d <%s
+
+######### LibO-specific stuff #######################################
+
+# Treat LibO resource header files as C files
+*.hrc C
+# Treat LibO header files generated from *.idl as C++ files
+*.hdl C++
+# Treat LibO IDL files as C++ files, not exactly a header file, but ...
+*.idl C++
+# Treat LibO resource files as C files
+*.src C
+# Treat LibO *.mk files as makefiles
+*.mk make
diff --git a/solenv/bin/image-sort.py b/solenv/bin/image-sort.py
new file mode 100644
index 000000000..5d248684b
--- /dev/null
+++ b/solenv/bin/image-sort.py
@@ -0,0 +1,155 @@
+# -*- Mode: Python; tab-width: 4; indent-tabs-mode: nil -*-
+#
+# 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 .
+#
+
+import sys, os, re
+import argparse
+
+global_list = []
+global_hash = {}
+args = None
+
+def read_icons(fname):
+ global args
+ images = []
+ full_path = os.path.join(args.base_path, fname)
+ if not os.path.exists(full_path):
+ if not args.quiet:
+ print("Skipping non-existent {}".format(full_path), file=sys.stderr)
+ return images
+ with open(full_path) as fp:
+ for line in fp:
+ m = re.search(r'xlink:href="\.uno:(\S+)"\s+', line)
+ if m:
+ images.append(m.group(1).lower())
+ return images
+
+# filter out already seen icons & do prefixing
+def read_new_icons(fname, prefix):
+ images = read_icons(fname)
+ new_icons_arr = []
+ new_icons_d = {}
+ for icon in images:
+ iname = "cmd/" + prefix + icon + ".png"
+ if iname not in global_hash and \
+ iname not in new_icons_d:
+ new_icons_arr.append(iname)
+ new_icons_d[iname] = 1
+ return new_icons_arr
+
+def process_group(prefix, uiconfigs):
+ global global_list, global_hash
+ group = {}
+ cur_max = 1.0
+
+ # a very noddy sorting algorithm
+ for uiconfig in uiconfigs:
+ images = read_new_icons(uiconfig, prefix)
+ prev = ''
+ for icon in images:
+ if icon not in group:
+ if prev not in group:
+ group[icon] = cur_max
+ cur_max += 1.0
+ else:
+ group[icon] = group[prev] + (1.0 - 0.5 / cur_max)
+ def intvalue(i):
+ return group[i]
+ for icon in sorted(group.keys(), key=intvalue):
+ global_list.append(icon)
+ global_hash[icon] = 1
+
+def process_file(fname, prefix):
+ global global_list, global_hash
+ images = read_new_icons(fname, prefix)
+
+ for icon in images:
+ global_list.append(icon)
+ global_hash[icon] = 1
+
+def chew_controlfile(ifile):
+ global global_list, global_hash
+ filelist = []
+ for line in ifile:
+ line = line.strip()
+ if line.startswith('#'):
+ continue
+ if not line:
+ continue
+
+ m = re.match(r'-- (\S+)\s*', line)
+ if m:
+ # control code
+ code = m.group(1)
+ small = line.lower().endswith(' small')
+ if code.lower() == 'group':
+ if not small:
+ process_group("lc_", filelist)
+ process_group ("sc_", filelist)
+ elif code.lower() == 'ordered':
+ if not small:
+ for f in filelist:
+ process_file(f, "lc_")
+ for f in filelist:
+ process_file(f, "sc_")
+ elif code.lower() == 'literal':
+ for f in filelist:
+ if f not in global_hash:
+ global_list.append(f)
+ global_hash[f] = 1
+ else:
+ sys.exit("Unknown code '{}'".format(code))
+ filelist = []
+ else:
+ filelist.append(line)
+
+parser = argparse.ArgumentParser()
+# where the control file lives
+parser.add_argument('control_file', metavar='image-sort.lst',
+ help='the sort control file')
+# where the uiconfigs live
+parser.add_argument('base_path', metavar='directory',
+ help='path to the UIConfigs directory')
+parser.add_argument('output', metavar='output file', type=argparse.FileType('w'),
+ nargs='?', default=None, help='optionally write to this output file')
+parser.add_argument("-q", "--quiet", action="store_true",
+ help="don't print status messages to stdout")
+
+args = parser.parse_args()
+
+if args.output is not None:
+ close_output = True
+else:
+ args.output = sys.stdout
+ close_output = False
+
+with open(args.control_file) as cf:
+ chew_controlfile(cf)
+
+for icon in global_list:
+ if not icon.startswith('sc_'):
+ args.output.write(icon + "\n")
+
+for icon in global_list:
+ if icon.startswith('sc_'):
+ args.output.write(icon + "\n")
+
+if close_output:
+ args.output.close()
+
+# dnl vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/bin/install-gdb-printers b/solenv/bin/install-gdb-printers
new file mode 100755
index 000000000..3eae4d9ef
--- /dev/null
+++ b/solenv/bin/install-gdb-printers
@@ -0,0 +1,143 @@
+#!/usr/bin/env bash
+#
+# 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/.
+#
+
+GDBDIR="${SRCDIR}/solenv/gdb"
+INSTALLDIR="${TESTINSTALLDIR}"
+DYLIB=so
+if [ "$(uname)" = Darwin ]; then
+ INSTALLDIR=$INSTALLDIR/LibreOffice.app/Contents
+ DYLIB=dylib
+fi
+
+die() {
+ echo "$1" >&2
+ exit 1
+}
+
+usage() {
+ cat <<EOT
+Install gdb pretty printers and autoloaders for them.
+
+Usage:
+install-gdb-printers [ -a dir ] [ -i dir ] [ -p dir ] [ -c ]
+install-gdb-printers -h
+
+Options:
+-a dir The dir where autoloaders will be placed. Defaults to whatever -i
+ is.
+-c Create the autoloader's dir if it does not exist. This option only
+ makes sense if both -a and -i are used.
+-h Show this help text.
+-i dir The dir where libreoffice is installed. Defaults to whatever -a is.
+-p dir The dir where pretty printers are placed.
+
+Env. variables:
+DESTDIR If set, it is prepended to all dir arguments.
+
+Examples:
+1) Install pretty printers into /usr/share/libreoffice/gdb, with
+ autoloaders in /usr/share/gdb/auto-load (run
+ "info gdb 'Extending GDB' Python Auto-loading" to learn more) and
+ installation in /usr/lib64/libreoffice (this is what Fedora does):
+
+install-gdb-printers -a /usr/share/gdb/auto-load/usr/lib64/libreoffice -c \\
+ -i /usr/lib64/libreoffice -p /usr/share/libreoffice/gdb
+EOT
+}
+
+make_autoload() {
+ local lib="${DESTDIR}${autoloaddir}/$2/$3"
+ local merged="$4"
+
+ local resolved;
+ resolved=$(readlink "${DESTDIR}${installdir}/$2/$3")
+ [ -n "$resolved" ] && lib=$resolved
+ local dir="${lib%/*}"
+
+ if ${create}; then
+ mkdir -p "${dir}" || die "cannot create dir '${dir}'"
+ fi
+
+ [[ -f ${lib}-gdb.py ]] && rm -f "${lib}-gdb.py"
+ if [[ -n "${merged}" ]]; then
+ sed -e "s!%PYTHONDIR%!${pythondir}!" -e "s!%MODULES%!${*:5}!" \
+ "${GDBDIR}/autoload.template" > "${lib}-gdb.py"
+ else
+ sed -e "s!%PYTHONDIR%!${pythondir}!" -e "s!%MODULES%!$1!" \
+ "${GDBDIR}/autoload.template" > "${lib}-gdb.py"
+ fi
+}
+
+# dir where the autoloaders will be placed
+autoloaddir=
+# The installation dir. If only one of these is set, the other is set to
+# the same value.
+installdir=
+# dir where the pretty printers will be placed
+pythondir="${GDBDIR}"
+# Create autoload dir if it does not exist. This only makes sense when
+# installing into system gdb dir, so $autoloaddir must be absolute path.
+create=false
+
+# b de g jklmno qrstuvwxyzABCDEFGHIJK MNOPQRSTUVWXYZ0123456789
+while getopts :a:cfhi:p:L opt; do
+ case ${opt} in
+ a) autoloaddir="${OPTARG}" ;;
+ c) create=true ;;
+ h) usage; exit ;;
+ i) installdir="${OPTARG}" ;;
+ p) pythondir="${OPTARG}" ;;
+ *) die "unknown option ${OPTARG}" ;;
+ esac
+done
+
+if [[ -z ${autoloaddir} && -z ${installdir} ]]; then
+ autoloaddir="${INSTALLDIR}"
+ installdir="${INSTALLDIR}"
+elif [[ -n ${autoloaddir} && -z ${installdir} ]]; then
+ installdir="${autoloaddir}"
+elif [[ -z ${autoloaddir} && -n ${installdir} ]]; then
+ autoloaddir="${installdir}"
+fi
+
+if [[ -n ${DESTDIR} ]]; then
+ [[ ${autoloaddir:0:1} = / ]] || die 'the arg to -a must be an absolute path'
+ [[ ${pythondir:0:1} = / ]] || die 'the arg to -p must be an absolute path'
+fi
+if ${create}; then
+ [[ ${autoloaddir:0:1} = / ]] || die 'the arg to -a must be an absolute path'
+else
+ [[ ! -d ${DESTDIR}${autoloaddir} ]] && die "directory '${DESTDIR}${autoloaddir}' does not exist"
+fi
+[[ ! -d ${DESTDIR}${installdir} ]] && die "directory '${DESTDIR}${installdir}' does not exist"
+[[ ! -d ${GDBDIR} ]] && die "directory '${GDBDIR}' does not exist"
+
+if [[ ${DESTDIR}${pythondir} != ${GDBDIR} ]]; then
+ mkdir -p "${DESTDIR}${pythondir}" || die "cannot create dir '${DESTDIR}${pythondir}'"
+ cp -pr "${GDBDIR}/libreoffice" "${DESTDIR}${pythondir}"
+fi
+
+if [[ -n "${MERGELIBS}" ]]; then
+ make_autoload merged program libmergedlo."$DYLIB" merge svl tl basegfx vcl utl
+ make_autoload cppu program libuno_cppu."$DYLIB".3
+ make_autoload sal program libuno_sal."$DYLIB".3
+ make_autoload sw program libswlo."$DYLIB"
+else
+ make_autoload basegfx program libbasegfxlo."$DYLIB"
+ make_autoload cppu program libuno_cppu."$DYLIB".3
+ make_autoload sal program libuno_sal."$DYLIB".3
+ make_autoload svl program libsvllo."$DYLIB"
+ make_autoload sw program libswlo."$DYLIB"
+ make_autoload tl program libtllo."$DYLIB"
+ make_autoload utl program libutllo."$DYLIB"
+ make_autoload vcl program libvcllo."$DYLIB"
+fi
+make_autoload writerfilter program libwriterfilterlo."$DYLIB"
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/bin/install-sh b/solenv/bin/install-sh
new file mode 100755
index 000000000..fb942ef71
--- /dev/null
+++ b/solenv/bin/install-sh
@@ -0,0 +1,3 @@
+;; This file is automatically created by diff_all_filter.pl
+;; Fri Mar 27 08:02:00 2009
+
diff --git a/solenv/bin/localestr b/solenv/bin/localestr
new file mode 100755
index 000000000..c66d40cbf
--- /dev/null
+++ b/solenv/bin/localestr
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+case "$1" in
+ ca-valencia)
+ echo ca@valencia
+ ;;
+ kmr-Latn)
+ echo kmr@latin
+ ;;
+ sr-Latn)
+ echo sr@latin
+ ;;
+ hu-Hung)
+ echo hu@hung
+ ;;
+ *)
+ echo $1 | tr '-' '_'
+ ;;
+esac
+
diff --git a/solenv/bin/macosx-change-install-names.pl b/solenv/bin/macosx-change-install-names.pl
new file mode 100644
index 000000000..3d393a012
--- /dev/null
+++ b/solenv/bin/macosx-change-install-names.pl
@@ -0,0 +1,95 @@
+#
+# 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 .
+#
+
+# The install names of our dynamic libraries contain a special segment token
+# that denotes where the dynamic library is located in the installation set.
+# The segment token consists of "@", optionally followed by ".", followed by 50
+# "_", followed by a location token (one of "URELIB", "OOO", "OXT", or "NONE").
+#
+# Typically, the segment token is the first segment of a relative install name.
+# But the segment token may also appear within an absolute install name. That
+# is useful when tunnelling the segment token into the external build process
+# via a --prefix configure switch, for example.
+#
+# When another dynamic library or an executable links against such a dynamic
+# library, the path recorded in the former to locate the latter is rewritten
+# according to the below %action table. The result path consists of the prefix
+# from the action table followed by the suffix of the dynamic library's install
+# name. If the special segment token does not contain the optional "." after
+# the "@", the suffix consists of all segments after the special token segment.
+# If the special token segment does contain the optional ".", then the suffix
+# consists of just the last segment of the original install name.
+#
+# That latter case is useful for libraries from external modules, where the
+# external build process locates them in some sub-directory.
+
+sub action($$$)
+{
+ # The @__VIA_LIBRARY_PATH__ thing has no magic meaning anywhere
+ # (here in LO or to the dynamic linker), it is effectively a
+ # comment telling that this library is supposed to have been found
+ # by the dynamic linker already in DYLD_LIBRARY_PATH.
+
+ my %action =
+ ('app/UREBIN/URELIB' => '@executable_path/../Frameworks',
+ 'app/OOO/URELIB' => '@executable_path/../Frameworks',
+ 'app/OOO/OOO' => '@executable_path/../Frameworks',
+ 'app/SDKBIN/URELIB' => '@__VIA_LIBRARY_PATH__',
+ 'app/NONE/URELIB' => '@__VIA_LIBRARY_PATH__',
+ 'app/NONE/OOO' => '@__VIA_LIBRARY_PATH__',
+ 'app/NONE/NONE' => '@__VIA_LIBRARY_PATH__',
+ 'shl/URELIB/URELIB' => '@loader_path',
+ 'shl/OOO/URELIB' => '@loader_path',
+ 'shl/OOO/OOO' => '@loader_path',
+ 'shl/URELIB/OOO' => '@loader_path',
+ 'shl/OXT/URELIB' => '@executable_path/urelibs',
+ 'shl/NONE/URELIB' => '@__VIA_LIBRARY_PATH__',
+ 'shl/NONE/OOO' => '@__VIA_LIBRARY_PATH__',
+ 'shl/NONE/NONE' => '@loader_path');
+ my ($type, $loc1, $loc2) = @_;
+ my $act = $action{"$type/$loc1/$loc2"};
+ die "illegal combination $type/$loc1/$loc2" unless defined $act;
+ return $act;
+}
+
+@ARGV >= 2 or die 'Usage: app|shl UREBIN|URELIB|OOO|SDKBIN|OXT|NONE <filepath>*';
+$type = shift @ARGV;
+$loc = shift @ARGV;
+foreach $file (@ARGV)
+{
+ my $call = "otool -L $file";
+ open(IN, "-|", $call) or die "cannot $call";
+ my $change = "";
+ while (<IN>)
+ {
+ if (m'^\s*(((/.*)?/)?@_{50}([^/]+)(/.+)) \(compatibility version \d+\.\d+\.\d+, current version \d+\.\d+\.\d+\)\n$')
+ {
+ $change .= " -change $1 " . action($type, $loc, $4) . $5;
+ }
+ elsif (m'^\s*(((/.*)?/)?@\._{50}([^/]+)(/.+)?(/[^/]+)) \(compatibility version \d+\.\d+\.\d+, current version \d+\.\d+\.\d+\)\n$')
+ {
+ $change .= " -change $1 " . action($type, $loc, $4) . $6;
+ }
+ }
+ close(IN) or die "got $? from $call";
+ if ($change ne "")
+ {
+ $call = "$ENV{'INSTALL_NAME_TOOL'} $change $file";
+ system($call) == 0 or die "cannot $call";
+ }
+}
diff --git a/solenv/bin/macosx-codesign-app-bundle b/solenv/bin/macosx-codesign-app-bundle
new file mode 100755
index 000000000..e569aef24
--- /dev/null
+++ b/solenv/bin/macosx-codesign-app-bundle
@@ -0,0 +1,135 @@
+#!/usr/bin/env bash
+
+# Use of unset variable is an error
+set -u
+# If any part of a pipeline of commands fails, the whole pipeline fails
+set -o pipefail
+
+# Script to sign executables, dylibs and frameworks in an app bundle plus the bundle itself. Called
+# from installer::simplepackage::create_package() in solenv/bin/modules/installer/simplepackage.pm
+# and the test-install target in Makefile.in.
+
+test `uname` = Darwin || { echo This is for macOS only; exit 1; }
+
+test $# = 1 || { echo Usage: $0 app-bundle; exit 1; }
+
+for V in \
+ BUILDDIR \
+ MACOSX_BUNDLE_IDENTIFIER \
+ MACOSX_CODESIGNING_IDENTITY; do
+ if test -z "$(eval echo '$'$V)"; then
+ echo No '$'$V "environment variable! This should be run in a build only"
+ exit 1
+ fi
+done
+
+APP_BUNDLE="$1"
+entitlements=
+application_identifier=
+if test -n "$ENABLE_MACOSX_SANDBOX"; then
+ # In a sandboxed build executables need the entitlements
+ entitlements="--entitlements $BUILDDIR/lo.xcent"
+ application_identifier=`/usr/libexec/PlistBuddy -c "print com.apple.application-identifier" $BUILDDIR/lo.xcent`
+ # remove the key from the entitlement - only use it when signing the whole bundle in the final step
+ /usr/libexec/PlistBuddy -c "delete com.apple.application-identifier" $BUILDDIR/lo.xcent
+ # All data files are in Resources and included in the app bundle signature
+ other_files=''
+ # HACK: remove donate menu entries, need to support apple-pay and be verified
+ # as non profit as a bare minimum to allow asking....
+ sed -I "" -e '\#<menu:menuitem menu:id=".uno:Donation"/>#d' $APP_BUNDLE/Contents/Resources/config/soffice.cfg/modules/*/menubar/menubar.xml
+else
+ # We then want to sign data files, too, hmm.
+ entitlements="--entitlements $BUILDDIR/hardened_runtime.xcent"
+ other_files="\
+ -or -name '*.fodt' -or -name 'schema.strings' -or -name 'schema.xml' \
+ -or -name '*.jar' -or -name 'LICENSE' -or -name 'LICENSE.html' \
+ -or -name '*.applescript' -or -name '*.odt'"
+fi
+
+# Sign jnilibs first as workaround for signing issue on old baseline
+# order matters/screws things up otherwise
+find -d "$APP_BUNDLE" \( -name '*.jnilib' \) ! -type l |
+ while read file; do
+ id=`echo ${file#${APP_BUNDLE}/Contents/} | sed -e 's,/,.,g'`
+ codesign --force --identifier=$MACOSX_BUNDLE_IDENTIFIER.$id --sign "$MACOSX_CODESIGNING_IDENTITY" "$file" || exit 1
+done
+
+# Sign dylibs
+#
+# The dylibs in the Python framework are called *.so. Go figure
+#
+# On Mavericks also would like to have data files signed...
+# add some where it makes sense. Make a depth-first search to sign the contents
+# of e.g. the spotlight plugin before attempting to sign the plugin itself
+
+find "$APP_BUNDLE" \( -name '*.dylib' -or -name '*.dylib.*' -or -name '*.so' \
+ $other_files \) ! -type l |
+while read file; do
+ id=`echo ${file#${APP_BUNDLE}/Contents/} | sed -e 's,/,.,g'`
+ codesign --force --identifier=$MACOSX_BUNDLE_IDENTIFIER.$id --sign "$MACOSX_CODESIGNING_IDENTITY" "$file" || exit 1
+done
+
+# Sign included bundles. First .app ones (i.e. the Python.app inside
+# the LibreOfficePython.framework. Be generic for kicks...)
+
+find "$APP_BUNDLE"/Contents -name '*.app' -type d |
+while read app; do
+ # Assume the app has a XML (and not binary) Info.plist
+ id=`grep -A 1 '<key>CFBundleIdentifier</key>' $app/Contents/Info.plist | tail -1 | sed -e 's,.*<string>,,' -e 's,</string>.*,,'`
+ codesign --options=runtime --force --identifier=$id --sign "$MACOSX_CODESIGNING_IDENTITY" $entitlements "$app" || exit 1
+done
+
+# Then .framework ones. Again, be generic just for kicks.
+
+find "$APP_BUNDLE" -name '*.framework' -type d |
+while read framework; do
+ for version in "$framework"/Versions/*; do
+ if test ! -L "$version" -a -d "$version"; then
+ # Assume the framework has a XML (and not binary) Info.plist
+ id=`grep -A 1 '<key>CFBundleIdentifier</key>' $version/Resources/Info.plist | tail -1 | sed -e 's,.*<string>,,' -e 's,</string>.*,,'`
+ if test -d $version/bin; then
+ # files in bin are not covered by signing the framework...
+ for scriptorexecutable in $(find $version/bin/ -type f); do
+ codesign --options=runtime --force --identifier=$id --sign "$MACOSX_CODESIGNING_IDENTITY" "$scriptorexecutable" || exit 1
+ done
+ fi
+ codesign --force --identifier=$id --sign "$MACOSX_CODESIGNING_IDENTITY" "$version" || exit 1
+ fi
+ done
+done
+
+# Then mdimporters
+
+find "$APP_BUNDLE" -name '*.mdimporter' -type d |
+while read bundle; do
+ codesign --force --prefix=$MACOSX_BUNDLE_IDENTIFIER. --sign "$MACOSX_CODESIGNING_IDENTITY" "$bundle" || exit 1
+done
+
+# Sign executables
+
+find "$APP_BUNDLE/Contents/MacOS" -type f |
+while read file; do
+ case "$file" in
+ */soffice)
+ ;;
+ *)
+ id=`echo ${file#${APP_BUNDLE}/Contents/} | sed -e 's,/,.,g'`
+ codesign --force --options=runtime --identifier=$MACOSX_BUNDLE_IDENTIFIER.$id --sign "$MACOSX_CODESIGNING_IDENTITY" $entitlements "$file" || exit 1
+ ;;
+ esac
+done
+
+# Sign the app bundle as a whole which means (re-)signing the
+# CFBundleExecutable from Info.plist, i.e. soffice, plus the contents
+# of the Resources tree.
+#
+# See also https://developer.apple.com/library/mac/technotes/tn2206/
+
+if test -n "$ENABLE_MACOSX_SANDBOX" && test -n "$application_identifier"; then
+ # add back the application-identifier to the entitlements
+ # testflight/beta-testing won't work if that key is used when signing the other executables
+ /usr/libexec/PlistBuddy -c "add com.apple.application-identifier string $application_identifier" $BUILDDIR/lo.xcent
+fi
+codesign --force --options=runtime --identifier="${MACOSX_BUNDLE_IDENTIFIER}" --sign "$MACOSX_CODESIGNING_IDENTITY" $entitlements "$APP_BUNDLE" || exit 1
+
+exit 0
diff --git a/solenv/bin/macosx_menubar_modification.xsl b/solenv/bin/macosx_menubar_modification.xsl
new file mode 100644
index 000000000..14a8be07c
--- /dev/null
+++ b/solenv/bin/macosx_menubar_modification.xsl
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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 .
+-->
+<xsl:stylesheet version='1.0'
+ xmlns:menu="http://openoffice.org/2001/menu"
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >
+
+ <!-- identity template, does reproduce every IN node on the output -->
+ <xsl:template match="node()|@*">
+ <xsl:copy>
+ <xsl:apply-templates select="node()|@*"/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- filtering template : removes the concerned nodes -->
+ <!-- removes the separator just before the expected item -->
+ <xsl:template match="menu:menuseparator[following-sibling::menu:menuitem[1]/@menu:id='.uno:Quit']"/>
+ <!-- suppression of the Quit item -->
+ <xsl:template match="menu:menuitem[@menu:id='.uno:Quit']"/>
+
+ <xsl:template match="menu:menuseparator[following-sibling::menu:menuitem[1]/@menu:id='.uno:About']"/>
+ <!-- suppression of the About item -->
+ <xsl:template match="menu:menuitem[@menu:id='.uno:About']"/>
+
+ <!-- suppression of the OptionsTreeDialog item -->
+ <xsl:template match="menu:menuitem[@menu:id='.uno:OptionsTreeDialog']"/>
+
+</xsl:stylesheet>
diff --git a/solenv/bin/make-raspbian-root-tarball b/solenv/bin/make-raspbian-root-tarball
new file mode 100755
index 000000000..710540957
--- /dev/null
+++ b/solenv/bin/make-raspbian-root-tarball
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+# When lacking a proper cross-compilation package system from Linux
+# (or some other Unix) to Raspbian, instead create a tarball of
+# headers, libraries and pkg-config files on a Raspbian system and
+# unpack that then on the build system, and pass in a -sysroot switch
+# to the cross-compiler.
+
+cd /
+
+# Exclude irrelevant stuff, like shared libraries that actually are
+# "modules" loaded at run-time by some software.
+
+EXCLUDE='lib/ld-linux \
+lib/klibc- \
+lib/arm-linux-gnueabihf/security/ \
+usr/lib/arm-linux-gnueabihf/ImageMagick- \
+usr/lib/arm-linux-gnueabihf/autofs/ \
+usr/lib/arm-linux-gnueabihf/directfb- \
+usr/lib/arm-linux-gnueabihf/gconv/ \
+usr/lib/arm-linux-gnueabihf/gdbus- \
+usr/lib/arm-linux-gnueabihf/gdk-pixbuf- \
+usr/lib/arm-linux-gnueabihf/gio/ \
+usr/lib/arm-linux-gnueabihf/gvfs/ \
+usr/lib/arm-linux-gnueabihf/jack/ \
+usr/lib/arm-linux-gnueabihf/libgphoto2/ \
+usr/lib/arm-linux-gnueabihf/libgphoto2_port/ \
+usr/lib/arm-linux-gnueabihf/libgtk-2.0/ \
+usr/lib/arm-linux-gnueabihf/libgtk-3.0/ \
+usr/lib/arm-linux-gnueabihf/libproxy/ \
+usr/lib/arm-linux-gnueabihf/odbc/ \
+usr/lib/arm-linux-gnueabihf/pango/ \
+usr/lib/arm-linux-gnueabihf/plymouth/ \
+usr/lib/arm-linux-gnueabihf/qt4/ \
+usr/lib/arm-linux-gnueabihf/sane \
+usr/lib/libblas.so \
+usr/lib/liblapack.so'
+
+EXCLUDE=`echo "$EXCLUDE" | tr -d '
+' | sed -e 's/ /|/g'`
+
+FILELIST=`mktemp`
+STAGINGDIR=`mktemp -d`
+
+find lib/*.so* \
+ lib/arm-linux-gnueabihf \
+ usr/include \
+ usr/lib/liblpsolve*.a \
+ usr/lib/*.so* \
+ usr/lib/arm-linux-gnueabihf \
+ usr/lib/jvm/java-6-openjdk-armhf/include \
+ usr/lib/jvm/java-6-openjdk-armhf/jre/lib/arm \
+ usr/lib/pkgconfig \
+ usr/share/pkgconfig \
+ -type f -o -type l |
+ grep -v -E "^($EXCLUDE)" >$FILELIST
+
+tar -c --files-from=$FILELIST -f - | (cd $STAGINGDIR && tar xf -)
+
+rm $FILELIST
+
+cd $STAGINGDIR
+# Change absolute symlinks to relative
+find . -type l -print0 | xargs -0 ls -ld | grep -- '-> /' |
+ while read mode links user group size month day yearortime link arrow target; do
+ target=`echo "$target" | sed -e 's,/,..;,'`
+ while test `expr index $target /` -gt 0; do
+ target=`echo "$target" | sed -e 's,/,;,'`
+ target="..;$target"
+ done
+ target=`echo "$target" | sed -e 's,;,/,g'`
+ ln -f -s $target $link
+ done
+
+RESULT=/tmp/raspbian-root-`date +%Y%m%d`.tar.gz
+tar czf $RESULT .
+
+cd /
+rm -rf $STAGINGDIR
+
+echo === Result in $RESULT ===
diff --git a/solenv/bin/make_installer.pl b/solenv/bin/make_installer.pl
new file mode 100644
index 000000000..48aaadac2
--- /dev/null
+++ b/solenv/bin/make_installer.pl
@@ -0,0 +1,26 @@
+#
+# 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 warnings;
+
+use lib ("$ENV{SRCDIR}/solenv/bin/modules");
+
+use installer qw(main);
+
+exit main();
diff --git a/solenv/bin/mkdocs.Makefile b/solenv/bin/mkdocs.Makefile
new file mode 100644
index 000000000..731b79ab9
--- /dev/null
+++ b/solenv/bin/mkdocs.Makefile
@@ -0,0 +1,46 @@
+.SUFFIXES:
+
+gb_Side=host
+BUILDDIR=$(shell pwd)
+SRCDIR:=$(abspath $(dir $(firstword $(MAKEFILE_LIST)))/../..)
+$(info SRCDIR:$(SRCDIR))
+include $(SRCDIR)/config_host.mk
+
+.PHONY: init_doxygen generate_tag generate_doc
+.DEFAULT: generate_doc
+
+prefered_modules := sw sc sd
+gbuild_modules := $(prefered_modules) $(filter-out $(prefered_modules),$(patsubst $(SRCDIR)/%/,%,$(dir $(wildcard $(SRCDIR)/*/Module_*.mk))))
+$(info gbuild_modules:$(gbuild_modules))
+
+DOXYGEN_REF_TAGFILES=$(foreach m,$(gbuild_modules), $(BUILDDIR)/docs/$(m)/$(m).tags=./$(m)/html)
+export DOXYGEN_REF_TAGFILES
+
+$(BUILDDIR)/docs/%.tag: init_doxygen
+ @echo "doxygen tag of $(basename $(notdir $@))"
+ @export DOXYGEN_INCLUDE_PATH=`echo $(SOLARINC) | sed -e 's/-I\.//g' -e 's/ -I/ /'g -e 's/ -isystem/ /g' -e 's|/usr/[^ ]*| |g'` ; \
+ $(SRCDIR)/solenv/bin/mkonedoc.sh "$(basename $(notdir $@))" "tag" "$(SRCDIR)" "$(BUILDDIR)/docs"
+ @touch $@
+
+$(BUILDDIR)/docs/%.doc: generate_tag
+ @echo "doxygen doc of $(basename $(notdir $@))"
+ @export DOXYGEN_INCLUDE_PATH=`echo $(SOLARINC) | sed -e 's/-I\.//g' -e 's/ -I/ /'g -e 's/ -isystem/ /g' -e 's|/usr/[^ ]*| |g'` ; \
+ $(SRCDIR)/solenv/bin/mkonedoc.sh "$(basename $(notdir $@))" "doc" "$(SRCDIR)" "$(BUILDDIR)/docs"
+ @touch $@
+
+
+
+all: generate_doc
+
+generate_tag: $(foreach m,$(gbuild_modules), $(BUILDDIR)/docs/$(m).tag)
+ @echo "all tag generated"
+
+generate_doc: $(foreach m,$(gbuild_modules), $(BUILDDIR)/docs/$(m).doc)
+ @$(SRCDIR)/solenv/bin/mkdocs_portal.sh "$(SRCDIR)" "$(BUILDDIR)/docs"
+ @echo "Done."
+
+init_doxygen:
+ @echo "init"
+ @rm -fr $(BUILDDIR)/docs
+ @mkdir $(BUILDDIR)/docs
+
diff --git a/solenv/bin/mkdocs.sh b/solenv/bin/mkdocs.sh
new file mode 100755
index 000000000..b61d53a29
--- /dev/null
+++ b/solenv/bin/mkdocs.sh
@@ -0,0 +1,281 @@
+#!/usr/bin/env bash
+#
+# 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/.
+#
+# Doxygen / README doc generation
+#
+# See git for contributors
+#
+
+function header {
+ title=$1
+ breadcrumb=$2
+ output=$3
+
+ cat - > $output <<EOF
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+ <title>$title</title>
+
+ <style>
+ * { margin: 0; padding: 0; }
+ body { font-family: sans-serif; font-size: 12px; }
+ #head { padding: 20px; background: #00A500; }
+ #head a { color: #000; }
+ #body { padding: 20px; }
+ #foot { padding: 10px; font-size: 9px; border-top: 1px #18A303 solid; margin-top: 25px; }
+ p { line-height: 1.7em; margin-bottom: 1em; }
+ pre { margin-bottom: 0.5em; }
+ .multi-col { -moz-column-width: 20em; -webkit-column-width: 20em; -moz-column-gap: 1em; -webkit-column-gap: 1em; }
+ h1 { margin-bottom: 0.5em; }
+ h2,h3,h4 { margin: 1.3em 0 0.5em 0; }
+ ul, ol { margin: 0.5em 1.5em; }
+ </style>
+</head>
+<body>
+ <div id="head">
+ <h1>$title</h1>
+ <p>$breadcrumb</p>
+ </div>
+ <div id="body" style="multi-col">
+EOF
+}
+
+function footer {
+ output=$1
+
+ cat - >> $output <<EOF
+
+</div>
+<div id="foot">
+ <small>
+ <p>Generated by Libreoffice <a href="https://git.libreoffice.org/core/+/refs/heads/master/solenv/bin/mkdocs.sh">Module Description Tool</a></p>
+ <p>Last updated:
+EOF
+LANG= date >> $output
+cat - >> $output <<EOF
+ </p>
+ </small>
+</div>
+</body>
+</html>
+EOF
+
+}
+
+function proc_text {
+ # Local links: [[...]]
+ # Git links: [git:...]
+ # Other remote links: [...]
+ # Headings: == bleh ==
+ # Paragraphs: \n\n
+ sed -re ' s/\[\[([-_a-zA-Z0-9]+)\]\]/<a href="\1.html">\1<\/a>/g' - \
+ | sed -re ' s/\[git:([^]]+)\]/<a href="https:\/\/git.libreoffice.org\/core\/+\/refs\/heads\/master\/\1">\1<\/a>/g' \
+ | sed -re ' s/\[([^]]+)\]/<a href="\1">\1<\/a>/g' \
+ | sed -re ' s/====([^=]+)====/<h4>\1<\/h4>/g' \
+ | sed -re ' s/===([^=]+)===/<h3>\1<\/h3>/g' \
+ | sed -re ' s/==([^=]+)==/<h2>\1<\/h2>/g' \
+ | sed -re ':a;N;$!ba;s/\n\n/<\/p><p>/g' \
+ | awk 'BEGIN { print "<p>" } { print } END { print "</p>" }'
+}
+
+function proc_text_markdown {
+ sed -re ' s/\[git:([^]]+)\]/<a href="\.\.\/\1">\1<\/a>/g'
+}
+
+function check_cmd {
+ cmds_needed="$1"
+ error_msg="$2"
+
+ found=0; cmd=
+ for cmd_needed in $cmds_needed; do
+ which $cmd_needed > /dev/null 2>&1 && { found=1; cmd=$cmd_needed; }
+ done
+ if [ $found = 0 ]; then
+ echo "$error_msg" >&2
+ exit 1
+ fi
+ export "${cmds_needed%% *}"=$cmd
+}
+
+function setup {
+ parm=$1
+ if [ -z "${!parm}" ] ; then
+ echo "grep \"${parm}=\" ./config_host.mk | sed -re \" s/${parm}=//\")"
+ echo "$parm=$(grep \"${parm}=\" ./config_host.mk | sed -re \" s/${parm}=//\")"
+ eval "$parm=$(grep \"${parm}=\" ./config_host.mk | sed -re \" s/${parm}=//\")"
+ fi
+ if [ -z "${!parm}" ] ; then
+ echo "could not determine $parm" >&2
+ exit 1
+ fi
+}
+
+# binaries that we need
+check_cmd doxygen "You need doxygen for doc generation"
+check_cmd dot "You need the graphviz tools to create the nice inheritance graphs"
+check_cmd "markdown markdown2 markdown2-3" "You need either markdown or markdown2 in order to convert README.md into html"
+
+# suck setup
+setup "SOLARINC"
+shopt -s nullglob
+
+# Title of the documentation
+DOXYGEN_PROJECT_PREFIX="LibreOffice"
+
+# get list of modules
+if [ -z "$INPUT_PROJECTS" ]; then
+ INPUT_PROJECTS="`ls */Module_*.mk | sed 's#/.*##'`"
+fi
+
+
+# output directory for generated documentation
+BASE_OUTPUT="$1"
+mkdir -p "$BASE_OUTPUT" || {
+ echo "Cannot create $BASE_OUTPUT"
+ exit 1
+}
+
+# paths for binary and configuration file
+BASE_PATH=`pwd`
+DOXYGEN_CFG="$2"
+if test ! -f "$DOXYGEN_CFG"; then
+ echo "doxygen.cfg not found"
+ exit 1
+fi
+
+# strip -I. and bin -I prefix; exclude system headers
+DOXYGEN_INCLUDE_PATH=`echo $SOLARINC | sed -e 's/-I\.//g' -e 's/ -I/ /'g -e 's/ -isystem/ /g' -e 's|/usr/[^ ]*| |g'`
+
+# setup version string
+DOXYGEN_VERSION="master"
+
+
+###################################################
+#
+# Generate docs
+#
+###################################################
+
+# cleanup
+echo "cleaning up" && rm -rf $BASE_OUTPUT/*
+
+# make the stuff world-readable
+umask 022
+
+# generate docs
+echo "generating doxygen docs"
+DOXYGEN_REF_TAGFILES=""
+for PROJECT in $INPUT_PROJECTS;
+do
+ # avoid processing of full project subdirs, only add source and inc
+
+ # project header files can be in $PROJECT/inc and/or include/$PROJECT
+ if [ -d "$PROJECT/inc" ]; then
+ PROJECT_INCLUDE="$PROJECT/inc"
+ else
+ PROJECT_INCLUDE=""
+ fi
+
+ if [ -d "include/$PROJECT" ]; then
+ PROJECT_INCLUDE="$PROJECT_INCLUDE include/$PROJECT"
+ if [ "$PROJECT" = "sal" ]; then
+ PROJECT_INCLUDE="$PROJECT_INCLUDE include/osl include/rtl"
+ fi
+ fi
+
+ DOXYGEN_INPUT=`printf "%s" "$PROJECT/source $PROJECT_INCLUDE"`
+
+ DOXYGEN_OUTPUT="$BASE_OUTPUT/$PROJECT"
+ DOXYGEN_OUR_TAGFILE="$DOXYGEN_OUTPUT/$PROJECT.tags"
+ DOXYGEN_PROJECTNAME="$DOXYGEN_PROJECT_PREFIX Module $PROJECT"
+
+ # export variables referenced in doxygen config file
+ export DOXYGEN_INPUT
+ export DOXYGEN_OUTPUT
+ export DOXYGEN_INCLUDE_PATH
+ export DOXYGEN_VERSION
+ export DOXYGEN_OUR_TAGFILE
+ export DOXYGEN_REF_TAGFILES
+ export DOXYGEN_PROJECTNAME
+
+ # debug
+ echo "Calling $DOXYGEN_PATH/doxygen $DOXYGEN_CFG with"
+ echo "Input: $DOXYGEN_INPUT"
+ echo "Output: $DOXYGEN_OUTPUT"
+ echo "Include: $DOXYGEN_INCLUDE_PATH"
+ echo "Version: $DOXYGEN_VERSION"
+ echo "Tagfile: $DOXYGEN_OUR_TAGFILE"
+ echo "Ref-Tags: $DOXYGEN_REF_TAGFILES"
+ echo "Title: $DOXYGEN_PROJECTNAME"
+
+ nice -15 doxygen "$DOXYGEN_CFG" >>$BASE_OUTPUT/doxygen.log 2>&1 || exit 1
+
+ # setup referenced tagfiles for next round
+ DOXYGEN_REF_TAGFILES="$DOXYGEN_REF_TAGFILES $DOXYGEN_OUR_TAGFILE=$BASE_URL/$PROJECT/html"
+done
+
+# generate entry page
+echo "generating index page"
+header "LibreOffice Modules" " " "$BASE_OUTPUT/index.html"
+for module_name in *; do
+ if [ -d $module_name ]; then
+ cur_file=$(echo $module_name/README.md)
+ if [ -f "$cur_file" ]; then
+ # write index.html entry
+ text=$(echo -e "<h2><a href=\"${module_name}.html\">${module_name}</a></h2>\n")
+
+ if [ ${cur_file: -3} == ".md" ]; then
+ # This is a markdown file.
+ header_text="$(head -n1 $cur_file)"
+ header_text="$(echo ${header_text} | sed -e 's/^\#*//g')"
+ text="${text}${header_text}"
+ else
+ text="${text}$(head -n1 $cur_file | proc_text)"
+ fi
+ echo -e "$text" >> "$BASE_OUTPUT/index.html"
+
+ # write detailed module content
+ header "$module_name" "<a href=\"index.html\">LibreOffice</a> &raquo; ${module_name}" "$BASE_OUTPUT/${module_name}.html"
+ text="<p><b>View module in:</b>"
+ text="${text} &nbsp; <a href=\"https://git.libreoffice.org/core/+/refs/heads/master/${module_name}\">git</a>"
+ if $(echo $INPUT_PROJECTS | grep -q $module_name); then
+ text="${text} &nbsp; <a href=\"${module_name}/html/classes.html\">Doxygen</a>"
+ fi
+ text="${text} </p><p>&nbsp;</p>"
+ echo -e "$text" >> "$BASE_OUTPUT/${module_name}.html"
+
+ if [ ${cur_file: -3} == ".md" ]; then
+ # This is a markdown file.
+ text="$(${markdown} $cur_file | proc_text_markdown)"
+ echo -e "$text" >> "$BASE_OUTPUT/${module_name}.html"
+ else
+ proc_text < $cur_file >> "$BASE_OUTPUT/${module_name}.html"
+ fi
+ footer "$BASE_OUTPUT/${module_name}.html"
+ else
+ empty_modules[${#empty_modules[*]}]=$module_name
+ fi
+ fi
+done
+
+if [ ${#empty_modules[*]} -gt 10 ]; then
+ echo -e "<p>&nbsp;</p><p>READMEs were not available for these modules:</p><ul>\n" >> "$BASE_OUTPUT/index.html"
+ for module_name in "${empty_modules[@]}"; do
+ # Do not process these directories
+ if [[ "$module_name" =~ ^(autom4te.cache|dictionaries|docs|helpcompiler|helpcontent2|include|instdir|lo|translations|workdir)$ ]]; then
+ continue
+ fi
+ echo -e "<li><a href=\"https://git.libreoffice.org/core/+/refs/heads/master/${module_name}\">${module_name}</a></li>\n" >> "$BASE_OUTPUT/index.html"
+ done
+ echo -e "</ul>\n" >> "$BASE_OUTPUT/index.html"
+fi
+
+footer "$BASE_OUTPUT/index.html"
+
+## done
diff --git a/solenv/bin/mkdocs_portal.sh b/solenv/bin/mkdocs_portal.sh
new file mode 100755
index 000000000..8fa120a77
--- /dev/null
+++ b/solenv/bin/mkdocs_portal.sh
@@ -0,0 +1,157 @@
+#!/usr/bin/env bash
+
+if [ -n "$debug" ] ; then
+ set -x
+fi
+
+markdown="markdown"
+SRCDIR="$1"
+BASE_OUTPUT="$2"
+
+pushd "$SRCDIR" > /dev/null
+
+
+function header
+{
+ local title="$1"
+ local breadcrumb="$2"
+ local output="$3"
+
+ cat - > $output <<EOF
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+ <title>$title</title>
+
+ <style>
+ * { margin: 0; padding: 0; }
+ body { font-family: sans-serif; font-size: 12px; }
+ #head { padding: 20px; background: #00A500; }
+ #head a { color: #000; }
+ #body { padding: 20px; }
+ #foot { padding: 10px; font-size: 9px; border-top: 1px #18A303 solid; margin-top: 25px; }
+ p { line-height: 1.7em; margin-bottom: 1em; }
+ pre { margin-bottom: 0.5em; }
+ .multi-col { -moz-column-width: 20em; -webkit-column-width: 20em; -moz-column-gap: 1em; -webkit-column-gap: 1em; }
+ h1 { margin-bottom: 0.5em; }
+ h2,h3,h4 { margin: 1.3em 0 0.5em 0; }
+ ul, ol { margin: 0.5em 1.5em; }
+ </style>
+</head>
+<body>
+ <div id="head">
+ <h1>${title}</h1>
+ <p>${breadcrumb}</p>
+ </div>
+ <div id="body" style="multi-col">
+EOF
+}
+
+function footer
+{
+local output="$1"
+
+ cat - >> $output <<EOF
+
+</div>
+<div id="foot">
+ <small>
+ <p>Generated by Libreoffice CI on $(hostname)</p>
+ <p>Last updated:
+EOF
+
+date '+%F %T' >> $output
+cat - >> $output <<EOF
+ | <a href="http://www.documentfoundation.org/privacy">Privacy Policy</a> | <a href="http://www.documentfoundation.org/imprint">Impressum (Legal Info)</a>
+ </p>
+ </small>
+</div>
+</body>
+</html>
+EOF
+
+}
+
+function proc_text
+{
+ # Local links: [[...]]
+ # Git links: [git:...]
+ # Other remote links: [...]
+ # Headings: == bleh ==
+ # Paragraphs: \n\n
+ sed -re ' s/\[\[([-_a-zA-Z0-9]+)\]\]/<a href="\1.html">\1<\/a>/g' - \
+ | sed -re ' s/\[git:([^]]+)\]/<a href="https:\/\/git.libreoffice.org\/core\/+\/refs\/heads\/master\/\1">\1<\/a>/g' \
+ | sed -re ' s/\[([^]]+)\]/<a href="\1">\1<\/a>/g' \
+ | sed -re ' s/====([^=]+)====/<h4>\1<\/h4>/g' \
+ | sed -re ' s/===([^=]+)===/<h3>\1<\/h3>/g' \
+ | sed -re ' s/==([^=]+)==/<h2>\1<\/h2>/g' \
+ | sed -re ':a;N;$!ba;s/\n\n/<\/p><p>/g' \
+ | awk 'BEGIN { print "<p>" } { print } END { print "</p>" }'
+}
+
+function proc_text_markdown {
+ sed -re ' s/\[git:([^]]+)\]/<a href="https:\/\/git.libreoffice.org\/core\/+\/refs\/heads\/master\/\1">\1<\/a>/g'
+}
+
+# generate entry page
+
+echo "generating index page"
+header "LibreOffice Modules" " " "$BASE_OUTPUT/index.html"
+
+for module_name in *; do
+ if [ -d $module_name ]; then
+ cur_file=$(echo $module_name/README.md)
+ if [ -f "$cur_file" ]; then
+ # write index.html entry
+ text=$(echo -e "<h2><a href=\"${module_name}.html\">${module_name}</a></h2>\n")
+ if [ ${cur_file: -3} == ".md" ]; then
+ # This is a markdown file.
+ header_text="$(head -n1 $cur_file)"
+ header_text="$(echo ${header_text} | sed -e 's/^\#*//g')"
+ text="${text}${header_text}"
+ else
+ text="${text}$(head -n1 $cur_file | proc_text)"
+ fi
+ echo -e "$text" >> "$BASE_OUTPUT/index.html"
+
+ # write detailed module content
+ header "$module_name" "<a href=\"index.html\">LibreOffice</a> &raquo; ${module_name}" "$BASE_OUTPUT/${module_name}.html"
+ text="<p><b>View module in:</b>"
+ text="${text} &nbsp; <a href=\"https://git.libreoffice.org/core/+/refs/heads/master/${module_name}\">git</a>"
+ if $(echo $INPUT_PROJECTS | grep -q $module_name); then
+ text="${text} &nbsp; <a href=\"${module_name}/html/classes.html\">Doxygen</a>"
+ fi
+ text="${text} </p><p>&nbsp;</p>"
+ echo -e "$text" >> "$BASE_OUTPUT/${module_name}.html"
+
+ if [ ${cur_file: -3} == ".md" ]; then
+ # This is a markdown file.
+ text="$(${markdown} $cur_file | proc_text_markdown)"
+ echo -e "$text" >> "$BASE_OUTPUT/${module_name}.html"
+ else
+ proc_text < $cur_file >> "$BASE_OUTPUT/${module_name}.html"
+ fi
+ footer "$BASE_OUTPUT/${module_name}.html"
+ else
+ empty_modules[${#empty_modules[*]}]=$module_name
+ fi
+ fi
+done
+
+if [ ${#empty_modules[*]} -gt 10 ]; then
+ echo -e "<p>&nbsp;</p><p>READMEs were not available for these modules:</p><ul>\n" >> "$BASE_OUTPUT/index.html"
+ for module_name in "${empty_modules[@]}"; do
+ if [[ "$module_name" =~ ^(autom4te.cache|dictionaries|docs|helpcompiler|helpcontent2|include|instdir|lo|translations|workdir)$ ]]
+ then
+ continue
+ fi
+ echo -e "<li><a href=\"https://git.libreoffice.org/core/+/refs/heads/master/${module_name}\">${module_name}</a></li>\n" >> "$BASE_OUTPUT/index.html"
+ done
+ echo -e "</ul>\n" >> "$BASE_OUTPUT/index.html"
+fi
+
+footer "$BASE_OUTPUT/index.html"
+
+popd > /dev/null
+
+## done
diff --git a/solenv/bin/mkonedoc.sh b/solenv/bin/mkonedoc.sh
new file mode 100755
index 000000000..654ce5681
--- /dev/null
+++ b/solenv/bin/mkonedoc.sh
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+
+module="$1"
+mode="$2"
+SRCDIR="$3"
+BASE_OUTPUT="$4"
+
+
+module_include=""
+if [ -d "$module/inc" ]; then
+ module_include="$module/inc"
+fi
+
+if [ -d "include/$module" ]; then
+ module_include="$module_include include/$module"
+fi
+
+DOXYGEN_INPUT=`printf "%s" "$module/source $module_include"`
+DOXYGEN_OUTPUT="$BASE_OUTPUT/$module"
+DOXYGEN_VERSION="master"
+DOXYGEN_PROJECTNAME="LibreOffice Module $module"
+if [ "$mode" = "tag" ] ; then
+ DOXYGEN_OUR_TAGFILE="$DOXYGEN_OUTPUT/$module.tags"
+ DOXYGEN_REF_TAGFILES=
+else
+ DOXYGEN_OUR_TAGFILE="$DOXYGEN_OUTPUT/$module.tags2"
+ DOXYGEN_REF_TAGFILES="$(echo $DOXYGEN_REF_TAGFILES | sed -e "s@$DOXYGEN_OUTPUT/$module.tags@@")"
+fi
+
+# export variables referenced in doxygen config file
+export DOXYGEN_INPUT
+export DOXYGEN_OUTPUT
+export DOXYGEN_INCLUDE_PATH
+export DOXYGEN_VERSION
+export DOXYGEN_OUR_TAGFILE
+export DOXYGEN_REF_TAGFILES
+export DOXYGEN_PROJECTNAME
+
+
+echo "Calling doxygen mode $mode for $module"
+echo "using tagfiles : $DOXYGEN_REF_TAGFILES" >> $BASE_OUTPUT/$module.log 2>&1
+doxygen "$SRCDIR/solenv/inc/doxygen_$mode.cfg" >> $BASE_OUTPUT/$module.log 2>&1
+echo "$(date "+%F %T") doxygen $module.$mode rc:$?"
+
+
diff --git a/solenv/bin/modules/RepositoryHelper.pm b/solenv/bin/modules/RepositoryHelper.pm
new file mode 100644
index 000000000..29001f178
--- /dev/null
+++ b/solenv/bin/modules/RepositoryHelper.pm
@@ -0,0 +1,161 @@
+# -*- Mode: Perl; tab-width: 4; indent-tabs-mode: nil; -*-
+#
+# 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 .
+#
+
+#*************************************************************************
+#
+# RepositoryHelper - Perl for working with repositories
+#
+# usage: see below
+#
+#*************************************************************************
+
+package RepositoryHelper;
+
+use strict;
+
+
+use Carp;
+use Cwd qw (cwd);
+use File::Basename;
+#use File::Temp qw(tmpnam);
+
+my $debug = 0;
+
+##### profiling #####
+
+##### ctor #####
+
+sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $initial_directory = shift;
+ if ($initial_directory) {
+ $initial_directory = Cwd::realpath($initial_directory);
+ } else {
+ if ( defined $ENV{PWD} ) {
+ $initial_directory = $ENV{PWD};
+ } elsif (defined $ENV{_cwd}) {
+ $initial_directory = $ENV{_cwd};
+ } else {
+ $initial_directory = cwd();
+ };
+ };
+ my $self = {};
+ $self->{INITIAL_DIRECTORY} = $initial_directory;
+ $self->{REPOSITORY_ROOT} = undef;
+ if (! search_via_build_lst($self))
+ {
+ croak('Cannot determine source directory/repository for ' . $self->{INITIAL_DIRECTORY});
+ }
+ bless($self, $class);
+ return $self;
+}
+
+##### methods #####
+sub get_repository_root
+{
+ my $self = shift;
+ return $self->{REPOSITORY_ROOT};
+}
+
+sub get_initial_directory
+{
+ my $self = shift;
+ return $self->{INITIAL_DIRECTORY};
+}
+
+sub search_via_build_lst {
+ my $self = shift;
+ my $previous_dir = '';
+ my $rep_root_candidate = $self->{INITIAL_DIRECTORY};
+ do {
+ my $test_file;
+ if ($rep_root_candidate eq '/') {
+ $test_file = '/prj/build.lst';
+ } else {
+ $test_file = $rep_root_candidate . '/prj/build.lst';
+ };
+ if (-e $test_file) {
+ $self->{REPOSITORY_ROOT} = File::Basename::dirname($rep_root_candidate);
+ return 1;
+ };
+ $previous_dir = $rep_root_candidate;
+ $rep_root_candidate = File::Basename::dirname($rep_root_candidate);
+ return 0 if ((!$rep_root_candidate) || ($rep_root_candidate eq $previous_dir));
+ }
+ while (chdir "$rep_root_candidate");
+};
+
+##### finish #####
+
+1; # needed by use or require
+
+__END__
+
+=head1 NAME
+
+RepositoryHelper - Perl module for working with repositories
+
+=head1 SYNOPSIS
+
+ # example that will analyze sources and return the source root directory
+
+ use RepositoryHelper;
+
+ # Create a new instance:
+ $a = RepositoryHelper->new();
+
+ # Get repositories for the actual workspace:
+ $a->get_repository_root();
+
+
+=head1 DESCRIPTION
+
+RepositoryHelper is a perlPerl module for working with repositories
+in the database.
+
+Methods:
+
+RepositoryHelper::new()
+
+Creates a new instance of RepositoryHelper. Can be initialized by: some path which likely to belong to a repository, default - empty, the current dir will be taken.
+
+RepositoryHelper::get_repository_root()
+
+Returns the repository root, retrieved by educated guess...
+
+RepositoryHelper::get_initial_directory()
+
+Returns full path to the initialisation directory.
+
+=head2 EXPORT
+
+RepositoryHelper::new()
+RepositoryHelper::get_repository_root()
+RepositoryHelper::get_initial_directory()
+
+=head1 AUTHOR
+
+Vladimir Glazunov, vg@openoffice.org
+
+=head1 SEE ALSO
+
+perl(1).
+
+=cut
diff --git a/solenv/bin/modules/installer.pm b/solenv/bin/modules/installer.pm
new file mode 100644
index 000000000..a4075fec5
--- /dev/null
+++ b/solenv/bin/modules/installer.pm
@@ -0,0 +1,1713 @@
+#
+# 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 .
+#
+
+package installer;
+
+use base 'Exporter';
+
+use Cwd;
+use Data::Dumper;
+use File::Copy;
+use List::Util qw(shuffle);
+use installer::control;
+use installer::converter;
+use installer::copyproject;
+use installer::download;
+use installer::environment;
+use installer::epmfile;
+use installer::files;
+use installer::filelists;
+use installer::globals;
+use installer::helppack;
+use installer::languagepack;
+use installer::languages;
+use installer::logger;
+use installer::packagelist;
+use installer::parameter;
+use installer::pathanalyzer;
+use installer::profiles;
+use installer::scpzipfiles;
+use installer::scriptitems;
+use installer::setupscript;
+use installer::simplepackage;
+use installer::strip qw(strip_libraries);
+use installer::systemactions;
+use installer::windows::assembly;
+use installer::windows::binary;
+use installer::windows::component;
+use installer::windows::createfolder;
+use installer::windows::directory;
+use installer::windows::feature;
+use installer::windows::featurecomponent;
+use installer::windows::file;
+use installer::windows::font;
+use installer::windows::icon;
+use installer::windows::idtglobal;
+use installer::windows::inifile;
+use installer::windows::media;
+use installer::windows::mergemodule;
+use installer::windows::msiglobal;
+use installer::windows::msishortcutproperty;
+use installer::windows::msp;
+use installer::windows::property;
+use installer::windows::removefile;
+use installer::windows::registry;
+use installer::windows::shortcut;
+use installer::windows::strip;
+use installer::windows::update;
+use installer::windows::upgrade;
+use installer::worker;
+use installer::ziplist qw(read_ziplist);
+
+our @EXPORT_OK = qw(main);
+
+sub main {
+ installer::logger::starttime();
+
+ my $exit_code = 0;
+
+ eval {
+ run();
+ };
+ if ($@) {
+ my $message = "ERROR: $@";
+
+ warn "ERROR: Failure in installer.pm\n";
+ warn "$message\n";
+ $exit_code = -1;
+
+ cleanup_on_error($message);
+ }
+
+ installer::logger::stoptime();
+
+ return $exit_code;
+}
+
+sub run {
+ installer::logger::print_message( "... checking environment variables ...\n" );
+ my $environmentvariableshashref = installer::control::check_system_environment();
+
+ installer::environment::set_global_environment_variables($environmentvariableshashref);
+
+ #################################
+ # Check and output of parameter
+ #################################
+
+ installer::parameter::saveparameter();
+ installer::parameter::getparameter();
+
+ installer::parameter::control_fundamental_parameter();
+ installer::parameter::setglobalvariables();
+ installer::parameter::control_required_parameter();
+
+ if (!($installer::globals::languages_defined_in_productlist)) { installer::languages::analyze_languagelist(); }
+ installer::parameter::outputparameter();
+
+ $installer::globals::build = uc($installer::globals::build); # using "SRC680" instead of "src680"
+
+ ######################################
+ # Creating the log directory
+ ######################################
+
+ my $empty = "";
+ my $loggingdir = installer::systemactions::create_directories("logging", \$empty);
+ $loggingdir = $loggingdir . $installer::globals::separator;
+ $installer::globals::exitlog = $loggingdir;
+
+ my $installdir = "";
+ my $currentdir = cwd();
+ my $shipinstalldir = "";
+ my $current_install_number = "";
+
+ ######################################
+ # Checking the system requirements
+ ######################################
+
+ installer::logger::print_message( "... checking required files ...\n" );
+ installer::control::check_system_path();
+
+ my $pathvariableshashref = installer::environment::create_pathvariables($environmentvariableshashref);
+
+ ###############################################
+ # Checking saved setting for Windows patches
+ ###############################################
+
+ if (( $installer::globals::iswindowsbuild ) && ( $installer::globals::prepare_winpatch )) { installer::windows::msiglobal::read_saved_mappings(); }
+
+ ###################################################
+ # Analyzing the settings and variables in zip.lst
+ ###################################################
+
+ my ($allsettingsarrayref, $allvariableshashref) = read_ziplist($installer::globals::ziplistname);
+
+ ########################################################
+ # Check if this is simple packaging mechanism
+ ########################################################
+
+ installer::simplepackage::check_simple_packager_project($allvariableshashref);
+
+ ####################################################################
+ # setting global variables
+ ####################################################################
+
+ installer::control::set_addsystemintegration($allvariableshashref);
+
+ ########################################################
+ # Re-define logging dir, after all variables are set
+ ########################################################
+
+ my $oldloggingdir = $loggingdir;
+ # FIXME: It would be better to use installer::systemactions::remove_complete_directory
+ # Though, we would need to remove only the lang-specific subdirectory for langpacks and helppacks
+ rmdir $oldloggingdir;
+ $loggingdir = installer::systemactions::create_directories("logging", \$empty);
+ $loggingdir = $loggingdir . $installer::globals::separator;
+ $installer::globals::exitlog = $loggingdir;
+
+ # checking, whether this is an opensource product
+
+ if (!($installer::globals::is_copy_only_project)) { installer::ziplist::set_manufacturer($allvariableshashref); }
+
+ ##############################################
+ # Checking version of makecab.exe
+ ##############################################
+
+ if ( $installer::globals::iswindowsbuild && (!defined($ENV{'CROSS_COMPILING'}) || $ENV{'CROSS_COMPILING'} ne 'TRUE' || $installer::globals::packageformat eq 'msi')) { installer::control::check_makecab_version(); }
+
+ ##########################################################
+ # Getting the include path from the settings in zip list
+ ##########################################################
+
+ my $includepathref = installer::ziplist::getinfofromziplist($allsettingsarrayref, "include");
+ if ( $$includepathref eq "" )
+ {
+ die 'Definition for "include" not found in ' . $installer::globals::ziplistname;
+ }
+
+ my $includepatharrayref = installer::converter::convert_stringlist_into_array($includepathref, ",");
+
+ installer::ziplist::replace_all_variables_in_paths($includepatharrayref, $pathvariableshashref);
+
+ installer::ziplist::replace_minor_in_paths($includepatharrayref);
+
+ installer::ziplist::replace_packagetype_in_paths($includepatharrayref);
+
+ installer::ziplist::resolve_relative_paths($includepatharrayref);
+
+ installer::ziplist::remove_ending_separator($includepatharrayref);
+
+ ##############################################
+ # Collecting all files from all include
+ # paths in global hashes.
+ ##############################################
+
+ installer::worker::collect_all_files_from_includepaths($includepatharrayref);
+
+ ##############################################
+ # Analyzing languages in zip.lst if required
+ # Probably no longer used.
+ ##############################################
+
+ if ($installer::globals::languages_defined_in_productlist) { installer::languages::get_info_about_languages($allsettingsarrayref); }
+
+ #####################################
+ # Windows requires the LCID list
+ #####################################
+
+ if ( $installer::globals::iswindowsbuild ) { installer::control::read_lcidlist($includepatharrayref); }
+
+ #####################################################################
+ # Including additional inc files for variable settings, if defined
+ #####################################################################
+
+ if ( $allvariableshashref->{'ADD_INCLUDE_FILES'} ) { installer::worker::add_variables_from_inc_to_hashref($allvariableshashref, $includepatharrayref); }
+
+ #####################################
+ # Analyzing the setup script
+ #####################################
+
+ if ($installer::globals::setupscript_defined_in_productlist) { installer::setupscript::set_setupscript_name($allsettingsarrayref, $includepatharrayref); }
+
+ installer::logger::globallog("setup script file: $installer::globals::setupscriptname");
+
+ installer::logger::print_message( "... analyzing script: $installer::globals::setupscriptname ... \n" );
+
+ my $setupscriptref = installer::files::read_file($installer::globals::setupscriptname); # Reading the setup script file
+
+ # Resolving variables defined in the zip list file into setup script
+ # All the variables are defined in $allvariablesarrayref
+
+ installer::scpzipfiles::replace_all_ziplistvariables_in_file($setupscriptref, $allvariableshashref);
+
+ # Resolving %variables defined in the installation object
+
+ my $allscriptvariablesref = installer::setupscript::get_all_scriptvariables_from_installation_object($setupscriptref);
+
+ installer::setupscript::add_lowercase_productname_setupscriptvariable($allscriptvariablesref);
+
+ installer::setupscript::resolve_lowercase_productname_setupscriptvariable($allscriptvariablesref);
+
+ $setupscriptref = installer::setupscript::replace_all_setupscriptvariables_in_script($setupscriptref, $allscriptvariablesref);
+
+ # Adding all variables defined in the installation object into the hash of all variables.
+ # This is needed if variables are defined in the installation object, but not in the zip list file.
+ # If there is a definition in the zip list file and in the installation object, the installation object is more important
+
+ installer::setupscript::add_installationobject_to_variables($allvariableshashref, $allscriptvariablesref);
+
+ # Replacing preset properties, not using the default mechanisms (for example for UNIXPRODUCTNAME)
+ installer::setupscript::replace_preset_properties($allvariableshashref);
+
+ installer::scpzipfiles::replace_all_ziplistvariables_in_file($setupscriptref, $allvariableshashref);
+
+
+ installer::logger::log_hashref($allvariableshashref);
+
+ installer::logger::print_message( "... analyzing directories ... \n" );
+
+ # Collect all directories in the script to get the destination dirs
+
+ my $dirsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Directory");
+
+ if ( $allvariableshashref->{'SHIFT_BASIS_INTO_BRAND_LAYER'} ) { $dirsinproductarrayref = installer::scriptitems::shift_basis_directory_parents($dirsinproductarrayref); }
+ if ( $allvariableshashref->{'OFFICEDIRECTORYNAME'} ) { installer::scriptitems::set_officedirectory_name($dirsinproductarrayref, $allvariableshashref->{'OFFICEDIRECTORYNAME'}); }
+
+
+ installer::scriptitems::resolve_all_directory_names($dirsinproductarrayref);
+
+ installer::logger::print_message( "... analyzing files ... \n" );
+
+ my $filesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "File");
+
+ if (( ! $installer::globals::iswindowsbuild ) &&
+ ( ! $installer::globals::isrpmbuild ) &&
+ ( ! $installer::globals::isdebbuild ) &&
+ ( ! $installer::globals::issolarispkgbuild ) &&
+ ( $installer::globals::packageformat ne "installed" ) &&
+ ( $installer::globals::packageformat ne "dmg" ) &&
+ ( $installer::globals::packageformat ne "archive" ))
+ { installer::control::check_oxtfiles($filesinproductarrayref); }
+
+ if (! $installer::globals::languagepack)
+ {
+ $filesinproductarrayref = installer::scriptitems::remove_Languagepacklibraries_from_Installset($filesinproductarrayref);
+ }
+
+ if (! $installer::globals::helppack)
+ {
+ $filesinproductarrayref = installer::scriptitems::remove_Helppacklibraries_from_Installset($filesinproductarrayref);
+ }
+
+ installer::logger::print_message( "... analyzing scpactions ... \n" );
+
+ my $scpactionsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "ScpAction");
+
+ if ( $installer::globals::languagepack ) { installer::scriptitems::use_langpack_copy_scpaction($scpactionsinproductarrayref); }
+ elsif ( $installer::globals::helppack ) { installer::scriptitems::use_langpack_copy_scpaction($scpactionsinproductarrayref); }
+ # TODO: why is this not done in scp2 based on the value of $(ENABLE_RELEASE_BUILD)?
+ elsif ( $allvariableshashref->{'PRODUCTNAME'} eq "LibreOfficeDev" ) { installer::scriptitems::use_devversion_copy_scpaction($scpactionsinproductarrayref); }
+
+ installer::scriptitems::change_keys_of_scpactions($scpactionsinproductarrayref);
+
+ installer::logger::print_message( "... analyzing shortcuts ... \n" );
+
+ my $linksinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Shortcut");
+
+ installer::logger::print_message( "... analyzing unix links ... \n" );
+
+ my $unixlinksinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Unixlink");
+
+ installer::logger::print_message( "... analyzing profile ... \n" );
+
+ my $profilesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Profile");
+
+ installer::logger::print_message( "... analyzing profileitems ... \n" );
+
+ my $profileitemsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "ProfileItem");
+
+ my $folderinproductarrayref;
+ my $folderitemsinproductarrayref;
+ my $folderitempropertiesinproductarrayref;
+ my $registryitemsinproductarrayref;
+ my $windowscustomactionsarrayref;
+ my $mergemodulesarrayref;
+
+ if ( $installer::globals::iswindowsbuild ) # Windows specific items: Folder, FolderItem, RegistryItem, WindowsCustomAction
+ {
+ installer::logger::print_message( "... analyzing folders ... \n" );
+
+ $folderinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Folder");
+
+ installer::logger::print_message( "... analyzing folderitems ... \n" );
+
+ $folderitemsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "FolderItem");
+
+ installer::setupscript::add_predefined_folder($folderitemsinproductarrayref, $folderinproductarrayref);
+
+ installer::logger::print_message( "... analyzing folderitemproperties ... \n" );
+
+ $folderitempropertiesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "FolderItemProperty");
+
+ installer::setupscript::prepare_non_advertised_files($folderitemsinproductarrayref, $filesinproductarrayref);
+
+ installer::logger::print_message( "... analyzing registryitems ... \n" );
+
+ $registryitemsinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "RegistryItem");
+
+ $registryitemsinproductarrayref = installer::scriptitems::remove_uninstall_regitems_from_script($registryitemsinproductarrayref);
+
+ installer::logger::print_message( "... analyzing Windows custom actions ... \n" );
+
+ $windowscustomactionsarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "WindowsCustomAction");
+
+ installer::logger::print_message( "... analyzing Windows merge modules ... \n" );
+
+ $mergemodulesarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "MergeModule");
+ }
+
+ my $modulesinproductarrayref;
+
+ if (!($installer::globals::is_copy_only_project))
+ {
+ installer::logger::print_message( "... analyzing modules ... \n" );
+
+ $modulesinproductarrayref = installer::setupscript::get_all_items_from_script($setupscriptref, "Module");
+
+ installer::scriptitems::resolve_assigned_modules($modulesinproductarrayref);
+
+ $modulesinproductarrayref = installer::scriptitems::remove_template_modules($modulesinproductarrayref);
+
+ installer::scriptitems::set_children_flag($modulesinproductarrayref);
+
+ installer::scriptitems::collect_all_languagemodules($modulesinproductarrayref);
+
+ # Assigning the modules to the items
+
+ installer::scriptitems::assigning_modules_to_items($modulesinproductarrayref, $filesinproductarrayref, "Files");
+
+ installer::scriptitems::assigning_modules_to_items($modulesinproductarrayref, $unixlinksinproductarrayref, "Unixlinks");
+
+ installer::scriptitems::assigning_modules_to_items($modulesinproductarrayref, $dirsinproductarrayref, "Dirs");
+ }
+
+ #################################################
+ # Part 1b: The language dependent part
+ # (still platform independent)
+ #################################################
+
+ # Now starts the language dependent part, if more than one product is defined on the command line
+ # Example -l en-US,de#es,fr,it defines two multilingual products
+
+ ###############################################################################
+ # Beginning of language dependent part
+ # The for iterates over all products, separated by an # in the language list
+ ###############################################################################
+
+ for ( my $n = 0; $n <= $#installer::globals::languageproducts; $n++ )
+ {
+ my $languagesarrayref = installer::languages::get_all_languages_for_one_product($installer::globals::languageproducts[$n], $allvariableshashref);
+ my @setuplanguagesarray = @{ $languagesarrayref };
+
+ my $languagestringref = installer::languages::get_language_string($languagesarrayref);
+ installer::logger::print_message( "------------------------------------\n" );
+ installer::logger::print_message( "... languages $$languagestringref ... \n" );
+
+ if ( $installer::globals::languagepack )
+ {
+ $installer::globals::addsystemintegration = 0;
+ $installer::globals::addlicensefile = 0;
+ $installer::globals::makedownload = 1;
+ }
+
+ if ( $installer::globals::helppack )
+ {
+ $installer::globals::addsystemintegration = 0;
+ $installer::globals::addlicensefile = 0;
+ $installer::globals::makedownload = 1;
+ @setuplanguagesarray = grep { $_ ne "en-US" } @setuplanguagesarray;
+ unshift(@setuplanguagesarray, "en-US");
+ }
+
+ ############################################################
+ # Beginning of language specific logging mechanism
+ # Until now only global logging into default: logfile.txt
+ ############################################################
+
+ @installer::globals::logfileinfo = (); # new logfile array and new logfile name
+ installer::logger::copy_globalinfo_into_logfile();
+
+ my $loglanguagestring = $$languagestringref;
+ my $loglanguagestring_orig = $loglanguagestring;
+ if (length($loglanguagestring) > $installer::globals::max_lang_length)
+ {
+ my $number_of_languages = installer::systemactions::get_number_of_langs($loglanguagestring);
+ #replace this in the same it was done in installer/windows/directory.pm
+ #chomp(my $shorter = `echo $loglanguagestring | $ENV{'MD5SUM'} | sed -e "s/ .*//g"`);
+ #my $id = substr($shorter, 0, 8); # taking only the first 8 digits
+ my $id = installer::windows::msiglobal::calculate_id($loglanguagestring, 8); # taking only the first 8 digits
+ $loglanguagestring = "lang_" . $number_of_languages . "_id_" . $id;
+ }
+
+ $installer::globals::logfilename = "log_" . $installer::globals::build;
+ $installer::globals::logfilename .= "_" . $loglanguagestring;
+ $installer::globals::logfilename .= ".log";
+ $loggingdir = $loggingdir . $loglanguagestring . $installer::globals::separator;
+ installer::systemactions::create_directory($loggingdir);
+
+ if ($loglanguagestring ne $loglanguagestring_orig) {
+ (my $dir = $loggingdir) =~ s!/$!!;
+ open(my $F1, "> $dir.dir");
+ open(my $F2, "> " . $loggingdir . $installer::globals::logfilename . '.file');
+ my @s = map { "$_\n" } split('_', $loglanguagestring_orig);
+ print $F1 @s;
+ print $F2 @s;
+ }
+
+ $installer::globals::exitlog = $loggingdir;
+
+ ###################################################################
+ # Reading an existing msi database, to prepare update and patch
+ ###################################################################
+
+ my $refdatabase = "";
+ my $uniquefilename = "";
+ my $revuniquefilename = "";
+ my $revshortfilename = "";
+ my $allupdatesequences = "";
+ my $allupdatecomponents = "";
+ my $allupdatefileorder = "";
+ my $allupdatecomponentorder = "";
+ my $shortdirname = "";
+ my $componentid = "";
+ my $componentidkeypath = "";
+ my $alloldproperties = "";
+ my $allupdatelastsequences = "";
+ my $allupdatediskids = "";
+
+ if ( $installer::globals::packageformat eq 'msi' )
+ {
+ if ( $allvariableshashref->{'UPDATE_DATABASE'} )
+ {
+ installer::logger::print_message( "... analyzing update database ...\n" );
+ $refdatabase = installer::windows::update::readdatabase($allvariableshashref, $languagestringref, $includepatharrayref);
+
+ if ( $installer::globals::updatedatabase )
+ {
+ ($uniquefilename, $revuniquefilename, $revshortfilename, $allupdatesequences, $allupdatecomponents, $allupdatefileorder, $allupdatecomponentorder, $shortdirname, $componentid, $componentidkeypath, $alloldproperties, $allupdatelastsequences, $allupdatediskids) = installer::windows::update::create_database_hashes($refdatabase);
+ }
+ }
+
+ # Always analyze the merge module.
+ # We need to investigate the directory table in merge module to emit
+ # custom action for directory names that start with standard prefix
+ if ( $mergemodulesarrayref > -1 ) {
+ installer::windows::update::readmergedatabase($mergemodulesarrayref, $languagestringref, $includepatharrayref);
+ }
+ }
+
+ ##############################################
+ # Setting global code variables for Windows
+ ##############################################
+
+ if (!($installer::globals::is_copy_only_project))
+ {
+ if ((( $installer::globals::iswindowsbuild ) && ( $installer::globals::packageformat ne "archive" ) && ( $installer::globals::packageformat ne "installed" ) ) || $installer::globals::packageformat eq 'msi' )
+ {
+ installer::windows::msiglobal::set_global_code_variables($languagesarrayref, $languagestringref, $allvariableshashref, $alloldproperties);
+ }
+ }
+
+ ################################################
+ # Resolving include paths (language dependent)
+ ################################################
+
+ $includepatharrayref_lang = installer::ziplist::replace_languages_in_paths($includepatharrayref, \@setuplanguagesarray);
+
+ if ( $installer::globals::refresh_includepaths ) { installer::worker::collect_all_files_from_includepaths($includepatharrayref_lang); }
+
+ installer::ziplist::list_all_files_from_include_path($includepatharrayref_lang);
+
+ ##############################################
+ # Analyzing spellchecker languages
+ ##############################################
+
+ if ( $allvariableshashref->{'SPELLCHECKERFILE'} ) { installer::worker::set_spellcheckerlanguages($languagesarrayref, $allvariableshashref); }
+
+ #####################################
+ # Language dependent directory part
+ #####################################
+
+ my $dirsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($dirsinproductarrayref, $languagesarrayref);
+
+ # A new directory array is needed ($dirsinproductlanguageresolvedarrayref instead of $dirsinproductarrayref)
+ # because $dirsinproductarrayref is needed in get_Destination_Directory_For_Item_From_Directorylist
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($dirsinproductlanguageresolvedarrayref);
+
+ installer::scriptitems::checking_directories_with_corrupt_hostname($dirsinproductlanguageresolvedarrayref, $languagesarrayref);
+
+ installer::scriptitems::set_global_directory_hostnames($dirsinproductlanguageresolvedarrayref, $allvariableshashref);
+
+ #####################################
+ # files part, language dependent
+ #####################################
+
+ installer::logger::print_message( "... analyzing files ...\n" );
+
+ my $filesinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($filesinproductarrayref, $languagesarrayref);
+
+ if ( ! $installer::globals::set_office_start_language )
+ {
+ $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_office_start_language_files($filesinproductlanguageresolvedarrayref);
+ }
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($filesinproductlanguageresolvedarrayref);
+
+ if ( $installer::globals::iswin and $^O =~ /MSWin/i ) { installer::converter::convert_slash_to_backslash($filesinproductlanguageresolvedarrayref); }
+
+ $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_non_existent_languages_in_productlists($filesinproductlanguageresolvedarrayref, $languagestringref, "Name", "file");
+
+ installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($filesinproductlanguageresolvedarrayref, $dirsinproductarrayref);
+
+ installer::scriptitems::get_Source_Directory_For_Files_From_Includepathlist($filesinproductlanguageresolvedarrayref, $includepatharrayref_lang, $dirsinproductlanguageresolvedarrayref, "Files", $allvariableshashref);
+
+ $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_Files_Without_Sourcedirectory($filesinproductlanguageresolvedarrayref);
+
+ if ($installer::globals::languagepack)
+ {
+ $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_Files_For_Languagepacks($filesinproductlanguageresolvedarrayref);
+ }
+
+ if ( ! $allvariableshashref->{'NO_README_IN_ROOTDIR'} )
+ {
+ $filesinproductlanguageresolvedarrayref = installer::scriptitems::add_License_Files_into_Installdir($filesinproductlanguageresolvedarrayref, $dirsinproductlanguageresolvedarrayref, $languagesarrayref);
+ }
+
+ installer::scriptitems::make_filename_language_specific($filesinproductlanguageresolvedarrayref);
+
+ ######################################################################################
+ # Processing files with flag FILELIST and putting listed files into the file list
+ ######################################################################################
+
+ installer::logger::print_message( "... analyzing files with flag FILELIST ...\n" );
+
+ ($filesinproductlanguageresolvedarrayref, $unixlinksinproductarrayref) = installer::filelists::resolve_filelist_flag($filesinproductlanguageresolvedarrayref, $unixlinksinproductarrayref, $ENV{'INSTDIR'});
+
+ # packed files sometimes contain a "$" in their name: HighlightText$1.class. For epm the "$" has to be quoted by "$$"
+
+ if (!( $installer::globals::iswindowsbuild || $installer::globals::simple ) )
+ {
+ installer::scriptitems::quoting_illegal_filenames($filesinproductlanguageresolvedarrayref);
+ }
+
+ #####################################
+ # Files with flag SCPZIP_REPLACE
+ #####################################
+
+ installer::logger::print_message( "... analyzing files with flag SCPZIP_REPLACE ...\n" );
+
+ # Editing files with flag SCPZIP_REPLACE.
+
+ installer::scpzipfiles::resolving_scpzip_replace_flag($filesinproductlanguageresolvedarrayref, $allvariableshashref, "File", $languagestringref);
+
+ #########################################################
+ # language dependent unix links part
+ #########################################################
+
+ installer::logger::print_message( "... analyzing unix links ...\n" );
+
+ my $unixlinksinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($unixlinksinproductarrayref, $languagesarrayref);
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($unixlinksinproductlanguageresolvedarrayref);
+
+ installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($unixlinksinproductlanguageresolvedarrayref, $dirsinproductarrayref);
+
+ ############################################
+ # Collecting directories for epm list file
+ ############################################
+
+ installer::logger::print_message( "... analyzing all directories for this product ...\n" );
+
+ # There are two ways for a directory to be included into the epm directory list:
+ # 1. Looking for all destination paths in the files array
+ # 2. Looking for directories with CREATE flag in the directory array
+ # Advantage: Many paths are hidden in zip files, they are not defined in the setup script.
+ # It will be possible, that in the setup script only those directories have to be defined,
+ # that have a CREATE flag. All other directories are created, if they contain at least one file.
+
+ my ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_from_filesarray($filesinproductlanguageresolvedarrayref, $unixlinksinproductlanguageresolvedarrayref);
+ ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_with_create_flag_from_directoryarray($dirsinproductlanguageresolvedarrayref, $alldirectoryhash);
+
+ #########################################################
+ # language dependent scpactions part
+ #########################################################
+
+ my $scpactionsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($scpactionsinproductarrayref, $languagesarrayref);
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($scpactionsinproductlanguageresolvedarrayref);
+
+ installer::scriptitems::get_Source_Directory_For_Files_From_Includepathlist($scpactionsinproductlanguageresolvedarrayref, $includepatharrayref_lang, $dirsinproductlanguageresolvedarrayref, "ScpActions", $allvariableshashref);
+
+ # Editing scpactions with flag SCPZIP_REPLACE.
+
+ installer::scpzipfiles::resolving_scpzip_replace_flag($scpactionsinproductlanguageresolvedarrayref, $allvariableshashref, "ScpAction", $languagestringref);
+
+ #########################################################
+ # language dependent links part
+ #########################################################
+
+ installer::logger::print_message( "... analyzing links ...\n" );
+
+ my $linksinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($linksinproductarrayref, $languagesarrayref);
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($linksinproductlanguageresolvedarrayref);
+
+ installer::scriptitems::get_destination_file_path_for_links($linksinproductlanguageresolvedarrayref, $filesinproductlanguageresolvedarrayref);
+
+ installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($linksinproductlanguageresolvedarrayref, $dirsinproductarrayref);
+
+ # Now taking all links that have no FileID but a ShortcutID, linking to another link
+
+ installer::scriptitems::get_destination_link_path_for_links($linksinproductlanguageresolvedarrayref);
+
+ $linksinproductlanguageresolvedarrayref = installer::scriptitems::remove_workstation_only_items($linksinproductlanguageresolvedarrayref);
+
+ installer::scriptitems::resolve_links_with_flag_relative($linksinproductlanguageresolvedarrayref);
+
+ #########################################################
+ # language dependent part for profiles and profileitems
+ #########################################################
+
+ my $profilesinproductlanguageresolvedarrayref;
+ my $profileitemsinproductlanguageresolvedarrayref;
+
+ if ((!($installer::globals::is_copy_only_project)) && (!($installer::globals::languagepack)) && (!($installer::globals::helppack)))
+ {
+ installer::logger::print_message( "... creating profiles ...\n" );
+
+ $profilesinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($profilesinproductarrayref, $languagesarrayref);
+
+ $profileitemsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($profileitemsinproductarrayref, $languagesarrayref);
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($profilesinproductlanguageresolvedarrayref);
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($profileitemsinproductlanguageresolvedarrayref);
+
+ installer::scriptitems::replace_setup_variables($profileitemsinproductlanguageresolvedarrayref, $languagestringref, $allvariableshashref);
+
+ # Note that patch_user_dir is not related to the killed
+ # ancient (not MSP) "patch" thing, I think.
+ if ( $installer::globals::patch_user_dir )
+ {
+ installer::scriptitems::replace_userdir_variable($profileitemsinproductlanguageresolvedarrayref);
+ }
+
+ installer::scriptitems::get_Destination_Directory_For_Item_From_Directorylist($profilesinproductlanguageresolvedarrayref, $dirsinproductarrayref);
+
+ # Now the Profiles can be created
+
+ installer::profiles::create_profiles($profilesinproductlanguageresolvedarrayref, $profileitemsinproductlanguageresolvedarrayref, $filesinproductlanguageresolvedarrayref, $languagestringref, $allvariableshashref);
+ }
+
+ my $registryitemsinproductlanguageresolvedarrayref; # cannot be defined in the following "if ( $installer::globals::iswindowsbuild )"
+ my $folderinproductlanguageresolvedarrayref; # cannot be defined in the following "if ( $installer::globals::iswindowsbuild )"
+ my $folderitemsinproductlanguageresolvedarrayref; # cannot be defined in the following "if ( $installer::globals::iswindowsbuild )"
+
+ if ( $installer::globals::iswindowsbuild ) # Windows specific items: Folder, FolderItem, RegistryItem
+ {
+ #########################################################
+ # language dependent part for folder
+ #########################################################
+
+ installer::logger::print_message( "... analyzing folder ...\n" );
+
+ $folderinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($folderinproductarrayref, $languagesarrayref);
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($folderinproductlanguageresolvedarrayref);
+
+ #########################################################
+ # language dependent part for folderitems
+ #########################################################
+
+ installer::logger::print_message( "... analyzing folderitems ...\n" );
+
+ $folderitemsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($folderitemsinproductarrayref, $languagesarrayref);
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($folderitemsinproductlanguageresolvedarrayref);
+
+ #########################################################
+ # language dependent part for registryitems
+ #########################################################
+
+ installer::logger::print_message( "... analyzing registryitems ...\n" );
+
+ $registryitemsinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($registryitemsinproductarrayref, $languagesarrayref);
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($registryitemsinproductlanguageresolvedarrayref);
+ }
+
+ #########################################################
+ # language dependent part for modules
+ #########################################################
+
+ my $modulesinproductlanguageresolvedarrayref;
+
+ if (!($installer::globals::is_copy_only_project))
+ {
+ installer::logger::print_message( "... analyzing modules ...\n" );
+
+ $modulesinproductlanguageresolvedarrayref = installer::scriptitems::resolving_all_languages_in_productlists($modulesinproductarrayref, $languagesarrayref);
+
+ $modulesinproductlanguageresolvedarrayref = installer::scriptitems::remove_not_required_language_modules($modulesinproductlanguageresolvedarrayref, $languagesarrayref);
+
+ if ( $installer::globals::analyze_spellcheckerlanguage )
+ {
+ $modulesinproductlanguageresolvedarrayref = installer::scriptitems::remove_not_required_spellcheckerlanguage_modules($modulesinproductlanguageresolvedarrayref);
+
+ $filesinproductlanguageresolvedarrayref = installer::scriptitems::remove_not_required_spellcheckerlanguage_files($filesinproductlanguageresolvedarrayref);
+ $directoriesforepmarrayref = installer::scriptitems::remove_not_required_spellcheckerlanguage_files($directoriesforepmarrayref);
+ }
+
+ installer::scriptitems::changing_name_of_language_dependent_keys($modulesinproductlanguageresolvedarrayref);
+
+ installer::scriptitems::select_required_language_strings($modulesinproductlanguageresolvedarrayref); # using english strings
+
+ }
+
+ # Copy-only projects can now start to copy all items File and ScpAction
+ if ( $installer::globals::is_copy_only_project ) { installer::copyproject::copy_project($filesinproductlanguageresolvedarrayref, $scpactionsinproductlanguageresolvedarrayref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref); }
+
+ # Language pack projects can now start to select the required information
+ if ( $installer::globals::languagepack )
+ {
+ $filesinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($filesinproductlanguageresolvedarrayref, $languagesarrayref, "File");
+ $scpactionsinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($scpactionsinproductlanguageresolvedarrayref, $languagesarrayref, "ScpAction");
+ $linksinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($linksinproductlanguageresolvedarrayref, $languagesarrayref, "Shortcut");
+ $unixlinksinproductlanguageresolvedarrayref = installer::languagepack::select_language_items($unixlinksinproductlanguageresolvedarrayref, $languagesarrayref, "Unixlink");
+ @{$folderitemsinproductlanguageresolvedarrayref} = (); # no folderitems in languagepacks
+
+ # Collecting the directories again, to include only the language specific directories
+ ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_from_filesarray($filesinproductlanguageresolvedarrayref, $unixlinksinproductlanguageresolvedarrayref);
+ ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_with_create_flag_from_directoryarray($dirsinproductlanguageresolvedarrayref, $alldirectoryhash);
+ @$directoriesforepmarrayref = sort { $a->{"HostName"} cmp $b->{"HostName"} } @$directoriesforepmarrayref;
+
+ if ( $installer::globals::iswindowsbuild )
+ {
+ $registryitemsinproductlanguageresolvedarrayref = installer::worker::select_langpack_items($registryitemsinproductlanguageresolvedarrayref, "RegistryItem");
+ }
+
+ }
+
+ # Help pack projects can now start to select the required information
+ if ( $installer::globals::helppack )
+ {
+ $filesinproductlanguageresolvedarrayref = installer::helppack::select_help_items($filesinproductlanguageresolvedarrayref, $languagesarrayref, "File");
+ $scpactionsinproductlanguageresolvedarrayref = installer::helppack::select_help_items($scpactionsinproductlanguageresolvedarrayref, $languagesarrayref, "ScpAction");
+ $linksinproductlanguageresolvedarrayref = installer::helppack::select_help_items($linksinproductlanguageresolvedarrayref, $languagesarrayref, "Shortcut");
+ $unixlinksinproductlanguageresolvedarrayref = installer::helppack::select_help_items($unixlinksinproductlanguageresolvedarrayref, $languagesarrayref, "Unixlink");
+ @{$folderitemsinproductlanguageresolvedarrayref} = (); # no folderitems in helppacks
+
+ # Collecting the directories again, to include only the language specific directories
+ ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_from_filesarray($filesinproductlanguageresolvedarrayref, $unixlinksinproductlanguageresolvedarrayref);
+ ($directoriesforepmarrayref, $alldirectoryhash) = installer::scriptitems::collect_directories_with_create_flag_from_directoryarray($dirsinproductlanguageresolvedarrayref, $alldirectoryhash);
+ @$directoriesforepmarrayref = sort { $a->{"HostName"} cmp $b->{"HostName"} } @$directoriesforepmarrayref;
+
+ if ( $installer::globals::iswindowsbuild )
+ {
+ $registryitemsinproductlanguageresolvedarrayref = installer::worker::select_helppack_items($registryitemsinproductlanguageresolvedarrayref, "RegistryItem");
+ }
+
+ }
+
+ #########################################################
+ # Collecting all scp actions
+ #########################################################
+
+ installer::worker::collect_scpactions($scpactionsinproductlanguageresolvedarrayref);
+
+ ###########################################################
+ # Simple package projects can now start to create the
+ # installation structure by creating Directories, Files
+ # Links and ScpActions. This is the last platform
+ # independent part.
+ ###########################################################
+
+ if ( $installer::globals::is_simple_packager_project )
+ {
+ installer::simplepackage::create_simple_package($filesinproductlanguageresolvedarrayref, $directoriesforepmarrayref, $scpactionsinproductlanguageresolvedarrayref, $linksinproductlanguageresolvedarrayref, $unixlinksinproductlanguageresolvedarrayref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref, $allvariableshashref, $includepatharrayref);
+ next; # ! leaving the current loop, because no further packaging required.
+ }
+
+ ###########################################################
+ # Analyzing the package structure
+ ###########################################################
+
+ installer::logger::print_message( "... analyzing package list ...\n" );
+
+ my $packages = installer::packagelist::collectpackages($modulesinproductlanguageresolvedarrayref, $languagesarrayref);
+ installer::packagelist::check_packagelist($packages);
+
+ $packages = installer::packagelist::analyze_list($packages, $modulesinproductlanguageresolvedarrayref);
+ installer::packagelist::remove_multiple_modules_packages($packages);
+
+ # printing packages content:
+ installer::packagelist::log_packages_content($packages);
+ installer::packagelist::create_module_destination_hash($packages, $allvariableshashref);
+
+ #################################################
+ # Part 2: The platform dependent part
+ #################################################
+
+ #################################################
+ # Part 2a: All non-Windows platforms
+ #################################################
+
+ #########################################################
+ # ... creating epm list file ...
+ # Only for non-Windows platforms
+ #########################################################
+
+ if (!( $installer::globals::iswindowsbuild ))
+ {
+ ####################################################
+ # Writing log file before packages are packed
+ ####################################################
+
+ installer::logger::print_message( "... creating log file " . $loggingdir . $installer::globals::logfilename . "\n" );
+ installer::files::save_file($loggingdir . $installer::globals::logfilename, \@installer::globals::logfileinfo);
+
+ ####################################################
+ # Creating directories
+ ####################################################
+
+ installer::download::set_download_filename($languagestringref, $allvariableshashref);
+
+ $installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number);
+
+ my $listfiledir = installer::systemactions::create_directories("listfile", $languagestringref);
+ my $installlogdir = installer::systemactions::create_directory_next_to_directory($installdir, "log");
+
+ ####################################################
+ # Reading for Solaris all package descriptions
+ # from file defined in property PACKAGEMAP
+ ####################################################
+
+ if ( $installer::globals::issolarisbuild ) { installer::epmfile::read_packagemap($allvariableshashref, $includepatharrayref, $languagesarrayref); }
+
+ ###########################################
+ # Checking epm state
+ ###########################################
+
+ my $epmexecutable = "";
+ if ( $installer::globals::call_epm )
+ {
+ $epmexecutable = installer::epmfile::find_epm_on_system($includepatharrayref);
+ installer::epmfile::set_patch_state($epmexecutable); # setting $installer::globals::is_special_epm
+ }
+
+ # shuffle array to reduce parallel packaging process in pool
+ @{$packages} = shuffle @{$packages}
+ unless $installer::globals::simple;
+
+ # iterating over all packages
+ for my $onepackage ( @{$packages} )
+ {
+ # checking, if this is a language pack or a project pack.
+ # Creating language packs only, if $installer::globals::languagepack is set. Parameter: -languagepack
+
+ if ( $installer::globals::languagepack ) { installer::languagepack::replace_languagestring_variable($onepackage, $languagestringref); }
+
+ # checking, if this is a help pack
+ # Creating help packs only, if $installer::globals::helppack is set. Parameter: -helppack
+
+ if ( $installer::globals::helppack ) { installer::helppack::replace_languagestring_variable($onepackage, $languagestringref); }
+
+ my $onepackagename = $onepackage->{'module'}; # name of the top module (required)
+
+ my $shellscriptsfilename = "";
+ if ( $onepackage->{'script'} ) { $shellscriptsfilename = $onepackage->{'script'}; }
+
+ ###########################
+ # package name
+ ###########################
+
+ my $packagename = "";
+
+ if ( $installer::globals::issolarisbuild ) # only for Solaris
+ {
+ if ( $onepackage->{'solarispackagename'} ) { $packagename = $onepackage->{'solarispackagename'}; }
+ }
+ else # not Solaris
+ {
+ if ( $onepackage->{'packagename'} ) { $packagename = $onepackage->{'packagename'}; }
+ }
+
+ if (!($packagename eq ""))
+ {
+ installer::packagelist::resolve_packagevariables(\$packagename, $allvariableshashref, 0);
+ }
+
+ # Debian allows no underline in package name
+ if ( $installer::globals::debian ) { $packagename =~ s/_/-/g; }
+
+ ####################################################
+ # Header for this package into log file
+ ####################################################
+
+ installer::logger::include_header_into_logfile("Creating package: $packagename");
+
+ ###########################################
+ # Root path, can be defined as parameter
+ ###########################################
+
+ my $packagerootpath = "";
+
+ if ($installer::globals::rootpath eq "")
+ {
+ $packagerootpath = $onepackage->{'destpath'};
+ installer::packagelist::resolve_packagevariables(\$packagerootpath, $allvariableshashref, 1);
+ # we put branding and common stuff into the same prefix on unixes => $packagerootpath must be the whole prefix, including the product name
+ if ($installer::globals::isunix) { $packagerootpath .= "/$allvariableshashref->{'UNIXBASISROOTNAME'}"; }
+ if ( $^O =~ /darwin/i ) { $packagerootpath =~ s/\/opt\//\/Applications\//; }
+ }
+ else
+ {
+ $packagerootpath = $installer::globals::rootpath;
+ }
+
+ #################################
+ # collecting items for package
+ #################################
+
+ my $filesinpackage = installer::packagelist::find_files_for_package($filesinproductlanguageresolvedarrayref, $onepackage);
+ my $unixlinksinpackage = installer::packagelist::find_files_for_package($unixlinksinproductlanguageresolvedarrayref, $onepackage);
+ my $linksinpackage = installer::packagelist::find_links_for_package($linksinproductlanguageresolvedarrayref, $onepackage);
+ my $dirsinpackage = installer::packagelist::find_dirs_for_package($directoriesforepmarrayref, $onepackage);
+
+ #############################################
+ # copying the collectors for each package
+ #############################################
+
+ $filesinpackage = installer::converter::copy_collector($filesinpackage);
+ $linksinpackage = installer::converter::copy_collector($linksinpackage);
+ $unixlinksinpackage = installer::converter::copy_collector($unixlinksinpackage);
+ $dirsinpackage = installer::converter::copy_collector($dirsinpackage);
+
+ ###########################################
+ # setting the root path for the packages
+ ###########################################
+
+ installer::scriptitems::add_rootpath_to_directories($dirsinpackage, $packagerootpath);
+ installer::scriptitems::add_rootpath_to_files($filesinpackage, $packagerootpath);
+ installer::scriptitems::add_rootpath_to_links($linksinpackage, $packagerootpath);
+ installer::scriptitems::add_rootpath_to_files($unixlinksinpackage, $packagerootpath);
+
+ ###############################################
+ # nothing to do, if $filesinpackage is empty
+ ###############################################
+
+ if ( ! ( $#{$filesinpackage} > -1 ))
+ {
+ $infoline = "\n\nNo file in package: $packagename \-\> Skipping\n\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ next; # next package, end of loop !
+ }
+
+ ###########################################
+ # Stripping libraries
+ ###########################################
+
+ # Building for non Windows platforms in cws requires, that all files are stripped before packaging:
+ # 1. copy all files that need to be stripped locally
+ # 2. strip all these files
+
+ if ( $installer::globals::strip )
+ {
+ strip_libraries($filesinpackage, $languagestringref);
+ }
+
+ if ( $installer::globals::simple ) {
+ installer::worker::install_simple($onepackagename, $$languagestringref, $dirsinpackage, $filesinpackage, $linksinpackage, $unixlinksinpackage);
+ }
+ else {
+ # epm list file format:
+ # type mode owner group destination source options
+ # Example for a file: f 755 root sys /usr/bin/foo foo
+ # Example for a directory: d 755 root sys /var/spool/foo -
+ # Example for a link: l 000 root sys /usr/bin/linkname filename
+ # The source field specifies the file to link to
+
+ my $epmfilename = "epm_" . $onepackagename . ".lst";
+
+ installer::logger::print_message( "... creating epm list file $epmfilename ... \n" );
+
+ my $completeepmfilename = $listfiledir . $installer::globals::separator . $epmfilename;
+
+ my @epmfile = ();
+
+ my $epmheaderref = installer::epmfile::create_epm_header($allvariableshashref, $filesinproductlanguageresolvedarrayref, $languagesarrayref, $onepackage);
+ installer::epmfile::adding_header_to_epm_file(\@epmfile, $epmheaderref);
+
+ # adding directories, files and links into epm file
+
+ installer::epmfile::put_directories_into_epmfile($dirsinpackage, \@epmfile, $allvariableshashref, $packagerootpath);
+ installer::epmfile::put_files_into_epmfile($filesinpackage, \@epmfile );
+ installer::epmfile::put_links_into_epmfile($linksinpackage, \@epmfile );
+ installer::epmfile::put_unixlinks_into_epmfile($unixlinksinpackage, \@epmfile );
+
+ if ((!( $shellscriptsfilename eq "" )) && (!($installer::globals::iswindowsbuild))) { installer::epmfile::adding_shellscripts_to_epm_file(\@epmfile, $shellscriptsfilename, $packagerootpath, $allvariableshashref, $filesinpackage); }
+
+ installer::files::save_file($completeepmfilename ,\@epmfile);
+
+ # ... splitting the rootpath into a relocatable part and a static part, if possible
+
+ my $staticpath = "";
+ my $relocatablepath = "";
+ # relocatable path can be defined in package list
+ if ( $onepackage->{'relocatablepath'} ) { $relocatablepath = $onepackage->{'relocatablepath'}; }
+ # setting fix part and variable part of destination path
+ installer::epmfile::analyze_rootpath($packagerootpath, \$staticpath, \$relocatablepath, $allvariableshashref);
+
+ # ... replacing the variable PRODUCTDIRECTORYNAME in the shellscriptfile by $staticpath
+
+ installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "PRODUCTDIRECTORYNAME", $staticpath);
+ installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "SOLSUREPACKAGEPREFIX", $allvariableshashref->{'SOLSUREPACKAGEPREFIX'});
+ installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "UREPACKAGEPREFIX", $allvariableshashref->{'UREPACKAGEPREFIX'});
+ installer::files::save_file($completeepmfilename ,\@epmfile);
+
+ {
+ # changing into the "install" directory to create installation sets
+
+ $currentdir = cwd(); # $currentdir is global in this file
+
+ chdir($installdir); # changing into install directory ($installdir is global in this file)
+
+ ###########################################
+ # Starting epm
+ ###########################################
+
+ # With a patched epm, it is now possible to set the relocatable directory, change
+ # the directory in which the packages are created, setting "requires" and "provides"
+ # (Linux) or creating the "depend" file (Solaris) and finally to begin
+ # the packaging process with standard tooling and standard parameter
+ # Linux: Adding into the spec file: Prefix: /opt
+ # Solaris: Adding into the pkginfo file: BASEDIR=/opt
+ # Attention: Changing of the path can influence the shell scripts
+
+ if (( $installer::globals::is_special_epm ) && ( ($installer::globals::isrpmbuild) || ($installer::globals::issolarispkgbuild) )) # special handling only for Linux RPMs and Solaris Packages
+ {
+ if ( $installer::globals::call_epm ) # only do something, if epm is really executed
+ {
+ # ... now epm can be started, to create the installation sets
+
+ installer::logger::print_message( "... starting patched epm ... \n" );
+
+ installer::epmfile::call_epm($epmexecutable, $completeepmfilename, $packagename, $includepatharrayref);
+
+ my $newepmdir = installer::epmfile::prepare_packages($loggingdir, $packagename, $staticpath, $relocatablepath, $onepackage, $allvariableshashref, $filesinpackage, $languagestringref); # adding the line for Prefix / Basedir, include rpmdir
+
+ installer::epmfile::create_packages_without_epm($newepmdir, $packagename, $includepatharrayref, $allvariableshashref, $languagestringref); # start to package
+
+ # finally removing all temporary files
+
+ installer::epmfile::remove_temporary_epm_files($newepmdir, $loggingdir, $packagename);
+
+ # Installation:
+ # Install: pkgadd -a myAdminfile -d ./SUNWso8m34.pkg
+ # Install: rpm -i --prefix=/opt/special --nodeps so8m35.rpm
+
+ installer::epmfile::create_new_directory_structure($newepmdir);
+ $installer::globals::postprocess_specialepm = 1;
+
+ # solaris patch not needed anymore
+ }
+ }
+
+ else # this is the standard epm (not relocatable) or ( nonlinux and nonsolaris )
+ {
+ installer::epmfile::resolve_path_in_epm_list_before_packaging(\@epmfile, $completeepmfilename, "\$\$PRODUCTINSTALLLOCATION", $relocatablepath);
+ installer::files::save_file($completeepmfilename ,\@epmfile); # Warning for pool, content of epm file is changed.
+
+ if ( $installer::globals::call_epm )
+ {
+ # ... now epm can be started, to create the installation sets
+
+ if ( $installer::globals::is_special_epm )
+ {
+ installer::logger::print_message( "... starting patched epm ... \n" );
+ }
+ else
+ {
+ installer::logger::print_message( "... starting unpatched epm ... \n" );
+ }
+
+ if ( $installer::globals::call_epm ) { installer::epmfile::call_epm($epmexecutable, $completeepmfilename, $packagename, $includepatharrayref); }
+
+ if (($installer::globals::isrpmbuild) || ($installer::globals::issolarispkgbuild) || ($installer::globals::debian))
+ {
+ $installer::globals::postprocess_standardepm = 1;
+ }
+ }
+ }
+
+ chdir($currentdir); # changing back into start directory
+
+ }
+
+ } # end of "if ( ! $installer::globals::simple )
+
+ } # end of "for ( @{$packages} )"
+
+ ##############################################################
+ # Post epm functionality, after the last package is packed
+ ##############################################################
+
+ if ( $installer::globals::postprocess_specialepm )
+ {
+ installer::logger::include_header_into_logfile("Post EPM processes (Patched EPM):");
+
+ chdir($installdir);
+
+ # Copying the cde, kde and gnome packages into the installation set
+ if ( $installer::globals::addsystemintegration ) { installer::epmfile::put_systemintegration_into_installset($installer::globals::epmoutpath, $includepatharrayref, $allvariableshashref, $modulesinproductarrayref); }
+
+ # Adding license and readme into installation set
+ if ($installer::globals::addlicensefile) { installer::worker::put_scpactions_into_installset("."); }
+
+ # Adding license file into setup
+ if ( $allvariableshashref->{'PUT_LICENSE_INTO_SETUP'} ) { installer::worker::put_license_into_setup(".", $includepatharrayref); }
+
+ # Creating installation set for Unix language packs, that are not part of multi lingual installation sets
+ if ( ( $installer::globals::languagepack ) && ( ! $installer::globals::debian ) && ( ! $installer::globals::makedownload ) ) { installer::languagepack::build_installer_for_languagepack($installer::globals::epmoutpath, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref); }
+
+ # Creating installation set for Unix help packs, that are not part of multi lingual installation sets
+ if ( ( $installer::globals::helppack ) && ( ! $installer::globals::debian ) && ( ! $installer::globals::makedownload ) ) { installer::helppack::build_installer_for_helppack($installer::globals::epmoutpath, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref); }
+
+ chdir($currentdir); # changing back into start directory
+ }
+
+ if ( $installer::globals::postprocess_standardepm )
+ {
+ installer::logger::include_header_into_logfile("Post EPM processes (Standard EPM):");
+
+ chdir($installdir);
+
+ # determine the destination directory
+ my $newepmdir = installer::epmfile::determine_installdir_ooo();
+
+ # Copying the cde, kde and gnome packages into the installation set
+ if ( $installer::globals::addsystemintegration ) { installer::epmfile::put_systemintegration_into_installset($newepmdir, $includepatharrayref, $allvariableshashref, $modulesinproductarrayref); }
+
+ # Adding license and readme into installation set
+ if ($installer::globals::addlicensefile) { installer::worker::put_scpactions_into_installset("."); }
+
+ # Adding license file into setup
+ if ( $allvariableshashref->{'PUT_LICENSE_INTO_SETUP'} ) { installer::worker::put_license_into_setup(".", $includepatharrayref); }
+
+ # Creating installation set for Unix language packs, that are not part of multi lingual installation sets
+ if ( ( $installer::globals::languagepack ) && ( ! $installer::globals::debian ) && ( ! $installer::globals::makedownload ) ) { installer::languagepack::build_installer_for_languagepack($newepmdir, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref); }
+
+ # Creating installation set for Unix help packs, that are not part of multi lingual installation sets
+ if ( ( $installer::globals::helppack ) && ( ! $installer::globals::debian ) && ( ! $installer::globals::makedownload ) ) { installer::helppack::build_installer_for_helpepack($newepmdir, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref); }
+
+ chdir($currentdir); # changing back into start directory
+ }
+
+ if (( $installer::globals::issolarispkgbuild ) && ( $allvariableshashref->{'COLLECT_PKGMAP'} )) { installer::worker::collectpackagemaps($installdir, $languagestringref, $allvariableshashref); }
+
+ #######################################################
+ # Analyzing the log file
+ #######################################################
+
+ my $is_success = 0;
+ my $finalinstalldir = "";
+
+ installer::worker::clean_output_tree(); # removing directories created in the output tree
+ ($is_success, $finalinstalldir) = installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number);
+ my $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "downloadname");
+
+ #######################################################
+ # Creating download installation set
+ #######################################################
+
+ if ( $installer::globals::makedownload )
+ {
+ my $create_download = 0;
+ if ( $$downloadname ne "" ) { $create_download = 1; }
+ if ( $installer::globals::iswindowsbuild ) { $create_download = 0; }
+ if (( $is_success ) && ( $create_download ) && ( $ENV{'ENABLE_DOWNLOADSETS'} ))
+ {
+ my $downloaddir = installer::download::create_download_sets($finalinstalldir, $includepatharrayref, $allvariableshashref, $$downloadname, $languagestringref, $languagesarrayref);
+ installer::worker::analyze_and_save_logfile($loggingdir, $downloaddir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number);
+ }
+ }
+ } # end of "if (!( $installer::globals::iswindowsbuild ))"
+
+ #################################################
+ # Part 2b: The Windows platform
+ #################################################
+
+ #####################################################################
+ # ... creating idt files ...
+ # Only for Windows builds
+ #####################################################################
+
+ if ( $installer::globals::iswindowsbuild )
+ {
+ ###########################################
+ # Stripping libraries
+ ###########################################
+
+ # Building for gcc build in cws requires, that all files are stripped before packaging:
+ # 1. copy all files that need to be stripped locally
+ # 2. strip all these files
+
+ if ( $installer::globals::com eq 'GCC')
+ {
+ installer::windows::strip::strip_binaries($filesinproductlanguageresolvedarrayref, $languagestringref);
+ }
+
+ $installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number);
+
+ my $idtdirbase = installer::systemactions::create_directories("idt_files", $languagestringref);
+ $installer::globals::infodirectory = installer::systemactions::create_directories("info_files", $languagestringref);
+ my $installlogdir = installer::systemactions::create_directory_next_to_directory($installdir, "log");
+
+ #################################################################################
+ # Preparing cabinet files from package definitions
+ #################################################################################
+
+ installer::packagelist::prepare_cabinet_files($packages, $allvariableshashref);
+ # printing packages content:
+ installer::packagelist::log_cabinet_assignments();
+
+ #################################################################################
+ # Begin of functions that are used for the creation of idt files (Windows only)
+ #################################################################################
+
+ installer::logger::print_message( "... creating idt files ...\n" );
+
+ installer::logger::include_header_into_logfile("Creating idt files:");
+
+ my $newidtdir = $idtdirbase . $installer::globals::separator . "00"; # new files into language independent directory "00"
+ installer::systemactions::create_directory($newidtdir);
+
+ my @allfilecomponents = ();
+ my @allregistrycomponents = ();
+
+ # Collecting all files with flag "BINARYTABLE"
+ my $binarytablefiles = installer::worker::collect_all_items_with_special_flag($filesinproductlanguageresolvedarrayref ,"BINARYTABLE");
+
+ # Removing all files with flag "BINARYTABLE_ONLY"
+ @installer::globals::binarytableonlyfiles = ();
+ $filesinproductlanguageresolvedarrayref = installer::worker::remove_all_items_with_special_flag($filesinproductlanguageresolvedarrayref ,"BINARYTABLE_ONLY");
+
+ # Collecting all profileitems with flag "INIFILETABLE" for table "IniFile"
+ my $inifiletableentries = installer::worker::collect_all_items_with_special_flag($profileitemsinproductlanguageresolvedarrayref ,"INIFILETABLE");
+
+ # Creating the important dynamic idt files
+ installer::windows::msiglobal::set_msiproductversion($allvariableshashref);
+ installer::windows::msiglobal::put_msiproductversion_into_bootstrapfile($filesinproductlanguageresolvedarrayref);
+
+ # Add cabinet assignments to files
+ installer::windows::file::assign_cab_to_files($filesinproductlanguageresolvedarrayref);
+ installer::windows::file::assign_sequencenumbers_to_files($filesinproductlanguageresolvedarrayref);
+
+ # Collection all available directory trees
+ installer::windows::directory::collectdirectorytrees($directoriesforepmarrayref);
+
+ # Attention: The table "Director.idt" contains language specific strings -> parameter: \@setuplanguagesarray !
+ installer::windows::directory::create_directory_table($directoriesforepmarrayref, \@setuplanguagesarray, $newidtdir, $allvariableshashref, $shortdirname, $loggingdir);
+
+ $filesinproductlanguageresolvedarrayref = installer::windows::file::create_files_table($filesinproductlanguageresolvedarrayref, $directoriesforepmarrayref, \@allfilecomponents, $newidtdir, $allvariableshashref, $uniquefilename, $allupdatesequences, $allupdatecomponents, $allupdatefileorder);
+ if ( $installer::globals::updatedatabase ) { installer::windows::file::check_file_sequences($allupdatefileorder, $allupdatecomponentorder); }
+
+ # Attention: The table "Registry.idt" contains language specific strings -> parameter: \@setuplanguagesarray !
+ installer::windows::registry::create_registry_table($registryitemsinproductlanguageresolvedarrayref, \@allregistrycomponents, $newidtdir, \@setuplanguagesarray, $allvariableshashref);
+
+ installer::windows::component::create_component_table($filesinproductlanguageresolvedarrayref, $registryitemsinproductlanguageresolvedarrayref, $directoriesforepmarrayref, \@allfilecomponents, \@allregistrycomponents, $newidtdir, $componentid, $componentidkeypath, $allvariableshashref);
+
+ # Attention: The table "Feature.idt" contains language specific strings -> parameter: \@setuplanguagesarray !
+ installer::windows::feature::add_uniquekey($modulesinproductlanguageresolvedarrayref);
+ $modulesinproductlanguageresolvedarrayref = installer::windows::feature::sort_feature($modulesinproductlanguageresolvedarrayref);
+ installer::windows::feature::create_feature_table($modulesinproductlanguageresolvedarrayref, $newidtdir, \@setuplanguagesarray, $allvariableshashref);
+
+ installer::windows::featurecomponent::create_featurecomponent_table($filesinproductlanguageresolvedarrayref, $registryitemsinproductlanguageresolvedarrayref, $newidtdir);
+
+ installer::windows::media::create_media_table($filesinproductlanguageresolvedarrayref, $newidtdir, $allvariableshashref, $allupdatelastsequences, $allupdatediskids);
+
+ installer::windows::font::create_font_table($filesinproductlanguageresolvedarrayref, $newidtdir);
+
+ # Attention: The table "Shortcut.idt" contains language specific strings -> parameter: \@setuplanguagesarray !
+ # Attention: Shortcuts (Folderitems) have icon files, that have to be copied into the Icon directory (last parameter)
+ my @iconfilecollector = ();
+
+ installer::windows::shortcut::create_shortcut_table($filesinproductlanguageresolvedarrayref, $linksinproductlanguageresolvedarrayref, $folderinproductlanguageresolvedarrayref, $folderitemsinproductlanguageresolvedarrayref, $directoriesforepmarrayref, $newidtdir, \@setuplanguagesarray, $includepatharrayref, \@iconfilecollector);
+
+ installer::windows::inifile::create_inifile_table($inifiletableentries, $filesinproductlanguageresolvedarrayref, $newidtdir);
+
+ installer::windows::icon::create_icon_table(\@iconfilecollector, $newidtdir); # creating the icon table with all iconfiles used as shortcuts (FolderItems)
+
+ installer::windows::createfolder::create_createfolder_table($directoriesforepmarrayref, $filesinproductlanguageresolvedarrayref, $newidtdir, $allvariableshashref);
+
+ installer::windows::upgrade::create_upgrade_table($newidtdir, $allvariableshashref);
+
+ installer::windows::msishortcutproperty::create_msishortcutproperty_table($folderitempropertiesinproductarrayref, $folderitemsinproductarrayref, $newidtdir);
+
+ if (( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack )) # the following tables not for language packs or help packs
+ {
+ installer::windows::removefile::create_removefile_table($folderitemsinproductlanguageresolvedarrayref, $newidtdir);
+
+ # Adding Assemblies into the tables MsiAssembly and MsiAssemblyName dynamically
+ installer::windows::assembly::create_msiassembly_table($filesinproductlanguageresolvedarrayref, $newidtdir);
+ installer::windows::assembly::create_msiassemblyname_table($filesinproductlanguageresolvedarrayref, $newidtdir);
+ installer::windows::assembly::add_assembly_condition_into_component_table($filesinproductlanguageresolvedarrayref, $newidtdir);
+ }
+
+ $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ # Localizing the language dependent idt files
+ # For every language there will be a localized msi database
+ # For multilingual installation sets, the differences of this
+ # databases have to be stored in transforms.
+
+ for ( my $m = 0; $m <= $#{\@setuplanguagesarray}; $m++ )
+ {
+ my $onelanguage = ${\@setuplanguagesarray}[$m];
+
+ my $is_rtl = 0;
+ my @rtllanguages = ("ar", "fa", "he", "ug", "ky-CN");
+ if ( grep {$_ eq $onelanguage} @rtllanguages ) { $is_rtl = 1; }
+
+ my $languageidtdir = $idtdirbase . $installer::globals::separator . $onelanguage;
+ if ( -d $languageidtdir ) { installer::systemactions::remove_complete_directory($languageidtdir, 1); }
+ installer::systemactions::create_directory($languageidtdir);
+
+ # Copy the template idt files and the new created idt files into this language directory
+
+ installer::logger::print_message( "... copying idt files ...\n" );
+
+ installer::logger::include_header_into_logfile("Copying idt files to $languageidtdir:");
+
+ installer::windows::idtglobal::prepare_language_idt_directory($languageidtdir, $newidtdir, $onelanguage, $filesinproductlanguageresolvedarrayref, \@iconfilecollector, $binarytablefiles, $allvariableshashref);
+
+ # Now all files are copied into a language specific directory
+ # The template idt files can be translated
+
+ installer::logger::print_message( "... localizing idt files (language: $onelanguage) ...\n" );
+
+ installer::logger::include_header_into_logfile("Localizing idt files (Language: $onelanguage):");
+
+ my @translationfiles = (); # all idt files, that need a translation
+ push(@translationfiles, "ActionTe.idt");
+ push(@translationfiles, "Control.idt");
+ push(@translationfiles, "CustomAc.idt");
+ push(@translationfiles, "Error.idt");
+ push(@translationfiles, "LaunchCo.idt");
+ push(@translationfiles, "RadioBut.idt");
+ push(@translationfiles, "Property.idt");
+ push(@translationfiles, "UIText.idt");
+
+ my $oneidtfilename;
+ my $oneidtfile;
+
+ foreach $oneidtfilename (@translationfiles)
+ {
+ my $languagefilename = installer::windows::idtglobal::get_languagefilename($oneidtfilename, $installer::globals::idtlanguagepath);
+ my $languagefile = installer::files::read_file($languagefilename);
+
+ $oneidtfilename = $languageidtdir . $installer::globals::separator . $oneidtfilename;
+ $oneidtfile = installer::files::read_file($oneidtfilename);
+
+ # Now the substitution can start
+ installer::windows::idtglobal::translate_idtfile($oneidtfile, $languagefile, $onelanguage);
+
+ installer::files::save_file($oneidtfilename, $oneidtfile);
+
+ $infoline = "Translated idt file: $oneidtfilename into language $onelanguage\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Used languagefile: $languagefilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ # setting bidi attributes, if required
+ if ( $is_rtl ) { installer::windows::idtglobal::setbidiattributes($languageidtdir, $onelanguage); }
+
+ # setting the condition, that at least one module is selected
+ installer::windows::idtglobal::set_multilanguageonly_condition($languageidtdir);
+
+ # include the license text into the table Control.idt
+
+ if ( ! $allvariableshashref->{'HIDELICENSEDIALOG'} )
+ {
+ my $licensefilesource = installer::windows::idtglobal::get_rtflicensefilesource($onelanguage, $includepatharrayref_lang);
+ my $licensefile = installer::files::read_file($licensefilesource);
+ installer::scpzipfiles::replace_all_ziplistvariables_in_rtffile($licensefile, $allvariableshashref);
+ my $controltablename = $languageidtdir . $installer::globals::separator . "Control.idt";
+ my $controltable = installer::files::read_file($controltablename);
+ installer::windows::idtglobal::add_licensefile_to_database($licensefile, $controltable);
+ installer::files::save_file($controltablename, $controltable);
+
+ $infoline = "Added licensefile $licensefilesource into database $controltablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ # include a component into environment table if required
+
+ installer::windows::component::set_component_in_environment_table($languageidtdir, $filesinproductlanguageresolvedarrayref);
+
+ # include the ProductCode and the UpgradeCode from codes-file into the Property.idt
+
+ installer::windows::property::set_codes_in_property_table($languageidtdir);
+
+ # the language specific properties can now be set in the Property.idt
+
+ installer::windows::property::update_property_table($languageidtdir, $onelanguage, $allvariableshashref, $languagestringref);
+
+ # replacing variables in RegLocat.idt
+
+ installer::windows::msiglobal::update_reglocat_table($languageidtdir, $allvariableshashref);
+
+ # replacing variables in RemoveRe.idt (RemoveRegistry.idt)
+
+ installer::windows::msiglobal::update_removere_table($languageidtdir);
+
+ # adding language specific properties for multilingual installation sets
+
+ installer::windows::property::set_languages_in_property_table($languageidtdir, \@setuplanguagesarray);
+
+ # adding settings into CheckBox.idt
+ installer::windows::property::update_checkbox_table($languageidtdir, $allvariableshashref);
+
+ # adding the files from the binary directory into the binary table
+ installer::windows::binary::update_binary_table($languageidtdir, $filesinproductlanguageresolvedarrayref, $binarytablefiles);
+
+ # Adding Windows Installer CustomActions
+
+ installer::windows::idtglobal::addcustomactions($languageidtdir, $windowscustomactionsarrayref, $filesinproductlanguageresolvedarrayref);
+
+ installer::logger::print_message( "... Analyze if custom action table must be patched with merge module directory names ...\n" );
+
+ my @customactions = ();
+ for my $e (keys %installer::globals::merge_directory_hash) {
+ my $var;
+ installer::logger::print_message( "... analyzing directory from merge module: $e\n");
+ if (installer::windows::directory::has_standard_directory_prefix($e, \$var)) {
+ installer::logger::print_message( "... emitting custom action to set the var $e to directory: $var\n");
+ push(@customactions, installer::windows::idtglobal::emit_custom_action_for_standard_directory($e, $var));
+ }
+ }
+
+ if (@customactions) {
+ installer::logger::print_message( "... Patching custom action table with merge module directory names ...\n" );
+ #print Dumper(@customactions);
+ installer::windows::idtglobal::addcustomactions($languageidtdir, \@customactions, $filesinproductlanguageresolvedarrayref);
+ }
+
+ # Then the language specific msi database can be created
+
+ if ( $installer::globals::iswin || $installer::globals::packageformat eq 'msi' )
+ {
+ my $msidatabasename = installer::windows::msiglobal::get_msidatabasename($allvariableshashref, $onelanguage);
+ my $msifilename = $languageidtdir . $installer::globals::separator . $msidatabasename;
+
+ installer::logger::print_message( "... creating msi database (language $onelanguage) ... \n" );
+
+ installer::windows::msiglobal::set_uuid_into_component_table($languageidtdir, $allvariableshashref); # setting new GUID for the components using the tool uuidgen.exe
+ installer::windows::msiglobal::prepare_64bit_database($languageidtdir, $allvariableshashref); # making last 64 bit changes
+ installer::windows::msiglobal::create_msi_database($languageidtdir ,$msifilename);
+
+ # validating the database # ToDo
+
+ installer::windows::msiglobal::write_summary_into_msi_database($msifilename, $onelanguage, $languagefile, $allvariableshashref);
+
+ # copy msi database into installation directory
+
+ my $msidestfilename = $installdir . $installer::globals::separator . $msidatabasename;
+ installer::systemactions::copy_one_file($msifilename, $msidestfilename);
+ }
+ }
+
+ # Creating transforms, if the installation set has more than one language
+ # renaming the msi database
+
+ my $defaultlanguage = installer::languages::get_default_language(\@setuplanguagesarray);
+
+ if ( $installer::globals::iswin || $installer::globals::packageformat eq 'msi' )
+ {
+ if ( $#{\@setuplanguagesarray} > 0 )
+ {
+ installer::windows::msiglobal::create_transforms(\@setuplanguagesarray, $defaultlanguage, $installdir, $allvariableshashref);
+ }
+ # if there are Merge Modules, they have to be integrated now
+ my $mergedbname = installer::windows::msiglobal::get_msidatabasename($allvariableshashref, $defaultlanguage);
+ my $mergeidtdir = $idtdirbase . $installer::globals::separator . "mergemodules";
+ if ( -d $mergeidtdir ) { installer::systemactions::remove_complete_directory($mergeidtdir, 1); }
+ installer::systemactions::create_directory($mergeidtdir);
+ installer::systemactions::copy_one_file($installdir . $installer::globals::separator . $mergedbname, $mergeidtdir . $installer::globals::separator . $mergedbname);
+ $filesinproductlanguageresolvedarrayref = installer::windows::mergemodule::merge_mergemodules_into_msi_database($mergemodulesarrayref, $filesinproductlanguageresolvedarrayref, $mergeidtdir . $installer::globals::separator . $mergedbname, $languagestringref, $allvariableshashref, $includepatharrayref, $allupdatesequences, $allupdatelastsequences, $allupdatediskids);
+ installer::systemactions::copy_one_file($mergeidtdir . $installer::globals::separator . $mergedbname, $installdir . $installer::globals::separator . $mergedbname);
+
+ installer::windows::msiglobal::rename_msi_database_in_installset($defaultlanguage, $installdir, $allvariableshashref);
+ }
+
+ # Analyzing the ScpActions and copying the files into the installation set
+
+ installer::logger::print_message( "... copying files into installation set ...\n" );
+
+ installer::worker::put_scpactions_into_installset($installdir);
+
+ # ... copying MergeModules into installation set
+
+ if ( ! $installer::globals::fix_number_of_cab_files ) { installer::windows::msiglobal::copy_merge_modules_into_installset($installdir); }
+
+ installer::logger::print_message( "... creating ddf files ...\n" );
+
+ # Creating all needed ddf files and generating a list
+ # for the package process containing all system calls
+
+ my $ddfdir = installer::systemactions::create_directories("ddf", $languagestringref);
+
+ my $packjobref = installer::windows::msiglobal::generate_cab_file_list($filesinproductlanguageresolvedarrayref, $installdir, $ddfdir, $allvariableshashref);
+
+ # Update and patch reasons the pack order needs to be saved
+ installer::windows::msiglobal::save_packorder();
+
+ $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ ####################################
+ # Writing log file
+ # before cab files are packed
+ ####################################
+
+ installer::logger::print_message( "... creating log file $installer::globals::logfilename \n" );
+
+ installer::files::save_file($loggingdir . $installer::globals::logfilename, \@installer::globals::logfileinfo);
+
+ #######################################################
+ # Finally really create the installation packages,
+ # Only for Windows and only on a windows platform.
+ #######################################################
+
+ if ( $installer::globals::iswin || $installer::globals::packageformat eq 'msi' )
+ {
+ installer::logger::print_message( "... packaging installation set ... \n" );
+ installer::windows::msiglobal::execute_packaging($packjobref, $loggingdir, $allvariableshashref);
+ if ( $installer::globals::include_cab_in_msi ) { installer::windows::msiglobal::include_cabs_into_msi($installdir); }
+
+ ####################################
+ # Writing log file
+ # after cab files are packed
+ ####################################
+
+ installer::logger::print_message( "\n... creating log file $installer::globals::logfilename \n" );
+ installer::files::save_file($loggingdir . $installer::globals::logfilename, \@installer::globals::logfileinfo);
+ }
+
+ #######################################################
+ # Analyzing the log file
+ #######################################################
+
+ my $is_success = 0;
+ my $finalinstalldir = "";
+ installer::worker::clean_output_tree(); # removing directories created in the output tree
+ ($is_success, $finalinstalldir) = installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number);
+
+ #######################################################
+ # Creating Windows msp patches
+ #######################################################
+
+ if (( $is_success ) && ( $installer::globals::updatedatabase ) && ( $allvariableshashref->{'CREATE_MSP_INSTALLSET'} ))
+ {
+ # Required:
+ # Temp path for administrative installations: $installer::globals::temppath
+ # Path of new installation set: $finalinstalldir
+ # Path of old installation set: $installer::globals::updatedatabasepath
+ my $mspdir = installer::windows::msp::create_msp_patch($finalinstalldir, $includepatharrayref, $allvariableshashref, $languagestringref, $languagesarrayref, $filesinproductlanguageresolvedarrayref);
+ ($is_success, $finalinstalldir) = installer::worker::analyze_and_save_logfile($loggingdir, $mspdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number);
+ installer::worker::clean_output_tree(); # removing directories created in the output tree
+ }
+
+ #######################################################
+ # Creating download installation set
+ #######################################################
+
+ my $create_download = 0;
+ my $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "downloadname");
+ if ( $installer::globals::languagepack ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "langpackdownloadname"); }
+ if ( $installer::globals::helppack ) { $downloadname = installer::ziplist::getinfofromziplist($allsettingsarrayref, "helppackdownloadname"); }
+
+ if ( $$downloadname ne "" ) { $create_download = 1; }
+ if ( $installer::globals::iswindowsbuild )
+ {
+ $create_download = 0;
+ $$downloadname = installer::download::set_download_filename($languagestringref, $allvariableshashref);
+ installer::systemactions::rename_one_file( $finalinstalldir . $installer::globals::separator . $installer::globals::shortmsidatabasename, $finalinstalldir . $installer::globals::separator . $$downloadname . ".msi" );
+ }
+ if (( $is_success ) && ( $create_download ) && ( $ENV{'ENABLE_DOWNLOADSETS'} ))
+ {
+ my $downloaddir = installer::download::create_download_sets($finalinstalldir, $includepatharrayref, $allvariableshashref, $$downloadname, $languagestringref, $languagesarrayref);
+ installer::worker::analyze_and_save_logfile($loggingdir, $downloaddir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number);
+ }
+
+ } # end of "if ( $installer::globals::iswindowsbuild )"
+
+ # saving file_info file for later analysis
+ my $speciallogfilename = $loggingdir . "fileinfo_" . $installer::globals::product . "\.log";
+ open my $log_fh, '>', $speciallogfilename
+ or die "Could not open $speciallogfilename for writing: $!";
+ print $log_fh Dumper($filesinproductlanguageresolvedarrayref);
+
+ } # end of iteration for one language group
+}
+
+sub cleanup_on_error {
+ my $message = shift;
+
+ # If an installation set is currently created, the directory name
+ # is saved in $installer::globals::saveinstalldir. If this
+ # directory name contains "_inprogress", it has to be renamed to
+ # "_witherror".
+ if ( $installer::globals::saveinstalldir =~ /_inprogress/ ) {
+ installer::systemactions::rename_string_in_directory($installer::globals::saveinstalldir, "_inprogress", "_witherror");
+ }
+
+ # Removing directories created in the output tree.
+ installer::worker::clean_output_tree();
+
+ $installer::globals::logfilename = $installer::globals::exitlog . $installer::globals::logfilename;
+
+ my @log = (@installer::globals::logfileinfo, @installer::globals::globallogfileinfo);
+
+ push(@log, "\n" . '*' x 65 . "\n");
+ push(@log, $message);
+ push(@log, '*' x 65 . "\n");
+
+ installer::files::save_file($installer::globals::logfilename, \@log);
+
+ print("ERROR, saved logfile $installer::globals::logfilename is:\n");
+ open(my $log, "<", $installer::globals::logfilename);
+ print ": $_" while (<$log>);
+ print "\n";
+ close($log);
+}
+
+1;
diff --git a/solenv/bin/modules/installer/control.pm b/solenv/bin/modules/installer/control.pm
new file mode 100644
index 000000000..196a13546
--- /dev/null
+++ b/solenv/bin/modules/installer/control.pm
@@ -0,0 +1,474 @@
+#
+# 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 .
+#
+
+package installer::control;
+
+use Cwd;
+use installer::converter;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::pathanalyzer;
+use installer::scriptitems;
+use installer::systemactions;
+
+#########################################################
+# Function that can be used for additional controls.
+# Search happens in $installer::globals::patharray.
+#########################################################
+
+sub check_needed_files_in_path
+{
+ my ( $filesref ) = @_;
+
+ foreach $onefile ( @{$filesref} )
+ {
+ installer::logger::print_message( "... searching $onefile ..." );
+
+ my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$onefile, $installer::globals::patharray , 0);
+
+ if ( $$fileref eq "" )
+ {
+ $error = 1;
+ installer::logger::print_error( "$onefile not found\n" );
+ }
+ else
+ {
+ installer::logger::print_message( "\tFound: $$fileref\n" );
+ }
+ }
+
+ if ( $error )
+ {
+ installer::exiter::exit_program("ERROR: Could not find all needed files in path!", "check_needed_files_in_path");
+ }
+}
+
+#########################################################
+# Checking the local system
+# Checking existence of needed files in include path
+#########################################################
+
+sub check_system_path
+{
+ # The following files have to be found in the environment variable PATH
+ # All platforms: zip
+ # Windows only: "msiinfo.exe", "msidb.exe", "uuidgen.exe", "makecab.exe", "msitran.exe", "expand.exe" for msi database and packaging
+
+ my $onefile;
+ my $error = 0;
+ my $pathvariable = $ENV{'PATH'};
+ my $local_pathseparator = $installer::globals::pathseparator;
+
+ if( $^O =~ /cygwin/i )
+ {
+ # When using cygwin's perl the PATH variable is POSIX style and
+ # has to be converted to DOS style for further use.
+ $pathvariable = join ';',
+ map { $dir = qx{cygpath -m "$_"}; chomp($dir); $dir }
+ split /\Q$local_pathseparator\E\s*/, $pathvariable;
+ $local_pathseparator = ';';
+ }
+ my $patharrayref = installer::converter::convert_stringlist_into_array(\$pathvariable, $local_pathseparator);
+
+ $installer::globals::patharray = $patharrayref;
+
+ my @needed_files_in_path = ();
+
+ if (($installer::globals::iswin) && ($installer::globals::iswindowsbuild))
+ {
+ @needed_files_in_path = ("zip.exe", "msiinfo.exe", "msidb.exe", "uuidgen", "makecab.exe", "msitran.exe", "expand.exe");
+ }
+ elsif ($installer::globals::iswin)
+ {
+ @needed_files_in_path = ("zip.exe");
+ }
+ else
+ {
+ @needed_files_in_path = ("zip");
+ }
+
+ foreach $onefile ( @needed_files_in_path )
+ {
+ installer::logger::print_message( "... searching $onefile ..." );
+
+ my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath_classic(\$onefile, $patharrayref , 0);
+
+ if ( $$fileref eq "" )
+ {
+ $error = 1;
+ installer::logger::print_error( "$onefile not found\n" );
+ }
+ else
+ {
+ installer::logger::print_message( "\tFound: $$fileref\n" );
+ # Saving the absolute path for msitran.exe. This is required for the determination of the checksum.
+ if ( $onefile eq "msitran.exe" ) { $installer::globals::msitranpath = $$fileref; }
+ }
+ }
+
+ if ( $error )
+ {
+ installer::exiter::exit_program("ERROR: Could not find all needed files in path!", "check_system_path");
+ }
+
+ # checking for epm, which has to be in the path or in the solver
+
+ if (( $installer::globals::call_epm ) && (!($installer::globals::iswindowsbuild)))
+ {
+ my $onefile = "epm";
+ my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$onefile, $patharrayref , 0);
+ if (!( $$fileref eq "" ))
+ {
+ $installer::globals::epm_in_path = 1;
+
+ if ( $$fileref =~ /^\s*\.\/epm\s*$/ )
+ {
+ my $currentdir = cwd();
+ $$fileref =~ s/\./$currentdir/;
+ }
+
+ $installer::globals::epm_path = $$fileref;
+ }
+ }
+}
+
+######################################################################
+# Determining the version of file makecab.exe
+######################################################################
+
+sub get_makecab_version
+{
+ my $makecabversion = -1;
+
+ my $systemcall = "makecab.exe |";
+ my @makecaboutput = ();
+
+ open (CAB, $systemcall);
+ while (<CAB>) { push(@makecaboutput, $_); }
+ close (CAB);
+
+ my $returnvalue = $?; # $? contains the return value of the systemcall
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ my $versionline = "";
+
+ for ( my $i = 0; $i <= $#makecaboutput; $i++ )
+ {
+ if ( $makecaboutput[$i] =~ /\bVersion\b/i )
+ {
+ $versionline = $makecaboutput[$i];
+ last;
+ }
+ }
+
+ $infoline = $versionline;
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ if ( $versionline =~ /\bVersion\b\s+(\d+[\d\.]+\d+)\s+/ )
+ {
+ $makecabversion = $1;
+ }
+
+ # Only using the first number
+
+ if ( $makecabversion =~ /^\s*(\d+?)\D*/ )
+ {
+ $makecabversion = $1;
+ }
+
+ $infoline = "Using version: " . $makecabversion . "\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ }
+
+ return $makecabversion;
+}
+
+######################################################################
+# Checking the version of file makecab.exe
+######################################################################
+
+sub check_makecab_version
+{
+ # checking version of makecab.exe
+ # Now it is guaranteed, that makecab.exe is in the path
+
+ my $do_check = 1;
+
+ my $makecabversion = get_makecab_version();
+
+ my $infoline = "Tested version: " . $installer::globals::controlledmakecabversion . "\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ if ( $makecabversion < 0 ) { $do_check = 0; } # version could not be determined
+
+ if ( $do_check )
+ {
+ if ( $makecabversion < $installer::globals::controlledmakecabversion )
+ {
+ installer::exiter::exit_program("makecab.exe too old. Found version: \"$makecabversion\", required version: \"$installer::globals::controlledmakecabversion\"!", "check_makecab_version");
+ }
+ }
+ else
+ {
+ $infoline = "Warning: No version check of makecab.exe\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ }
+}
+
+######################################################################
+# Reading the environment variables for the paths in ziplist.
+# solarenvpath, os, pmiscpath
+######################################################################
+
+sub check_system_environment
+{
+ my %variables = ();
+ my $error = 0;
+
+ my @environmentvariables = qw(
+ LIBO_VERSION_MAJOR
+ LIBO_VERSION_MINOR
+ CPUNAME
+ OS
+ COM
+ PLATFORMID
+ LOCAL_OUT
+ LOCAL_COMMON_OUT
+ WORKDIR
+ SRCDIR
+ );
+
+ for my $key ( @environmentvariables )
+ {
+ $variables{$key} = defined($ENV{$key}) ? $ENV{$key} : "";
+
+ if ( $variables{$key} eq "" )
+ {
+ installer::logger::print_error( "$key not set in environment\n" );
+ $error = 1;
+ }
+ }
+
+ if ( $error )
+ {
+ installer::exiter::exit_program("ERROR: Environment variable not set!", "check_system_environment");
+ }
+
+ return \%variables;
+}
+
+#############################################################
+# Controlling the log file at the end of the
+# packaging process
+#############################################################
+
+sub check_logfile
+{
+ my ($logfile) = @_;
+
+ my @errors = ();
+ my @output = ();
+ my $contains_error = 0;
+
+ my $ignore_error = 0;
+ my $make_error_to_warning = 0;
+
+ for ( my $i = 0; $i <= $#{$logfile}; $i++ )
+ {
+ my $line = ${$logfile}[$i];
+
+ # Errors are all errors, but not the Windows installer table "Error.idt"
+
+ my $compareline = $line;
+ $compareline =~ s/Error\.idt//g; # removing all occurrences of "Error.idt"
+ $compareline =~ s/Error\.ulf//g; # removing all occurrences of "Error.ulf"
+ $compareline =~ s/Error\.idl//g; # removing all occurrences of "Error.idl"
+ $compareline =~ s/Error\.html//g; # removing all occurrences of "Error.html"
+ $compareline =~ s/error\.py//g; # removing all occurrences of "error.py"
+ $compareline =~ s/error\.cpython\-3.(\.opt\-.|)\.py[co]//g; # removing all occurrences of "error-cpython"
+ $compareline =~ s/libgpg-error//g;
+ $compareline =~ s/Error-xref\.html//g;
+
+ if ( $compareline =~ /\bError\b/i )
+ {
+ $contains_error = 1;
+ push(@errors, $line);
+
+ if ( $ignore_error )
+ {
+ $contains_error = 0;
+ $make_error_to_warning = 1;
+ }
+ }
+ }
+
+ if ($contains_error)
+ {
+ my $line = "\n*********************************************************************\n";
+ push(@output, $line);
+ $line = "ERROR: The following errors occurred in packaging process:\n\n";
+ push(@output, $line);
+
+ for ( my $i = 0; $i <= $#errors; $i++ )
+ {
+ $line = "$errors[$i]";
+ push(@output, $line);
+ }
+
+ $line = "*********************************************************************\n";
+ push(@output, $line);
+ }
+ else
+ {
+ my $line = "";
+
+ if ( $make_error_to_warning )
+ {
+ $line = "\n*********************************************************************\n";
+ push(@output, $line);
+ $line = "The following errors in the log file were ignored:\n\n";
+ push(@output, $line);
+
+ for ( my $i = 0; $i <= $#errors; $i++ )
+ {
+ $line = "$errors[$i]";
+ push(@output, $line);
+ }
+
+ $line = "*********************************************************************\n";
+ push(@output, $line);
+ }
+
+ $line = "\n***********************************************************\n";
+ push(@output, $line);
+ $line = "Successful packaging process!\n";
+ push(@output, $line);
+ $line = "***********************************************************\n";
+ push(@output, $line);
+ }
+
+ # printing the output file and adding it to the logfile
+
+ installer::logger::include_header_into_logfile("Summary:");
+
+ my $force = 1; # print this message even in 'quiet' mode
+ for ( my $i = 0; $i <= $#output; $i++ )
+ {
+ my $line = "$output[$i]";
+ installer::logger::print_message( "$line", $force );
+ push( @installer::globals::logfileinfo, $line);
+ push( @installer::globals::errorlogfileinfo, $line);
+ }
+
+ return $contains_error;
+}
+
+#############################################################
+# Reading the Windows list file for Windows language codes
+# Encoding field is no longer used. We use UTF-8 everywhere.
+#############################################################
+
+sub read_lcidlist
+{
+ my ($patharrayref) = @_;
+
+ if ( ! -f $installer::globals::lcidlistname ) { installer::exiter::exit_program("ERROR: Did not find Windows LCID list $installer::globals::lcidlistname!", "read_lcidlist"); }
+
+ my $infoline = "Found LCID file: $installer::globals::lcidlistname\n";
+ push(@installer::globals::globallogfileinfo, $infoline);
+
+ my $lcidlist = installer::files::read_file($installer::globals::lcidlistname);
+ my %msilanguage = ();
+
+ for ( my $i = 0; $i <= $#{$lcidlist}; $i++ )
+ {
+ my $line = ${$lcidlist}[$i];
+ # de-mangle various potential DOS line-ending problems
+ $line =~ s/\r//g;
+ $line =~ s/\n//g;
+ $line =~ s/\s*\#.*$//; # removing comments after "#"
+ if ( $line =~ /^\s*$/ ) { next; } # this is an empty line
+
+ if ( $line =~ /^\s*([\w-]+)\s+(\d+)\s+(\d+)\s*$/ )
+ {
+ my $onelanguage = $1;
+ my $windowslanguage = $3;
+ $msilanguage{$onelanguage} = $windowslanguage;
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Wrong syntax in Windows LCID list $installer::globals::lcidlistname in line $i: '$line'", "read_lcidlist");
+ }
+ }
+ $installer::globals::msilanguage = \%msilanguage;
+}
+
+#############################################################
+# Only for Windows and Linux (RPM)there is currently
+# a reliable mechanism to register extensions during
+# installation process. Therefore it is for all other
+# platforms forbidden to install oxt files into that
+# directory, in which they are searched for registration.
+#############################################################
+
+sub check_oxtfiles
+{
+ my ( $filesarray ) = @_;
+
+ for ( my $i = 0; $i <= $#{$filesarray}; $i++ )
+ {
+ my $onefile = ${$filesarray}[$i];
+
+ if (( $onefile->{'Name'} ) && ( $onefile->{'Dir'} ))
+ {
+ if (( $onefile->{'Name'} =~ /\.oxt\s*$/ ) && ( $onefile->{'Dir'} eq $installer::globals::extensioninstalldir ))
+ {
+ installer::exiter::exit_program("There is currently only for Linux (RPM) and Windows a reliable mechanism to register extensions during installation.\nPlease remove file \"$onefile->{'gid'}\" from your installation set!\nYou can use \"\#ifdef _WIN32\" and \"\#ifdef LINUX\" in scp.", "check_oxtfiles");
+ }
+ }
+ }
+}
+
+#######################################################################
+# Setting global variable "$installer::globals::addsystemintegration"
+#######################################################################
+
+sub set_addsystemintegration
+{
+ my ($allvariables) = @_;
+
+ if ( $allvariables->{'ADDSYSTEMINTEGRATION'} ) { $installer::globals::addsystemintegration = 1; }
+
+ if ( $installer::globals::languagepack ) { $installer::globals::addsystemintegration = 0; }
+ if ( $installer::globals::helppack ) { $installer::globals::addsystemintegration = 0; }
+
+ my $infoline = "Value of \$installer::globals::addsystemintegration: $installer::globals::addsystemintegration\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+}
+
+1;
diff --git a/solenv/bin/modules/installer/converter.pm b/solenv/bin/modules/installer/converter.pm
new file mode 100644
index 000000000..f825e0439
--- /dev/null
+++ b/solenv/bin/modules/installer/converter.pm
@@ -0,0 +1,187 @@
+#
+# 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 .
+#
+
+package installer::converter;
+
+use strict;
+use warnings;
+
+use installer::globals;
+
+#############################
+# Converter
+#############################
+
+sub convert_array_to_hash
+{
+ my ($arrayref) = @_;
+
+ my %newhash = ();
+
+ for (@{$arrayref})
+ {
+ next unless /^\s*([\w-]+?)\s+(.*?)\s*$/;
+ $newhash{$1} = $2;
+ }
+
+ return \%newhash;
+}
+
+#############################################################################
+# Converting a string list with separator $listseparator
+# into an array
+#############################################################################
+
+sub convert_stringlist_into_array
+{
+ my ( $includestringref, $listseparator ) = @_;
+
+ return [map "$_\n", split /\Q$listseparator\E\s*/, ${$includestringref}];
+}
+
+#############################################################################
+# Converting a string list with separator $listseparator
+# into a hash with values 1.
+#############################################################################
+
+sub convert_stringlist_into_hash
+{
+ my ( $includestringref, $listseparator ) = @_;
+
+ return {map {$_, 1} split /\Q$listseparator\E\s*/, ${$includestringref}};
+}
+
+#############################################################################
+# Converting an array into a space separated string
+#############################################################################
+
+sub convert_array_to_space_separated_string
+{
+ my ( $arrayref ) = @_;
+
+ my $newstring;
+ for (@{$arrayref}) {
+ my $tmp = $_;
+ $tmp =~ s/\s+$//;
+ $newstring .= "$tmp ";
+ }
+ $newstring =~ s/ $//;
+
+ return $newstring;
+}
+
+#############################################################################
+# The file name contains for some files "/". If this programs runs on
+# a windows platform, this has to be converted to "\".
+#############################################################################
+
+sub convert_slash_to_backslash
+{
+ my ($filesarrayref) = @_;
+
+ for my $onefile (@{$filesarrayref})
+ {
+ if ( $onefile->{'Name'} ) { $onefile->{'Name'} =~ s/\//\\/g; }
+ }
+}
+
+############################################################################
+# Creating a copy of an existing file object
+# No converter
+############################################################################
+
+sub copy_item_object
+{
+ my ($olditemhashref, $newitemhashref) = @_;
+
+ $newitemhashref = {%{$olditemhashref}};
+}
+
+#################################################################
+# Windows paths must not contain the following structure:
+# c:\dirA\dirB\..\dirC
+# This has to be exchanged to
+# c:\dirA\dirC
+#################################################################
+
+sub make_path_conform
+{
+ my ( $path ) = @_;
+ my $s = $installer::globals::separator;
+
+ while ($path =~ s/[^\.\Q$s\E]+?\Q$s\E\.\.(?:\Q$s\E|$)//g) {}
+
+ return $path;
+}
+
+#################################################################
+# Copying an item collector
+# A reference to an array consisting of references to hashes.
+#################################################################
+
+sub copy_collector
+{
+ return [map { {%{$_}} } @{$_[0]}];
+}
+
+#################################################################
+# Combining two arrays, first wins
+#################################################################
+
+sub combine_arrays_from_references_first_win
+{
+ my ( $arrayref1, $arrayref2 ) = @_;
+
+ my $hashref1 = convert_array_to_hash($arrayref1);
+ my $hashref2 = convert_array_to_hash($arrayref2);
+
+ # add key-value pairs from hash1 to hash2 (overwrites existing keys)
+ @{$hashref2}{keys %{$hashref1}} = values %{$hashref1};
+
+ return [map { "$_ $hashref2->{$_}\n" } keys %{$hashref2}];
+}
+
+#################################################################
+# Replacing separators, that are included into quotes
+#################################################################
+
+sub replace_masked_separator
+{
+ my ($string, $separator, $replacementstring) = @_;
+
+ $string =~ s/\\\Q$separator\E/$replacementstring/g;
+
+ return $string;
+}
+
+#################################################################
+# Resolving separators, that were replaced
+# in function mask_separator_in_quotes
+#################################################################
+
+sub resolve_masked_separator
+{
+ my ($arrayref, $separator, $replacementstring) = @_;
+
+ for (@{$arrayref})
+ {
+ s/$replacementstring/$separator/g;
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/copyproject.pm b/solenv/bin/modules/installer/copyproject.pm
new file mode 100644
index 000000000..309636657
--- /dev/null
+++ b/solenv/bin/modules/installer/copyproject.pm
@@ -0,0 +1,105 @@
+#
+# 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 .
+#
+
+package installer::copyproject;
+
+use strict;
+use warnings;
+
+use installer::control;
+use installer::converter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::systemactions;
+use installer::worker;
+
+####################################################
+# Including header files into the logfile
+####################################################
+
+sub copy_project
+{
+ my ( $filesref, $scpactionsref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref ) = @_;
+
+ # Creating directories
+
+ installer::logger::include_header_into_logfile("Creating installation directory");
+
+ my $current_install_number = "";
+
+ my $installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number);
+
+ my $installlogdir = installer::systemactions::create_directory_next_to_directory($installdir, "log");
+
+ # Copy files and ScpActions
+
+ installer::logger::include_header_into_logfile("Copying files:");
+
+ # copy Files
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+
+ my $source = $onefile->{'sourcepath'};
+ my $destination = $installdir . $installer::globals::separator . $onefile->{'Name'};
+
+ installer::systemactions::copy_one_file($source, $destination);
+
+ if ( $onefile->{'UnixRights'} )
+ {
+ chmod oct($onefile->{'UnixRights'}), $destination;
+ }
+ elsif ( $destination =~ /install\s*$/ )
+ {
+ chmod 0775, $destination;
+ }
+ }
+
+ # copy ScpActions
+
+ for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
+ {
+ my $onefile = ${$scpactionsref}[$i];
+
+ my $source = $onefile->{'sourcepath'};
+ my $destination = $installdir . $installer::globals::separator . $onefile->{'DestinationName'};
+
+ installer::systemactions::copy_one_file($source, $destination);
+
+ if ( $onefile->{'UnixRights'} )
+ {
+ chmod oct($onefile->{'UnixRights'}), $destination;
+ }
+ elsif ( $destination =~ /install\s*$/ )
+ {
+ chmod 0775, $destination;
+ }
+ }
+
+ # Analyzing the log file
+
+ installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number);
+
+ # That's all
+
+ exit(0);
+}
+
+1;
diff --git a/solenv/bin/modules/installer/download.pm b/solenv/bin/modules/installer/download.pm
new file mode 100644
index 000000000..f46dae735
--- /dev/null
+++ b/solenv/bin/modules/installer/download.pm
@@ -0,0 +1,666 @@
+#
+# 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 .
+#
+
+package installer::download;
+
+use strict;
+use warnings;
+
+use File::Spec;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::remover;
+use installer::systemactions;
+
+BEGIN { # This is needed so that cygwin's perl evaluates ACLs
+ # (needed for correctly evaluating the -x test.)
+ if( $^O =~ /cygwin/i ) {
+ require filetest; import filetest "access";
+ }
+}
+
+##################################################################
+# Including the lowercase product name into the script template
+##################################################################
+
+sub put_productname_into_script
+{
+ my ($scriptfile, $variableshashref) = @_;
+
+ my $productname = $variableshashref->{'PRODUCTNAME'};
+ $productname = lc($productname);
+ $productname =~ s/\.//g; # openoffice.org -> openofficeorg
+ $productname =~ s/\s*//g;
+
+ my $infoline = "Adding productname $productname into download shell script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/;
+ }
+}
+
+#########################################################
+# Including the linenumber into the script template
+#########################################################
+
+sub put_linenumber_into_script
+{
+ my ( $scriptfile ) = @_;
+
+ my $linenumber = $#{$scriptfile} + 2;
+
+ my $infoline = "Adding linenumber $linenumber into download shell script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/LINENUMBERPLACEHOLDER/$linenumber/;
+ }
+}
+
+#########################################################
+# Determining the name of the new scriptfile
+#########################################################
+
+sub determine_scriptfile_name
+{
+ my ( $filename ) = @_;
+
+ $installer::globals::downloadfileextension = ".sh";
+ $filename = $filename . $installer::globals::downloadfileextension;
+ $installer::globals::downloadfilename = $filename;
+
+ my $infoline = "Setting download shell script file name to $filename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return $filename;
+}
+
+#########################################################
+# Saving the script file in the installation directory
+#########################################################
+
+sub save_script_file
+{
+ my ($directory, $newscriptfilename, $scriptfile) = @_;
+
+ $newscriptfilename = $directory . $installer::globals::separator . $newscriptfilename;
+ installer::files::save_file($newscriptfilename, $scriptfile);
+
+ my $infoline = "Saving script file $newscriptfilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ( ! $installer::globals::iswindowsbuild )
+ {
+ chmod 0775, $newscriptfilename;
+ }
+
+ return $newscriptfilename;
+}
+
+#########################################################
+# Including checksum and size into script file
+#########################################################
+
+sub put_checksum_and_size_into_script
+{
+ my ($scriptfile, $sumout) = @_;
+
+ my $checksum = "";
+ my $size = "";
+
+ if ( $sumout =~ /^\s*(\d+)\s+(\d+)\s*$/ )
+ {
+ $checksum = $1;
+ $size = $2;
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Incorrect return value from /usr/bin/sum: $sumout", "put_checksum_and_size_into_script");
+ }
+
+ my $infoline = "Adding checksum $checksum and size $size into download shell script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/CHECKSUMPLACEHOLDER/$checksum/;
+ ${$scriptfile}[$i] =~ s/DISCSPACEPLACEHOLDER/$size/;
+ }
+
+}
+
+#########################################################
+# Determining checksum and size of tar file
+#########################################################
+
+sub call_sum
+{
+ my ($filename) = @_;
+
+ my $systemcall = "/usr/bin/sum $filename |";
+
+ my $sumoutput = "";
+
+ open (SUM, "$systemcall");
+ $sumoutput = <SUM>;
+ close (SUM);
+
+ my $returnvalue = $?; # $? contains the return value of the systemcall
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ $sumoutput =~ s/\s+$filename\s$//;
+ return $sumoutput;
+}
+
+#########################################################
+# Include the tar file into the script
+#########################################################
+
+sub include_tar_into_script
+{
+ my ($scriptfile, $temporary_tarfile) = @_;
+
+ my $systemcall = "cat $temporary_tarfile >> $scriptfile && rm $temporary_tarfile";
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ return $returnvalue;
+}
+
+#########################################################
+# Create a tar file from the binary package
+#########################################################
+
+sub tar_package
+{
+ my ( $installdir, $tarfilename, $usefakeroot) = @_;
+
+ my $fakerootstring = "";
+ if ( $usefakeroot ) { $fakerootstring = "fakeroot"; }
+
+ my $systemcall = "cd $installdir; $fakerootstring tar -cf - * > $tarfilename";
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ chmod 0775, $tarfilename;
+
+ return ( -s $tarfilename );
+}
+
+#########################################################
+# Setting installation languages
+#########################################################
+
+sub get_downloadname_language
+{
+ my ($languagestringref) = @_;
+
+ my $languages = $$languagestringref;
+
+ if ( $installer::globals::added_english )
+ {
+ $languages =~ s/en-US_//;
+ $languages =~ s/_en-US//;
+ }
+
+ # do not list languages if there are too many
+ if ( length ($languages) > $installer::globals::max_lang_length )
+ {
+ $languages = '';
+ }
+
+ # do not list pure en-US, except for helppack and langpack
+ if ( ( $languages eq "en-US" ) &&
+ ( ! $installer::globals::languagepack ) &&
+ ( ! $installer::globals::helppack ) )
+ {
+ $languages = '';
+ }
+
+ return $languages;
+}
+
+#########################################################
+# Setting download name
+#########################################################
+
+sub get_downloadname_productname
+{
+ my ($allvariables) = @_;
+
+ my $start = "";
+
+ $start = $allvariables->{'PRODUCTNAME'};
+
+ return $start;
+}
+
+#########################################################
+# Setting download version
+#########################################################
+
+sub get_download_version
+{
+ my ($allvariables) = @_;
+
+ my $version = "";
+
+ $version = $allvariables->{'PRODUCTVERSION'};
+ if (( $allvariables->{'PRODUCTEXTENSION'} ) && ( $allvariables->{'PRODUCTEXTENSION'} ne "" )) { $version = $version . $allvariables->{'PRODUCTEXTENSION'}; }
+
+ return $version;
+}
+
+#################################################################
+# Setting the platform name for download
+#################################################################
+
+sub get_download_platformname
+{
+ my $platformname = "";
+
+ if ( $installer::globals::islinuxbuild )
+ {
+ $platformname = "Linux";
+ }
+ elsif ( $installer::globals::issolarisbuild )
+ {
+ $platformname = "Solaris";
+ }
+ elsif ( $installer::globals::iswindowsbuild )
+ {
+ $platformname = "Win";
+ }
+ elsif ( $installer::globals::isfreebsdbuild )
+ {
+ $platformname = "FreeBSD";
+ }
+ elsif ( $installer::globals::ismacbuild )
+ {
+ $platformname = "MacOS";
+ }
+ else
+ {
+ $platformname = $installer::globals::os;
+ }
+
+ return $platformname;
+}
+
+#########################################################
+# Setting the architecture for the download name
+#########################################################
+
+sub get_download_architecture
+{
+ my $arch = "";
+
+ if ( $installer::globals::issolarissparcbuild )
+ {
+ $arch = "Sparc";
+ }
+ elsif ( $installer::globals::issolarisx86build )
+ {
+ $arch = "x86";
+ }
+ elsif ( $installer::globals::cpuname eq 'INTEL' )
+ {
+ $arch = "x86";
+ }
+ elsif ( $installer::globals::cpuname eq 'POWERPC' )
+ {
+ $arch = "PPC";
+ }
+ elsif ( $installer::globals::cpuname eq 'POWERPC64' )
+ {
+ $arch = "PPC";
+ }
+ elsif ( $installer::globals::cpuname eq 'X86_64' )
+ {
+ $arch = $installer::globals::os eq 'WNT' ? 'x64' : 'x86-64';
+ }
+ elsif ( $installer::globals::cpuname eq 'AARCH64' )
+ {
+ $arch = "aarch64";
+ }
+
+ return $arch;
+}
+
+#########################################################
+# Setting the content type for the download name
+#########################################################
+
+sub get_download_content
+{
+ my ($allvariables) = @_;
+
+ my $content = "";
+
+ # content type included in the installer
+ if ( $installer::globals::isrpmbuild )
+ {
+ $content = "rpm";
+ }
+ elsif ( $installer::globals::isdebbuild )
+ {
+ $content = "deb";
+ }
+ elsif ( $installer::globals::packageformat eq "archive" )
+ {
+ $content = "archive";
+ }
+
+ return $content;
+}
+
+#########################################################
+# Setting the functionality type for the download name
+#########################################################
+
+sub get_download_functionality
+{
+ my ($allvariables) = @_;
+
+ my $functionality = "";
+
+ if ( $installer::globals::languagepack )
+ {
+ $functionality = "langpack";
+ }
+ elsif ( $installer::globals::helppack )
+ {
+ $functionality = "helppack";
+ }
+ elsif ( $allvariables->{'POSTVERSIONEXTENSION'} eq "SDK" )
+ {
+ $functionality = "sdk";
+ }
+ elsif ( $allvariables->{'POSTVERSIONEXTENSION'} eq "TEST" )
+ {
+ $functionality = "test";
+ }
+ elsif ( $allvariables->{'PRODUCTNAME'} eq "URE" )
+ {
+ $functionality = "ure";
+ }
+
+ return $functionality;
+}
+
+###############################################################################################
+# Setting the download file name
+# Syntax:
+# (PRODUCTNAME)_(VERSION)_(OS)_(ARCH)_(INSTALLTYPE)_(LANGUAGE).(FILEEXTENSION)
+###############################################################################################
+
+sub set_download_filename
+{
+ my ($languagestringref, $allvariables) = @_;
+
+ my $start = get_downloadname_productname($allvariables);
+ my $versionstring = get_download_version($allvariables);
+ my $platform = get_download_platformname();
+ my $architecture = get_download_architecture();
+ my $content = get_download_content($allvariables);
+ my $functionality = get_download_functionality($allvariables);
+ my $language = get_downloadname_language($languagestringref);
+
+ # Setting the extension happens automatically
+
+ my $filename = $start . "_" . $versionstring . "_" . $platform . "_" . $architecture . "_" . $content . "_" . $functionality . "_" . $language;
+
+ # get rid of duplicit "_" delimiters when some strings are empty
+ $filename =~ s/\_\_\_/\_/g;
+ $filename =~ s/\_\_/\_/g;
+ $filename =~ s/\_\s*$//;
+
+ $installer::globals::ooodownloadfilename = $filename;
+
+ return $filename;
+}
+
+
+#########################################################
+# Creating a tar.gz file
+#########################################################
+
+sub create_tar_gz_file_from_directory
+{
+ my ($installdir, $usefakeroot, $downloaddir, $downloadfilename) = @_;
+
+ my $infoline = "";
+
+ my $packdir = $installdir;
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$packdir);
+ my $changedir = $installdir;
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$changedir);
+
+ my $fakerootstring = "";
+ if ( $usefakeroot ) { $fakerootstring = "fakeroot"; }
+
+ $installer::globals::downloadfileextension = ".tar.gz";
+ $installer::globals::downloadfilename = $downloadfilename . $installer::globals::downloadfileextension;
+ my $targzname = $downloaddir . $installer::globals::separator . $installer::globals::downloadfilename;
+
+ # fdo#67060 - install script is for RPM only
+ if ( -e "$installdir/install" && !$installer::globals::isrpmbuild )
+ {
+ unlink("$installdir/install");
+ }
+
+ my $systemcall = "cd $changedir; $fakerootstring tar -cf - $packdir | $installer::globals::packertool > $targzname";
+
+ my $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ return $targzname;
+}
+
+##############################################################
+# Returning the complete block in all languages
+# for a specified string
+##############################################################
+
+sub get_language_block_from_language_file
+{
+ my ($searchstring, $languagefile) = @_;
+
+ my @language_block = ();
+
+ for ( my $i = 0; $i <= $#{$languagefile}; $i++ )
+ {
+ if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ )
+ {
+ my $counter = $i;
+
+ push(@language_block, ${$languagefile}[$counter]);
+ $counter++;
+
+ while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ )))
+ {
+ push(@language_block, ${$languagefile}[$counter]);
+ $counter++;
+ }
+
+ last;
+ }
+ }
+
+ return \@language_block;
+}
+
+##############################################################
+# Returning a specific language string from the block
+# of all translations
+##############################################################
+
+sub get_language_string_from_language_block
+{
+ my ($language_block, $language) = @_;
+
+ my $newstring = "";
+
+ for ( my $i = 0; $i <= $#{$language_block}; $i++ )
+ {
+ if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
+ {
+ $newstring = $1;
+ last;
+ }
+ }
+
+ if ( $newstring eq "" )
+ {
+ $language = "en-US"; # defaulting to english
+
+ for ( my $i = 0; $i <= $#{$language_block}; $i++ )
+ {
+ if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
+ {
+ $newstring = $1;
+ last;
+ }
+ }
+ }
+
+ return $newstring;
+}
+
+####################################################
+# Creating download installation sets
+####################################################
+
+sub create_download_sets
+{
+ my ($installationdir, $includepatharrayref, $allvariableshashref, $downloadname, $languagestringref, $languagesarrayref) = @_;
+
+ my $infoline = "";
+
+ my $force = 1; # print this message even in 'quiet' mode
+ installer::logger::print_message( "\n******************************************\n" );
+ installer::logger::print_message( "... creating download installation set ...\n", $force );
+ installer::logger::print_message( "******************************************\n" );
+
+ installer::logger::include_header_into_logfile("Creating download installation sets:");
+
+ my $firstdir = $installationdir;
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$firstdir);
+
+ my $lastdir = $installationdir;
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$lastdir);
+
+ if ( $installer::globals::iswindowsbuild && $lastdir =~ /\./ ) { $lastdir =~ s/\./_download_inprogress\./ }
+ else { $lastdir = $lastdir . "_download_inprogress"; }
+
+ # removing existing directory "_native_packed_inprogress" and "_native_packed_witherror" and "_native_packed"
+
+ my $downloaddir = $firstdir . $lastdir;
+
+ if ( -d $downloaddir ) { installer::systemactions::remove_complete_directory($downloaddir); }
+
+ my $olddir = $downloaddir;
+ $olddir =~ s/_inprogress/_witherror/;
+ if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); }
+
+ $olddir = $downloaddir;
+ $olddir =~ s/_inprogress//;
+ if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); }
+
+ # creating the new directory
+
+ installer::systemactions::create_directory($downloaddir);
+
+ $installer::globals::saveinstalldir = $downloaddir;
+
+ # evaluating the name of the download file
+
+ $downloadname = set_download_filename($languagestringref, $allvariableshashref);
+
+ if ( ! $installer::globals::iswindowsbuild ) # Unix specific part
+ {
+
+ # whether to use fakeroot (only required for Solaris and Linux)
+ my $usefakeroot = 0;
+ if (( $installer::globals::issolarisbuild ) || ( $installer::globals::islinuxbuild )) { $usefakeroot = 1; }
+
+ my $downloadfile = create_tar_gz_file_from_directory($installationdir, $usefakeroot, $downloaddir, $downloadname);
+ }
+
+ return $downloaddir;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/environment.pm b/solenv/bin/modules/installer/environment.pm
new file mode 100644
index 000000000..b45227f8a
--- /dev/null
+++ b/solenv/bin/modules/installer/environment.pm
@@ -0,0 +1,131 @@
+#
+# 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 .
+#
+
+package installer::environment;
+
+use installer::globals;
+
+######################################################
+# Create path variables from environment variables
+######################################################
+
+sub create_pathvariables
+{
+ my ($environment) = @_;
+
+ my %variables = ();
+
+ # The following variables are needed in the path file list
+ # solarenvpath, os, pmiscpath
+
+ my $solarenvpath = "";
+
+ if ( $ENV{'SO_PACK'} ) { $solarenvpath = $ENV{'SO_PACK'}; }
+ # overriding with STAR_INSTPATH, if set
+ if ( $ENV{'STAR_INSTPATH'} ) { $solarenvpath = $ENV{'STAR_INSTPATH'}; }
+
+ $variables{'solarenvpath'} = $solarenvpath;
+
+ my $localpath = $environment->{'LOCAL_OUT'};
+ $variables{'localpath'} = $localpath;
+
+ my $localcommonpath = $environment->{'LOCAL_COMMON_OUT'};
+ $variables{'localcommonpath'} = $localcommonpath;
+
+ my $installscriptdir = $environment->{'WORKDIR'} . $installer::globals::separator . "InstallScriptTarget";
+ $variables{'installscriptdir'} = $installscriptdir;
+
+ my $extensionsdir = $environment->{'WORKDIR'} . $installer::globals::separator . "Extension";
+ $variables{'extensionsdir'} = $extensionsdir;
+
+ my $customtargetpath = $environment->{'WORKDIR'} . $installer::globals::separator . "CustomTarget";
+ $variables{'customtargetpath'} = $customtargetpath;
+
+ my $filelistpath = $environment->{'WORKDIR'};
+ $variables{'filelistpath'} = $filelistpath;
+
+ my $licensepath = $environment->{'WORKDIR'} . $installer::globals::separator . "CustomTarget/readlicense_oo/license";
+ $variables{'licensepath'} = $licensepath;
+
+ my $packinfopath = $environment->{'SRCDIR'} . $installer::globals::separator . "setup_native/source/packinfo";
+ $variables{'packinfopath'} = $packinfopath;
+
+ return \%variables;
+}
+
+##################################################
+# Replacing tilde in paths, because of
+# problem with deep recursion (task 104830)
+##################################################
+
+sub check_tilde_in_directory
+{
+ if ( $ENV{'HOME'} )
+ {
+ my $home = $ENV{'HOME'};
+ $home =~ s/\Q$installer::globals::separator\E\s*$//;
+ $installer::globals::localinstalldir =~ s/~/$home/;
+ my $infoline = "Info: Changing LOCALINSTALLDIR to $installer::globals::localinstalldir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ # exit, because "~" is not allowed, if HOME is not set
+ my $infoline = "ERROR: If \"~\" is used in \"LOCALINSTALLDIR\", environment variable \"HOME\" needs to be defined!\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ die 'If "~" is used in "LOCALINSTALLDIR", environment variable "HOME" needs to be defined!';
+ }
+}
+
+##################################################
+# Setting some fundamental global variables.
+# All these variables can be overwritten
+# by parameters.
+##################################################
+
+sub set_global_environment_variables
+{
+ my ( $environment ) = @_;
+
+ $installer::globals::build = $environment->{'LIBO_VERSION_MAJOR'}.$environment->{'LIBO_VERSION_MINOR'}."0";
+ $installer::globals::os = $environment->{'OS'};
+ $installer::globals::com = $environment->{'COM'};
+ $installer::globals::cpuname = $environment->{'CPUNAME'};
+ $installer::globals::platformid = $environment->{'PLATFORMID'};
+
+ if ( $ENV{'ENABLE_DBGUTIL'} ) {} else { $installer::globals::pro = 1; }
+
+ if ( $ENV{'VERBOSE'} && ( (lc $ENV{'VERBOSE'}) eq "false" ) ) { $installer::globals::quiet = 1; }
+ if ( $ENV{'PREPARE_WINPATCH'} ) { $installer::globals::prepare_winpatch = 1; }
+ if ( $ENV{'PREVIOUS_IDT_DIR'} ) { $installer::globals::previous_idt_dir = $ENV{'PREVIOUS_IDT_DIR'}; }
+ if ( $ENV{'LOCALINSTALLDIR'} ) { $installer::globals::localinstalldir = $ENV{'LOCALINSTALLDIR'}; }
+ if ( $ENV{'LOCALUNPACKDIR'} ) { $installer::globals::localunpackdir = $ENV{'LOCALUNPACKDIR'}; }
+ if ( $ENV{'MAX_LANG_LENGTH'} ) { $installer::globals::max_lang_length = $ENV{'MAX_LANG_LENGTH'}; }
+
+ if ( $ENV{'RPM'} ) { $installer::globals::rpm = $ENV{'RPM'}; }
+ if ( $ENV{'DONTCOMPRESS'} ) { $installer::globals::solarisdontcompress = 1; }
+ if ( $ENV{'IGNORE_ERROR_IN_LOGFILE'} ) { $installer::globals::ignore_error_in_logfile = 1; }
+ if (( $ENV{'ENABLE_STRIP'} ) && ( $ENV{'ENABLE_STRIP'} ne '' )) { $installer::globals::strip = 1; }
+ if (( $ENV{'DISABLE_STRIP'} ) && ( $ENV{'DISABLE_STRIP'} ne '' )) { $installer::globals::strip = 0; }
+
+ if ( $installer::globals::localinstalldir ) { $installer::globals::localinstalldirset = 1; }
+ # Special handling, if LOCALINSTALLDIR contains "~" in the path
+ if ( $installer::globals::localinstalldir =~ /^\s*\~/ ) { check_tilde_in_directory(); }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/epmfile.pm b/solenv/bin/modules/installer/epmfile.pm
new file mode 100644
index 000000000..495366823
--- /dev/null
+++ b/solenv/bin/modules/installer/epmfile.pm
@@ -0,0 +1,2669 @@
+#
+# 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 .
+#
+
+package installer::epmfile;
+
+use Cwd qw();
+use installer::converter;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::packagelist;
+use installer::pathanalyzer;
+use installer::remover;
+use installer::scpzipfiles;
+use installer::scriptitems;
+use installer::systemactions;
+use POSIX;
+
+# please Debian packaging, fdo#53341
+sub debian_rewrite($)
+{
+ my $dep = shift;
+ if ( $installer::globals::debian ) {
+ $dep =~ s/_/-/g; # Debian allows no underline in package name
+ $dep = lc ($dep);
+ }
+ return $dep;
+}
+
+############################################################################
+# Reading the package map to find Solaris package names for
+# the corresponding abbreviations
+############################################################################
+
+sub read_packagemap
+{
+ my ($allvariables, $includepatharrayref, $languagesarrayref) = @_;
+
+ my $packagemapname = "";
+ if ( $allvariables->{'PACKAGEMAP'} ) { $packagemapname = $allvariables->{'PACKAGEMAP'}; }
+ if ( $packagemapname eq "" ) { installer::exiter::exit_program("ERROR: Property PACKAGEMAP must be defined!", "read_packagemap"); }
+
+ my $infoline = "\n\nCollected abbreviations and package names:\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ # Can be a comma separated list. All files have to be found in include paths
+ my $allpackagemapnames = installer::converter::convert_stringlist_into_hash(\$packagemapname, ",");
+ foreach my $onepackagemapname ( keys %{$allpackagemapnames} )
+ {
+ my $packagemapref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$onepackagemapname, $includepatharrayref, 0);
+
+ if ( $$packagemapref eq "" ) { installer::exiter::exit_program("ERROR: Could not find package map file \"$onepackagemapname\" (property PACKAGEMAP)!", "read_packagemap"); }
+
+ my $packagemapcontent = installer::files::read_file($$packagemapref);
+
+ for ( my $i = 0; $i <= $#{$packagemapcontent}; $i++ )
+ {
+ my $line = ${$packagemapcontent}[$i];
+
+ if ( $line =~ /^\s*\#/ ) { next; } # comment line
+ if ( $line =~ /^\s*$/ ) { next; } # empty line
+
+ if ( $line =~ /^\s*(.*?)\t(.*?)\s*$/ )
+ {
+ my $abbreviation = $1;
+ my $packagename = $2;
+ installer::packagelist::resolve_packagevariables(\$abbreviation, $allvariables, 0);
+ installer::packagelist::resolve_packagevariables(\$packagename, $allvariables, 0);
+
+ # Special handling for language strings %LANGUAGESTRING
+
+ if (( $abbreviation =~ /\%LANGUAGESTRING/ ) || ( $packagename =~ /\%LANGUAGESTRING/ ))
+ {
+ foreach my $onelang ( @{$languagesarrayref} )
+ {
+ my $local_abbreviation = $abbreviation;
+ my $local_packagename = $packagename;
+ $local_abbreviation =~ s/\%LANGUAGESTRING/$onelang/g;
+ $local_packagename =~ s/\%LANGUAGESTRING/$onelang/g;
+
+ # Logging all abbreviations and packagenames
+ $infoline = "$onelang : $local_abbreviation : $local_packagename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ if ( exists($installer::globals::dependfilenames{$local_abbreviation}) )
+ {
+ installer::exiter::exit_program("ERROR: Packagename for Solaris package $local_abbreviation already defined ($installer::globals::dependfilenames{$local_abbreviation})!", "read_packagemap");
+ }
+ else
+ {
+ $installer::globals::dependfilenames{$local_abbreviation} = $local_packagename;
+ }
+ }
+ }
+ else
+ {
+ # Logging all abbreviations and packagenames
+ $infoline = "$abbreviation : $packagename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ if ( exists($installer::globals::dependfilenames{$abbreviation}) )
+ {
+ installer::exiter::exit_program("ERROR: Packagename for Solaris package $abbreviation already defined ($installer::globals::dependfilenames{$abbreviation})!", "read_packagemap");
+ }
+ else
+ {
+ $installer::globals::dependfilenames{$abbreviation} = $packagename;
+ }
+ }
+ }
+ else
+ {
+ my $errorline = $i + 1;
+ installer::exiter::exit_program("ERROR: Wrong syntax in file \"$onepackagemapname\" (line $errorline)!", "read_packagemap");
+ }
+ }
+ }
+
+ $infoline = "\n\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+##########################################################
+# Filling the epm file with directories, files and links
+##########################################################
+
+sub put_directories_into_epmfile
+{
+ my ($directoriesarrayref, $epmfileref, $allvariables, $packagerootpath) = @_;
+ my $group = "bin";
+
+ if ( $installer::globals::islinuxbuild )
+ {
+ $group = "root";
+ }
+
+ for ( my $i = 0; $i <= $#{$directoriesarrayref}; $i++ )
+ {
+ my $onedir = ${$directoriesarrayref}[$i];
+ my $dir = "";
+
+ if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; }
+
+ if ((!($dir =~ /\bPREDEFINED_/ )) || ( $dir =~ /\bPREDEFINED_PROGDIR\b/ ))
+ {
+ my $hostname = $onedir->{'HostName'};
+
+ my $line = "d 755 root $group $hostname -\n";
+
+ push(@{$epmfileref}, $line)
+ }
+ }
+}
+
+sub put_files_into_epmfile
+{
+ my ($filesinproductarrayref, $epmfileref) = @_;
+
+ for ( my $i = 0; $i <= $#{$filesinproductarrayref}; $i++ )
+ {
+ my $onefile = ${$filesinproductarrayref}[$i];
+
+ my $unixrights = $onefile->{'UnixRights'};
+ my $destination = $onefile->{'destination'};
+ my $sourcepath = $onefile->{'sourcepath'};
+
+ my $filetype = "f";
+ my $styles = "";
+ if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
+ if ( $styles =~ /\bCONFIGFILE\b/ ) { $filetype = "c"; }
+
+ my $group = "bin";
+ if ( $installer::globals::islinuxbuild ) { $group = "root"; }
+ if (( $installer::globals::issolarisbuild ) && ( $onefile->{'SolarisGroup'} )) { $group = $onefile->{'SolarisGroup'}; }
+
+ my $line = "$filetype $unixrights root $group $destination $sourcepath\n";
+
+ push(@{$epmfileref}, $line);
+ }
+}
+
+sub put_links_into_epmfile
+{
+ my ($linksinproductarrayref, $epmfileref) = @_;
+ my $group = "bin";
+
+ if ( $installer::globals::islinuxbuild )
+ {
+ $group = "root";
+ }
+
+
+ for ( my $i = 0; $i <= $#{$linksinproductarrayref}; $i++ )
+ {
+ my $onelink = ${$linksinproductarrayref}[$i];
+ my $destination = $onelink->{'destination'};
+ my $destinationfile = $onelink->{'destinationfile'};
+
+ my $line = "l 000 root $group $destination $destinationfile\n";
+
+ push(@{$epmfileref}, $line)
+ }
+}
+
+sub put_unixlinks_into_epmfile
+{
+ my ($unixlinksinproductarrayref, $epmfileref) = @_;
+ my $group = "bin";
+
+ if ( $installer::globals::islinuxbuild ) { $group = "root"; }
+
+ for ( my $i = 0; $i <= $#{$unixlinksinproductarrayref}; $i++ )
+ {
+ my $onelink = ${$unixlinksinproductarrayref}[$i];
+ my $destination = $onelink->{'destination'};
+ my $target = $onelink->{'Target'};
+
+ my $line = "l 000 root $group $destination $target\n";
+
+ push(@{$epmfileref}, $line)
+ }
+}
+
+###############################################
+# Creating epm header file
+###############################################
+
+sub create_epm_header
+{
+ my ($variableshashref, $filesinproduct, $languagesref, $onepackage) = @_;
+
+ my @epmheader = ();
+
+ my ($licensefilename, $readmefilename, $readmefilenameen);
+
+ my $foundlicensefile = 0;
+ my $foundreadmefile = 0;
+
+ my $line = "";
+ my $infoline = "";
+
+ # %product LibreOffice Software
+ # %version 2.0
+ # %description A really great software
+ # %copyright 1999-2003 by OOo
+ # %vendor LibreOffice
+ # %license /test/replace/01/LICENSE01
+ # %readme /test/replace/01/README01
+ # %requires foo
+ # %provides bar
+ # %replaces bar
+ # %incompat bar
+
+ # The first language in the languages array determines the language of license and readme file
+
+ my $searchlanguage = ${$languagesref}[0];
+
+ # using the description for the %product line in the epm list file
+
+ my $productnamestring = $onepackage->{'description'};
+ installer::packagelist::resolve_packagevariables(\$productnamestring, $variableshashref, 0);
+ if ( $variableshashref->{'PRODUCTEXTENSION'} ) { $productnamestring = $productnamestring . $variableshashref->{'PRODUCTEXTENSION'}; }
+
+ $line = "%product" . " " . $productnamestring . "\n";
+ push(@epmheader, $line);
+
+ # Determining the release version
+ # This release version has to be listed in the line %version : %version versionnumber releasenumber
+
+ if ( ! $onepackage->{'packageversion'} ) { installer::exiter::exit_program("ERROR: No packageversion defined for package: $onepackage->{'module'}!", "create_epm_header"); }
+ $installer::globals::packageversion = $onepackage->{'packageversion'};
+ installer::packagelist::resolve_packagevariables(\$installer::globals::packageversion, $variableshashref, 0);
+ if ( $variableshashref->{'PACKAGEREVISION'} ) { $installer::globals::packagerevision = $variableshashref->{'PACKAGEREVISION'}; }
+
+ $line = "%version" . " " . $installer::globals::packageversion . "\n";
+ push(@epmheader, $line);
+
+ $line = "%release" . " " . $installer::globals::packagerevision . "\n";
+ if ( $installer::globals::isrpmbuild ) { $line = "%release" . " " . $installer::globals::buildid . "\n"; }
+ push(@epmheader, $line);
+
+ # Description, Copyright and Vendor are multilingual and are defined in
+ # the string file for the header file ($headerfileref)
+
+ my $descriptionstring = $onepackage->{'description'};
+ installer::packagelist::resolve_packagevariables(\$descriptionstring, $variableshashref, 0);
+ $line = "%description" . " " . $descriptionstring . "\n";
+ push(@epmheader, $line);
+
+ my $copyrightstring = $onepackage->{'copyright'};
+ installer::packagelist::resolve_packagevariables(\$copyrightstring, $variableshashref, 0);
+ $line = "%copyright" . " " . $copyrightstring . "\n";
+ push(@epmheader, $line);
+
+ my $vendorstring = $onepackage->{'vendor'};
+ installer::packagelist::resolve_packagevariables(\$vendorstring, $variableshashref, 0);
+ $line = "%vendor" . " " . $vendorstring . "\n";
+ push(@epmheader, $line);
+
+ # License and Readme file can be included automatically from the file list
+
+ if ( $installer::globals::iswindowsbuild )
+ {
+ $licensefilename = "license.txt";
+ $readmefilename = "readme.txt";
+ $readmefilenameen = "readme_en-US.txt";
+ }
+ else
+ {
+ $licensefilename = "LICENSE";
+ $readmefilename = "README";
+ $readmefilenameen = "README_en-US";
+ }
+
+ if (( $installer::globals::languagepack ) # in language packs and help packs the files LICENSE and README are removed, because they are not language specific
+ || ( $installer::globals::helppack )
+ || ( $variableshashref->{'NO_README_IN_ROOTDIR'} ))
+ {
+ if ( $installer::globals::iswindowsbuild )
+ {
+ $licensefilename = "license.txt";
+ $readmefilename = "readme_$searchlanguage.txt";
+ }
+ else
+ {
+ $licensefilename = "LICENSE";
+ $readmefilename = "README_$searchlanguage";
+ }
+ }
+
+ my $license_in_package_defined = 0;
+
+ if ( $installer::globals::issolarisbuild )
+ {
+ if ( $onepackage->{'solariscopyright'} )
+ {
+ $licensefilename = $onepackage->{'solariscopyright'};
+ $license_in_package_defined = 1;
+ }
+ }
+
+ # Process for Linux packages, in which only a very basic license file is
+ # included into the package.
+
+ if ( $installer::globals::islinuxbuild )
+ {
+ if ( $variableshashref->{'COPYRIGHT_INTO_LINUXPACKAGE'} )
+ {
+ $licensefilename = "linuxcopyrightfile";
+ $license_in_package_defined = 1;
+ }
+ }
+
+ # searching for and readme file;
+ # URE uses special README; others use README_en-US
+ # it does not matter which one is passed for epm if both are packaged
+ foreach my $possiblereadmefilename ($readmefilenameen, $readmefilename)
+ {
+ last if ($foundreadmefile);
+ for ( my $i = 0; $i <= $#{$filesinproduct}; $i++ )
+ {
+ my $onefile = ${$filesinproduct}[$i];
+ my $filename = $onefile->{'Name'};
+ # in the SDK it's in subdirectory sdk/share/readme
+ if ( $filename =~ /$possiblereadmefilename$/ )
+ {
+ $foundreadmefile = 1;
+ $line = "%readme" . " " . $onefile->{'sourcepath'} . "\n";
+ push(@epmheader, $line);
+ last;
+ }
+ }
+ }
+
+ # the readme file need not be packaged more times in the help content
+ # it needs to be installed in parallel with the main package anyway
+ # try to find the README file between all available files (not only between the packaged)
+ if (!($foundreadmefile) && $installer::globals::helppack)
+ {
+ my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$readmefilenameen, "" , 0);
+ if($$fileref ne "" )
+ {
+ $infoline = "Fallback to readme file: \"$$fileref\"!\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ $foundreadmefile = 1;
+ $line = "%readme" . " " . $$fileref . "\n";
+ push(@epmheader, $line);
+ }
+ }
+
+ # searching for and license file
+
+ if ( $license_in_package_defined )
+ {
+ my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, "" , 0);
+
+ if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find license file $licensefilename (A)!", "create_epm_header"); }
+
+ # Special handling to add the content of the file "license_en-US" to the solaris copyrightfile. But not for all products
+
+ if (( $installer::globals::issolarispkgbuild ) && ( ! $variableshashref->{'NO_LICENSE_INTO_COPYRIGHT'} ))
+ {
+ if ( ! $installer::globals::englishlicenseset ) { _set_english_license() }
+
+ # The location for the new file
+ my $languagestring = "";
+ for ( my $i = 0; $i <= $#{$languagesref}; $i++ ) { $languagestring = $languagestring . "_" . ${$languagesref}[$i]; }
+ $languagestring =~ s/^\s*_//;
+
+ my $copyrightdir = installer::systemactions::create_directories("copyright", \$languagestring);
+
+ my $copyrightfile = installer::files::read_file($$fileref);
+
+ # Adding license content to copyright file
+ push(@{$copyrightfile}, "\n");
+ for ( my $i = 0; $i <= $#{$installer::globals::englishlicense}; $i++ ) { push(@{$copyrightfile}, ${$installer::globals::englishlicense}[$i]); }
+
+ # New destination for $$fileref
+ $$fileref = $copyrightdir . $installer::globals::separator . "solariscopyrightfile_" . $onepackage->{'module'};
+ if ( -f $$fileref ) { unlink $$fileref; }
+ installer::files::save_file($$fileref, $copyrightfile);
+ }
+
+ $infoline = "Using license file: \"$$fileref\"!\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ $foundlicensefile = 1;
+ $line = "%license" . " " . $$fileref . "\n";
+ push(@epmheader, $line);
+ }
+ else
+ {
+ for my $onefile (@{$filesinproduct})
+ {
+ # in the SDK it's in subdirectory sdk/share/readme so try to match that
+ if ($onefile->{'Name'} =~ /$licensefilename$/)
+ {
+ push @epmheader, "%license" . " " . $onefile->{'sourcepath'} . "\n";
+ $foundlicensefile = 1;
+ last;
+ }
+ }
+
+ # the license file need not be packaged more times in the langpacks
+ # they need to be installed in parallel with the main package anyway
+ # try to find the LICENSE file between all available files (not only between the packaged)
+ if (!($foundlicensefile) && ($installer::globals::languagepack || $installer::globals::helppack))
+ {
+ my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, "" , 0);
+ if($$fileref ne "" )
+ {
+ $infoline = "Fallback to license file: \"$$fileref\"!\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ $foundlicensefile = 1;
+ $line = "%license" . " " . $$fileref . "\n";
+ push(@epmheader, $line);
+ }
+ }
+ }
+
+ if (!($foundlicensefile))
+ {
+ installer::exiter::exit_program("ERROR: Could not find license file $licensefilename (B)", "create_epm_header");
+ }
+
+ if (!($foundreadmefile))
+ {
+ installer::exiter::exit_program("ERROR: Could not find readme file $readmefilename (C)", "create_epm_header");
+ }
+
+ # including %replaces
+
+ my $replaces = "";
+
+ if ( $installer::globals::issolarispkgbuild )
+ {
+ $replaces = "solarisreplaces"; # the name in the packagelist
+ }
+ elsif ( $installer::globals::islinuxbuild )
+ {
+ $replaces = "linuxreplaces"; # the name in the packagelist
+ }
+
+ if ( $replaces )
+ {
+ if ( $onepackage->{$replaces} )
+ {
+ my $replacesstring = $onepackage->{$replaces};
+
+ my $allreplaces = installer::converter::convert_stringlist_into_array(\$replacesstring, ",");
+
+ for ( my $i = 0; $i <= $#{$allreplaces}; $i++ )
+ {
+ my $onereplaces = ${$allreplaces}[$i];
+ $onereplaces =~ s/\s*$//;
+ installer::packagelist::resolve_packagevariables(\$onereplaces, $variableshashref, 1);
+ $onereplaces = debian_rewrite($onereplaces);
+ $line = "%replaces" . " " . $onereplaces . "\n";
+ push(@epmheader, $line);
+ }
+ }
+ }
+
+ # including %incompat
+
+ my $incompat = "";
+
+ if (( $installer::globals::issolarispkgbuild ) && ( ! $installer::globals::patch ))
+ {
+ $incompat = "solarisincompat"; # the name in the packagelist
+ }
+ elsif (( $installer::globals::islinuxbuild ) && ( ! $installer::globals::patch ))
+ {
+ $incompat = "linuxincompat"; # the name in the packagelist
+ }
+
+ if (( $incompat ) && ( ! $installer::globals::patch ))
+ {
+ if ( $onepackage->{$incompat} )
+ {
+ my $incompatstring = $onepackage->{$incompat};
+
+ my $allincompat = installer::converter::convert_stringlist_into_array(\$incompatstring, ",");
+
+ for ( my $i = 0; $i <= $#{$allincompat}; $i++ )
+ {
+ my $oneincompat = ${$allincompat}[$i];
+ $oneincompat =~ s/\s*$//;
+ installer::packagelist::resolve_packagevariables(\$oneincompat, $variableshashref, 1);
+ $oneincompat = debian_rewrite($oneincompat);
+ $line = "%incompat" . " " . $oneincompat . "\n";
+ push(@epmheader, $line);
+ }
+ }
+ }
+
+ # including the directives for %requires and %provides
+
+ my $provides = "";
+ my $requires = "";
+
+ if ( $installer::globals::issolarispkgbuild )
+ {
+ $provides = "solarisprovides"; # the name in the packagelist
+ $requires = "solarisrequires"; # the name in the packagelist
+ }
+ elsif ( $installer::globals::isfreebsdpkgbuild )
+ {
+ $provides = "freebsdprovides"; # the name in the packagelist
+ $requires = "freebsdrequires"; # the name in the packagelist
+ }
+ else
+ {
+ $provides = "provides"; # the name in the packagelist
+ $requires = "requires"; # the name in the packagelist
+ }
+
+ my $isdict = 0;
+ if ( $onepackage->{'packagename'} =~ /-dict-/ ) { $isdict = 1; }
+
+ if ( $onepackage->{$provides} )
+ {
+ my $providesstring = $onepackage->{$provides};
+
+ my $allprovides = installer::converter::convert_stringlist_into_array(\$providesstring, ",");
+
+ for ( my $i = 0; $i <= $#{$allprovides}; $i++ )
+ {
+ my $oneprovides = ${$allprovides}[$i];
+ $oneprovides =~ s/\s*$//;
+ installer::packagelist::resolve_packagevariables(\$oneprovides, $variableshashref, 1);
+ $oneprovides = debian_rewrite($oneprovides);
+ $line = "%provides" . " " . $oneprovides . "\n";
+ push(@epmheader, $line);
+ }
+ }
+
+ if ( $onepackage->{$requires} )
+ {
+ my $requiresstring = $onepackage->{$requires};
+
+ # The requires string can contain the separator "," in the names (descriptions) of the packages
+ # (that are required for Solaris depend files). Therefore "," inside such a description has to
+ # masked with a backslash.
+ # This masked separator need to be found and replaced, before the stringlist is converted into an array.
+ # This replacement has to be turned back after the array is created.
+
+ my $replacementstring = "COMMAREPLACEMENT";
+ $requiresstring = installer::converter::replace_masked_separator($requiresstring, ",", "$replacementstring");
+
+ my $allrequires = installer::converter::convert_stringlist_into_array(\$requiresstring, ",");
+
+ installer::converter::resolve_masked_separator($allrequires, ",", $replacementstring);
+
+ for ( my $i = 0; $i <= $#{$allrequires}; $i++ )
+ {
+ my $onerequires = ${$allrequires}[$i];
+ $onerequires =~ s/\s*$//;
+ installer::packagelist::resolve_packagevariables2(\$onerequires, $variableshashref, 0, $isdict);
+ $onerequires = debian_rewrite($onerequires);
+ $line = "%requires" . " " . $onerequires . "\n";
+ push(@epmheader, $line);
+ }
+ }
+
+ return \@epmheader;
+}
+
+#######################################
+# Adding header to epm file
+#######################################
+
+sub adding_header_to_epm_file
+{
+ my ($epmfileref, $epmheaderref) = @_;
+
+ for ( my $i = 0; $i <= $#{$epmheaderref}; $i++ )
+ {
+ push( @{$epmfileref}, ${$epmheaderref}[$i] );
+ }
+
+ push( @{$epmfileref}, "\n\n" );
+}
+
+#####################################################
+# Replace one in shell scripts ( ${VARIABLENAME} )
+#####################################################
+
+sub replace_variable_in_shellscripts
+{
+ my ($scriptref, $variable, $searchstring) = @_;
+
+ for ( my $i = 0; $i <= $#{$scriptref}; $i++ )
+ {
+ ${$scriptref}[$i] =~ s/\$\{$searchstring\}/$variable/g;
+ }
+}
+
+################################################
+# Replacing many variables in shell scripts
+################################################
+
+sub replace_many_variables_in_shellscripts
+{
+ my ($scriptref, $variableshashref) = @_;
+
+ my $key;
+
+ foreach $key (keys %{$variableshashref})
+ {
+ my $value = $variableshashref->{$key};
+ replace_variable_in_shellscripts($scriptref, $value, $key);
+ }
+}
+
+#######################################
+# Adding shell scripts to epm file
+#######################################
+
+sub adding_shellscripts_to_epm_file
+{
+ my ($epmfileref, $shellscriptsfilename, $localrootpath, $allvariableshashref, $filesinpackage) = @_;
+
+ push( @{$epmfileref}, "\n\n" );
+
+ my $shellscriptsfileref = installer::files::read_file($shellscriptsfilename);
+
+ replace_variable_in_shellscripts($shellscriptsfileref, $localrootpath, "rootpath");
+
+ replace_many_variables_in_shellscripts($shellscriptsfileref, $allvariableshashref);
+
+ for ( my $i = 0; $i <= $#{$shellscriptsfileref}; $i++ )
+ {
+ push( @{$epmfileref}, ${$shellscriptsfileref}[$i] );
+ }
+
+ push( @{$epmfileref}, "\n" );
+}
+
+#################################################
+# Determining the epm on the system
+#################################################
+
+sub find_epm_on_system
+{
+ my ($includepatharrayref) = @_;
+
+ installer::logger::include_header_into_logfile("Check epm on system");
+
+ my $epmname = "epm";
+
+ # epm should be defined through the configure script but we need to
+ # check for it to be defined because of the Sun environment.
+ # Check the environment variable first and if it is not defined,
+ # or if it is but the location is not executable, search further.
+ # It has to be found in the solver or it has to be in the path
+ # (saved in $installer::globals::epm_in_path) or we get the specified
+ # one through the environment (i.e. when --with-epm=... is specified)
+
+ if ($ENV{'EPM'})
+ {
+ if (($ENV{'EPM'} ne "") && (-x "$ENV{'EPM'}"))
+ {
+ $epmname = $ENV{'EPM'};
+ }
+ else
+ {
+ installer::exiter::exit_program("Environment variable EPM set (\"$ENV{'EPM'}\"), but file does not exist or is not executable!", "find_epm_on_system");
+ }
+ }
+ else
+ {
+ my $epmfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$epmname, $includepatharrayref, 0);
+
+ if (($$epmfileref eq "") && (!($installer::globals::epm_in_path))) { installer::exiter::exit_program("ERROR: Could not find program $epmname!", "find_epm_on_system"); }
+ if (($$epmfileref eq "") && ($installer::globals::epm_in_path)) { $epmname = $installer::globals::epm_path; }
+ if (!($$epmfileref eq "")) { $epmname = $$epmfileref; }
+ }
+
+ my $infoline = "Using epmfile: $epmname\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return $epmname;
+}
+
+#################################################
+# Determining the epm patch state
+# saved in $installer::globals::is_special_epm
+#################################################
+
+sub set_patch_state
+{
+ my ($epmexecutable) = @_;
+
+ my $infoline = "";
+
+ my $systemcall = "$epmexecutable |";
+ open (EPMPATCH, "$systemcall");
+
+ while (<EPMPATCH>)
+ {
+ chop;
+ if ( $_ =~ /Patched for .*Office/ ) { $installer::globals::is_special_epm = 1; }
+ }
+
+ close (EPMPATCH);
+
+ if ( $installer::globals::is_special_epm )
+ {
+ $infoline = "\nPatch state: This is a patched version of epm!\n\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "\nPatch state: This is an unpatched version of epm!\n\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ if ( ( $installer::globals::is_special_epm ) && (($installer::globals::isrpmbuild) || ($installer::globals::issolarispkgbuild)) )
+ {
+ # Special postprocess handling only for Linux RPM and Solaris packages
+ $installer::globals::postprocess_specialepm = 1;
+ $installer::globals::postprocess_standardepm = 0;
+ }
+ else
+ {
+ $installer::globals::postprocess_specialepm = 0;
+ $installer::globals::postprocess_standardepm = 1;
+ }
+}
+
+#################################################
+# Calling epm to create the installation sets
+#################################################
+
+sub call_epm
+{
+ my ($epmname, $epmlistfilename, $packagename, $includepatharrayref) = @_;
+
+ installer::logger::include_header_into_logfile("epm call for $packagename");
+
+ my $packageformat = $installer::globals::packageformat;
+
+ my $localpackagename = $packagename;
+ # Debian allows only lowercase letters in package name
+ if ( $installer::globals::debian ) { $localpackagename = lc($localpackagename); }
+
+ my $outdirstring = "";
+ if ( $installer::globals::epmoutpath ne "" ) { $outdirstring = " --output-dir $installer::globals::epmoutpath"; }
+
+ # Debian package build needs to be run with fakeroot for correct ownerships/permissions
+
+ my $fakerootstring = "";
+
+ if ( $installer::globals::debian ) { $fakerootstring = "fakeroot "; }
+
+ my $extraflags = "";
+ if ($ENV{'EPM_FLAGS'}) { $extraflags = $ENV{'EPM_FLAGS'}; }
+
+ $extraflags .= ' -g' unless $installer::globals::strip;
+
+ my $verboseflag = "-v";
+ if ( ! $installer::globals::quiet ) { $verboseflag = "-v2"; };
+
+ my $systemcall = $fakerootstring . $epmname . " -f " . $packageformat . " " . $extraflags . " " . $localpackagename . " " . $epmlistfilename . $outdirstring . " " . $verboseflag . " " . " 2\>\&1 |";
+
+ installer::logger::print_message( "... $systemcall ...\n" );
+
+ my $maxepmcalls = 3;
+
+ for ( my $i = 1; $i <= $maxepmcalls; $i++ )
+ {
+ my @epmoutput = ();
+
+ open (EPM, "$systemcall");
+ while (<EPM>) {push(@epmoutput, $_); }
+ close (EPM);
+
+ my $returnvalue = $?; # $? contains the return value of the systemcall
+
+ my $infoline = "Systemcall (Try $i): $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $j = 0; $j <= $#epmoutput; $j++ )
+ {
+ if ( $i < $maxepmcalls ) { $epmoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; }
+ push( @installer::globals::logfileinfo, "$epmoutput[$j]");
+ }
+
+ if ($returnvalue)
+ {
+ $infoline = "Try $i : Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ if ( $i == $maxepmcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "call_epm"); }
+ }
+ else
+ {
+ installer::logger::print_message( "Success (Try $i): \"$systemcall\"\n" );
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ last;
+ }
+ }
+}
+
+#####################################################################
+# Adding the new line for relocatables into pkginfo file (Solaris)
+# or spec file (Linux) created by epm
+#####################################################################
+
+sub add_one_line_into_file
+{
+ my ($file, $insertline, $filename) = @_;
+
+ if ( $installer::globals::issolarispkgbuild )
+ {
+ push(@{$file}, $insertline); # simply adding at the end of pkginfo file
+ }
+
+ if ( $installer::globals::isrpmbuild )
+ {
+ # Adding behind the line beginning with: Group:
+
+ my $inserted_line = 0;
+
+ for ( my $i = 0; $i <= $#{$file}; $i++ )
+ {
+ if ( ${$file}[$i] =~ /^\s*Group\:\s*/ )
+ {
+ splice(@{$file},$i+1,0,$insertline);
+ $inserted_line = 1;
+ last;
+ }
+ }
+
+ if (! $inserted_line) { installer::exiter::exit_program("ERROR: Did not find string \"Group:\" in file: $filename", "add_one_line_into_file"); }
+ }
+
+ $insertline =~ s/\s*$//; # removing line end for correct logging
+ my $infoline = "Success: Added line $insertline into file $filename!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+#####################################################################
+# Setting the revision VERSION=1.9,REV=66 .
+# Also adding the new line: "AutoReqProv: no"
+#####################################################################
+
+sub set_revision_in_pkginfo
+{
+ my ($file, $filename, $variables, $packagename) = @_;
+
+ my $revisionstring = "\,REV\=" . $installer::globals::packagerevision;
+
+ # Adding also a time string to the revision. Syntax: VERSION=8.0.0,REV=66.2005.01.24
+
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+
+ $mday = $mday;
+ $mon = $mon + 1;
+ $year = $year + 1900;
+
+ if ( $mday < 10 ) { $mday = "0" . $mday; }
+ if ( $mon < 10 ) { $mon = "0" . $mon; }
+ $datestring = $year . "." . $mon . "." . $mday;
+ $revisionstring = $revisionstring . "." . $datestring;
+
+ for ( my $i = 0; $i <= $#{$file}; $i++ )
+ {
+ if ( ${$file}[$i] =~ /^\s*(VERSION\=.*?)\s*$/ )
+ {
+ my $oldstring = $1;
+ my $newstring = $oldstring . $revisionstring; # also adding the date string
+ ${$file}[$i] =~ s/$oldstring/$newstring/;
+ my $infoline = "Info: Changed in $filename file: \"$oldstring\" to \"$newstring\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ last;
+ }
+ }
+
+ # For Update and Patch reasons, this string can also be kept constant
+
+ my $pkgversion = "SOLSPARCPKGVERSION";
+ if ( $installer::globals::issolarisx86build ) { $pkgversion = "SOLIAPKGVERSION"; }
+
+ if (( $variables->{$pkgversion} ) && ( $variables->{$pkgversion} ne "" ))
+ {
+ if ( $variables->{$pkgversion} ne "FINALVERSION" )
+ {
+ # In OOo 3.x timeframe, this string is no longer unique for all packages, because of the three layer.
+ # In the string: "3.0.0,REV=9.2008.09.30" only the part "REV=9.2008.09.30" can be unique for all packages
+ # and therefore be set as $pkgversion.
+ # The first part "3.0.0" has to be derived from the
+
+ my $version = $installer::globals::packageversion;
+ if ( $version =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ )
+ {
+ my $major = $1;
+ my $minor = $2;
+ my $micro = $3;
+
+ my $finalmajor = $major;
+ my $finalminor = $minor;
+ my $finalmicro = 0;
+
+ $version = "$finalmajor.$finalminor.$finalmicro";
+ }
+
+ my $datestring = $variables->{$pkgversion};
+
+ # Allowing some packages to have another date of creation.
+ # They can be defined in product definition using a key like "SOLSPARCPKGVERSION_$packagename"
+
+ my $additionalkey = $pkgversion . "_" . $packagename;
+ if (( $variables->{$additionalkey} ) && ( $variables->{$additionalkey} ne "" )) { $datestring = $variables->{$additionalkey}; }
+
+ my $versionstring = "$version,$datestring";
+
+ for ( my $i = 0; $i <= $#{$file}; $i++ )
+ {
+ if ( ${$file}[$i] =~ /^\s*(VERSION\=).*?\s*$/ )
+ {
+ my $start = $1;
+ my $newstring = $start . $versionstring . "\n"; # setting the complete new string
+ my $oldstring = ${$file}[$i];
+ ${$file}[$i] = $newstring;
+ $oldstring =~ s/\s*$//;
+ $newstring =~ s/\s*$//;
+ my $infoline = "Info: Changed in $filename file: \"$oldstring\" to \"$newstring\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ last;
+ }
+ }
+ }
+ }
+}
+
+########################################################
+# Setting MAXINST=1000 into the pkginfo file.
+########################################################
+
+sub set_maxinst_in_pkginfo
+{
+ my ($changefile, $filename) = @_;
+
+ my $newline = "MAXINST\=1000\n";
+
+ add_one_line_into_file($changefile, $newline, $filename);
+}
+
+#############################################################
+# Setting several Solaris variables into the pkginfo file.
+#############################################################
+
+sub set_solaris_parameter_in_pkginfo
+{
+ my ($changefile, $filename, $allvariables) = @_;
+
+ my $newline = "";
+
+ # SUNW_PRODNAME
+ # SUNW_PRODVERS
+ # SUNW_PKGVERS
+ # Not: SUNW_PKGTYPE
+ # HOTLINE
+ # EMAIL
+
+ my $productname = $allvariables->{'PRODUCTNAME'};
+ $newline = "SUNW_PRODNAME=$productname\n";
+ add_one_line_into_file($changefile, $newline, $filename);
+
+ my $productversion = "";
+ if ( $allvariables->{'PRODUCTVERSION'} )
+ {
+ $productversion = $allvariables->{'PRODUCTVERSION'};
+ if ( $allvariables->{'PRODUCTEXTENSION'} ) { $productversion = $productversion . "/" . $allvariables->{'PRODUCTEXTENSION'}; }
+ }
+ $newline = "SUNW_PRODVERS=$productversion\n";
+ add_one_line_into_file($changefile, $newline, $filename);
+
+ $newline = "SUNW_PKGVERS=1\.0\n";
+ add_one_line_into_file($changefile, $newline, $filename);
+
+ if ( $allvariables->{'SUNW_PKGTYPE'} )
+ {
+ $newline = "SUNW_PKGTYPE=$allvariables->{'SUNW_PKGTYPE'}\n";
+ add_one_line_into_file($changefile, $newline, $filename);
+ }
+ else
+ {
+ $newline = "SUNW_PKGTYPE=\n";
+ add_one_line_into_file($changefile, $newline, $filename);
+ }
+
+ $newline = "HOTLINE=Please contact your local service provider\n";
+ add_one_line_into_file($changefile, $newline, $filename);
+
+ $newline = "EMAIL=\n";
+ add_one_line_into_file($changefile, $newline, $filename);
+
+}
+
+#####################################################################
+# epm uses as architecture for Solaris x86 "i86pc". This has to be
+# changed to "i386".
+#####################################################################
+
+sub fix_architecture_setting
+{
+ my ($changefile) = @_;
+
+ for ( my $i = 0; $i <= $#{$changefile}; $i++ )
+ {
+ if ( ${$changefile}[$i] =~ /^\s*ARCH=i86pc\s*$/ )
+ {
+ ${$changefile}[$i] =~ s/i86pc/i386/;
+ last;
+ }
+
+ }
+}
+
+#####################################################################
+# Adding a new line for topdir into specfile, removing old
+# topdir if set.
+#####################################################################
+
+sub set_topdir_in_specfile
+{
+ my ($changefile, $filename, $newepmdir) = @_;
+
+ $newepmdir = Cwd::cwd() . $installer::globals::separator . $newepmdir; # only absolute path allowed
+
+ # removing "%define _topdir", if existing
+
+ for ( my $i = 0; $i <= $#{$changefile}; $i++ )
+ {
+ if ( ${$changefile}[$i] =~ /^\s*\%define _topdir\s+/ )
+ {
+ my $removeline = ${$changefile}[$i];
+ $removeline =~ s/\s*$//;
+ splice(@{$changefile},$i,1);
+ my $infoline = "Info: Removed line \"$removeline\" from file $filename!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ last;
+ }
+ }
+
+ # Adding "topdir" behind the line beginning with: Group:
+
+ my $inserted_line = 0;
+
+ my $topdirline = "\%define _topdir $newepmdir\n";
+
+ for ( my $i = 0; $i <= $#{$changefile}; $i++ )
+ {
+ if ( ${$changefile}[$i] =~ /^\s*Group\:\s*/ )
+ {
+ splice(@{$changefile},$i+1,0,$topdirline);
+ $inserted_line = 1;
+ $topdirline =~ s/\s*$//;
+ my $infoline = "Success: Added line $topdirline into file $filename!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ if (! $inserted_line) { installer::exiter::exit_program("ERROR: Did not find string \"Group:\" in file: $filename", "set_topdir_in_specfile"); }
+
+}
+
+#####################################################################
+# Setting the packager in the spec file
+# Syntax: Packager: abc@def
+#####################################################################
+
+sub set_packager_in_specfile
+{
+ my ($changefile) = @_;
+
+ my $packager = $installer::globals::longmanufacturer;
+
+ for ( my $i = 0; $i <= $#{$changefile}; $i++ )
+ {
+ if ( ${$changefile}[$i] =~ /^\s*Packager\s*:\s*(.+?)\s*$/ )
+ {
+ my $oldstring = $1;
+ ${$changefile}[$i] =~ s/\Q$oldstring\E/$packager/;
+ my $infoline = "Info: Changed Packager in spec file from $oldstring to $packager!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ last;
+ }
+ }
+}
+
+#####################################################################
+# Setting the requirements in the spec file (i81494)
+# Syntax: PreReq: "requirements" (only for shared extensions)
+#####################################################################
+
+sub set_prereq_in_specfile
+{
+ my ($changefile) = @_;
+
+ my $prereq = "PreReq:";
+
+ for ( my $i = 0; $i <= $#{$changefile}; $i++ )
+ {
+ if ( ${$changefile}[$i] =~ /^\s*Requires:\s*(.+?)\s*$/ )
+ {
+ my $oldstring = ${$changefile}[$i];
+ ${$changefile}[$i] =~ s/Requires:/$prereq/;
+ my $infoline = "Info: Changed requirements in spec file from $oldstring to ${$changefile}[$i]!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+}
+
+#####################################################################
+# Setting the Auto[Req]Prov line and __find_requires
+#####################################################################
+
+sub set_autoprovreq_in_specfile
+{
+ my ($changefile, $findrequires, $bindir) = @_;
+
+ my $autoreqprovline = "AutoReqProv\: no\n";
+
+ if ( $findrequires )
+ {
+ # don't let rpm invoke it, we never want to use AutoReq because
+ # rpm will generate Requires: config(packagename)
+ open (FINDREQUIRES, "echo | $bindir/$findrequires |");
+ while (<FINDREQUIRES>) { $autoreqprovline .= "Requires: $_\n"; }
+ close (FINDREQUIRES);
+ }
+
+ $autoreqprovline .= "%define _binary_filedigest_algorithm 1\n%define _binary_payload w1T.xzdio\n";
+
+ for ( my $i = 0; $i <= $#{$changefile}; $i++ )
+ {
+ # Adding "autoreqprov" behind the line beginning with: Group:
+ if ( ${$changefile}[$i] =~ /^\s*Group\:\s*/ )
+ {
+ splice(@{$changefile},$i+1,0,$autoreqprovline);
+ $autoreqprovline =~ s/\s*$//;
+ $infoline = "Success: Added line $autoreqprovline into spec file!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ last;
+ }
+ }
+}
+
+#####################################################################
+# Replacing Copyright with License in the spec file
+# Syntax: License: LGPLv3 (or MPLv2 on ALv2, older usages were LGPL, SISSL)
+#####################################################################
+
+sub set_license_in_specfile
+{
+ my ($changefile, $variableshashref) = @_;
+
+ my $license = $variableshashref->{'LICENSENAME'};
+
+ for ( my $i = 0; $i <= $#{$changefile}; $i++ )
+ {
+ if ( ${$changefile}[$i] =~ /^\s*Copyright\s*:\s*(.+?)\s*$/ )
+ {
+ ${$changefile}[$i] = "License: $license\n";
+ my $infoline = "Info: Replaced Copyright with License: $license !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ last;
+ }
+ }
+}
+
+#########################################################
+# Building relocatable Solaris packages means:
+# 1. Add "BASEDIR=/opt" into pkginfo
+# 2. Remove "/opt/" from all objects in prototype file
+# For step2 this function exists
+# Sample: d none /opt/openofficeorg20/help 0755 root other
+# -> d none openofficeorg20/help 0755 root other
+#########################################################
+
+sub make_prototypefile_relocatable
+{
+ my ($prototypefile, $relocatablepath) = @_;
+
+ for ( my $i = 0; $i <= $#{$prototypefile}; $i++ )
+ {
+ if ( ${$prototypefile}[$i] =~ /^\s*\w\s+\w+\s+\/\w+/ ) # this is an object line
+ {
+ ${$prototypefile}[$i] =~ s/$relocatablepath//; # Important: $relocatablepath has a "/" at the end. Example "/opt/"
+ }
+ }
+
+ # If the $relocatablepath is "/opt/openoffice20/" the line "d none /opt/openoffice20" was not changed.
+ # This line has to be removed now
+
+ if ( $relocatablepath ne "/" ) { $relocatablepath =~ s/\/\s*$//; } # removing the ending slash
+
+ for ( my $i = 0; $i <= $#{$prototypefile}; $i++ )
+ {
+ if ( ${$prototypefile}[$i] =~ /^\s*d\s+\w+\s+\Q$relocatablepath\E/ )
+ {
+ my $line = ${$prototypefile}[$i];
+ splice(@{$prototypefile},$i,1); # removing the line
+ $line =~ s/\s*$//;
+ my $infoline = "Info: Removed line \"$line\" from prototype file!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ last;
+ }
+ }
+
+ # Making "\$" to "$" in prototype file. "\$" was created by epm.
+
+ for ( my $i = 0; $i <= $#{$prototypefile}; $i++ )
+ {
+ if ( ${$prototypefile}[$i] =~ /\\\$/ )
+ {
+ ${$prototypefile}[$i] =~ s/\\\$/\$/g;
+ my $infoline2 = "Info: Changed line in prototype file: ${$prototypefile}[$i] !\n";
+ push( @installer::globals::logfileinfo, $infoline2);
+ }
+ }
+}
+
+#########################################################################
+# Replacing the variables in the shell scripts or in the epm list file
+# Linux: spec file
+# Solaris: preinstall, postinstall, preremove, postremove
+# If epm is used in the original version (not relocatable)
+# the variables have to be exchanged in the list file,
+# created for epm.
+#########################################################################
+
+sub replace_variables_in_shellscripts
+{
+ my ($scriptfile, $scriptfilename, $oldstring, $newstring) = @_;
+
+ my $debug = 0;
+ if ( $oldstring eq "PRODUCTDIRECTORYNAME" ) { $debug = 1; }
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ if ( ${$scriptfile}[$i] =~ /\Q$oldstring\E/ )
+ {
+ my $oldline = ${$scriptfile}[$i];
+ ${$scriptfile}[$i] =~ s/\Q$oldstring\E/$newstring/g;
+ ${$scriptfile}[$i] =~ s/\/\//\//g; # replacing "//" by "/" , if path $newstring is empty!
+ my $infoline = "Info: Substituting in $scriptfilename $oldstring by $newstring\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ if ( $debug )
+ {
+ $infoline = "Old Line: $oldline";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "New Line: ${$scriptfile}[$i]";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+}
+
+############################################################
+# Determining the directory created by epm, in which the
+# RPMS or Solaris packages are created.
+############################################################
+
+sub determine_installdir_ooo
+{
+ # A simple "ls" command returns the directory name
+
+ my $dirname = "";
+
+ my $systemcall = "ls |";
+ open (LS, "$systemcall");
+ $dirname = <LS>;
+ close (LS);
+
+ $dirname =~ s/\s*$//;
+
+ my $infoline = "Info: Directory created by epm: $dirname\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ return $dirname;
+}
+
+############################################################
+# Setting the tab content into the file container
+############################################################
+
+sub set_tab_into_datafile
+{
+ my ($changefile, $filesref) = @_;
+
+ my @newclasses = ();
+ my $newclassesstring = "";
+
+ if ( $installer::globals::issolarispkgbuild )
+ {
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+
+ if ( $onefile->{'SolarisClass'} )
+ {
+ my $sourcepath = $onefile->{'sourcepath'};
+
+ for ( my $j = 0; $j <= $#{$changefile}; $j++ )
+ {
+ if (( ${$changefile}[$j] =~ /^\s*f\s+none\s+/ ) && ( ${$changefile}[$j] =~ /\=\Q$sourcepath\E\s+/ ))
+ {
+ my $oldline = ${$changefile}[$j];
+ ${$changefile}[$j] =~ s/f\s+none/e $onefile->{'SolarisClass'}/;
+ my $newline = ${$changefile}[$j];
+ $oldline =~ s/\s*$//;
+ $newline =~ s/\s*$//;
+
+ my $infoline = "TAB: Changing content from \"$oldline\" to \"$newline\" .\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ # collecting all new classes
+ if (! grep {$_ eq $onefile->{'SolarisClass'}} @newclasses)
+ {
+ push(@newclasses, $onefile->{'SolarisClass'});
+ }
+
+ last;
+ }
+ }
+ }
+ }
+
+ $newclassesstring = installer::converter::convert_array_to_space_separated_string(\@newclasses);
+ }
+
+ if ( $installer::globals::isrpmbuild )
+ {
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+
+ if ( $onefile->{'SpecFileContent'} )
+ {
+ my $destination = $onefile->{'destination'};
+
+ for ( my $j = 0; $j <= $#{$changefile}; $j++ )
+ {
+ if ( ${$changefile}[$j] =~ /^\s*(\%attr\(.*\))\s+(\".*?\Q$destination\E\"\s*)$/ )
+ {
+ my $begin = $1;
+ my $end = $2;
+
+ my $oldline = ${$changefile}[$j];
+ ${$changefile}[$j] = $begin . " " . $onefile->{'SpecFileContent'} . " " . $end;
+ my $newline = ${$changefile}[$j];
+
+ $oldline =~ s/\s*$//;
+ $newline =~ s/\s*$//;
+
+ my $infoline = "TAB: Changing content from \"$oldline\" to \"$newline\" .\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ last;
+ }
+ }
+ }
+ }
+ }
+
+ return $newclassesstring;
+}
+
+############################################################
+# Including additional classes into the pkginfo file
+############################################################
+
+sub include_classes_into_pkginfo
+{
+ my ($changefile, $classesstring) = @_;
+
+ for ( my $i = 0; $i <= $#{$changefile}; $i++ )
+ {
+ if ( ${$changefile}[$i] =~ /^\s*CLASSES\=none/ )
+ {
+ ${$changefile}[$i] =~ s/\s*$//;
+ my $oldline = ${$changefile}[$i];
+ ${$changefile}[$i] = ${$changefile}[$i] . " " . $classesstring . "\n";
+ my $newline = ${$changefile}[$i];
+ $newline =~ s/\s*$//;
+
+ my $infoline = "pkginfo file: Changing content from \"$oldline\" to \"$newline\" .\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+}
+
+##########################################################################################
+# Checking, if an extension is included into the package (Linux).
+# All extension files have to be installed into directory
+# share/extension/install
+# %attr(0444,root,root) "/opt/staroffice8/share/extension/install/SunSearchToolbar.oxt"
+##########################################################################################
+
+sub is_extension_package
+{
+ my ($specfile) = @_;
+
+ my $is_extension_package = 0;
+
+ for ( my $i = 0; $i <= $#{$specfile}; $i++ )
+ {
+ my $line = ${$specfile}[$i];
+ if ( $line =~ /share\/extension\/install\/.*?\.oxt\"\s*$/ )
+ {
+ $is_extension_package = 1;
+ last;
+ }
+ }
+
+ return $is_extension_package;
+}
+
+######################################################################
+# Checking, if an extension is included into the package (Solaris).
+# All extension files have to be installed into directory
+# share/extension/install
+######################################################################
+
+sub contains_extension_dir
+{
+ my ($prototypefile) = @_;
+
+ my $contains_extension_dir = 0;
+
+ # d none opt/libreoffice/share/extensions/
+
+ for ( my $i = 0; $i <= $#{$prototypefile}; $i++ )
+ {
+ my $line = ${$prototypefile}[$i];
+ if ( $line =~ /^\s*d\s+none\s.*\/share\/extensions\// )
+ {
+ $contains_extension_dir = 1;
+ last;
+ }
+ }
+
+ return $contains_extension_dir;
+}
+
+############################################################
+# Setting the correct Solaris locales
+############################################################
+
+sub get_solaris_language_for_langpack
+{
+ my ( $onelanguage ) = @_;
+
+ my $sollanguage = $onelanguage;
+ $sollanguage =~ s/\-/\_/;
+
+ if ( $sollanguage eq "de" ) { $sollanguage = "de"; }
+ elsif ( $sollanguage eq "en_US" ) { $sollanguage = "en_AU,en_CA,en_GB,en_IE,en_MT,en_NZ,en_US,en_US.UTF-8"; }
+ elsif ( $sollanguage eq "es" ) { $sollanguage = "es"; }
+ elsif ( $sollanguage eq "fr" ) { $sollanguage = "fr"; }
+ elsif ( $sollanguage eq "hu" ) { $sollanguage = "hu_HU"; }
+ elsif ( $sollanguage eq "it" ) { $sollanguage = "it"; }
+ elsif ( $sollanguage eq "nl" ) { $sollanguage = "nl_BE,nl_NL"; }
+ elsif ( $sollanguage eq "pl" ) { $sollanguage = "pl_PL"; }
+ elsif ( $sollanguage eq "sv" ) { $sollanguage = "sv"; }
+ elsif ( $sollanguage eq "pt" ) { $sollanguage = "pt_PT"; }
+ elsif ( $sollanguage eq "pt_BR" ) { $sollanguage = "pt_BR"; }
+ elsif ( $sollanguage eq "ru" ) { $sollanguage = "ru_RU"; }
+ elsif ( $sollanguage eq "ja" ) { $sollanguage = "ja,ja_JP,ja_JP.PCK,ja_JP.UTF-8"; }
+ elsif ( $sollanguage eq "ko" ) { $sollanguage = "ko,ko.UTF-8"; }
+ elsif ( $sollanguage eq "zh_CN" ) { $sollanguage = "zh,zh.GBK,zh_CN.GB18030,zh.UTF-8"; }
+ elsif ( $sollanguage eq "zh_TW" ) { $sollanguage = "zh_TW,zh_TW.BIG5,zh_TW.UTF-8,zh_HK.BIG5HK,zh_HK.UTF-8"; }
+
+ return $sollanguage;
+}
+
+############################################################
+# Adding language infos in pkginfo file
+############################################################
+
+sub include_languageinfos_into_pkginfo
+{
+ my ( $changefile, $filename, $languagestringref, $onepackage, $variableshashref ) = @_;
+
+ # SUNWPKG_LIST=core01
+ # SUNW_LOC=de
+
+ my $locallang = $onepackage->{'language'};
+ my $solarislanguage = get_solaris_language_for_langpack($locallang);
+
+ my $newline = "SUNW_LOC=" . $solarislanguage . "\n";
+ add_one_line_into_file($changefile, $newline, $filename);
+
+ # SUNW_PKGLIST is required, if SUNW_LOC is defined.
+ if ( $onepackage->{'pkg_list_entry'} )
+ {
+ my $packagelistentry = $onepackage->{'pkg_list_entry'};
+ installer::packagelist::resolve_packagevariables(\$packagelistentry, $variableshashref, 1);
+ $newline = "SUNW_PKGLIST=" . $packagelistentry . "\n";
+ add_one_line_into_file($changefile, $newline, $filename);
+ }
+ else
+ {
+ # Using default package ooobasis30-core01.
+ my $packagelistentry = "%BASISPACKAGEPREFIX%WITHOUTDOTPRODUCTVERSION-core01";
+ installer::packagelist::resolve_packagevariables(\$packagelistentry, $variableshashref, 1);
+ $newline = "SUNW_PKGLIST=" . $packagelistentry . "\n";
+ add_one_line_into_file($changefile, $newline, $filename);
+ }
+}
+
+############################################################
+# Including package names into the depend files.
+# The package names have to be included into
+# packagelist. They are already saved in
+# %installer::globals::dependfilenames.
+############################################################
+
+sub put_packagenames_into_dependfile
+{
+ my ( $file ) = @_;
+
+ for ( my $i = 0; $i <= $#{$file}; $i++ )
+ {
+ my $line = ${$file}[$i];
+ if ( $line =~ /^\s*\w\s+(.*?)\s*$/ )
+ {
+ my $abbreviation = $1;
+
+ if ( $abbreviation =~ /\%/ ) { installer::exiter::exit_program("ERROR: Could not resolve all properties in Solaris package abbreviation \"$abbreviation\"!", "read_packagemap"); }
+
+ if ( exists($installer::globals::dependfilenames{$abbreviation}) )
+ {
+ my $packagename = $installer::globals::dependfilenames{$abbreviation};
+ if ( $packagename =~ /\%/ ) { installer::exiter::exit_program("ERROR: Could not resolve all properties in Solaris package name \"$packagename\"!", "read_packagemap"); }
+
+ $line =~ s/\s*$//;
+ ${$file}[$i] = $line . "\t" . $packagename . "\n";
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Missing packagename for Solaris package \"$abbreviation\"!", "put_packagenames_into_dependfile");
+ }
+ }
+ }
+}
+
+############################################################
+# Including the relocatable directory into
+# spec file and pkginfo file
+# Linux: set topdir in specfile
+# Solaris: remove $relocatablepath (/opt/)
+# for all objects in prototype file
+# and changing "topdir" for Linux
+############################################################
+
+sub prepare_packages
+{
+ my ($loggingdir, $packagename, $staticpath, $relocatablepath, $onepackage, $variableshashref, $filesref, $languagestringref) = @_;
+
+ my $filename = "";
+ my $newline = "";
+ my $newepmdir = $installer::globals::epmoutpath . $installer::globals::separator;
+
+ my $localrelocatablepath = $relocatablepath;
+ if ( $localrelocatablepath ne "/" ) { $localrelocatablepath =~ s/\/\s*$//; }
+
+ if ( $installer::globals::issolarispkgbuild )
+ {
+ $filename = $packagename . ".pkginfo";
+ $newline = "BASEDIR\=" . $localrelocatablepath . "\n";
+ }
+
+ if ( $installer::globals::isrpmbuild )
+ {
+ $filename = $packagename . ".spec";
+ $newline = "Prefix\:\ " . $localrelocatablepath . "\n";
+ }
+
+ my $completefilename = $newepmdir . $filename;
+
+ if ( ! -f $completefilename) { installer::exiter::exit_program("ERROR: Did not find file: $completefilename", "prepare_packages"); }
+ my $changefile = installer::files::read_file($completefilename);
+ if ( $newline ne "" )
+ {
+ add_one_line_into_file($changefile, $newline, $filename);
+ installer::files::save_file($completefilename, $changefile);
+ }
+
+ # adding new "topdir" and removing old "topdir" in specfile
+
+ if ( $installer::globals::isrpmbuild )
+ {
+ set_topdir_in_specfile($changefile, $filename, $newepmdir);
+ set_autoprovreq_in_specfile($changefile, $onepackage->{'findrequires'}, "$installer::globals::workpath" . "/bin");
+ set_packager_in_specfile($changefile);
+ if ( is_extension_package($changefile) ) { set_prereq_in_specfile($changefile); }
+ set_license_in_specfile($changefile, $variableshashref);
+ set_tab_into_datafile($changefile, $filesref);
+ installer::files::save_file($completefilename, $changefile);
+ }
+
+ # removing the relocatable path in prototype file
+
+ if ( $installer::globals::issolarispkgbuild )
+ {
+ set_revision_in_pkginfo($changefile, $filename, $variableshashref, $packagename);
+ set_maxinst_in_pkginfo($changefile, $filename);
+ set_solaris_parameter_in_pkginfo($changefile, $filename, $variableshashref);
+ if ( $installer::globals::issolarisx86build ) { fix_architecture_setting($changefile); }
+ if (( $onepackage->{'language'} ) && ( $onepackage->{'language'} ne "" ) && ( $onepackage->{'language'} ne "en-US" )) { include_languageinfos_into_pkginfo($changefile, $filename, $languagestringref, $onepackage, $variableshashref); }
+ installer::files::save_file($completefilename, $changefile);
+
+ my $prototypefilename = $packagename . ".prototype";
+ $prototypefilename = $newepmdir . $prototypefilename;
+ if (! -f $prototypefilename) { installer::exiter::exit_program("ERROR: Did not find prototype file: $prototypefilename", "prepare_packages"); }
+
+ my $prototypefile = installer::files::read_file($prototypefilename);
+ make_prototypefile_relocatable($prototypefile, $relocatablepath);
+ my $classesstring = set_tab_into_datafile($prototypefile, $filesref);
+ if ($classesstring)
+ {
+ include_classes_into_pkginfo($changefile, $classesstring);
+ installer::files::save_file($completefilename, $changefile);
+ }
+
+ installer::files::save_file($prototypefilename, $prototypefile);
+
+ # Adding package names into depend files for Solaris (not supported by epm)
+ my $dependfilename = $packagename . ".depend";
+ $dependfilename = $newepmdir . $dependfilename;
+ if ( -f $dependfilename)
+ {
+ my $dependfile = installer::files::read_file($dependfilename);
+ put_packagenames_into_dependfile($dependfile);
+ installer::files::save_file($dependfilename, $dependfile);
+ }
+ }
+
+ return $newepmdir;
+}
+
+###############################################################################
+# Replacement of PRODUCTINSTALLLOCATION and PRODUCTDIRECTORYNAME in the
+# epm list file.
+# The complete rootpath is stored in $installer::globals::rootpath
+# or for each package in $onepackage->{'destpath'}
+# The static rootpath is stored in $staticpath
+# The relocatable path is stored in $relocatablepath
+# PRODUCTINSTALLLOCATION is the relocatable part ("/opt") and
+# PRODUCTDIRECTORYNAME the static path ("openofficeorg20").
+# In standard epm process:
+# No usage of package specific variables like $BASEDIR, because
+# 1. These variables would be replaced in epm process
+# 2. epm version 3.7 does not support relocatable packages
+###############################################################################
+
+sub resolve_path_in_epm_list_before_packaging
+{
+ my ($listfile, $listfilename, $variable, $path) = @_;
+
+ installer::logger::include_header_into_logfile("Replacing variables in epm list file:");
+
+ $path =~ s/\/\s*$//;
+ replace_variables_in_shellscripts($listfile, $listfilename, $variable, $path);
+
+}
+
+#################################################################
+# Determining the rpm version. Beginning with rpm version 4.0
+# the tool to create RPMs is "rpmbuild" and no longer "rpm"
+#################################################################
+
+sub determine_rpm_version
+{
+ my $rpmversion = 0;
+ my $rpmout = "";
+ my $systemcall = "";
+
+ # "rpm --version" has problems since LD_LIBRARY_PATH was removed. Therefore the content of $RPM has to be called.
+ # "rpm --version" and "rpmbuild --version" have the same output. Therefore $RPM can be used. Its value
+ # is saved in $installer::globals::rpm
+
+ if ( $installer::globals::rpm ne "" )
+ {
+ $systemcall = "$installer::globals::rpm --version |";
+ }
+ else
+ {
+ $systemcall = "rpm --version |";
+ }
+
+ open (RPM, "$systemcall");
+ $rpmout = <RPM>;
+ close (RPM);
+
+ if ( $rpmout ne "" )
+ {
+ $rpmout =~ s/\s*$//g;
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ( $rpmout eq "" ) { $infoline = "ERROR: Could not find file \"rpm\" !\n"; }
+ else { $infoline = "Success: rpm version: $rpmout\n"; }
+
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ( $rpmout =~ /(\d+)\.(\d+)\.(\d+)/ ) { $rpmversion = $1; }
+ elsif ( $rpmout =~ /(\d+)\.(\d+)/ ) { $rpmversion = $1; }
+ elsif ( $rpmout =~ /(\d+)/ ) { $rpmversion = $1; }
+ else { installer::exiter::exit_program("ERROR: Unknown format: $rpmout ! Expected: \"a.b.c\", or \"a.b\", or \"a\"", "determine_rpm_version"); }
+ }
+
+ return $rpmversion;
+}
+
+####################################################
+# Writing some info about rpm into the log file
+####################################################
+
+sub log_rpm_info
+{
+ my $systemcall = "";
+ my $infoline = "";
+
+ $infoline = "\nLogging rpmrc content using --showrc\n\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ( $installer::globals::rpm ne "" )
+ {
+ $systemcall = "$installer::globals::rpm --showrc |";
+ }
+ else
+ {
+ $systemcall = "rpm --showrc |";
+ }
+
+ my @fullrpmout = ();
+
+ open (RPM, "$systemcall");
+ while (<RPM>) {push(@fullrpmout, $_); }
+ close (RPM);
+
+ if ( $#fullrpmout > -1 )
+ {
+ for ( my $i = 0; $i <= $#fullrpmout; $i++ )
+ {
+ my $rpmout = $fullrpmout[$i];
+ $rpmout =~ s/\s*$//g;
+
+ $infoline = "$rpmout\n";
+ $infoline =~ s/error/e_r_r_o_r/gi; # avoiding log problems
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ else
+ {
+ $infoline = "Problem in systemcall: $systemcall : No return value\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ $infoline = "End of logging rpmrc\n\n";
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+#################################################
+# Systemcall to start the packaging process
+#################################################
+
+sub create_packages_without_epm
+{
+ my ($epmdir, $packagename, $includepatharrayref, $allvariables, $languagestringref) = @_;
+
+ # Solaris: pkgmk -o -f solaris-2.8-sparc/SUNWso8m34.prototype -d solaris-2.8-sparc
+ # Solaris: pkgtrans solaris-2.8-sparc SUNWso8m34.pkg SUNWso8m34
+ # Solaris: tar -cf - SUNWso8m34 | $installer::globals::packertool > SUNWso8m34.tar.gz
+
+ if ( $installer::globals::issolarispkgbuild )
+ {
+ my $prototypefile = $epmdir . $packagename . ".prototype";
+ if (! -f $prototypefile) { installer::exiter::exit_program("ERROR: Did not find file: $prototypefile", "create_packages_without_epm"); }
+
+ my $destinationdir = $prototypefile;
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationdir);
+ $destinationdir =~ s/\/\s*$//; # removing ending slashes
+
+ my $systemcall = "pkgmk -l 1073741824 -o -f $prototypefile -d $destinationdir 2\>\&1 |";
+ installer::logger::print_message( "... $systemcall ...\n" );
+
+ my $maxpkgmkcalls = 3;
+
+ for ( my $i = 1; $i <= $maxpkgmkcalls; $i++ )
+ {
+ my @pkgmkoutput = ();
+
+ open (PKGMK, "$systemcall");
+ while (<PKGMK>) {push(@pkgmkoutput, $_); }
+ close (PKGMK);
+
+ my $returnvalue = $?; # $? contains the return value of the systemcall
+
+ my $infoline = "Systemcall (Try $i): $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $j = 0; $j <= $#pkgmkoutput; $j++ )
+ {
+ if ( $i < $maxpkgmkcalls ) { $pkgmkoutput[$j] =~ s/\bERROR\b/PROBLEM/ig; }
+ push( @installer::globals::logfileinfo, "$pkgmkoutput[$j]");
+ }
+
+ if ($returnvalue)
+ {
+ $infoline = "Try $i : Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ if ( $i == $maxpkgmkcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "create_packages_without_epm"); }
+ }
+ else
+ {
+ installer::logger::print_message( "Success (Try $i): \"$systemcall\"\n" );
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ last;
+ }
+ }
+
+ # It might be necessary to save uncompressed Solaris packages
+
+ # compressing packages
+
+ if ( ! $installer::globals::solarisdontcompress )
+ {
+ my $faspac = "faspac-so.sh";
+
+ my $compressorref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$faspac, $includepatharrayref, 0);
+ if ($$compressorref ne "")
+ {
+ # Saving original pkginfo, to set time stamp later
+ my $pkginfoorig = "$destinationdir/$packagename/pkginfo";
+ my $pkginfotmp = "$destinationdir/$packagename" . ".pkginfo.tmp";
+ $systemcall = "cp -p $pkginfoorig $pkginfotmp";
+ installer::systemactions::make_systemcall($systemcall);
+
+ $faspac = $$compressorref;
+ $infoline = "Found compressor: $faspac\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ installer::logger::print_message( "... $faspac ...\n" );
+ installer::logger::include_timestamp_into_logfile("Starting $faspac");
+
+ $systemcall = "/bin/sh $faspac -a -q -d $destinationdir $packagename"; # $faspac has to be the absolute path!
+ installer::systemactions::make_systemcall($systemcall);
+
+ # Setting time stamp for pkginfo, because faspac-so.sh
+ # changed the pkginfo file, updated the size and
+ # checksum, but not the time stamp.
+ $systemcall = "touch -r $pkginfotmp $pkginfoorig";
+ installer::systemactions::make_systemcall($systemcall);
+ if ( -f $pkginfotmp ) { unlink($pkginfotmp); }
+
+ installer::logger::include_timestamp_into_logfile("End of $faspac");
+ }
+ else
+ {
+ $infoline = "Not found: $faspac\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ # Setting unix rights to "775" for all created directories inside the package
+
+ $systemcall = "cd $destinationdir; find $packagename -type d | xargs -i chmod 775 \{\} \;";
+ installer::logger::print_message( "... $systemcall ...\n" );
+
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+
+ ######################
+ # making pkg files
+ ######################
+
+ # my $streamname = $packagename . ".pkg";
+ # $systemcall = "pkgtrans $destinationdir $streamname $packagename";
+ # print "... $systemcall ...\n";
+
+ # $returnvalue = system($systemcall);
+
+ # $infoline = "Systemcall: $systemcall\n";
+ # push( @installer::globals::logfileinfo, $infoline);
+
+ # if ($returnvalue)
+ # {
+ # $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ # push( @installer::globals::logfileinfo, $infoline);
+ # }
+ # else
+ # {
+ # $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ # push( @installer::globals::logfileinfo, $infoline);
+ # }
+
+ #########################
+ # making tar.gz files
+ #########################
+
+ # my $targzname = $packagename . ".tar.gz";
+ # $systemcall = "cd $destinationdir; tar -cf - $packagename | $installer::globals::packertool > $targzname";
+ # print "... $systemcall ...\n";
+
+ # $returnvalue = system($systemcall);
+
+ # $infoline = "Systemcall: $systemcall\n";
+ # push( @installer::globals::logfileinfo, $infoline);
+
+ # if ($returnvalue)
+ # {
+ # $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ # push( @installer::globals::logfileinfo, $infoline);
+ # }
+ # else
+ # {
+ # $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ # push( @installer::globals::logfileinfo, $infoline);
+ # }
+
+ }
+
+ # Linux: rpm -bb so8m35.spec ( -> dependency check abklemmen? )
+
+ if ( $installer::globals::isrpmbuild )
+ {
+ my $specfilename = $epmdir . $packagename . ".spec";
+ if (! -f $specfilename) { installer::exiter::exit_program("ERROR: Did not find file: $specfilename", "create_packages_without_epm"); }
+
+ my $rpmcommand = $installer::globals::rpm;
+ my $rpmversion = determine_rpm_version();
+
+ my $target = "";
+ if ( $installer::globals::platformid eq 'linux_x86')
+ {
+ $target = "i586";
+ }
+ elsif ( $installer::globals::platformid eq 'aix_powerpc')
+ {
+ $target = "ppc";
+ }
+ elsif ( $installer::globals::os eq 'LINUX')
+ {
+ $target = (POSIX::uname())[4];
+ }
+
+ # rpm 4.6 ignores buildroot tag in spec file
+
+ my $buildrootstring = "";
+
+ if ( $rpmversion >= 4 )
+ {
+ my $dir = Cwd::getcwd;
+ my $buildroot = $dir . "/" . $epmdir . "buildroot/";
+ $buildrootstring = "--buildroot=$buildroot";
+ mkdir($buildroot = $dir . "/" . $epmdir . "BUILD/");
+ }
+
+ if ( ! $installer::globals::rpminfologged )
+ {
+ log_rpm_info();
+ $installer::globals::rpminfologged = 1;
+ }
+
+ my $systemcall = "$rpmcommand -bb --define \"_unpackaged_files_terminate_build 0\" $specfilename --target $target $buildrootstring 2\>\&1 |";
+
+ installer::logger::print_message( "... $systemcall ...\n" );
+
+ my $maxrpmcalls = 3;
+ my $rpm_failed = 0;
+
+ for ( my $i = 1; $i <= $maxrpmcalls; $i++ )
+ {
+ my @rpmoutput = ();
+
+ open (RPM, "$systemcall");
+ while (<RPM>) {push(@rpmoutput, $_); }
+ close (RPM);
+
+ my $returnvalue = $?; # $? contains the return value of the systemcall
+
+ my $infoline = "Systemcall (Try $i): $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $j = 0; $j <= $#rpmoutput; $j++ )
+ {
+ $rpmoutput[$j] =~ s/\bERROR\b/PROBLEM/ig;
+ push( @installer::globals::logfileinfo, "$rpmoutput[$j]");
+ }
+
+ if ($returnvalue)
+ {
+ $infoline = "Try $i : Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $rpm_failed = 1;
+ }
+ else
+ {
+ installer::logger::print_message( "Success (Try $i): \"$systemcall\"\n" );
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $rpm_failed = 0;
+ last;
+ }
+ }
+
+ if ( $rpm_failed )
+ {
+ # Because of the problems with LD_LIBRARY_PATH, a direct call of local "rpm" or "rpmbuild" might be successful
+ my $rpmprog = "";
+ if ( -f "/usr/bin/rpmbuild" ) { $rpmprog = "/usr/bin/rpmbuild"; }
+ elsif ( -f "/usr/bin/rpm" ) { $rpmprog = "/usr/bin/rpm"; }
+
+ if ( $rpmprog ne "" )
+ {
+ installer::logger::print_message( "... $rpmprog ...\n" );
+
+ my $helpersystemcall = "$rpmprog -bb $specfilename --target $target $buildrootstring 2\>\&1 |";
+
+ my @helperrpmoutput = ();
+
+ open (RPM, "$helpersystemcall");
+ while (<RPM>) {push(@helperrpmoutput, $_); }
+ close (RPM);
+
+ my $helperreturnvalue = $?; # $? contains the return value of the systemcall
+
+ $infoline = "\nLast try: Using $rpmprog directly (problem with LD_LIBRARY_PATH)\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ $infoline = "\nSystemcall: $helpersystemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $j = 0; $j <= $#helperrpmoutput; $j++ ) { push( @installer::globals::logfileinfo, "$helperrpmoutput[$j]"); }
+
+ if ($helperreturnvalue)
+ {
+ $infoline = "Could not execute \"$helpersystemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ installer::logger::print_message( "Success: \"$helpersystemcall\"\n" );
+ $infoline = "Success: Executed \"$helpersystemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $rpm_failed = 0;
+ }
+ }
+
+ # Now it is really time to exit this packaging process, if the error still occurs
+ if ( $rpm_failed ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "create_packages_without_epm"); }
+ }
+ }
+}
+
+#################################################
+# Removing all temporary files created by epm
+#################################################
+
+sub remove_temporary_epm_files
+{
+ my ($epmdir, $loggingdir, $packagename) = @_;
+
+ # saving the files into the loggingdir
+
+ if ( $installer::globals::issolarispkgbuild )
+ {
+ my @extensions = ();
+ push(@extensions, ".pkginfo");
+ push(@extensions, ".prototype");
+ push(@extensions, ".postinstall");
+ push(@extensions, ".postremove");
+ push(@extensions, ".preinstall");
+ push(@extensions, ".preremove");
+ push(@extensions, ".depend");
+
+ for ( my $i = 0; $i <= $#extensions; $i++ )
+ {
+ my $removefile = $epmdir . $packagename . $extensions[$i];
+ my $destfile = $loggingdir . $packagename . $extensions[$i] . ".log";
+
+ if (! -f $removefile) { next; }
+
+ my $systemcall = "mv -f $removefile $destfile";
+ system($systemcall); # ignoring the return value
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ if ( $installer::globals::isrpmbuild )
+ {
+ my $removefile = $epmdir . $packagename . ".spec";
+ my $destfile = $loggingdir . $packagename . ".spec.log";
+
+ my $systemcall = "mv -f $removefile $destfile";
+ system($systemcall); # ignoring the return value
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # removing the directory "buildroot"
+
+ my $removedir = $epmdir . "buildroot";
+
+ $systemcall = "rm -rf $removedir";
+
+ installer::logger::print_message( "... $systemcall ...\n" );
+
+ my $returnvalue = system($systemcall);
+
+ $removedir = $epmdir . "BUILD";
+
+ $systemcall = "rm -rf $removedir";
+
+ installer::logger::print_message( "... $systemcall ...\n" );
+
+ $returnvalue = system($systemcall);
+
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+}
+
+###########################################################
+# Creating a better directory structure in the solver.
+###########################################################
+
+sub create_new_directory_structure
+{
+ my ($newepmdir) = @_;
+
+ my $newdir = $installer::globals::epmoutpath;
+
+ if ( $installer::globals::isrpmbuild )
+ {
+ my $rpmdir;
+ my $machine = "";
+ if ( $installer::globals::platformid eq 'linux_x86')
+ {
+ $rpmdir = "$installer::globals::epmoutpath/RPMS/i586";
+ }
+ elsif ( $installer::globals::platformid eq 'aix_powerpc')
+ {
+ $machine = "ppc";
+ $rpmdir = "$installer::globals::epmoutpath/RPMS/$machine";
+ }
+ elsif ( $installer::globals::os eq 'LINUX')
+ {
+ $machine = (POSIX::uname())[4];
+ $rpmdir = "$installer::globals::epmoutpath/RPMS/$machine";
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: rpmdir undefined !", "create_new_directory_structure");
+ }
+
+ my $systemcall = "mv $rpmdir/* $newdir"; # moving the rpms into the directory "RPMS"
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not move content of \"$rpmdir\" to \"$newdir\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Moved content of \"$rpmdir\" to \"$newdir\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ # and removing the empty directory
+
+ if ( $machine ne "" )
+ {
+ rmdir "$installer::globals::epmoutpath/RPMS/$machine";
+ }
+ rmdir "$installer::globals::epmoutpath/RPMS/powerpc";
+ rmdir "$installer::globals::epmoutpath/RPMS/x86_64";
+ rmdir "$installer::globals::epmoutpath/RPMS/i586";
+ rmdir "$installer::globals::epmoutpath/RPMS/i386";
+ rmdir "$installer::globals::epmoutpath/RPMS"
+ or warn "Could not remove RPMS dir: $!";
+ }
+
+ # Setting unix rights to "775" for $newdir ("RPMS" or "packages")
+ chmod 0775, $newdir;
+}
+
+######################################################
+# Collect modules with product specific styles.
+######################################################
+
+sub collect_modules_with_style
+{
+ my ($style, $modulesarrayref) = @_;
+
+ my @allmodules = ();
+
+ for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
+ {
+ my $onemodule = ${$modulesarrayref}[$i];
+ my $styles = "";
+ if ( $onemodule->{'Styles'} ) { $styles = $onemodule->{'Styles'}; }
+ if ( $styles =~ /\b\Q$style\E\b/ )
+ {
+ push(@allmodules, $onemodule);
+ }
+ }
+
+ return \@allmodules;
+}
+
+######################################################
+# Remove modules without packagecontent.
+######################################################
+
+sub remove_modules_without_package
+{
+ my ($allmodules) = @_;
+
+ my @allmodules = ();
+
+ for ( my $i = 0; $i <= $#{$allmodules}; $i++ )
+ {
+ my $onemodule = ${$allmodules}[$i];
+ my $packagename = "";
+ if ( $onemodule->{'PackageName'} ) { $packagename = $onemodule->{'PackageName'}; }
+ if ( $packagename ne "" )
+ {
+ push(@allmodules, $onemodule);
+ }
+ }
+
+ return \@allmodules;
+}
+
+######################################################
+# Copying files for system integration.
+######################################################
+
+sub copy_and_unpack_tar_gz_files
+{
+ my ($sourcefile, $destdir) = @_;
+
+ my $systemcall = "cd $destdir; cat $sourcefile | gunzip | tar -xf -";
+ installer::systemactions::make_systemcall($systemcall);
+}
+
+######################################################
+# Checking whether the new content is a directory and
+# not a package. If it is a directory, the complete
+# content of the directory has to be added to the
+# array newcontent.
+######################################################
+
+sub control_subdirectories
+{
+ my ($content, $subdir) = @_;
+
+ my @newcontent = ();
+
+ for ( my $i = 0; $i <= $#{$content}; $i++ )
+ {
+ if ( -d ${$content}[$i] )
+ {
+ $subdir = ${$content}[$i];
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$subdir);
+ my $allpackages = installer::systemactions::read_directory(${$content}[$i]);
+ for ( my $j = 0; $j <= $#{$allpackages}; $j++ )
+ {
+ # Currently only Linux rpm is supported, debian packages cannot be installed via xpd installer
+ if (( $installer::globals::islinuxbuild ) && ( ! ( ${$allpackages}[$j] =~ /\.rpm\s*$/ ))) { next; }
+ push(@newcontent, ${$allpackages}[$j]);
+ }
+ }
+ else
+ {
+ push(@newcontent, ${$content}[$i]);
+ }
+ }
+
+ return (\@newcontent, $subdir);
+}
+
+######################################################
+# Including the system integration files into the
+# installation sets.
+######################################################
+
+sub put_systemintegration_into_installset
+{
+ my ($newdir, $includepatharrayref, $allvariables, $modulesarrayref) = @_;
+
+ my $destdir = $newdir;
+
+ # adding System integration files
+
+ my $sourcefile = "";
+
+ # Finding the modules defined in scp (with flag SYSTEMMODULE)
+ # Getting name of package from scp-Module
+ # Search package in list off all include files
+ # Copy file into installation set and unpack it (always tar.gz)
+ # tar.gz can contain a different number of packages -> automatically create hidden sub modules
+
+ # Collect all modules with flag "SYSTEMMODULE"
+ my $allmodules = collect_modules_with_style("SYSTEMMODULE", $modulesarrayref);
+ $allmodules = remove_modules_without_package($allmodules);
+
+ for ( my $i = 0; $i <= $#{$allmodules}; $i++ )
+ {
+ my $onemodule = ${$allmodules}[$i];
+ my $packagetarfilename = $onemodule->{'PackageName'};
+
+ my $infoline = "Including into installation set: $packagetarfilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $sourcepathref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$packagetarfilename, $includepatharrayref, 1);
+ if ( $$sourcepathref eq "" ) { installer::exiter::exit_program("ERROR: Source path not found for $packagetarfilename!", "copy_systemintegration_files"); }
+
+ # Collecting all packages in directory "packages" or "RPMS"
+ my $oldcontent = installer::systemactions::read_directory($destdir);
+
+ copy_and_unpack_tar_gz_files($$sourcepathref, $destdir);
+
+ # Finding new content -> that is the package name
+ my ($newcontent, $allcontent ) = installer::systemactions::find_new_content_in_directory($destdir, $oldcontent);
+
+ # special handling, if new content is a directory
+ my $subdir = "";
+ if ( ! $installer::globals::issolarispkgbuild ) { ($newcontent, $subdir) = control_subdirectories($newcontent); }
+
+ # Adding license content into Solaris packages
+ if (( $installer::globals::issolarispkgbuild ) && ( $installer::globals::englishlicenseset ) && ( ! $variableshashref->{'NO_LICENSE_INTO_COPYRIGHT'} )) { _add_license_into_systemintegrationpackages($destdir, $newcontent); }
+ }
+}
+
+######################################################
+# Analyzing the Unix installation path.
+# From the installation path /opt/openofficeorg20
+# is the part /opt relocatable and the part
+# openofficeorg20 static.
+######################################################
+
+sub analyze_rootpath
+{
+ my ($rootpath, $staticpathref, $relocatablepathref, $allvariables) = @_;
+
+ $rootpath =~ s/\/\s*$//; # removing ending slash
+
+ ##############################################################
+ # Version 3: "/" is variable and "/opt/openofficeorg20" fixed
+ ##############################################################
+
+ $$relocatablepathref = "/";
+ # Static path has to contain the office directory name. This is replaced in shellscripts.
+ $$staticpathref = $rootpath . $installer::globals::separator . $installer::globals::officedirhostname;
+ # For RPM version 3.x it is required, that Prefix is not "/" in spec file. In this case --relocate will not work,
+ # because RPM 3.x says, that the package is not relocatable. Therefore we have to use Prefix=/opt and for
+ # all usages of --relocate this path has to be on both sides of the "=": --relocate /opt=<myselectdir>/opt .
+ if ( $installer::globals::isrpmbuild )
+ {
+ $$relocatablepathref = $rootpath . "\/"; # relocatable path must end with "/", will be "/opt/"
+ $$staticpathref = $installer::globals::officedirhostname; # to be used as replacement in shell scripts
+ }
+
+ if ( $installer::globals::isdebbuild )
+ {
+ $$relocatablepathref = "";
+ # $$staticpathref is already "/opt/libreoffice", no additional $rootpath required.
+ }
+
+}
+
+################################################
+# Defining the English license text to add
+# it into Solaris packages.
+################################################
+
+sub _set_english_license
+{
+ my $additional_license_name = $installer::globals::englishsolarislicensename; # always the English file
+ my $licensefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$additional_license_name, "" , 0);
+ if ( $$licensefileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find license file $additional_license_name!", "set_english_license"); }
+ $installer::globals::englishlicenseset = 1;
+ $installer::globals::englishlicense = installer::files::read_file($$licensefileref);
+ installer::scpzipfiles::replace_all_ziplistvariables_in_file($installer::globals::englishlicense, $variableshashref);
+}
+
+################################################
+# Adding the content of the English license
+# file into the system integration packages.
+################################################
+
+sub _add_license_into_systemintegrationpackages
+{
+ my ($destdir, $packages) = @_;
+
+ for ( my $i = 0; $i <= $#{$packages}; $i++ )
+ {
+ my $copyrightfilename = ${$packages}[$i] . $installer::globals::separator . "install" . $installer::globals::separator . "copyright";
+ if ( ! -f $copyrightfilename ) { installer::exiter::exit_program("ERROR: Could not find license file in system integration package: $copyrightfilename!", "add_license_into_systemintegrationpackages"); }
+ my $copyrightfile = installer::files::read_file($copyrightfilename);
+
+ # Saving time stamp of old copyrightfile
+ my $savcopyrightfilename = $copyrightfilename . ".sav";
+ installer::systemactions::copy_one_file($copyrightfilename, $savcopyrightfilename);
+ _set_time_stamp_for_file($copyrightfilename, $savcopyrightfilename); # now $savcopyrightfile has the time stamp of $copyrightfile
+
+ # Adding license content to copyright file
+ push(@{$copyrightfile}, "\n");
+ for ( my $i = 0; $i <= $#{$installer::globals::englishlicense}; $i++ ) { push(@{$copyrightfile}, ${$installer::globals::englishlicense}[$i]); }
+ installer::files::save_file($copyrightfilename, $copyrightfile);
+
+ # Setting the old time stamp saved with $savcopyrightfilename
+ _set_time_stamp_for_file($savcopyrightfilename, $copyrightfilename); # now $copyrightfile has the time stamp of $savcopyrightfile
+ unlink($savcopyrightfilename);
+
+ # Changing content of copyright file in pkgmap
+ my $pkgmapfilename = ${$packages}[$i] . $installer::globals::separator . "pkgmap";
+ if ( ! -f $pkgmapfilename ) { installer::exiter::exit_program("ERROR: Could not find pkgmap in system integration package: $pkgmapfilename!", "add_license_into_systemintegrationpackages"); }
+ my $pkgmap = installer::files::read_file($pkgmapfilename);
+ _change_onefile_in_pkgmap($pkgmap, $copyrightfilename, "copyright");
+ installer::files::save_file($pkgmapfilename, $pkgmap);
+ }
+}
+
+##############################################
+# Setting time stamp of copied files to avoid
+# errors from pkgchk.
+##############################################
+
+sub _set_time_stamp_for_file
+{
+ my ($sourcefile, $destfile) = @_;
+
+ my $systemcall = "touch -r $sourcefile $destfile";
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: \"$systemcall\" failed!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: \"$systemcall\" !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+##############################################
+# Setting checksum and wordcount for changed
+# pkginfo file into pkgmap.
+##############################################
+
+sub _change_onefile_in_pkgmap
+{
+ my ($pkgmapfile, $fullfilename, $shortfilename) = @_;
+
+ # 1 i pkginfo 442 34577 1166716297
+ # ->
+ # 1 i pkginfo 443 34737 1166716297
+ #
+ # wc -c pkginfo | cut -f6 -d' ' -> 442 (variable)
+ # sum pkginfo | cut -f1 -d' ' -> 34577 (variable)
+ # grep 'pkginfo' pkgmap | cut -f6 -d' ' -> 1166716297 (fix)
+
+ my $checksum = _call_sum($fullfilename);
+ if ( $checksum =~ /^\s*(\d+)\s+.*$/ ) { $checksum = $1; }
+
+ my $wordcount = _call_wc($fullfilename);
+ if ( $wordcount =~ /^\s*(\d+)\s+.*$/ ) { $wordcount = $1; }
+
+ for ( my $i = 0; $i <= $#{$pkgmapfile}; $i++ )
+ {
+ if ( ${$pkgmapfile}[$i] =~ /(^.*\b\Q$shortfilename\E\b\s+)(\d+)(\s+)(\d+)(\s+)(\d+)(\s*$)/ )
+ {
+ my $newline = $1 . $wordcount . $3 . $checksum . $5 . $6 . $7;
+ ${$pkgmapfile}[$i] = $newline;
+ last;
+ }
+ }
+}
+
+#########################################################
+# Calling sum
+#########################################################
+
+sub _call_sum
+{
+ my ($filename) = @_;
+
+ $sumfile = "/usr/bin/sum";
+
+ if ( ! -f $sumfile ) { installer::exiter::exit_program("ERROR: No file /usr/bin/sum", "call_sum"); }
+
+ my $systemcall = "$sumfile $filename |";
+
+ my $sumoutput = "";
+
+ open (SUM, "$systemcall");
+ $sumoutput = <SUM>;
+ close (SUM);
+
+ my $returnvalue = $?; # $? contains the return value of the systemcall
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ return $sumoutput;
+}
+
+#########################################################
+# Calling wc
+# wc -c pkginfo | cut -f6 -d' '
+#########################################################
+
+sub _call_wc
+{
+ my ($filename) = @_;
+
+ $wcfile = "/usr/bin/wc";
+
+ if ( ! -f $wcfile ) { installer::exiter::exit_program("ERROR: No file /usr/bin/wc", "call_wc"); }
+
+ my $systemcall = "$wcfile -c $filename |";
+
+ my $wcoutput = "";
+
+ open (WC, "$systemcall");
+ $wcoutput = <WC>;
+ close (WC);
+
+ my $returnvalue = $?; # $? contains the return value of the systemcall
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ return $wcoutput;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/exiter.pm b/solenv/bin/modules/installer/exiter.pm
new file mode 100644
index 000000000..c6e49f9ce
--- /dev/null
+++ b/solenv/bin/modules/installer/exiter.pm
@@ -0,0 +1,33 @@
+#
+# 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 .
+#
+
+package installer::exiter;
+
+use strict;
+use warnings;
+
+use Carp;
+
+sub exit_program
+{
+ my $message = shift;
+
+ croak $message;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/filelists.pm b/solenv/bin/modules/installer/filelists.pm
new file mode 100644
index 000000000..1320a89e6
--- /dev/null
+++ b/solenv/bin/modules/installer/filelists.pm
@@ -0,0 +1,154 @@
+#
+# 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/.
+#
+
+package installer::filelists;
+
+use File::stat;
+
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+
+sub resolve_filelist_flag
+{
+ my ($files, $links, $outdir) = @_;
+ my @newfiles = ();
+ my $error = 0;
+
+ foreach my $file (@{$files})
+ {
+ my $is_filelist = 0;
+ my $use_internal_rights = 0;
+ if ($file->{'Styles'})
+ {
+ if ($file->{'Styles'} =~ /\bFILELIST\b/)
+ {
+ $is_filelist = 1;
+ }
+ if ($file->{'Styles'} =~ /\bUSE_INTERNAL_RIGHTS\b/ && !$installer::globals::iswin)
+ {
+ $use_internal_rights = 1;
+ }
+ }
+
+ if ($is_filelist)
+ {
+ my $filelist_path = $file->{'sourcepath'};
+ my $filelist = read_filelist($filelist_path);
+ if (@{$filelist})
+ {
+ my $destination = $file->{'destination'};
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination);
+
+ foreach my $path (@{$filelist})
+ {
+ my $is_symlink = 0;
+
+ if ((index $path, $outdir) != 0)
+ {
+ installer::logger::print_error("file '$path' is not in '$outdir'");
+ $error = 1;
+ }
+ if ($path =~ '\/\/')
+ {
+ installer::logger::print_error("file '$path' contains 2 consecutive '/' which breaks MSIs");
+ $error = 1;
+ }
+ if (-l $path)
+ {
+ $is_symlink = 1;
+ }
+ else
+ {
+ if (!-e $path)
+ {
+ installer::logger::print_error("file '$path' does not exist");
+ $error = 1;
+ }
+ }
+
+ my $subpath = substr $path, ((length $outdir) + 1); # drop separator too
+
+ my %newfile = ();
+ %newfile = %{$file};
+ $newfile{'Name'} = $subpath;
+ $newfile{'sourcepath'} = $path;
+ $newfile{'destination'} = $destination . $subpath;
+ $newfile{'filelistname'} = $file->{'Name'};
+ $newfile{'filelistpath'} = $file->{'sourcepath'};
+
+ if ($is_symlink)
+ {
+ # FIXME: for symlinks destination is mangled later in
+ # get_Destination_Directory_For_Item_From_Directorylist
+ $newfile{'DoNotMessWithSymlinks'} = 1;
+ $newfile{'Target'} = readlink($path);
+ push ( @{$links}, \%newfile );
+ }
+ else
+ {
+ if ($use_internal_rights)
+ {
+ my $st = stat($path);
+ $newfile{'UnixRights'} = sprintf("%o", $st->mode & 0777);
+ }
+
+ push @newfiles, \%newfile;
+ }
+ }
+ }
+ else
+ {
+ installer::logger::print_message("filelist $filelist_path is empty\n");
+ }
+ }
+ else # not a filelist, just pass the current file over
+ {
+ push @newfiles, $file;
+ }
+ }
+
+ if ( $error )
+ {
+ installer::exiter::exit_program("ERROR: error(s) in resolve_filelist_flag");
+ }
+
+ return (\@newfiles, $links);
+}
+
+sub read_filelist
+{
+ my ($path) = @_;
+ my $content = installer::files::read_file($path);
+ my @filelist = ();
+
+ # split on space, but only if followed by / (don't split within a filename)
+ my $splitRE = qr!\s+(?=/)!;
+ # filelist on win have C:/cygwin style however - also reading dos-file under
+ # cygwin retains \r\n - so chomp below still leaves \r to strip in the RE
+ $splitRE = qr!\s+(?:$|(?=[A-Z]:/))! if ($installer::globals::os eq "WNT");
+
+ foreach my $line (@{$content})
+ {
+ chomp $line;
+ foreach my $file (split $splitRE, $line)
+ {
+ if ($file ne "")
+ {
+ push @filelist, $file;
+ }
+ }
+ }
+
+ return \@filelist;
+}
+
+1;
+
+# vim: set expandtab shiftwidth=4 tabstop=4:
diff --git a/solenv/bin/modules/installer/files.pm b/solenv/bin/modules/installer/files.pm
new file mode 100644
index 000000000..1eb41482c
--- /dev/null
+++ b/solenv/bin/modules/installer/files.pm
@@ -0,0 +1,120 @@
+#
+# 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 .
+#
+
+package installer::files;
+
+use strict;
+use warnings;
+
+use installer::exiter;
+use installer::logger;
+
+############################################
+# File Operations
+############################################
+
+sub check_file
+{
+ my ($arg) = @_;
+
+ if(!( -f $arg ))
+ {
+ installer::exiter::exit_program("ERROR: Cannot find file $arg", "check_file");
+ }
+}
+
+sub read_file
+{
+ my ($localfile) = @_;
+ my @localfile = ();
+
+ open( IN, "<$localfile" ) || installer::exiter::exit_program("ERROR: Cannot open file $localfile for reading", "read_file");
+
+# Don't use "my @localfile = <IN>" here, because
+# perl has a problem with the internal "large_and_huge_malloc" function
+# when calling perl using MacOS 10.5 with a perl built with MacOS 10.4
+ while ( my $line = <IN> ) {
+ push @localfile, $line;
+ }
+
+ close( IN );
+
+ return \@localfile;
+}
+
+###########################################
+# Saving files, arrays and hashes
+###########################################
+
+sub save_file
+{
+ my ($savefile, $savecontent) = @_;
+
+ if ( open( OUT, ">$savefile" ) )
+ {
+ print OUT @{$savecontent};
+ close( OUT);
+ }
+ else
+ {
+ # it is useless to save a log file, if there is no write access
+
+ if ( $savefile =~ /\.log/ )
+ {
+ print "\n*************************************************\n";
+ print "ERROR: Cannot write log file $savefile, $!";
+ print "\n*************************************************\n";
+ exit(-1); # exiting the program to avoid endless loops
+ }
+
+ installer::exiter::exit_program("ERROR: Cannot open file $savefile for writing", "save_file");
+ }
+}
+
+###########################################
+# Binary file operations
+###########################################
+
+sub read_binary_file
+{
+ my ($filename) = @_;
+
+ my $file;
+
+ open( IN, "<$filename" ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "read_binary_file");
+ binmode IN;
+ seek IN, 0, 2;
+ my $length = tell IN;
+ seek IN, 0, 0;
+ read IN, $file, $length;
+ close IN;
+
+ return $file;
+}
+
+sub save_binary_file
+{
+ my ($file, $filename) = @_;
+
+ open( OUT, ">$filename" ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for writing", "save_binary_file");
+ binmode OUT;
+ print OUT $file;
+ close OUT;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/globals.pm b/solenv/bin/modules/installer/globals.pm
new file mode 100644
index 000000000..5bbaef309
--- /dev/null
+++ b/solenv/bin/modules/installer/globals.pm
@@ -0,0 +1,290 @@
+#
+# 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 .
+#
+
+package installer::globals;
+
+############################################
+# Global settings
+############################################
+
+BEGIN
+{
+ $ziplistname = "";
+ $pathfilename = "";
+ $setupscriptname = "";
+ $product = "";
+ $languagelist = "";
+ $added_english = 0;
+ $set_office_start_language = 0;
+
+ $destdir = "";
+ $rootpath = "";
+
+ @languageproducts = ();
+ $build = "";
+ $os = "";
+ $cpuname = "";
+ $com = "";
+ $platformid = "";
+ $pro = 0;
+ $dounzip = 1;
+ $languages_defined_in_productlist = 0;
+ $setupscript_defined_in_productlist = 0;
+ $iswindowsbuild = 0;
+ $islinuxbuild = 0;
+ $isrpmbuild = 0;
+ $isdebbuild = 0;
+ $issolarisbuild = 0;
+ $issolarispkgbuild = 0;
+ $issolarissparcbuild = 0;
+ $issolarisx86build = 0;
+ $isfreebsdbuild = 0;
+ $isfreebsdpkgbuild = 0;
+ $ismacbuild = 0;
+ $ismacdmgbuild = 0;
+ $unpackpath = "";
+ $workpath = ""; # installation working dir; some helper scripts are
+ # placed here by gbuild
+ $idttemplatepath = "";
+ $idtlanguagepath = "";
+ $buildid = "Not set";
+ $fontsfolder = "FontsFolder";
+ $fontsfoldername = "Fonts";
+ $fontsdirparent = "";
+ $fontsdirname = "";
+ $fontsdirhostname = "truetype";
+ $officemenufolder = "OfficeMenuFolder";
+ $startupfolder = "StartupFolder";
+ $startmenufolder = "StartMenuFolder";
+ $desktopfolder = "DesktopFolder";
+ $programfilesfolder = "ProgramFilesFolder";
+ $commonfilesfolder = "CommonFilesFolder";
+ $commonappdatafolder = "CommonAppDataFolder";
+ $localappdatafolder = "LocalAppDataFolder";
+ $templatefolder = "TemplateFolder";
+ $templatefoldername = "Templates";
+ $programmenufolder = "ProgramMenuFolder";
+ $lcidlistname = $ENV{'SRCDIR'} . "/l10ntools/source/ulfconv/msi-encodinglist.txt";
+ $msilanguage = ""; # hash reference for msi languages LCID
+ $sofficeiconadded = 0;
+ $temppath = "";
+ $cyg_temppath = "";
+ $temppathdefined = 0;
+ $packageversion = 1;
+ $packagerevision = 1;
+ $rpm = "";
+ $rpminfologged = 0;
+ $debian = "";
+ $installertypedir = "";
+ $controlledmakecabversion = "5";
+ $max_lang_length = 50;
+ $globalblock = "Globals";
+ $rootmodulegid = "";
+ %alllangmodules = ();
+ $englishlicenseset = 0;
+ $englishlicense = "";
+ $englishsolarislicensename = "LICENSE"; # _en-US";
+ $solarisdontcompress = 0;
+ $patharray = "";
+
+ $is_special_epm = 0;
+ $epm_in_path = 0;
+ $epm_path = "";
+ $epmoutpath = "";
+ $simple = 0;
+ $simpledefaultuserdir = "\$ORIGIN/..";
+ $call_epm = 1;
+ $packageformat = "";
+ $packagename = "";
+ $packagelist = "";
+ $shiptestdirectory = "";
+ $archiveformat = "";
+ $updatelastsequence = 0;
+ $updatesequencecounter = 0;
+ $updatedatabase = 0;
+ $updatedatabasepath = "";
+ $pffcabfilename = "ooobasis3.0_pff.cab";
+ %allmergemodulefilesequences = ();
+ %newupdatefiles = ();
+ %allusedupdatesequences = ();
+ %mergemodulefiles = ();
+ $mergefiles_added_into_collector = 0;
+ $creating_windows_installer_patch = 0;
+
+ $strip = 0;
+
+ $packertool = "gzip"; # the default package compression tool for *NIX
+
+ $logfilename = "logfile.log"; # the default logfile name for global errors
+ @logfileinfo = ();
+ @errorlogfileinfo = ();
+ @globallogfileinfo = ();
+ $ignore_error_in_logfile = 0;
+ $exitlog = "";
+ $quiet = 0;
+
+ $ismultilingual = 0;
+ %alluniquefilenames = ();
+ %alllcuniquefilenames = ();
+ %uniquefilenamesequence = ();
+ %dependfilenames = ();
+ $manufacturer = "";
+ $longmanufacturer = "";
+ $codefilename = "codes.txt";
+ $componentfilename = "components.txt";
+ $productcode = "";
+ $upgradecode = "";
+ $msiproductversion = "";
+ $msimajorproductversion = "";
+ @allddffiles = ();
+ $infodirectory = "";
+
+ %mergemodules = ();
+ %merge_media_line = ();
+ %merge_allfeature_hash = ();
+ %merge_alldirectory_hash = ();
+ %merge_directory_hash = ();
+ %copy_msm_files = ();
+ $mergefeaturecollected = 0;
+ $mergedirectoriescollected = 0;
+ $lastsequence_before_merge = 0;
+ $lastcabfilename = "";
+
+ $defaultlanguage = "";
+ $addlicensefile = 1;
+ $addsystemintegration = 0;
+ $makedownload = 1;
+ @binarytableonlyfiles = ();
+ @allscpactions = ();
+ $languagepackaddon = "LanguagePack";
+ $helppackaddon = "HelpPack";
+ $ooodownloadfilename = "";
+ $downloadfilename = "";
+ $downloadfileextension = "";
+ %multilingual_only_modules = ();
+ %application_modules = ();
+
+ $is_copy_only_project = 0;
+ $is_simple_packager_project = 0;
+ $patch_user_dir = 0;
+ $languagepack = 0;
+ $helppack = 0;
+ $refresh_includepaths = 0;
+ $include_paths_read = 0;
+ @patchfilecollector = ();
+ @userregistrycollector = ();
+ $addeduserregitrykeys = 0;
+ $desktoplinkexists = 0;
+ $analyze_spellcheckerlanguage = 0;
+ %spellcheckerlanguagehash = ();
+ %spellcheckerfilehash = ();
+ $registryrootcomponent = "";
+ %allcomponents = ();
+ %allcomponents_in_this_database = ();
+ %allshortcomponents = ();
+ %allregistrycomponents_ = ();
+ %allregistrycomponents_in_this_database_ = ();
+ %allshortregistrycomponents = ();
+
+ $installlocationdirectory = "";
+ $installlocationdirectoryset = 0;
+ $vendordirectory = "";
+ $officeinstalldirectory = "";
+ $rootbrandpackage = "";
+ $rootbrandpackageset = 0;
+ $officedirhostname = "";
+ $officedirgid = "";
+
+ %treestyles = ();
+ %treelayername = ();
+ %hostnametreestyles = ();
+ %treeconditions = ();
+ %usedtreeconditions = ();
+ %moduledestination = ();
+
+ $fix_number_of_cab_files = 1;
+ $cabfilecompressionlevel = 21; # Using LZX compression, possible values are: 15 | 16 | ... | 21 (best compression)
+ $number_of_cabfiles = 1; # only for $fix_number_of_cab_files = 1
+ $include_cab_in_msi = 1;
+ $msidatabasename = "";
+ $prepare_winpatch = 0;
+ $previous_idt_dir = "";
+ $msitranpath = "";
+ $insert_file_at_end = 0;
+ $newfilesexist = 0;
+ $usesharepointpath = 0;
+ %newfilescollector = ();
+
+ $saveinstalldir = "";
+ $csp_installdir = ""; # global installdir of createsimplepackage() in simplepackage.pm
+ $csp_installlogdir = ""; # global installlogdir of createsimplepackage() in simplepackage.pm
+ $csp_languagestring = ""; # global languagestring of createsimplepackage() in simplepackage.pm
+ $localunpackdir = "";
+ $localinstalldirset = 0;
+ $localinstalldir = "";
+
+ $postprocess_specialepm = 0;
+ $postprocess_standardepm = 0;
+ $mergemodules_analyzed = 0;
+
+ @packagelistitems = ("module", "solarispackagename", "packagename", "copyright", "vendor", "description" );
+ @featurecollector =();
+ $msiassemblyfiles = "";
+ $macinstallfilename = $ENV{'WORKDIR'} . "/CustomTarget/setup_native/mac/macinstall.ulf";
+ $extensioninstalldir = "gid_Dir_Share_Extension_Install";
+ @languagenames = ();
+ %componentcondition = ();
+ %componentid = ();
+ %allcabinets = ();
+ %allcabinetassigns = ();
+ %cabfilecounter = ();
+ %lastsequence = ();
+ %allcalculated_guids = ();
+ %calculated_component_guids = ();
+ %all_english_languagestrings = ();
+ %all_required_english_languagestrings = ();
+
+ @removedirs = ();
+ @removefiletable = ();
+
+ if ( $^O =~ /cygwin/i )
+ {
+ $zippath = "zip"; # Has to be in the path: /usr/bin/zip
+ $separator = "/";
+ $pathseparator = "\:";
+ $isunix = 0;
+ $iswin = 1;
+ $archiveformat = ".zip";
+ %savedmapping = ();
+ %savedrevmapping = ();
+ %savedrev83mapping = ();
+ %saved83dirmapping = ();
+ }
+ else
+ {
+ $zippath = "zip"; # Has to be in the path: /usr/bin/zip
+ $separator = "/";
+ $pathseparator = "\:";
+ $archiveformat = ".tar.gz";
+ $isunix = 1;
+ $iswin = 0;
+ }
+
+}
+
+1;
diff --git a/solenv/bin/modules/installer/helppack.pm b/solenv/bin/modules/installer/helppack.pm
new file mode 100644
index 000000000..456e91ecf
--- /dev/null
+++ b/solenv/bin/modules/installer/helppack.pm
@@ -0,0 +1,530 @@
+#
+# 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 .
+#
+
+package installer::helppack;
+
+use strict;
+use warnings;
+
+use installer::converter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::scpzipfiles;
+use installer::scriptitems;
+use installer::systemactions;
+use installer::worker;
+
+sub select_help_items
+{
+ my ( $itemsref, $languagesarrayref, $itemname ) = @_;
+
+ installer::logger::include_header_into_logfile("Selecting items for help pack. Item: $itemname");
+
+ my @itemsarray = ();
+
+ for ( my $i = 0; $i <= $#{$itemsref}; $i++ )
+ {
+ my $oneitem = ${$itemsref}[$i];
+
+ my $styles = "";
+ if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
+
+ if (( $styles =~ /\bHELPPACK\b/ ) || ( $styles =~ /\bFORCEHELPPACK\b/ ))
+ {
+ # Files with style "HELPPACK" and "FORCEHELPPACK" also have to be included into the help pack.
+ # Files with style "HELPPACK" are only included into help packs.
+ # Files with style "FORCEHELPPACK" are included into help packs and non help packs. They are
+ # forced, because otherwise they may not be included into helppacks.
+
+ my $ismultilingual = $oneitem->{'ismultilingual'};
+
+ if ($ismultilingual)
+ {
+ my $specificlanguage = "";
+ if ( $oneitem->{'specificlanguage'} ) { $specificlanguage = $oneitem->{'specificlanguage'}; }
+
+ for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) # iterating over all languages
+ {
+ my $onelanguage = ${$languagesarrayref}[$j];
+ my $locallang = $onelanguage;
+ $locallang =~ s/-/_/;
+
+ if ( $specificlanguage eq $onelanguage )
+ {
+ push(@itemsarray, $oneitem);
+ }
+ }
+ }
+ else
+ {
+ push(@itemsarray, $oneitem);
+ }
+ }
+ }
+
+ return \@itemsarray;
+}
+
+sub replace_languagestring_variable
+{
+ my ($onepackageref, $languagestringref) = @_;
+
+ my $key;
+
+ foreach $key (keys %{$onepackageref})
+ {
+ my $value = $onepackageref->{$key};
+ $value =~ s/\%LANGUAGESTRING/$$languagestringref/g;
+ $onepackageref->{$key} = $value;
+ }
+}
+
+#########################################################
+# Including the license text into the script template
+#########################################################
+
+sub put_license_file_into_script
+{
+ my ($scriptfile, $licensefile) = @_;
+
+ my $infoline = "Adding licensefile into help pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $includestring = "";
+
+ for ( my $i = 0; $i <= $#{$licensefile}; $i++ )
+ {
+ $includestring = $includestring . ${$licensefile}[$i];
+ }
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/LICENSEFILEPLACEHOLDER/$includestring/;
+ }
+}
+
+#########################################################
+# Creating a tar.gz file from a Solaris package
+#########################################################
+
+sub create_tar_gz_file
+{
+ my ($installdir, $packagename, $packagestring) = @_;
+
+ $packagename =~ s/\.rpm\s*$//;
+ my $targzname = $packagename . ".tar.gz";
+ my $systemcall = "cd $installdir; tar -cf - $packagestring | $installer::globals::packertool > $targzname";
+ installer::logger::print_message( "... $systemcall ...\n" );
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ return $targzname;
+}
+
+#########################################################
+# Determining the name of the package file
+#########################################################
+
+sub get_packagename_from_packagelist
+{
+ my ( $alldirs, $allvariables, $languagestringref ) = @_;
+
+ # my $packagename = "";
+
+ # for ( my $i = 0; $i <= $#{$alldirs}; $i++ )
+ # {
+ # if ( ${$alldirs}[$i] =~ /-fonts/ ) { next; }
+ # if ( ${$alldirs}[$i] =~ /-help/ ) { next; }
+ # if ( ${$alldirs}[$i] =~ /-res/ ) { next; }
+ #
+ # $packagename = ${$alldirs}[$i];
+ # last;
+ # }
+
+ # if ( $packagename eq "" ) { installer::exiter::exit_program("ERROR: Could not find base package in directory $installdir!", "get_packagename_from_packagelist"); }
+
+ my $localproductname = $allvariables->{'PRODUCTNAME'};
+ $localproductname = lc($localproductname);
+ $localproductname =~ s/ //g;
+ $localproductname =~ s/-/_/g;
+
+ my $packagename = $localproductname . "_" . $$languagestringref;
+
+ return $packagename;
+}
+
+#########################################################
+# Determining the name of the package file or the rpm
+# in the installation directory. For help packs
+# there is only one file in this directory
+#########################################################
+
+sub determine_packagename
+{
+ my ( $installdir, $allvariables, $languagestringref ) = @_;
+
+ my $packagename = "";
+ my $allnames = "";
+
+ if ( $installer::globals::isrpmbuild )
+ {
+ # determining the rpm file in directory $installdir
+
+ my $fileextension = "rpm";
+ my $rpmfiles = installer::systemactions::find_file_with_file_extension($fileextension, $installdir);
+ if ( ! ( $#{$rpmfiles} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); }
+ my $rpmsav = [@{$rpmfiles}];
+ for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$rpmfiles}[$i]); }
+
+ $packagename = get_packagename_from_packagelist($rpmfiles, $allvariables, $languagestringref);
+
+ my $packagestring = installer::converter::convert_array_to_space_separated_string($rpmfiles);
+ $packagename = create_tar_gz_file($installdir, $packagename, $packagestring); # only one file
+ for ( my $i = 0; $i <= $#{$rpmsav}; $i++ )
+ {
+ my $onefile = $installdir . $installer::globals::separator . ${$rpmsav}[$i];
+ unlink($onefile);
+ }
+
+ $allnames = $rpmfiles;
+ }
+
+ if ( $installer::globals::issolarisbuild )
+ {
+ # determining the Solaris package file in directory $installdir
+ my $alldirs = installer::systemactions::get_all_directories($installdir);
+
+ if ( ! ( $#{$alldirs} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); }
+ my $alldirssav = [@{$alldirs}];
+ for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$alldirs}[$i]); }
+
+ $packagename = get_packagename_from_packagelist($alldirs, $allvariables, $languagestringref);
+ my $packagestring = installer::converter::convert_array_to_space_separated_string($alldirs);
+ $packagename = create_tar_gz_file($installdir, $packagename, $packagestring); # only a file (not a directory) can be included into the shell script
+ for ( my $i = 0; $i <= $#{$alldirssav}; $i++ ) { installer::systemactions::remove_complete_directory(${$alldirssav}[$i], 1); }
+ $allnames = $alldirs;
+ }
+
+ my $infoline = "Found package in installation directory $installdir : $packagename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return ( $packagename, $allnames);
+}
+
+#########################################################
+# Including the name of the package file or the rpm
+# into the script template
+#########################################################
+
+sub put_packagename_into_script
+{
+ my ($scriptfile, $packagename, $allnames) = @_;
+
+ my $localpackagename = $packagename;
+ $localpackagename =~ s/\.tar\.gz//; # making "OOOopenoffice-it-ea.tar.gz" to "OOOopenoffice-it-ea"
+ my $infoline = "Adding packagename $localpackagename into help pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $installline = "";
+
+ if ( $installer::globals::issolarisbuild ) { $installline = " /usr/sbin/pkgadd -d \$outdir -a \$adminfile"; }
+
+ if ( $installer::globals::isrpmbuild ) { $installline = " rpm --prefix \$PRODUCTINSTALLLOCATION --replacepkgs -i"; }
+
+ for ( my $i = 0; $i <= $#{$allnames}; $i++ )
+ {
+ if ( $installer::globals::issolarisbuild ) { $installline = $installline . " ${$allnames}[$i]"; }
+
+ if ( $installer::globals::isrpmbuild ) { $installline = $installline . " \$outdir/${$allnames}[$i]"; }
+ }
+
+ for ( my $j = 0; $j <= $#{$scriptfile}; $j++ )
+ {
+ ${$scriptfile}[$j] =~ s/INSTALLLINES/$installline/;
+ }
+}
+
+##################################################################
+# Including the lowercase product name into the script template
+##################################################################
+
+sub put_productname_into_script
+{
+ my ($scriptfile, $variableshashref) = @_;
+
+ my $productname = $variableshashref->{'PRODUCTNAME'};
+ $productname = lc($productname);
+ $productname =~ s/\.//g; # openoffice.org -> openofficeorg
+
+ my $infoline = "Adding productname $productname into help pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/;
+ }
+}
+
+##################################################################
+# Including the full product name into the script template
+# (name and version)
+##################################################################
+
+sub put_fullproductname_into_script
+{
+ my ($scriptfile, $variableshashref) = @_;
+
+ my $productname = $variableshashref->{'PRODUCTNAME'};
+ my $productversion = "";
+ if ( $variableshashref->{'PRODUCTVERSION'} ) { $productversion = $variableshashref->{'PRODUCTVERSION'}; };
+ my $fullproductname = $productname . " " . $productversion;
+
+ my $infoline = "Adding full productname \"$fullproductname\" into help pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/FULLPRODUCTNAMELONGPLACEHOLDER/$fullproductname/;
+ }
+}
+
+##################################################################
+# Including the name of the search package (-core01)
+# into the script template
+##################################################################
+
+sub put_searchpackage_into_script
+{
+ my ($scriptfile, $variableshashref) = @_;
+
+ my $basispackageprefix = $variableshashref->{'BASISPACKAGEPREFIX'};
+ my $productversion = $variableshashref->{'PRODUCTVERSION'};
+
+ if ( $installer::globals::issolarisbuild ) { $productversion =~ s/\.//g; } # "3.0" -> "30"
+
+ my $infoline = "Adding basis package prefix $basispackageprefix into help pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ $infoline = "Adding basis package version $productversion into help pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/BASISPACKAGEPREFIXPLACEHOLDER/$basispackageprefix/;
+ ${$scriptfile}[$i] =~ s/PRODUCTVERSIONPLACEHOLDER/$productversion/;
+ }
+
+}
+
+#########################################################
+# Including the linenumber into the script template
+#########################################################
+
+sub put_linenumber_into_script
+{
+ my ( $scriptfile, $licensefile, $allnames ) = @_;
+
+ my $linenumber = $#{$scriptfile} + $#{$licensefile} + 3; # also adding the content of the license file!
+
+ my $infoline = "Adding linenumber $linenumber into help pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/LINENUMBERPLACEHOLDER/$linenumber/;
+ }
+}
+
+#########################################################
+# Determining the name of the new scriptfile
+#########################################################
+
+sub determine_scriptfile_name
+{
+ my ( $packagename ) = @_;
+
+ my $scriptfilename = $packagename;
+
+# if ( $installer::globals::isrpmbuild ) { $scriptfilename =~ s/\.rpm\s*$/\.sh/; }
+# if ( $installer::globals::issolarisbuild ) { $scriptfilename =~ s/\.tar\.gz\s*$/\.sh/; }
+
+ $scriptfilename =~ s/\.tar\.gz\s*$/\.sh/;
+
+ my $infoline = "Setting help pack script file name to $scriptfilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return $scriptfilename;
+}
+
+#########################################################
+# Saving the script file in the installation directory
+#########################################################
+
+sub save_script_file
+{
+ my ($installdir, $newscriptfilename, $scriptfile) = @_;
+
+ $newscriptfilename = $installdir . $installer::globals::separator . $newscriptfilename;
+ installer::files::save_file($newscriptfilename, $scriptfile);
+
+ my $infoline = "Saving script file $newscriptfilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return $newscriptfilename;
+}
+
+#########################################################
+# Including the binary package into the script
+#########################################################
+
+sub include_package_into_script
+{
+ my ( $scriptfilename, $installdir, $packagename ) = @_;
+
+ my $longpackagename = $installdir . $installer::globals::separator . $packagename;
+ my $systemcall = "cat $longpackagename >>$scriptfilename";
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ my $localcall = "chmod 775 $scriptfilename \>\/dev\/null 2\>\&1";
+ system($localcall);
+
+}
+
+#########################################################
+# Removing the binary package
+#########################################################
+
+sub remove_package
+{
+ my ( $installdir, $packagename ) = @_;
+
+ my $remove_package = 1;
+
+ if ( $ENV{'DONT_REMOVE_PACKAGE'} ) { $remove_package = 0; }
+
+ if ( $remove_package )
+ {
+ my $longpackagename = $installdir . $installer::globals::separator . $packagename;
+ unlink $longpackagename;
+
+ my $infoline = "Removing package: $longpackagename \n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+####################################################
+# Unix help packs, that are not part of
+# multilingual installation sets, need a
+# shell script installer
+####################################################
+
+sub build_installer_for_helppack
+{
+ my ($installdir, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref) = @_;
+
+ installer::logger::print_message( "... creating shell script installer ...\n" );
+
+ installer::logger::include_header_into_logfile("Creating shell script installer:");
+
+ # find and read setup script template
+
+ my $scriptfilename = "langpackscript.sh";
+ my $scriptref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfilename, $includepatharrayref, 0);
+ if ($$scriptref eq "") { installer::exiter::exit_program("ERROR: Could not find script file $scriptfilename!", "build_installer_for_helppack"); }
+ my $scriptfile = installer::files::read_file($$scriptref);
+
+ my $infoline = "Found script file $scriptfilename: $$scriptref \n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # find and read english license file
+ my $licenselanguage = "en-US"; # always english !
+ my $licensefilename = "LICENSE";
+ my $licenseincludepatharrayref = installer::worker::get_language_specific_include_paths($includepatharrayref, $licenselanguage);
+
+ my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $licenseincludepatharrayref, 0);
+ if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "build_installer_for_helppack"); }
+ my $licensefile = installer::files::read_file($$licenseref);
+
+ $infoline = "Found licensefile $licensefilename: $$licenseref \n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # including variables into license file
+ installer::scpzipfiles::replace_all_ziplistvariables_in_file($licensefile, $allvariableshashref);
+
+ # add license text into script template
+ put_license_file_into_script($scriptfile, $licensefile);
+
+ # add rpm or package file name into script template
+ my ( $packagename, $allnames) = determine_packagename($installdir, $allvariableshashref, $languagestringref);
+ put_packagename_into_script($scriptfile, $packagename, $allnames);
+
+ # add product name into script template
+ put_productname_into_script($scriptfile, $allvariableshashref);
+
+ # add product name into script template
+ put_fullproductname_into_script($scriptfile, $allvariableshashref);
+
+ # add product name into script template
+ put_searchpackage_into_script($scriptfile, $allvariableshashref);
+
+ # replace linenumber in script template
+ put_linenumber_into_script($scriptfile, $licensefile, $allnames);
+
+ # saving the script file
+ my $newscriptfilename = determine_scriptfile_name($packagename);
+ $newscriptfilename = save_script_file($installdir, $newscriptfilename, $scriptfile);
+
+ # include rpm or package into script
+ include_package_into_script($newscriptfilename, $installdir, $packagename);
+
+ # remove rpm or package
+ remove_package($installdir, $packagename);
+}
+
+1;
diff --git a/solenv/bin/modules/installer/languagepack.pm b/solenv/bin/modules/installer/languagepack.pm
new file mode 100644
index 000000000..14a870866
--- /dev/null
+++ b/solenv/bin/modules/installer/languagepack.pm
@@ -0,0 +1,509 @@
+#
+# 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 .
+#
+
+package installer::languagepack;
+
+use installer::converter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::scpzipfiles;
+use installer::scriptitems;
+use installer::systemactions;
+use installer::worker;
+
+####################################################
+# Selecting all files with the correct language
+####################################################
+
+sub select_language_items
+{
+ my ( $itemsref, $languagesarrayref, $itemname ) = @_;
+
+ installer::logger::include_header_into_logfile("Selecting languages for language pack. Item: $itemname");
+
+ my @itemsarray = ();
+
+ for ( my $i = 0; $i <= $#{$itemsref}; $i++ )
+ {
+ my $oneitem = ${$itemsref}[$i];
+
+ my $ismultilingual = $oneitem->{'ismultilingual'};
+
+ if (!($ismultilingual))
+ {
+ # Files with style "LANGUAGEPACK" and "FORCELANGUAGEPACK" also have to be included into the language pack.
+ # Files with style "LANGUAGEPACK" are only included into language packs.
+ # Files with style "FORCELANGUAGEPACK" are included into language packs and non language packs. They are
+ # forced, because otherwise they may not be included into languagepacks.
+
+ my $styles = "";
+ if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
+
+ if (( $styles =~ /\bLANGUAGEPACK\b/ ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ )) { push(@itemsarray, $oneitem); }
+
+ next; # single language files are not included into language pack
+ }
+
+ my $specificlanguage = "";
+ if ( $oneitem->{'specificlanguage'} ) { $specificlanguage = $oneitem->{'specificlanguage'}; }
+
+ for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) # iterating over all languages
+ {
+ my $onelanguage = ${$languagesarrayref}[$j];
+ my $locallang = $onelanguage;
+ $locallang =~ s/-/_/;
+
+ if ( $specificlanguage eq $onelanguage )
+ {
+ push(@itemsarray, $oneitem);
+ }
+ }
+ }
+
+ return \@itemsarray;
+}
+
+sub replace_languagestring_variable
+{
+ my ($onepackageref, $languagestringref) = @_;
+
+ my $key;
+
+ foreach $key (keys %{$onepackageref})
+ {
+ my $value = $onepackageref->{$key};
+ $value =~ s/\%LANGUAGESTRING/$$languagestringref/g;
+ $onepackageref->{$key} = $value;
+ }
+}
+
+#########################################################
+# Including the license text into the script template
+#########################################################
+
+sub put_license_file_into_script
+{
+ my ($scriptfile, $licensefile) = @_;
+
+ my $infoline = "Adding licensefile into language pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $includestring = "";
+
+ for ( my $i = 0; $i <= $#{$licensefile}; $i++ )
+ {
+ $includestring = $includestring . ${$licensefile}[$i];
+ }
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/LICENSEFILEPLACEHOLDER/$includestring/;
+ }
+}
+
+#########################################################
+# Creating a tar.gz file from a Solaris package
+#########################################################
+
+sub create_tar_gz_file
+{
+ my ($installdir, $packagename, $packagestring) = @_;
+
+ $packagename =~ s/\.rpm\s*$//;
+ my $targzname = $packagename . ".tar.gz";
+ $systemcall = "cd $installdir; tar -cf - $packagestring | $installer::globals::packertool > $targzname";
+ installer::logger::print_message( "... $systemcall ...\n" );
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ return $targzname;
+}
+
+#########################################################
+# Determining the name of the package file
+#########################################################
+
+sub get_packagename_from_packagelist
+{
+ my ( $alldirs, $allvariables, $languagestringref ) = @_;
+
+ my $localproductname = $allvariables->{'PRODUCTNAME'};
+ $localproductname = lc($localproductname);
+ $localproductname =~ s/ //g;
+ $localproductname =~ s/-/_/g;
+
+ my $packagename = $localproductname . "_" . $$languagestringref;
+
+ return $packagename;
+}
+
+#########################################################
+# Determining the name of the package file or the rpm
+# in the installation directory. For language packs
+# there is only one file in this directory
+#########################################################
+
+sub determine_packagename
+{
+ my ( $installdir, $allvariables, $languagestringref ) = @_;
+
+ my $packagename = "";
+ my $allnames = "";
+
+ if ( $installer::globals::isrpmbuild )
+ {
+ # determining the rpm file in directory $installdir
+
+ my $fileextension = "rpm";
+ my $rpmfiles = installer::systemactions::find_file_with_file_extension($fileextension, $installdir);
+ if ( ! ( $#{$rpmfiles} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); }
+ my $rpmsav = [@{$rpmfiles}];
+ for ( my $i = 0; $i <= $#{$rpmfiles}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$rpmfiles}[$i]); }
+
+ $packagename = get_packagename_from_packagelist($rpmfiles, $allvariables, $languagestringref);
+
+ my $packagestring = installer::converter::convert_array_to_space_separated_string($rpmfiles);
+ $packagename = create_tar_gz_file($installdir, $packagename, $packagestring); # only one file
+ for ( my $i = 0; $i <= $#{$rpmsav}; $i++ )
+ {
+ my $onefile = $installdir . $installer::globals::separator . ${$rpmsav}[$i];
+ unlink($onefile);
+ }
+
+ $allnames = $rpmfiles;
+ }
+
+ if ( $installer::globals::issolarisbuild )
+ {
+ # determining the Solaris package file in directory $installdir
+ my $alldirs = installer::systemactions::get_all_directories($installdir);
+
+ if ( ! ( $#{$alldirs} > -1 )) { installer::exiter::exit_program("ERROR: Could not find package in directory $installdir!", "determine_packagename"); }
+ my $alldirssav = [@{$alldirs}];
+ for ( my $i = 0; $i <= $#{$alldirs}; $i++ ) { installer::pathanalyzer::make_absolute_filename_to_relative_filename(\${$alldirs}[$i]); }
+
+ $packagename = get_packagename_from_packagelist($alldirs, $allvariables, $languagestringref);
+ my $packagestring = installer::converter::convert_array_to_space_separated_string($alldirs);
+ $packagename = create_tar_gz_file($installdir, $packagename, $packagestring); # only a file (not a directory) can be included into the shell script
+ for ( my $i = 0; $i <= $#{$alldirssav}; $i++ ) { installer::systemactions::remove_complete_directory(${$alldirssav}[$i], 1); }
+ $allnames = $alldirs;
+ }
+
+ my $infoline = "Found package in installation directory $installdir : $packagename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return ( $packagename, $allnames);
+}
+
+#########################################################
+# Including the name of the package file or the rpm
+# into the script template
+#########################################################
+
+sub put_packagename_into_script
+{
+ my ($scriptfile, $packagename, $allnames) = @_;
+
+ my $localpackagename = $packagename;
+ $localpackagename =~ s/\.tar\.gz//; # making "OOOopenoffice-it-ea.tar.gz" to "OOOopenoffice-it-ea"
+ my $infoline = "Adding packagename $localpackagename into language pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $installline = "";
+
+ if ( $installer::globals::issolarisbuild ) { $installline = " /usr/sbin/pkgadd -d \$outdir -a \$adminfile"; }
+
+ if ( $installer::globals::isrpmbuild ) { $installline = " rpm --prefix \$PRODUCTINSTALLLOCATION --replacepkgs -i"; }
+
+ for ( my $i = 0; $i <= $#{$allnames}; $i++ )
+ {
+ if ( $installer::globals::issolarisbuild ) { $installline = $installline . " ${$allnames}[$i]"; }
+
+ if ( $installer::globals::isrpmbuild ) { $installline = $installline . " \$outdir/${$allnames}[$i]"; }
+ }
+
+ for ( my $j = 0; $j <= $#{$scriptfile}; $j++ )
+ {
+ ${$scriptfile}[$j] =~ s/INSTALLLINES/$installline/;
+ }
+}
+
+##################################################################
+# Including the lowercase product name into the script template
+##################################################################
+
+sub put_productname_into_script
+{
+ my ($scriptfile, $variableshashref) = @_;
+
+ my $productname = $variableshashref->{'PRODUCTNAME'};
+ $productname = lc($productname);
+ $productname =~ s/\.//g; # openoffice.org -> openofficeorg
+
+ my $infoline = "Adding productname $productname into language pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/PRODUCTNAMEPLACEHOLDER/$productname/;
+ }
+}
+
+##################################################################
+# Including the full product name into the script template
+# (name and version)
+##################################################################
+
+sub put_fullproductname_into_script
+{
+ my ($scriptfile, $variableshashref) = @_;
+
+ my $productname = $variableshashref->{'PRODUCTNAME'};
+ my $productversion = "";
+ if ( $variableshashref->{'PRODUCTVERSION'} ) { $productversion = $variableshashref->{'PRODUCTVERSION'}; };
+ my $fullproductname = $productname . " " . $productversion;
+
+ my $infoline = "Adding full productname \"$fullproductname\" into language pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/FULLPRODUCTNAMELONGPLACEHOLDER/$fullproductname/;
+ }
+}
+
+##################################################################
+# Including the name of the search package (-core01)
+# into the script template
+##################################################################
+
+sub put_searchpackage_into_script
+{
+ my ($scriptfile, $variableshashref) = @_;
+
+ my $basispackageprefix = $variableshashref->{'BASISPACKAGEPREFIX'};
+ my $productversion = $variableshashref->{'PRODUCTVERSION'};
+
+ if ( $installer::globals::issolarisbuild ) { $productversion =~ s/\.//g; } # "3.0" -> "30"
+
+ my $infoline = "Adding basis package prefix $basispackageprefix into language pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ $infoline = "Adding basis package version $productversion into language pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/BASISPACKAGEPREFIXPLACEHOLDER/$basispackageprefix/;
+ ${$scriptfile}[$i] =~ s/PRODUCTVERSIONPLACEHOLDER/$productversion/;
+ }
+
+}
+
+#########################################################
+# Including the linenumber into the script template
+#########################################################
+
+sub put_linenumber_into_script
+{
+ my ( $scriptfile, $licensefile, $allnames ) = @_;
+
+ my $linenumber = $#{$scriptfile} + $#{$licensefile} + 3; # also adding the content of the license file!
+
+ my $infoline = "Adding linenumber $linenumber into language pack script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/LINENUMBERPLACEHOLDER/$linenumber/;
+ }
+}
+
+#########################################################
+# Determining the name of the new scriptfile
+#########################################################
+
+sub determine_scriptfile_name
+{
+ my ( $packagename ) = @_;
+
+ my $scriptfilename = $packagename;
+
+ $scriptfilename =~ s/\.tar\.gz\s*$/\.sh/;
+
+ my $infoline = "Setting language pack script file name to $scriptfilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return $scriptfilename;
+}
+
+#########################################################
+# Saving the script file in the installation directory
+#########################################################
+
+sub save_script_file
+{
+ my ($installdir, $newscriptfilename, $scriptfile) = @_;
+
+ $newscriptfilename = $installdir . $installer::globals::separator . $newscriptfilename;
+ installer::files::save_file($newscriptfilename, $scriptfile);
+
+ my $infoline = "Saving script file $newscriptfilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return $newscriptfilename;
+}
+
+#########################################################
+# Including the binary package into the script
+#########################################################
+
+sub include_package_into_script
+{
+ my ( $scriptfilename, $installdir, $packagename ) = @_;
+
+ my $longpackagename = $installdir . $installer::globals::separator . $packagename;
+ my $systemcall = "cat $longpackagename >>$scriptfilename";
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ chmod 0775, $scriptfilename;
+
+}
+
+#########################################################
+# Removing the binary package
+#########################################################
+
+sub remove_package
+{
+ my ( $installdir, $packagename ) = @_;
+
+ my $remove_package = 1;
+
+ if ( $ENV{'DONT_REMOVE_PACKAGE'} ) { $remove_package = 0; }
+
+ if ( $remove_package )
+ {
+ my $longpackagename = $installdir . $installer::globals::separator . $packagename;
+ unlink $longpackagename;
+
+ my $infoline = "Removing package: $longpackagename \n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+####################################################
+# Unix language packs, that are not part of
+# multilingual installation sets, need a
+# shell script installer
+####################################################
+
+sub build_installer_for_languagepack
+{
+ my ($installdir, $allvariableshashref, $includepatharrayref, $languagesarrayref, $languagestringref) = @_;
+
+ installer::logger::print_message( "... creating shell script installer ...\n" );
+
+ installer::logger::include_header_into_logfile("Creating shell script installer:");
+
+ # find and read setup script template
+
+ my $scriptfilename = $ENV{'SRCDIR'} . "/setup_native/scripts/langpackscript.sh";
+ if (! -f $scriptfilename) { installer::exiter::exit_program("ERROR: Could not find script file $scriptfilename!", "build_installer_for_languagepack"); }
+ my $scriptfile = installer::files::read_file($scriptfilename);
+
+ my $infoline = "Found script file $scriptfilename: $scriptfile \n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # find and read english license file
+ my $licenselanguage = "en-US"; # always english !
+ my $licensefilename = "LICENSE";
+ my $licenseincludepatharrayref = installer::worker::get_language_specific_include_paths($includepatharrayref, $licenselanguage);
+
+ my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $licenseincludepatharrayref, 0);
+ if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "build_installer_for_languagepack"); }
+ my $licensefile = installer::files::read_file($$licenseref);
+
+ $infoline = "Found licensefile $licensefilename: $$licenseref \n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # including variables into license file
+ installer::scpzipfiles::replace_all_ziplistvariables_in_file($licensefile, $allvariableshashref);
+
+ # add license text into script template
+ put_license_file_into_script($scriptfile, $licensefile);
+
+ # add rpm or package file name into script template
+ my ( $packagename, $allnames) = determine_packagename($installdir, $allvariableshashref, $languagestringref);
+ put_packagename_into_script($scriptfile, $packagename, $allnames);
+
+ # add product name into script template
+ put_productname_into_script($scriptfile, $allvariableshashref);
+
+ # add product name into script template
+ put_fullproductname_into_script($scriptfile, $allvariableshashref);
+
+ # add product name into script template
+ put_searchpackage_into_script($scriptfile, $allvariableshashref);
+
+ # replace linenumber in script template
+ put_linenumber_into_script($scriptfile, $licensefile, $allnames);
+
+ # saving the script file
+ my $newscriptfilename = determine_scriptfile_name($packagename);
+ $newscriptfilename = save_script_file($installdir, $newscriptfilename, $scriptfile);
+
+ # include rpm or package into script
+ include_package_into_script($newscriptfilename, $installdir, $packagename);
+
+ # remove rpm or package
+ remove_package($installdir, $packagename);
+}
+
+1;
diff --git a/solenv/bin/modules/installer/languages.pm b/solenv/bin/modules/installer/languages.pm
new file mode 100644
index 000000000..e25905383
--- /dev/null
+++ b/solenv/bin/modules/installer/languages.pm
@@ -0,0 +1,142 @@
+#
+# 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 .
+#
+
+package installer::languages;
+
+use installer::converter;
+use installer::exiter;
+use installer::globals;
+use installer::remover;
+use installer::ziplist;
+
+#############################################################################
+# Analyzing the language list parameter and language list from zip list file
+#############################################################################
+
+sub analyze_languagelist
+{
+ my $first = $installer::globals::languagelist;
+
+ $first =~ s/\_/\,/g; # substituting "_" by ",", in case of dmake definition 01_49
+
+ # Products are separated by a "#", if defined in zip-list by a "|". But "get_info_about_languages"
+ # substitutes already "|" to "#". This procedure only knows "#" as product separator.
+ # Different languages for one product are separated by ",". But on the command line the "_" is used.
+ # Therefore "_" is replaced by "," at the beginning of this procedure.
+
+ while ($first =~ /^(\S+)\#(\S+?)$/) # Minimal matching, to keep the order of languages
+ {
+ $first = $1;
+ my $last = $2;
+ unshift(@installer::globals::languageproducts, $last);
+ }
+
+ unshift(@installer::globals::languageproducts, $first);
+}
+
+####################################################
+# Reading languages from zip list file
+####################################################
+
+sub get_info_about_languages
+{
+ my ( $allsettingsarrayref ) = @_;
+
+ my $languagelistref;
+
+ $languagelistref = installer::ziplist::getinfofromziplist($allsettingsarrayref, "languages");
+ $installer::globals::languagelist = $$languagelistref;
+
+ if ( $installer::globals::languagelist eq "" ) # not defined on command line and not in product list
+ {
+ installer::exiter::exit_program("ERROR: Languages not defined on command line (-l) and not in product list!", "get_info_about_languages");
+ }
+
+ # Adapting the separator format from zip list.
+ # | means new product, , (comma) means more than one language in one product
+ # On the command line, | is difficult to use. Therefore this script uses hashes
+
+ $installer::globals::languagelist =~ s/\|/\#/g;
+
+ analyze_languagelist();
+}
+
+#############################################
+# All languages defined for one product
+#############################################
+
+sub get_all_languages_for_one_product
+{
+ my ( $languagestring, $allvariables ) = @_;
+
+ my @languagearray = ();
+
+ my $last = $languagestring;
+
+ $installer::globals::ismultilingual = 0; # setting the global variable $ismultilingual !
+ if ( $languagestring =~ /\,/ ) { $installer::globals::ismultilingual = 1; }
+
+ while ( $last =~ /^\s*(.+?)\,(.+)\s*$/) # "$" for minimal matching, comma separated list
+ {
+ my $first = $1;
+ $last = $2;
+ installer::remover::remove_leading_and_ending_whitespaces(\$first);
+ push(@languagearray, "$first");
+ }
+
+ installer::remover::remove_leading_and_ending_whitespaces(\$last);
+ push(@languagearray, "$last");
+
+ return \@languagearray;
+}
+
+##########################################################
+# Converting the language array into a string for output
+##########################################################
+
+sub get_language_string
+{
+ my ($languagesref) = @_;
+
+ my $newstring = "";
+
+ for ( my $i = 0; $i <= $#{$languagesref}; $i++ )
+ {
+ $newstring = $newstring . ${$languagesref}[$i] . "_";
+ }
+
+ # remove ending underline
+
+ $newstring =~ s/\_\s*$//;
+
+ return \$newstring;
+}
+
+##########################################################
+# Analyzing the languages in the languages array and
+# returning the most important language
+##########################################################
+
+sub get_default_language
+{
+ my ($languagesref) = @_;
+
+ return ${$languagesref}[0]; # ToDo, only returning the first language
+}
+
+1;
diff --git a/solenv/bin/modules/installer/logger.pm b/solenv/bin/modules/installer/logger.pm
new file mode 100644
index 000000000..24fe5fc7b
--- /dev/null
+++ b/solenv/bin/modules/installer/logger.pm
@@ -0,0 +1,256 @@
+#
+# 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 .
+#
+
+package installer::logger;
+
+use strict;
+use warnings;
+
+use base 'Exporter';
+
+use installer::files;
+use installer::globals;
+
+our @EXPORT_OK = qw(
+ include_header_into_logfile
+ include_timestamp_into_logfile
+ log_hashref
+ globallog
+ copy_globalinfo_into_logfile
+ starttime
+ stoptime
+ print_message
+ print_warning
+ print_error
+);
+
+my $starttime;
+
+####################################################
+# Including header files into the logfile
+####################################################
+
+sub include_header_into_logfile
+{
+ my ($message) = @_;
+
+ my $infoline;
+
+ $infoline = "\n" . _get_time_string();
+ push( @installer::globals::logfileinfo, $infoline);
+
+ $infoline = "######################################################\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ $infoline = "$message\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+
+ $infoline = "######################################################\n";
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+####################################################
+# Write timestamp into log file
+####################################################
+
+sub include_timestamp_into_logfile
+{
+ my ($message) = @_;
+
+ my $infoline;
+ my $timestring = _get_time_string();
+ $infoline = "$message\t$timestring";
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+####################################################
+# Writing all variables content into the log file
+####################################################
+
+sub log_hashref
+{
+ my ($hashref) = @_;
+
+ my $infoline = "\nLogging variable settings:\n";
+ push(@installer::globals::globallogfileinfo, $infoline);
+
+ my $itemkey;
+
+ foreach $itemkey ( keys %{$hashref} )
+ {
+ my $line = "";
+ my $itemvalue = "";
+ if ( $hashref->{$itemkey} ) { $itemvalue = $hashref->{$itemkey}; }
+ $line = $itemkey . "=" . $itemvalue . "\n";
+ push(@installer::globals::globallogfileinfo, $line);
+ }
+
+ $infoline = "\n";
+ push(@installer::globals::globallogfileinfo, $infoline);
+}
+
+#########################################################
+# Including global logging info into global log array
+#########################################################
+
+sub globallog
+{
+ my ($message) = @_;
+
+ my $infoline;
+
+ $infoline = "\n" . _get_time_string();
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ $infoline = "######################################################\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ $infoline = "$message\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ $infoline = "######################################################\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+}
+
+###############################################################
+# For each product (new language) a new log file is created.
+# Therefore the global logging has to be saved in this file.
+###############################################################
+
+sub copy_globalinfo_into_logfile
+{
+ for ( my $i = 0; $i <= $#installer::globals::globallogfileinfo; $i++ )
+ {
+ push(@installer::globals::logfileinfo, $installer::globals::globallogfileinfo[$i]);
+ }
+}
+
+###############################################################
+# Starting the time
+###############################################################
+
+sub starttime
+{
+ $starttime = time();
+}
+
+###############################################################
+# Convert time string
+###############################################################
+
+sub _convert_timestring
+{
+ my ($secondstring) = @_;
+
+ my $timestring = "";
+
+ if ( $secondstring < 60 ) # less than a minute
+ {
+ if ( $secondstring < 10 ) { $secondstring = "0" . $secondstring; }
+ $timestring = "00\:$secondstring min\.";
+ }
+ elsif ( $secondstring < 3600 )
+ {
+ my $minutes = $secondstring / 60;
+ my $seconds = $secondstring % 60;
+ if ( $minutes =~ /(\d*)\.\d*/ ) { $minutes = $1; }
+ if ( $minutes < 10 ) { $minutes = "0" . $minutes; }
+ if ( $seconds < 10 ) { $seconds = "0" . $seconds; }
+ $timestring = "$minutes\:$seconds min\.";
+ }
+ else # more than one hour
+ {
+ my $hours = $secondstring / 3600;
+ my $secondstring = $secondstring % 3600;
+ my $minutes = $secondstring / 60;
+ my $seconds = $secondstring % 60;
+ if ( $hours =~ /(\d*)\.\d*/ ) { $hours = $1; }
+ if ( $minutes =~ /(\d*)\.\d*/ ) { $minutes = $1; }
+ if ( $hours < 10 ) { $hours = "0" . $hours; }
+ if ( $minutes < 10 ) { $minutes = "0" . $minutes; }
+ if ( $seconds < 10 ) { $seconds = "0" . $seconds; }
+ $timestring = "$hours\:$minutes\:$seconds hours";
+ }
+
+ return $timestring;
+}
+
+###############################################################
+# Returning time string for logging
+###############################################################
+
+sub _get_time_string
+{
+ my $currenttime = time();
+ $currenttime = $currenttime - $starttime;
+ $currenttime = _convert_timestring($currenttime);
+ $currenttime = localtime() . " \(" . $currenttime . "\)\n";
+ return $currenttime;
+}
+
+###############################################################
+# Stopping the time
+###############################################################
+
+sub stoptime
+{
+ print_message( _get_time_string() );
+}
+
+###############################################################
+# Console output: messages
+###############################################################
+
+sub print_message
+{
+ my $message = shift;
+ chomp $message;
+ my $force = shift || 0;
+ print "$message\n" if ( $force || ! $installer::globals::quiet );
+ return;
+}
+
+###############################################################
+# Console output: warnings
+###############################################################
+
+sub print_warning
+{
+ my $message = shift;
+ chomp $message;
+ print STDERR "WARNING: $message";
+ return;
+}
+
+###############################################################
+# Console output: errors
+###############################################################
+
+sub print_error
+{
+ my $message = shift;
+ chomp $message;
+ print STDERR "\n**************************************************\n";
+ print STDERR "ERROR: $message";
+ print STDERR "\n**************************************************\n";
+ return;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/packagelist.pm b/solenv/bin/modules/installer/packagelist.pm
new file mode 100644
index 000000000..a0e1da760
--- /dev/null
+++ b/solenv/bin/modules/installer/packagelist.pm
@@ -0,0 +1,840 @@
+#
+# 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 .
+#
+
+package installer::packagelist;
+
+use installer::converter;
+use installer::exiter;
+use installer::globals;
+use installer::remover;
+use installer::scriptitems;
+
+########################################
+# Check existence of module
+########################################
+
+sub check_module_existence
+{
+ my ($onegid, $moduleslist) = @_;
+
+ my $foundgid = 0;
+
+ for ( my $i = 0; $i <= $#{$moduleslist}; $i++ )
+ {
+ my $gid = ${$moduleslist}[$i]->{'gid'};
+
+ if ( $gid eq $onegid )
+ {
+ $foundgid = 1;
+ last;
+ }
+ }
+
+ return $foundgid;
+}
+
+###################################################
+# Analyzing the gids, defined in the packagelist
+###################################################
+
+sub analyze_list
+{
+ my ($packagelist, $moduleslist) = @_;
+
+ @allpackages = ();
+
+ my $moduleshash = get_module_hash($moduleslist);
+
+ for ( my $i = 0; $i <= $#{$packagelist}; $i++ )
+ {
+ my $onepackage = ${$packagelist}[$i];
+
+ my $onegid = $onepackage->{'module'};
+
+ installer::remover::remove_leading_and_ending_whitespaces(\$onegid);
+
+ my $moduleexists = check_module_existence($onegid, $moduleslist);
+
+ if ( ! $moduleexists ) { next; }
+
+ my @allmodules = ();
+
+ push(@allmodules, $onegid);
+
+ get_children_with_hash($moduleshash, $onegid, \@allmodules);
+
+ $onepackage->{'allmodules'} = \@allmodules;
+
+ push(@allpackages, $onepackage);
+ }
+
+ return \@allpackages;
+}
+
+###################################################
+# Creating a hash, that contains the module gids
+# as keys and the parentids as values
+###################################################
+
+sub get_module_hash
+{
+ my ($moduleslist) = @_;
+
+ my %modulehash = ();
+
+ for ( my $i = 0; $i <= $#{$moduleslist}; $i++ )
+ {
+ my $gid = ${$moduleslist}[$i]->{'gid'};
+ # Containing only modules with parent. Root modules can be ignored.
+ if ( ${$moduleslist}[$i]->{'ParentID'} ) { $modulehash{$gid} = ${$moduleslist}[$i]->{'ParentID'}; }
+ }
+
+ return \%modulehash;
+}
+
+########################################################
+# Recursively defined procedure to order
+# modules and directories
+########################################################
+
+sub get_children_with_hash
+{
+ my ($modulehash, $parentgid, $newitemorder) = @_;
+
+ foreach my $gid ( keys %{$modulehash} )
+ {
+ my $parent = $modulehash->{$gid};
+
+ if ( $parent eq $parentgid )
+ {
+ push(@{$newitemorder}, $gid);
+ my $parent = $gid;
+ get_children_with_hash($modulehash, $parent, $newitemorder); # recursive!
+ }
+ }
+}
+
+########################################################
+# Recursively defined procedure to order
+# modules and directories
+########################################################
+
+sub get_children
+{
+ my ($allitems, $startparent, $newitemorder) = @_;
+
+ for ( my $i = 0; $i <= $#{$allitems}; $i++ )
+ {
+ my $gid = ${$allitems}[$i]->{'gid'};
+ my $parent = "";
+ if ( ${$allitems}[$i]->{'ParentID'} ) { $parent = ${$allitems}[$i]->{'ParentID'}; }
+
+ if ( $parent eq $startparent )
+ {
+ push(@{$newitemorder}, $gid);
+ my $parent = $gid;
+ get_children($allitems, $parent, $newitemorder); # recursive!
+ }
+ }
+}
+
+#####################################################################
+# All modules below a defined gid_Module_A are collected now for
+# each modules defined in the packagelist. Now the modules have
+# to be removed, that are part of more than one package.
+#####################################################################
+
+sub remove_multiple_modules_packages
+{
+ my ($allpackagemodules) = @_;
+
+ # iterating over all packages
+
+ for ( my $i = 0; $i <= $#{$allpackagemodules}; $i++ )
+ {
+ my $onepackage = ${$allpackagemodules}[$i];
+ my $allmodules = $onepackage->{'allmodules'};
+
+ # Comparing each package, with all following packages. If a
+ # gid for the module is part of more than one package, it is
+ # removed if the number of modules in the package is greater
+ # in the current package than in the compare package.
+
+ # Taking all modules from package $i
+
+ my $packagecount = $#{$allmodules};
+
+ my @optimizedpackage = ();
+
+ # iterating over all modules of this package
+
+ for ( my $j = 0; $j <= $#{$allmodules}; $j++ )
+ {
+ my $onemodule = ${$allmodules}[$j]; # this is the module, that shall be removed or not
+
+ my $put_module_into_new_package = 1;
+
+ # iterating over all other packages
+
+ for ( my $k = 0; $k <= $#{$allpackagemodules}; $k++ )
+ {
+ if ( $k == $i ) { next; } # not comparing equal module
+
+ if (! $put_module_into_new_package) { next; } # do not compare, if already found
+
+ my $comparepackage = ${$allpackagemodules}[$k];
+ my $allcomparemodules = $comparepackage->{'allmodules'};
+
+ my $comparepackagecount = $#{$allcomparemodules};
+
+ # modules will only be removed from packages, that have more modules
+ # than the compare package
+
+ if ( $packagecount < $comparepackagecount ) { next; } # nothing to do, take next package
+
+ # iterating over all modules of this package
+
+ for ( my $m = 0; $m <= $#{$allcomparemodules}; $m++ )
+ {
+ my $onecomparemodule = ${$allcomparemodules}[$m];
+
+ if ( $onemodule eq $onecomparemodule ) # this $onemodule has to be removed
+ {
+ $put_module_into_new_package = 0;
+ }
+ }
+ }
+
+ if ( $put_module_into_new_package )
+ {
+ push(@optimizedpackage, $onemodule)
+ }
+ }
+
+ $onepackage->{'allmodules'} = \@optimizedpackage;
+ }
+}
+
+#####################################################################
+# Analyzing all files if they belong to a special package.
+# A package is described by a list of modules.
+#####################################################################
+
+sub find_files_for_package
+{
+ my ($filelist, $onepackage) = @_;
+
+ my @newfilelist;
+ my $lastmodules = '';
+ my $lastincludefile = 0;
+
+ my %packagemodules = map {$_ => 1} @{$onepackage->{'allmodules'}};
+
+ for my $onefile (@$filelist)
+ {
+ my $modulesstring = $onefile->{'modules'}; # comma separated modules list
+
+ # check if the modules string is the same as in the last file
+ if ($modulesstring eq $lastmodules)
+ {
+ push(@newfilelist, $onefile) if $lastincludefile;
+ next;
+ }
+
+ my $moduleslist = installer::converter::convert_stringlist_into_array(\$modulesstring, ",");
+
+ my $includefile = 0;
+
+ # iterating over all modules of this file
+ for my $filemodule (@$moduleslist) {
+ installer::remover::remove_leading_and_ending_whitespaces(\$filemodule);
+ if ($packagemodules{$filemodule}) {
+ $includefile = 1;
+ last;
+ }
+ }
+
+ push(@newfilelist, $onefile) if $includefile;
+
+ # cache last result for this modules list
+ $lastmodules = $modulesstring;
+ $lastincludefile = $includefile;
+
+ }
+ return \@newfilelist;
+}
+
+#####################################################################
+# Analyzing all links if they belong to a special package.
+# A package is described by a list of modules.
+# A link is inserted into the package, if the corresponding
+# file is also inserted.
+#####################################################################
+
+sub find_links_for_package
+{
+ my ($linklist, $filelist) = @_;
+
+ # First looking for all links with a FileID.
+ # Then looking for all links with a ShortcutID.
+
+ my @newlinklist = ();
+
+ for ( my $i = 0; $i <= $#{$linklist}; $i++ )
+ {
+ my $includelink = 0;
+
+ my $onelink = ${$linklist}[$i];
+
+ my $fileid = "";
+ if ( $onelink->{'FileID'} ) { $fileid = $onelink->{'FileID'}; }
+
+ if ( $fileid eq "" ) { next; } # A link with a ShortcutID
+
+ for ( my $j = 0; $j <= $#{$filelist}; $j++ ) # iterating over file list
+ {
+ my $onefile = ${$filelist}[$j];
+ my $gid = $onefile->{'gid'};
+
+ if ( $gid eq $fileid )
+ {
+ $includelink = 1;
+ last;
+ }
+ }
+
+ if ( $includelink )
+ {
+ push(@newlinklist, $onelink);
+ }
+ }
+
+ # iterating over the new list, because of all links with a ShortcutID
+
+ for ( my $i = 0; $i <= $#{$linklist}; $i++ )
+ {
+ my $includelink = 0;
+
+ my $onelink = ${$linklist}[$i];
+
+ my $shortcutid = "";
+ if ( $onelink->{'ShortcutID'} ) { $shortcutid = $onelink->{'ShortcutID'}; }
+
+ if ( $shortcutid eq "" ) { next; } # A link with a ShortcutID
+
+ for ( my $j = 0; $j <= $#newlinklist; $j++ ) # iterating over newly created link list
+ {
+ my $onefilelink = $newlinklist[$j];
+ my $gid = $onefilelink->{'gid'};
+
+ if ( $gid eq $shortcutid )
+ {
+ $includelink = 1;
+ last;
+ }
+ }
+
+ if ( $includelink )
+ {
+ push(@newlinklist, $onelink);
+ }
+ }
+
+ return \@newlinklist;
+}
+
+#####################################################################
+# Analyzing all directories if they belong to a special package.
+# A package is described by a list of modules.
+# Directories are included into the package, if they are needed
+# by a file or a link included into the package.
+# Attention: A directory with the flag CREATE, is only included
+# into the root module:
+# ($packagename eq $installer::globals::rootmodulegid)
+#####################################################################
+
+sub find_dirs_for_package
+{
+ my ($dirlist, $onepackage) = @_;
+
+ my @newdirlist = ();
+
+ for ( my $i = 0; $i <= $#{$dirlist}; $i++ )
+ {
+ my $onedir = ${$dirlist}[$i];
+ my $modulesstring = $onedir->{'modules'}; # comma separated modules list
+ my $moduleslist = installer::converter::convert_stringlist_into_array(\$modulesstring, ",");
+
+ my $includedir = 0;
+
+ # iterating over all modules of this dir
+
+ for ( my $j = 0; $j <= $#{$moduleslist}; $j++ )
+ {
+ if ( $includedir ) { last; }
+ my $dirmodule = ${$moduleslist}[$j];
+ installer::remover::remove_leading_and_ending_whitespaces(\$dirmodule);
+
+ # iterating over all modules of the package
+
+ my $packagemodules = $onepackage->{'allmodules'};
+
+ for ( my $k = 0; $k <= $#{$packagemodules}; $k++ )
+ {
+ my $packagemodule = ${$packagemodules}[$k];
+
+ if ( $dirmodule eq $packagemodule )
+ {
+ $includedir = 1;
+ last;
+ }
+ }
+ }
+
+ if ( $includedir )
+ {
+ push(@newdirlist, $onedir);
+ }
+ }
+
+ return \@newdirlist;
+}
+
+#####################################################################
+# Resolving all variables in the packagename.
+#####################################################################
+
+sub resolve_packagevariables
+{
+ my ($packagenameref, $variableshashref, $make_lowercase) = @_;
+
+ my $key;
+
+ # Special handling for dictionaries
+ if ( $$packagenameref =~ /-dict-/ )
+ {
+ if (exists($variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}) ) { $$packagenameref =~ s/\%UNIXPRODUCTNAME/$variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}/g; }
+ if (exists($variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}) ) { $$packagenameref =~ s/\%BRANDPACKAGEVERSION/$variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}/g; }
+ }
+
+ foreach $key (keys %{$variableshashref})
+ {
+ my $value = $variableshashref->{$key};
+ if ( $make_lowercase ) { $value = lc($value); }
+ $$packagenameref =~ s/\%$key/$value/g;
+ }
+}
+
+#####################################################################
+# Resolving all variables in the packagename.
+#####################################################################
+
+sub resolve_packagevariables2
+{
+ my ($packagenameref, $variableshashref, $make_lowercase, $isdict ) = @_;
+
+ my $key;
+
+ # Special handling for dictionaries
+ if ( $isdict )
+ {
+ if (exists($variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}) ) { $$packagenameref =~ s/\%UNIXPRODUCTNAME/$variableshashref->{'DICTIONARYUNIXPRODUCTNAME'}/g; }
+ if (exists($variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}) ) { $$packagenameref =~ s/\%BRANDPACKAGEVERSION/$variableshashref->{'DICTIONARYBRANDPACKAGEVERSION'}/g; }
+ }
+
+ foreach $key (keys %{$variableshashref})
+ {
+ my $value = $variableshashref->{$key};
+ if ( $make_lowercase ) { $value = lc($value); }
+ $$packagenameref =~ s/\%$key/$value/g;
+ }
+}
+
+#####################################################################
+# New packages system.
+#####################################################################
+
+##################################################################
+# Controlling the content of the packagelist
+# 1. Items in @installer::globals::packagelistitems must exist
+# 2. If a shellscript file is defined, it must exist
+##################################################################
+
+sub check_packagelist
+{
+ my ($packages) = @_;
+
+ if ( ! ( $#{$packages} > -1 )) { installer::exiter::exit_program("ERROR: No packages defined!", "check_packagelist"); }
+
+ for ( my $i = 0; $i <= $#{$packages}; $i++ )
+ {
+ my $onepackage = ${$packages}[$i];
+
+ my $element;
+
+ # checking all items that must be defined
+
+ foreach $element (@installer::globals::packagelistitems)
+ {
+ if ( ! exists($onepackage->{$element}) )
+ {
+ installer::exiter::exit_program("ERROR in package list: No value for $element !", "check_packagelist");
+ }
+ }
+
+ # checking the existence of the script file, if defined
+
+ if ( $onepackage->{'script'} )
+ {
+ my $scriptfile = $onepackage->{'script'};
+ my $gid = $onepackage->{'module'};
+ my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptfile, "" , 0);
+
+ if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find script file $scriptfile for module $gid!", "check_packagelist"); }
+
+ my $infoline = "$gid: Using script file: \"$$fileref\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ $onepackage->{'script'} = $$fileref;
+ }
+ }
+}
+
+#####################################################################
+# Reading pack info for one module from packinfo file.
+#####################################################################
+
+sub get_packinfo
+{
+ my ($gid, $filename, $packages, $onelanguage, $islanguagemodule) = @_;
+
+ my $packagelist = installer::files::read_file($filename);
+
+ my @allpackages = ();
+
+ for ( my $i = 0; $i <= $#{$packagelist}; $i++ )
+ {
+ my $line = ${$packagelist}[$i];
+
+ if ( $line =~ /^\s*\#/ ) { next; } # this is a comment line
+
+ if ( $line =~ /^\s*Start\s*$/i ) # a new package definition
+ {
+ my %onepackage = ();
+
+ my $counter = $i + 1;
+
+ while (!( ${$packagelist}[$counter] =~ /^\s*End\s*$/i ))
+ {
+ if ( ${$packagelist}[$counter] =~ /^\s*(\S+)\s*\=\s*\"(.*)\"/ )
+ {
+ my $key = $1;
+ my $value = $2;
+ $onepackage{$key} = $value;
+ }
+
+ $counter++;
+ }
+
+ $onepackage{'islanguagemodule'} = $islanguagemodule;
+ if ( $islanguagemodule )
+ {
+ $saveonelanguage = $onelanguage;
+ $saveonelanguage =~ s/_/-/g;
+ $onepackage{'language'} = $saveonelanguage;
+ }
+
+ push(@allpackages, \%onepackage);
+ }
+ }
+
+ # looking for the packinfo with the correct gid
+
+ my $foundgid = 0;
+ my $onepackage;
+ foreach $onepackage (@allpackages)
+ {
+ # Adding the language to the module gid for LanguagePacks !
+ # Making the module gid language specific: gid_Module_Root -> gir_Module_Root_pt_BR (as defined in scp2)
+ if ( $onelanguage ne "" ) { $onepackage->{'module'} = $onepackage->{'module'} . "_$onelanguage"; }
+
+ if ( $onepackage->{'module'} eq $gid )
+ {
+ # Resolving the language identifier
+ my $onekey;
+ foreach $onekey ( keys %{$onepackage} )
+ {
+ # Some keys require "-" instead of "_" for example in "en-US". All package names do not use underlines.
+ my $locallang = $onelanguage;
+ if (( $onekey eq "solarispackagename" ) ||
+ ( $onekey eq "solarisrequires" ) ||
+ ( $onekey eq "packagename" ) ||
+ ( $onekey eq "requires" )) { $locallang =~ s/_/-/g; } # avoiding illegal package abbreviation
+ $onepackage->{$onekey} =~ s/\%LANGUAGESTRING/$locallang/g;
+ }
+
+ # Saving the language for the package
+ my $lang = $onelanguage;
+ $lang =~ s/_/-/g;
+ $onepackage->{'specificlanguage'} = $lang;
+
+ push(@{$packages}, $onepackage);
+ $foundgid = 1;
+ last;
+ }
+ }
+
+ if ( ! $foundgid )
+ {
+ installer::exiter::exit_program("ERROR: Could not find package info for module $gid in file \"$filename\"!", "get_packinfo");
+ }
+}
+
+#####################################################################
+# Collecting all packages from scp project.
+#####################################################################
+
+sub collectpackages
+{
+ my ( $allmodules, $languagesarrayref ) = @_;
+
+ installer::logger::include_header_into_logfile("Collecting packages:");
+
+ my @packages = ();
+ my %gid_analyzed = ();
+
+ my $onemodule;
+ foreach $onemodule ( @{$allmodules} )
+ {
+ if ( $onemodule->{'PackageInfo'} ) # this is a package module!
+ {
+ my $modulegid = $onemodule->{'gid'};
+
+ my $styles = "";
+ if ( $onemodule->{'Styles'} ) { $styles = $onemodule->{'Styles'}; }
+
+ # checking modules with style LANGUAGEMODULE
+ my $islanguagemodule = 0;
+ my $onelanguage = "";
+ if ( $styles =~ /\bLANGUAGEMODULE\b/ )
+ {
+ $islanguagemodule = 1;
+ $onelanguage = $onemodule->{'Language'}; # already checked, that it is set.
+ $onelanguage =~ s/-/_/g; # pt-BR -> pt_BR in scp
+ }
+
+ # Modules in different languages are listed more than once in multilingual installation sets
+ if ( exists($gid_analyzed{$modulegid}) ) { next; }
+ $gid_analyzed{$modulegid} = 1;
+
+ my $packinfofile = $onemodule->{'PackageInfo'};
+
+ # The file with package information has to be found in path list
+ my $fileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$packinfofile, "" , 0);
+
+ if ( $$fileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find file $packinfofile for module $modulegid!", "collectpackages"); }
+
+ my $infoline = "$modulegid: Using packinfo: \"$$fileref\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ get_packinfo($modulegid, $$fileref, \@packages, $onelanguage, $islanguagemodule);
+ }
+ }
+
+ return \@packages;
+}
+
+#####################################################################
+# Printing packages content for debugging purposes
+#####################################################################
+
+sub log_packages_content
+{
+ my ($packages) = @_;
+
+ if ( ! ( $#{$packages} > -1 )) { installer::exiter::exit_program("ERROR: No packages defined!", "print_content"); }
+
+ installer::logger::include_header_into_logfile("Logging packages content:");
+
+ my $infoline = "";
+
+ for ( my $i = 0; $i <= $#{$packages}; $i++ )
+ {
+ my $onepackage = ${$packages}[$i];
+
+ # checking all items that must be defined
+
+ $infoline = "Package $onepackage->{'module'}\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ my $key;
+ foreach $key (sort keys %{$onepackage})
+ {
+ if ( $key =~ /^\s*\;/ ) { next; }
+
+ if ( $key eq "allmodules" )
+ {
+ $infoline = "\t$key:\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ my $onemodule;
+ foreach $onemodule ( @{$onepackage->{$key}} )
+ {
+ $infoline = "\t\t$onemodule\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+ else
+ {
+ $infoline = "\t$key: $onepackage->{$key}\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ }
+}
+
+#####################################################################
+# Creating assignments from modules to destination paths.
+# This is required for logging in fileinfo file. Otherwise
+# the complete destination file would not be known in file list.
+# Saved in %installer::globals::moduledestination
+#####################################################################
+
+sub create_module_destination_hash
+{
+ my ($packages, $allvariables) = @_;
+
+ for ( my $i = 0; $i <= $#{$packages}; $i++ )
+ {
+ my $onepackage = ${$packages}[$i];
+
+ my $defaultdestination = $onepackage->{'destpath'};
+ resolve_packagevariables(\$defaultdestination, $allvariables, 1);
+ if ( $^O =~ /darwin/i ) { $defaultdestination =~ s/\/opt\//\/Applications\//; }
+
+ foreach my $onemodule ( @{$onepackage->{'allmodules'}} )
+ {
+ $installer::globals::moduledestination{$onemodule} = $defaultdestination;
+ }
+ }
+}
+
+#####################################################################
+# Adding the default paths into the files collector for Unixes.
+# This is necessary to know the complete destination path in
+# fileinfo log file.
+#####################################################################
+
+sub add_defaultpaths_into_filescollector
+{
+ my ($allfiles) = @_;
+
+ for ( my $i = 0; $i <= $#{$allfiles}; $i++ )
+ {
+ my $onefile = ${$allfiles}[$i];
+
+ if ( ! $onefile->{'destination'} ) { installer::exiter::exit_program("ERROR: No destination found at file $onefile->{'gid'}!", "add_defaultpaths_into_filescollector"); }
+ my $destination = $onefile->{'destination'};
+
+ if ( ! $onefile->{'modules'} ) { installer::exiter::exit_program("ERROR: No modules found at file $onefile->{'gid'}!", "add_defaultpaths_into_filescollector"); }
+ my $module = $onefile->{'modules'};
+ # If modules contains a list of modules, only taking the first one.
+ if ( $module =~ /^\s*(.*?)\,/ ) { $module = $1; }
+
+ if ( ! exists($installer::globals::moduledestination{$module}) ) { installer::exiter::exit_program("ERROR: No default destination path found for module $module!", "add_defaultpaths_into_filescollector"); }
+ my $defaultpath = $installer::globals::moduledestination{$module};
+ $defaultpath =~ s/\/\s*$//; # removing ending slashes
+ my $fulldestpath = $defaultpath . $installer::globals::separator . $destination;
+
+ $onefile->{'fulldestpath'} = $fulldestpath;
+ }
+}
+
+#####################################################################
+# Creating list of cabinet files from packages
+#####################################################################
+
+sub prepare_cabinet_files
+{
+ my ($packages, $allvariables) = @_;
+
+ if ( ! ( $#{$packages} > -1 )) { installer::exiter::exit_program("ERROR: No packages defined!", "print_content"); }
+
+ installer::logger::include_header_into_logfile("Preparing cabinet files:");
+
+ my $infoline = "";
+
+ for ( my $i = 0; $i <= $#{$packages}; $i++ )
+ {
+ my $onepackage = ${$packages}[$i];
+
+ my $cabinetfile = "$onepackage->{'packagename'}\.cab";
+
+ resolve_packagevariables(\$cabinetfile, $allvariables, 0);
+
+ $installer::globals::allcabinets{$cabinetfile} = 1;
+
+ # checking all items that must be defined
+
+ $infoline = "Package $onepackage->{'module'}\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ # Assigning the cab file to the module and also to all corresponding sub modules
+
+ my $onemodule;
+ foreach $onemodule ( @{$onepackage->{'allmodules'}} )
+ {
+ if ( ! exists($installer::globals::allcabinetassigns{$onemodule}) )
+ {
+ $installer::globals::allcabinetassigns{$onemodule} = $cabinetfile;
+ }
+ else
+ {
+ my $infoline = "Warning: Already existing assignment: $onemodule : $installer::globals::allcabinetassigns{$onemodule}\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Ignoring further assignment: $onemodule : $cabinetfile\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+}
+
+#####################################################################
+# Logging assignments of cabinet files
+#####################################################################
+
+sub log_cabinet_assignments
+{
+ installer::logger::include_header_into_logfile("Logging cabinet files:");
+
+ my $infoline = "List of cabinet files:\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ my $key;
+ foreach $key ( sort keys %installer::globals::allcabinets ) { push(@installer::globals::logfileinfo, "\t$key\n"); }
+
+ $infoline = "\nList of assignments from modules to cabinet files:\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ foreach $key ( sort keys %installer::globals::allcabinetassigns ) { push(@installer::globals::logfileinfo, "\t$key : $installer::globals::allcabinetassigns{$key}\n"); }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/parameter.pm b/solenv/bin/modules/installer/parameter.pm
new file mode 100644
index 000000000..befed7202
--- /dev/null
+++ b/solenv/bin/modules/installer/parameter.pm
@@ -0,0 +1,552 @@
+#
+# 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 .
+#
+
+package installer::parameter;
+
+use Cwd;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::remover;
+use installer::systemactions;
+use File::Temp qw/ :mktemp /;
+
+############################################
+# Parameter Operations
+############################################
+
+sub usage
+{
+ print <<End;
+--------------------------------------------------------------------------------
+The following parameter are needed:
+-f: Path to the product list (required)
+-s: Path to the setup script (optional, if defined in product list)
+-i: Install path of the product (/opt/openofficeorg20) (optional)
+-p: Product from product list to be created (required)
+-l: Language of the product (comma and hash) (optional, defined in productlist)
+-simple: Path to do a simple install to
+-u: Path, in which zipfiles are unpacked (optional)
+-msitemplate: Source of the msi file templates (Windows compiler only)
+-msilanguage: Source of the msi file templates (Windows compiler only)
+-buildid: Current BuildID (optional)
+-pro: Product version
+-format: Package format
+-debian: Create Debian packages for Linux
+-dontunzip: do not unzip all files with flag ARCHIVE
+-dontcallepm : do not call epm to create install sets (opt., non-Windows only)
+-ispatchedepm : Usage of a patched (non-standard) epm (opt., non-Windows only)
+-copyproject : is set for projects that are only used for copying (optional)
+-languagepack : do create a languagepack, no product pack (optional)
+-helppack : do create a helppack, no product pack (optional)
+-strip: Stripping files (Unix only)
+-packer: Path and parameters for tarball packaging tool (default: gzip (Unix only))
+-log : Logging all available information (optional)
+
+Examples for Windows:
+
+perl make_epmlist.pl -f zip.lst -p OfficeFAT -l en-US
+ -u /export/unpack -buildid 8712
+ -msitemplate /export/msi_files
+ -msilanguage /export/msi_languages
+
+Examples for Non-Windows:
+
+perl make_epmlist.pl -f zip.lst -p OfficeFAT -l en-US -format rpm
+ -u /export/unpack -buildid 8712 -ispatchedepm
+--------------------------------------------------------------------------------
+End
+ exit(-1);
+}
+
+#########################################
+# Writing all parameter into logfile
+#########################################
+
+sub saveparameter
+{
+ my $include = "";
+
+ installer::logger::globallog("Command line arguments:");
+
+ for ( my $i = 0; $i <= $#ARGV; $i++ )
+ {
+ $include = $ARGV[$i] . "\n";
+ push(@installer::globals::globallogfileinfo, $include);
+ }
+
+ # also saving global settings:
+
+ $include = "Separator: $installer::globals::separator\n";
+ push(@installer::globals::globallogfileinfo, $include);
+
+}
+
+#####################################
+# Reading parameter
+#####################################
+
+sub getparameter
+{
+ while ( $#ARGV >= 0 )
+ {
+ my $param = shift(@ARGV);
+
+ if ($param eq "-f") { $installer::globals::ziplistname = shift(@ARGV); }
+ elsif ($param eq "-s") { $installer::globals::setupscriptname = shift(@ARGV); }
+ elsif ($param eq "-p") { $installer::globals::product = shift(@ARGV); }
+ elsif ($param eq "-l") { $installer::globals::languagelist = shift(@ARGV); }
+ elsif ($param eq "-dontunzip") { $installer::globals::dounzip = 0; }
+ elsif ($param eq "-pro") { $installer::globals::pro = 1; }
+ elsif ($param eq "-format") { $installer::globals::packageformat = shift(@ARGV); }
+ elsif ($param eq "-quiet") { $installer::globals::quiet = 1; }
+ elsif ($param eq "-verbose") { $installer::globals::quiet = 0; }
+ elsif ($param eq "-u") { $installer::globals::unpackpath = shift(@ARGV); }
+ elsif ($param eq "-i") { $installer::globals::rootpath = shift(@ARGV); }
+ elsif ($param eq "-dontcallepm") { $installer::globals::call_epm = 0; }
+ elsif ($param eq "-msitemplate") { $installer::globals::idttemplatepath = shift(@ARGV); }
+ elsif ($param eq "-msilanguage") { $installer::globals::idtlanguagepath = shift(@ARGV); }
+ elsif ($param eq "-buildid") { $installer::globals::buildid = shift(@ARGV); }
+ elsif ($param eq "-copyproject") { $installer::globals::is_copy_only_project = 1; }
+ elsif ($param eq "-languagepack") { $installer::globals::languagepack = 1; }
+ elsif ($param eq "-helppack") { $installer::globals::helppack = 1;}
+ elsif ($param eq "-debian") { $installer::globals::debian = 1; }
+ elsif ($param eq "-strip") { $installer::globals::strip = 1; }
+ elsif ($param eq "-packer") { $installer::globals::packertool = shift(@ARGV); }
+ elsif ($param eq "-destdir") # new parameter for simple installer
+ {
+ $installer::globals::rootpath ne "" && die "must set destdir before -i or -simple";
+
+ my $path = shift(@ARGV);
+ mkdir $path;
+ $installer::globals::destdir = Cwd::realpath($path);
+ }
+ elsif ($param eq "-simple") # new parameter for simple installer
+ {
+ $installer::globals::simple = 1;
+ $installer::globals::call_epm = 0;
+ $installer::globals::makedownload = 0;
+ my $path = shift(@ARGV);
+ $path =~ s/^\Q$installer::globals::destdir\E//;
+ $installer::globals::rootpath = $path;
+ }
+ else
+ {
+ installer::logger::print_error( "unknown parameter: $param" );
+ usage();
+ exit(-1);
+ }
+ }
+
+ # Usage of simple installer (not for Windows):
+ # $PERL -w $SRCDIR/solenv/bin/make_installer.pl \
+ # -f openoffice.lst -l en-US -p OpenOffice \
+ # -buildid $BUILD -rpm \
+ # -destdir /tmp/nurk -simple $INSTALL_PATH
+}
+
+############################################
+# Controlling the fundamental parameter
+# (required for every process)
+############################################
+
+sub control_fundamental_parameter
+{
+ if ($installer::globals::product eq "")
+ {
+ installer::logger::print_error( "Product name not set!" );
+ usage();
+ exit(-1);
+ }
+}
+
+##########################################################
+# The path parameters can be relative or absolute.
+# This function creates absolute paths.
+##########################################################
+
+sub make_path_absolute
+{
+ my ($pathref) = @_;
+
+ if ( $installer::globals::isunix )
+ {
+ if (!($$pathref =~ /^\s*\//)) # this is a relative unix path
+ {
+ $$pathref = cwd() . $installer::globals::separator . $$pathref;
+ }
+ }
+
+ if ( $installer::globals::iswin )
+ {
+ if ( $^O =~ /cygwin/i )
+ {
+ if ( $$pathref !~ /^\s*\// && $$pathref !~ /^\s*\w\:/ ) # not an absolute POSIX or DOS path
+ {
+ $$pathref = cwd() . $installer::globals::separator . $$pathref;
+ }
+ my $p = $$pathref;
+ chomp( $p );
+ my $q = '';
+ # Avoid the $(LANG) problem.
+ if ($p =~ /(\A.*)(\$\(.*\Z)/) {
+ $p = $1;
+ $q = $2;
+ }
+ $p =~ s/\\/\\\\/g;
+ chomp( $p = qx{cygpath -w "$p"} );
+ $$pathref = $p.$q;
+ # Use windows paths, but with '/'s.
+ $$pathref =~ s/\\/\//g;
+ }
+ else
+ {
+ if (!($$pathref =~ /^\s*\w\:/)) # this is a relative windows path (no dos drive)
+ {
+ $$pathref = cwd() . $installer::globals::separator . $$pathref;
+
+ $$pathref =~ s/\//\\/g;
+ }
+ }
+ }
+ $$pathref =~ s/[\/\\]\s*$//; # removing ending slashes
+}
+
+# Setting some global parameters
+# This has to be expanded with further platforms
+
+sub setglobalvariables
+{
+ # Setting the installertype directory corresponding to the environment variable PKGFORMAT
+ # The global variable $installer::globals::packageformat can only contain one package format.
+ # If PKGFORMAT contains more than one format (for example "rpm deb") this is split in the
+ # makefile calling the perl program.
+ $installer::globals::installertypedir = $installer::globals::packageformat;
+
+ if ( $installer::globals::os eq 'WNT' )
+ {
+ $installer::globals::iswindowsbuild = 1;
+ }
+
+ if ( $installer::globals::os eq 'SOLARIS')
+ {
+ $installer::globals::issolarisbuild = 1;
+ if ( $installer::globals::packageformat eq "pkg" )
+ {
+ $installer::globals::issolarispkgbuild = 1;
+ $installer::globals::epmoutpath = "packages";
+ }
+ if ( $installer::globals::cpuname eq 'INTEL')
+ {
+ $installer::globals::issolarisx86build = 1;
+ }
+ else
+ {
+ $installer::globals::issolarissparcbuild = 1;
+ }
+ }
+
+ if ( $installer::globals::os eq 'MACOSX' )
+ {
+ $installer::globals::ismacbuild = 1;
+
+ if ( $installer::globals::packageformat eq "dmg" )
+ {
+ $installer::globals::ismacdmgbuild = 1;
+ }
+ }
+
+ if ( $installer::globals::os eq 'OPENBSD')
+ {
+ $installer::globals::epmoutpath = "openbsd";
+ }
+
+ if ( $installer::globals::os eq 'FREEBSD')
+ {
+ $installer::globals::isfreebsdbuild = 1;
+
+ if ( $installer::globals::packageformat eq "bsd" )
+ {
+ $installer::globals::epmoutpath = "freebsd";
+ $installer::globals::isfreebsdpkgbuild = 1;
+ }
+ }
+
+ if ($installer::globals::os eq 'AIX')
+ {
+ if ( $installer::globals::packageformat eq "rpm" )
+ {
+ $installer::globals::isrpmbuild = 1;
+ $installer::globals::epmoutpath = "RPMS";
+ }
+ if ( $installer::globals::rpm eq "" ) { installer::exiter::exit_program("ERROR: Environment variable \"\$RPM\" has to be defined!", "setglobalvariables"); }
+ }
+
+ if ($installer::globals::os eq 'LINUX')
+ {
+ $installer::globals::islinuxbuild = 1;
+ if ( $installer::globals::packageformat eq "rpm" )
+ {
+ $installer::globals::isrpmbuild = 1;
+ $installer::globals::epmoutpath = "RPMS";
+
+ if ( $installer::globals::rpm eq "" ) { installer::exiter::exit_program("ERROR: Environment variable \"\$RPM\" has to be defined!", "setglobalvariables"); }
+ }
+
+ # Creating Debian packages ?
+ if (( $installer::globals::packageformat eq "deb" ) || ( $installer::globals::debian ))
+ {
+ $installer::globals::debian = 1;
+ $installer::globals::packageformat = "deb";
+ my $message = "Creating Debian packages";
+ installer::logger::print_message( $message );
+ push(@installer::globals::globallogfileinfo, $message);
+ $installer::globals::isrpmbuild = 0;
+ $installer::globals::isdebbuild = 1;
+ $installer::globals::epmoutpath = "DEBS";
+ }
+ }
+
+ # Defaulting to native package format for epm
+
+ # no languages defined as parameter
+ if ($installer::globals::languagelist eq "") { $installer::globals::languages_defined_in_productlist = 1; }
+
+ # setting and creating the unpackpath
+
+ if ($installer::globals::unpackpath eq "") # unpackpath not set
+ {
+ $installer::globals::unpackpath = cwd();
+ }
+
+ if ($installer::globals::workpath eq "") # workpath not set
+ {
+ $installer::globals::workpath = cwd();
+ }
+
+ if ( $installer::globals::localunpackdir ne "" ) { $installer::globals::unpackpath = $installer::globals::localunpackdir; }
+
+ if (!($installer::globals::unpackpath eq ""))
+ {
+ make_path_absolute(\$installer::globals::unpackpath);
+ }
+
+ $installer::globals::unpackpath =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ if (! -d $installer::globals::unpackpath ) # create unpackpath
+ {
+ installer::systemactions::create_directory($installer::globals::unpackpath);
+ }
+
+ # setting and creating the temppath
+
+ if ( $ENV{'TMPDIR'} )
+ {
+ $installer::globals::temppath = $ENV{'TMPDIR'};
+ $installer::globals::temppath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes
+ $installer::globals::temppath .= $installer::globals::separator . 'ooopackagingXXXXXX';
+ $installer::globals::temppath = mkdtemp($installer::globals::temppath);
+
+ my $dirsave = $installer::globals::temppath;
+
+ if ( $installer::globals::platformid eq 'maosx_x86_64')
+ {
+ chmod 0777, $installer::globals::temppath;
+ }
+
+ $installer::globals::temppath = $installer::globals::temppath . $installer::globals::separator . "i";
+ $installer::globals::temppath = installer::systemactions::create_pid_directory($installer::globals::temppath);
+ push(@installer::globals::removedirs, $installer::globals::temppath);
+
+ if ( ! -d $installer::globals::temppath ) { installer::exiter::exit_program("ERROR: Failed to create directory $installer::globals::temppath ! Possible reason: Wrong privileges in directory $dirsave .", "setglobalvariables"); }
+
+ $installer::globals::temppath = $installer::globals::temppath . $installer::globals::separator . $installer::globals::platformid;
+ installer::systemactions::create_directory($installer::globals::temppath);
+ if ( $^O =~ /cygwin/i )
+ {
+ $installer::globals::cyg_temppath = $installer::globals::temppath;
+ $installer::globals::cyg_temppath =~ s/\\/\\\\/g;
+ chomp( $installer::globals::cyg_temppath = qx{cygpath -w "$installer::globals::cyg_temppath"} );
+ }
+ $installer::globals::temppathdefined = 1;
+ }
+ else
+ {
+ $installer::globals::temppathdefined = 0;
+ }
+
+ # only one cab file, if Windows msp patches shall be prepared
+ if ( $installer::globals::prepare_winpatch ) { $installer::globals::number_of_cabfiles = 1; }
+
+}
+
+############################################
+# Controlling the parameter that are
+# required for special processes
+############################################
+
+sub control_required_parameter
+{
+ if (!($installer::globals::is_copy_only_project))
+ {
+ ##############################################################################################
+ # idt template path. Only required for Windows build
+ # for the creation of the msi database.
+ ##############################################################################################
+
+ if (($installer::globals::idttemplatepath eq "") && ($installer::globals::iswindowsbuild))
+ {
+ installer::logger::print_error( "idt template path not set (-msitemplate)!" );
+ usage();
+ exit(-1);
+ }
+
+ ##############################################################################################
+ # idt language path. Only required for Windows build
+ # for the creation of the msi database.
+ ##############################################################################################
+
+ if (($installer::globals::idtlanguagepath eq "") && ($installer::globals::iswindowsbuild))
+ {
+ installer::logger::print_error( "idt language path not set (-msilanguage)!" );
+ usage();
+ exit(-1);
+ }
+
+ # Analyzing the idt template path
+
+ if (!($installer::globals::idttemplatepath eq "")) # idttemplatepath set, relative or absolute?
+ {
+ make_path_absolute(\$installer::globals::idttemplatepath);
+ }
+
+ installer::remover::remove_ending_pathseparator(\$installer::globals::idttemplatepath);
+
+ # Analyzing the idt language path
+
+ if (!($installer::globals::idtlanguagepath eq "")) # idtlanguagepath set, relative or absolute?
+ {
+ make_path_absolute(\$installer::globals::idtlanguagepath);
+ }
+
+ installer::remover::remove_ending_pathseparator(\$installer::globals::idtlanguagepath);
+
+ # In the msi template directory a files "codes.txt" has to exist, in which the ProductCode
+ # and the UpgradeCode for the product are defined.
+ # The name "codes.txt" can be overwritten in Product definition with CODEFILENAME (msiglobal.pm)
+
+ if (( $installer::globals::iswindowsbuild ) && ( $installer::globals::packageformat ne "archive" ) && ( $installer::globals::packageformat ne "installed" ))
+ {
+ $installer::globals::codefilename = $installer::globals::idttemplatepath . $installer::globals::separator . $installer::globals::codefilename;
+ installer::files::check_file($installer::globals::codefilename);
+ $installer::globals::componentfilename = $installer::globals::idttemplatepath . $installer::globals::separator . $installer::globals::componentfilename;
+ installer::files::check_file($installer::globals::componentfilename);
+ }
+
+ }
+
+ #######################################
+ # Testing existence of files
+ # also for copy-only projects
+ #######################################
+
+ if ($installer::globals::ziplistname eq "")
+ {
+ installer::logger::print_error( "ERROR: Zip list file has to be defined (Parameter -f) !" );
+ usage();
+ exit(-1);
+ }
+ else
+ {
+ installer::files::check_file($installer::globals::ziplistname);
+ }
+
+ if ($installer::globals::setupscriptname eq "") { $installer::globals::setupscript_defined_in_productlist = 1; }
+ else { installer::files::check_file($installer::globals::setupscriptname); } # if the setupscript file is defined, it has to exist
+
+}
+
+################################################
+# Writing parameter to shell and into logfile
+################################################
+
+sub outputparameter
+{
+ my $element;
+
+ my @output = ();
+
+ push(@output, "\n########################################################\n");
+ push(@output, "Product list file: $installer::globals::ziplistname\n");
+ if (!($installer::globals::setupscript_defined_in_productlist))
+ {
+ push(@output, "Setup script: $installer::globals::setupscriptname\n");
+ }
+ else
+ {
+ push(@output, "Taking setup script from workdir\n");
+ }
+ push(@output, "Unpackpath: $installer::globals::unpackpath\n");
+ push(@output, "PLATFORMID: $installer::globals::platformid\n");
+ push(@output, "OS: $installer::globals::os\n");
+ push(@output, "CPUNAME: $installer::globals::cpuname\n");
+ push(@output, "COM: $installer::globals::com\n");
+ push(@output, "Product: $installer::globals::product\n");
+ push(@output, "BuildID: $installer::globals::buildid\n");
+ push(@output, "Build: $installer::globals::build\n");
+ if ( $installer::globals::pro ) { push(@output, "Product version\n"); }
+ else { push(@output, "Non-Product version\n"); }
+ if ( $installer::globals::rootpath eq "" ) { push(@output, "Using default installpath\n"); }
+ else { push(@output, "Installpath: $installer::globals::rootpath\n"); }
+ push(@output, "Package format: $installer::globals::packageformat\n");
+ if (!($installer::globals::idttemplatepath eq "")) { push(@output, "msi templatepath: $installer::globals::idttemplatepath\n"); }
+ if ((!($installer::globals::idttemplatepath eq "")) && (!($installer::globals::iswindowsbuild))) { push(@output, "msi template path will be ignored for non Windows builds!\n"); }
+ if (!($installer::globals::idtlanguagepath eq "")) { push(@output, "msi languagepath: $installer::globals::idtlanguagepath\n"); }
+ if ((!($installer::globals::idtlanguagepath eq "")) && (!($installer::globals::iswindowsbuild))) { push(@output, "msi language path will be ignored for non Windows builds!\n"); }
+ if ((!($installer::globals::iswindowsbuild)) && ( $installer::globals::call_epm )) { push(@output, "Calling epm\n"); }
+ if ((!($installer::globals::iswindowsbuild)) && (!($installer::globals::call_epm))) { push(@output, "Not calling epm\n"); }
+ if ( $installer::globals::strip ) { push(@output, "Stripping files\n"); }
+ else { push(@output, "No file stripping\n"); }
+ if ( $installer::globals::debian ) { push(@output, "Linux: Creating Debian packages\n"); }
+ if ( $installer::globals::dounzip ) { push(@output, "Unzip ARCHIVE files\n"); }
+ else { push(@output, "Not unzipping ARCHIVE files\n"); }
+ if (!($installer::globals::languages_defined_in_productlist))
+ {
+ push(@output, "Languages:\n");
+ foreach $element (@installer::globals::languageproducts) { push(@output, "\t$element\n"); }
+ }
+ else
+ {
+ push(@output, "Languages defined in $installer::globals::ziplistname\n");
+ }
+ if ( $installer::globals::is_copy_only_project ) { push(@output, "This is a copy only project!\n"); }
+ if ( $installer::globals::languagepack ) { push(@output, "Creating language pack!\n"); }
+ if ( $installer::globals::helppack ) { push(@output, "Creating help pack!\n"); }
+ push(@output, "########################################################\n");
+
+ # output into shell and into logfile
+
+ for ( my $i = 0; $i <= $#output; $i++ )
+ {
+ installer::logger::print_message( $output[$i] );
+ push(@installer::globals::globallogfileinfo, $output[$i]);
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/pathanalyzer.pm b/solenv/bin/modules/installer/pathanalyzer.pm
new file mode 100644
index 000000000..312042acb
--- /dev/null
+++ b/solenv/bin/modules/installer/pathanalyzer.pm
@@ -0,0 +1,66 @@
+#
+# 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 .
+#
+
+package installer::pathanalyzer;
+
+use installer::globals;
+
+###########################################
+# Path analyzer
+###########################################
+
+sub get_path_from_fullqualifiedname
+{
+ my ($longfilenameref) = @_;
+
+ if ( $$longfilenameref =~ /\Q$installer::globals::separator\E/ ) # Is there a separator in the path? Otherwise the path is empty.
+ {
+ if ( $$longfilenameref =~ /^\s*(.*\Q$installer::globals::separator\E)(.+)/ )
+ {
+ $$longfilenameref = $1;
+ }
+ }
+ else
+ {
+ $$longfilenameref = ""; # there is no path
+ }
+}
+
+sub make_absolute_filename_to_relative_filename
+{
+ my ($longfilenameref) = @_;
+
+ if ( $installer::globals::isunix )
+ {
+ if ( $$longfilenameref =~ /^.*\/(?=\S)([^\/]+)(?<=\S)/ )
+ {
+ $$longfilenameref = $1;
+ }
+ }
+
+ if ( $installer::globals::iswin )
+ {
+ # Either '/' or '\'. It would be possible to use $installer::globals::separator.
+ if ( $$longfilenameref =~ /^.*[\/\\](?=\S)([^\/\\]+)(?<=\S)/ )
+ {
+ $$longfilenameref = $1;
+ }
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/profiles.pm b/solenv/bin/modules/installer/profiles.pm
new file mode 100644
index 000000000..a1a7b4507
--- /dev/null
+++ b/solenv/bin/modules/installer/profiles.pm
@@ -0,0 +1,223 @@
+#
+# 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 .
+#
+
+package installer::profiles;
+
+use installer::converter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::remover;
+use installer::systemactions;
+
+#############################
+# Profiles
+#############################
+
+#######################################################
+# Sorting the content of a profile
+#######################################################
+
+sub sorting_profile {
+ my ($profilesref) = @_;
+
+ my @sections;
+ my %section_content;
+
+ for ( my $i = 0; $i < @{$profilesref}; $i++ ) {
+ my $line = ${$profilesref}[$i];
+
+ # Skip unless this is a section (every second line)
+ next unless ( $line =~ /^\s*(\[.*\])\s*$/ );
+
+ my $section = $1;
+ my $next_line = ${$profilesref}[$i+1];
+
+ if ( ! exists $section_content{$section} ) {
+ push @sections, $section;
+ }
+
+ push @{ $section_content{$section} }, $next_line;
+ }
+
+ my @profile;
+
+ for my $section (@sections) {
+ push @profile, "$section\n";
+ push @profile, @{ $section_content{$section} };
+ }
+
+ return \@profile;
+}
+
+#####################################################################
+# Adding the newly created profile into the file list
+#####################################################################
+
+sub add_profile_into_filelist
+{
+ my ($filesarrayref, $oneprofile, $completeprofilename, $allvariables) = @_;
+
+ my %profile = ();
+
+ # Taking the base data from a file in the root module
+
+ if ( ! $allvariables->{'ROOTMODULEGID'} ) { installer::exiter::exit_program("ERROR: ROOTMODULEGID must be defined in list file!", "add_profile_into_filelist"); }
+ my $rootmodulegid = $allvariables->{'ROOTMODULEGID'};
+ my $rootfile;
+ foreach my $file (@{$filesarrayref}) {
+ if ($file->{'modules'} eq $rootmodulegid)
+ {
+ $rootfile = $file;
+ last;
+ }
+ }
+ if (! defined $rootfile) {
+ die "Could not find any file from module $rootmodulegid in list of files!";
+ }
+
+ # copying all base data
+ installer::converter::copy_item_object($rootfile, \%profile);
+
+ # and overriding all new values
+
+ $profile{'ismultilingual'} = 0;
+ $profile{'sourcepath'} = $completeprofilename;
+ $profile{'Name'} = $oneprofile->{'Name'};
+ $profile{'UnixRights'} = "644";
+ $profile{'gid'} = $oneprofile->{'gid'};
+ $profile{'Dir'} = $oneprofile->{'Dir'};
+ $profile{'destination'} = $oneprofile->{'destination'};
+ $profile{'Styles'} = "";
+ if ( $oneprofile->{'Styles'} ) { $profile{'Styles'} = $oneprofile->{'Styles'}; }
+ $profile{'modules'} = $oneprofile->{'ModuleID'}; # Profiles can only be added completely to a module
+
+ push(@{$filesarrayref}, \%profile);
+}
+
+###################################################
+# Including Windows line ends in ini files
+# Profiles on Windows shall have \r\n line ends
+###################################################
+
+sub include_windows_lineends
+{
+ my ($onefile) = @_;
+
+ for ( my $i = 0; $i <= $#{$onefile}; $i++ )
+ {
+ ${$onefile}[$i] =~ s/\r?\n$/\r\n/;
+ }
+}
+
+####################################
+# Create profiles
+####################################
+
+sub create_profiles
+{
+ my ($profilesref, $profileitemsref, $filesarrayref, $languagestringref, $allvariables) = @_;
+
+ my $infoline;
+
+ my $profilesdir = installer::systemactions::create_directories("profiles", $languagestringref);
+
+ installer::logger::include_header_into_logfile("Creating profiles:");
+
+ # Attention: The module dependencies from ProfileItems have to be ignored, because
+ # the Profile has to be installed completely with all of its content and the correct name.
+ # Only complete profiles can belong to a specified module, but not ProfileItems!
+
+ # iterating over all files
+
+ for ( my $i = 0; $i <= $#{$profilesref}; $i++ )
+ {
+ my $oneprofile = ${$profilesref}[$i];
+ my $dir = $oneprofile->{'Dir'};
+ if ( $dir eq "PREDEFINED_CONFIGDIR" ) { next; } # ignoring the profile sversion file
+
+ my $profilegid = $oneprofile->{'gid'};
+ my $profilename = $oneprofile->{'Name'};
+
+ my $localprofilesdir = $profilesdir . $installer::globals::separator . $profilegid; # uniqueness guaranteed by gid
+ if ( ! -d $localprofilesdir ) { installer::systemactions::create_directory($localprofilesdir); }
+
+ my @onefile = ();
+ my $profileempty = 1;
+
+ for ( my $j = 0; $j <= $#{$profileitemsref}; $j++ )
+ {
+ my $oneprofileitem = ${$profileitemsref}[$j];
+
+ my $styles = "";
+ if ( $oneprofileitem->{'Styles'} ) { $styles = $oneprofileitem->{'Styles'}; }
+ if ( $styles =~ /\bINIFILETABLE\b/ ) { next; } # these values are written during installation, not during packing
+
+ my $profileid = $oneprofileitem->{'ProfileID'};
+
+ if ( $profileid eq $profilegid )
+ {
+ my $section = $oneprofileitem->{'Section'};
+ my $key = $oneprofileitem->{'Key'};
+ my $value = $oneprofileitem->{'Value'};
+ for (my $pk = 1; $pk <= 50; $pk++)
+ {
+ my $key = "ValueList" . $pk;
+ if ( $oneprofileitem->{$key} )
+ { $value = $value . " " . $oneprofileitem->{$key} }
+ }
+ my $order = $oneprofileitem->{'Order'}; # ignoring order at the moment
+
+ my $line = "[" . $section . "]" . "\n";
+ push(@onefile, $line);
+ $line = $key . "=" . $value . "\n";
+ push(@onefile, $line);
+
+ $profileempty = 0;
+ }
+ }
+
+ if ( $profileempty ) { next; } # ignoring empty profiles
+
+ # Sorting the array @onefile
+ my $onefileref = sorting_profile(\@onefile);
+
+ if ( $installer::globals::iswin && $^O =~ /cygwin/i) # Windows line ends only for Cygwin
+ {
+ include_windows_lineends($onefileref);
+ }
+
+ # Saving the profile as a file
+ $completeprofilename = $localprofilesdir . $installer::globals::separator . $profilename;
+
+ installer::files::save_file($completeprofilename, $onefileref);
+
+ # Adding the file to the filearray
+ # Some data are set now, others are taken from the file "soffice.exe" ("soffice.bin")
+ add_profile_into_filelist($filesarrayref, $oneprofile, $completeprofilename, $allvariables);
+
+ $infoline = "Created Profile: $completeprofilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ $infoline = "\n";
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+
+1;
diff --git a/solenv/bin/modules/installer/remover.pm b/solenv/bin/modules/installer/remover.pm
new file mode 100644
index 000000000..426056eef
--- /dev/null
+++ b/solenv/bin/modules/installer/remover.pm
@@ -0,0 +1,50 @@
+#
+# 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 .
+#
+
+package installer::remover;
+
+use installer::globals;
+
+############################################
+# Remover
+############################################
+
+sub remove_leading_and_ending_whitespaces
+{
+ my ( $stringref ) = @_;
+
+ $$stringref =~ s/^\s+//;
+ $$stringref =~ s/\s+$//;
+}
+
+sub remove_leading_and_ending_quotationmarks
+{
+ my ( $stringref ) = @_;
+
+ $$stringref =~ s/^\s*\"//;
+ $$stringref =~ s/\"\s*$//;
+}
+
+sub remove_ending_pathseparator
+{
+ my ( $stringref ) = @_;
+
+ $$stringref =~ s/\Q$installer::globals::separator\E\s*$//;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/scpzipfiles.pm b/solenv/bin/modules/installer/scpzipfiles.pm
new file mode 100644
index 000000000..e6c773196
--- /dev/null
+++ b/solenv/bin/modules/installer/scpzipfiles.pm
@@ -0,0 +1,143 @@
+#
+# 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 .
+#
+
+package installer::scpzipfiles;
+
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::systemactions;
+
+# Replacing all zip list variables.
+# Called for setup script as well as files with flag scpzip_replace.
+
+sub replace_all_ziplistvariables_in_file
+{
+ my ( $fileref, $variablesref ) = @_;
+
+ for my $line ( @{$fileref} )
+ {
+ # Avoid removing variables we do not recognise.
+ $line =~ s/\$\{(\w+)\}/defined $variablesref->{$1}
+ ? $variablesref->{$1}
+ : $&/eg;
+ }
+}
+
+# Replacing all zip list variables in rtf files.
+
+sub replace_all_ziplistvariables_in_rtffile
+{
+ my ( $fileref, $variablesref ) = @_;
+
+ for my $line ( @{$fileref} )
+ {
+ # In rtf files the braces are backslash-escaped.
+ # Avoid removing variables we do not recognise.
+ $line =~ s/\$\\\{(\w+)\\\}/defined $variablesref->{$1}
+ ? $variablesref->{$1}
+ : $&/eg;
+ }
+}
+
+#########################################################
+# Analyzing files with flag SCPZIP_REPLACE
+# $item can be "File" or "ScpAction"
+#########################################################
+
+sub resolving_scpzip_replace_flag
+{
+ my ($filesarrayref, $variableshashref, $item, $languagestringref) = @_;
+
+ my $diritem = lc($item);
+
+ my $replacedirbase = installer::systemactions::create_directories("replace_$diritem", $languagestringref);
+
+ installer::logger::include_header_into_logfile("$item with flag SCPZIP:");
+
+ for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
+ {
+ my $onefile = ${$filesarrayref}[$i];
+ my $styles = "";
+
+ if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
+
+ if ( $styles =~ /\bSCPZIP_REPLACE\b/ )
+ {
+ # Language specific subdirectory
+
+ my $onelanguage = $onefile->{'specificlanguage'};
+
+ if ($onelanguage eq "")
+ {
+ $onelanguage = "00"; # files without language into directory "00"
+ }
+
+ my $replacedir = $replacedirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator;
+ installer::systemactions::create_directory($replacedir); # creating language specific directories
+
+ # copy files and edit them with the variables defined in the zip.lst
+
+ my $longfilename = 0;
+
+ my $onefilename = $onefile->{'Name'};
+ my $sourcepath = $onefile->{'sourcepath'};
+
+ if ( $onefilename =~ /^\s*\Q$installer::globals::separator\E/ ) # filename begins with a slash, for instance /registry/schema/org/openoffice/VCL.xcs
+ {
+ $onefilename =~ s/^\s*\Q$installer::globals::separator\E//;
+ $longfilename = 1;
+ }
+
+ my $destinationpath = $replacedir . $onefilename;
+ my $movepath = $destinationpath . ".orig";
+
+ if ( $longfilename ) # the destination directory has to be created before copying
+ {
+ my $destdir = $movepath;
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$destdir);
+ installer::systemactions::create_directory_structure($destdir);
+ }
+
+ my $copysuccess = installer::systemactions::copy_one_file($sourcepath, $movepath);
+
+ if ( $copysuccess )
+ {
+ # Now the file can be edited
+ # ToDo: How about binary patching?
+
+ my $onefileref = installer::files::read_file($movepath);
+ replace_all_ziplistvariables_in_file($onefileref, $variableshashref);
+ installer::files::save_file($destinationpath ,$onefileref);
+ }
+
+ # Saving the original source, where the file was found
+ $onefile->{'originalsourcepath'} = $onefile->{'sourcepath'};
+
+ # Writing the new sourcepath into the hashref, even if it was no copied
+
+ $onefile->{'sourcepath'} = $destinationpath;
+ }
+ }
+
+ my $infoline = "\n";
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+1;
diff --git a/solenv/bin/modules/installer/scriptitems.pm b/solenv/bin/modules/installer/scriptitems.pm
new file mode 100644
index 000000000..54247d01d
--- /dev/null
+++ b/solenv/bin/modules/installer/scriptitems.pm
@@ -0,0 +1,2404 @@
+#
+# 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 .
+#
+
+package installer::scriptitems;
+
+use installer::converter;
+use installer::exiter;
+use installer::globals;
+use installer::languages;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::remover;
+use installer::systemactions;
+
+################################################################
+# Resolving the GID for the directories defined in setup script
+################################################################
+
+sub resolve_all_directory_names
+{
+ my ($directoryarrayref) = @_;
+
+ # After this procedure the hash shall contain the complete language
+ # dependent path, not only the language dependent HostName.
+
+ my ($key, $value, $parentvalue, $parentgid, $parentdirectoryhashref);
+
+ for ( my $i = 0; $i <= $#{$directoryarrayref}; $i++ )
+ {
+ my $directoryhashref = ${$directoryarrayref}[$i];
+ my $gid = $directoryhashref-> {'gid'};
+ my $parentid = $directoryhashref-> {'ParentID'};
+
+ if ( $parentid ne "PREDEFINED_PROGDIR" )
+ {
+ # find the array of the parentid, which has to be defined before in setup script
+ # and is therefore listed before in this array
+
+ for ( my $j = 0; $j <= $i; $j++ )
+ {
+ $parentdirectoryhashref = ${$directoryarrayref}[$j];
+ $parentgid = $parentdirectoryhashref->{'gid'};
+
+ if ( $parentid eq $parentgid)
+ {
+ last;
+ }
+ }
+
+ # and now we can put the path together
+ # But take care of the languages!
+
+ my $dirismultilingual = $directoryhashref->{'ismultilingual'};
+ my $parentismultilingual = $parentdirectoryhashref->{'ismultilingual'};
+
+ # First: Both directories are language independent or both directories are language dependent
+
+ if ((( ! $dirismultilingual ) && ( ! $parentismultilingual )) ||
+ (( $dirismultilingual ) && ( $parentismultilingual )))
+ {
+ foreach $key (keys %{$directoryhashref})
+ {
+ # the key ("HostName (en-US)") must be usable for both hashes
+
+ if ( $key =~ /\bHostName\b/ )
+ {
+ $parentvalue = "";
+ $value = $directoryhashref->{$key};
+ if ( $parentdirectoryhashref->{$key} ) { $parentvalue = $parentdirectoryhashref->{$key}; }
+
+ # It is possible, that in scp project, a directory is defined in more languages than
+ # the directory parent (happened after automatic generation of macros.inc).
+ # Therefore this is checked now and written with a warning into the logfile.
+ # This is no error, because (in most cases) the concerned language is not build.
+
+ if ($parentvalue eq "")
+ {
+ $directoryhashref->{$key} = "FAILURE";
+ my $infoline = "WARNING: No hostname for $parentid with \"$key\". Needed by child directory $gid !\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ }
+ else
+ {
+ $directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value;
+ }
+ }
+ }
+ }
+
+ # Second: The directory is language dependent, the parent not
+
+ if (( $dirismultilingual ) && ( ! $parentismultilingual ))
+ {
+ $parentvalue = $parentdirectoryhashref->{'HostName'}; # there is only one
+
+ foreach $key (keys %{$directoryhashref}) # the current directory
+ {
+ if ( $key =~ /\bHostName\b/ )
+ {
+ $value = $directoryhashref->{$key};
+ $directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value;
+ }
+ }
+ }
+
+ # Third: The directory is not language dependent, the parent is language dependent
+
+ if (( ! $dirismultilingual ) && ( $parentismultilingual ))
+ {
+ $value = $directoryhashref->{'HostName'}; # there is only one
+ delete($directoryhashref->{'HostName'});
+
+ foreach $key (keys %{$parentdirectoryhashref}) # the parent directory
+ {
+ if ( $key =~ /\bHostName\b/ )
+ {
+ $parentvalue = $parentdirectoryhashref->{$key}; # there is only one
+ $directoryhashref->{$key} = $parentvalue . $installer::globals::separator . $value;
+ }
+ }
+
+ $directoryhashref->{'ismultilingual'} = 1; # now this directory is also language dependent
+ }
+ }
+ }
+}
+
+#############################################################################
+# Files with flag NOT_IN_SUITE do not need to be packed into
+# Suite installation sets
+#############################################################################
+
+sub remove_office_start_language_files
+{
+ my ($productarrayref) = @_;
+
+ my @newitems = ();
+
+ for ( my $i = 0; $i <= $#{$productarrayref}; $i++ )
+ {
+ my $oneitem = ${$productarrayref}[$i];
+ my $styles = "";
+
+ if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
+
+ if (!($styles =~ /\bSET_OFFICE_LANGUAGE\b/))
+ {
+ push(@newitems, $oneitem);
+ }
+ else
+ {
+ my $infoline = "INFO: Flag SET_OFFICE_LANGUAGE \-\> Removing $oneitem->{'gid'} from file list.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ return \@newitems;
+}
+
+#############################################################################
+# Registryitems for Uninstall have to be removed
+#############################################################################
+
+sub remove_uninstall_regitems_from_script
+{
+ my ($registryarrayref) = @_;
+
+ my @newitems = ();
+
+ for ( my $i = 0; $i <= $#{$registryarrayref}; $i++ )
+ {
+ my $oneitem = ${$registryarrayref}[$i];
+ my $subkey = "";
+
+ if ( $oneitem->{'Subkey'} ) { $subkey = $oneitem->{'Subkey'}; }
+
+ if ( $subkey =~ /Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall/ ) { next; }
+
+ push(@newitems, $oneitem);
+ }
+
+ return \@newitems;
+}
+
+##############################################################################
+# Searching the language module for a specified language
+##############################################################################
+
+sub get_languagespecific_module
+{
+ my ( $lang, $modulestring ) = @_;
+
+ my $langmodulestring = "";
+
+ my $module;
+ foreach $module ( keys %installer::globals::alllangmodules )
+ {
+ if (( $installer::globals::alllangmodules{$module} eq $lang ) && ( $modulestring =~ /\b$module\b/ ))
+ {
+ $langmodulestring = "$langmodulestring,$module";
+ }
+ }
+
+ $langmodulestring =~ s/^\s*,//;
+
+ if ( $langmodulestring eq "" ) { installer::exiter::exit_program("ERROR: No language pack module found for language $lang in string \"$modulestring\"!", "get_languagespecific_module"); }
+
+ return $langmodulestring;
+}
+
+##############################################################################
+# Removing all items in product lists which do not have the correct languages
+##############################################################################
+
+sub resolving_all_languages_in_productlists
+{
+ my ($productarrayref, $languagesarrayref) = @_;
+
+ my @itemsinalllanguages = ();
+
+ my ($key, $value);
+
+ for ( my $i = 0; $i <= $#{$productarrayref}; $i++ )
+ {
+ my $oneitem = ${$productarrayref}[$i];
+
+ my $ismultilingual = $oneitem->{'ismultilingual'};
+
+ if (!($ismultilingual)) # nothing to do with single language items
+ {
+ $oneitem->{'specificlanguage'} = "";
+ push(@itemsinalllanguages, $oneitem);
+ }
+ else #all language dependent files
+ {
+ for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) # iterating over all languages
+ {
+ my $onelanguage = ${$languagesarrayref}[$j];
+
+ my %oneitemhash = ();
+
+ foreach $key (keys %{$oneitem})
+ {
+ if ( $key =~ /\(\S+\)/ ) # this are the language dependent keys
+ {
+ if ( $key =~ /\(\Q$onelanguage\E\)/ )
+ {
+ $value = $oneitem->{$key};
+ $oneitemhash{$key} = $value;
+ }
+ }
+ else
+ {
+ $value = $oneitem->{$key};
+ $oneitemhash{$key} = $value;
+ }
+ }
+
+ $oneitemhash{'specificlanguage'} = $onelanguage;
+
+ if ( $oneitemhash{'haslanguagemodule'} )
+ {
+ my $langmodulestring = get_languagespecific_module($onelanguage, $oneitemhash{'modules'});
+ $oneitemhash{'modules'} = $langmodulestring;
+ }
+
+ push(@itemsinalllanguages, \%oneitemhash);
+ }
+ }
+ }
+
+ return \@itemsinalllanguages;
+}
+
+################################################################################
+# Removing all modules, that have the flag LANGUAGEMODULE, but do not
+# have the correct language
+################################################################################
+
+sub remove_not_required_language_modules
+{
+ my ($modulesarrayref, $languagesarrayref) = @_;
+
+ my @allmodules = ();
+
+ for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
+ {
+ my $module = ${$modulesarrayref}[$i];
+ my $styles = "";
+ if ( $module->{'Styles'} ) { $styles = $module->{'Styles'}; }
+
+ if ( $styles =~ /\bLANGUAGEMODULE\b/ )
+ {
+ if ( ! exists($module->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$module->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "remove_not_required_language_modules"); }
+ my $modulelanguage = $module->{'Language'};
+ # checking, if language is required
+ my $doinclude = 0;
+ for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ )
+ {
+ my $onelanguage = ${$languagesarrayref}[$j];
+ if ( $onelanguage eq $modulelanguage )
+ {
+ $doinclude = 1;
+ last;
+ }
+ }
+
+ if ( $doinclude ) { push(@allmodules, $module); }
+ }
+ else
+ {
+ push(@allmodules, $module);
+ }
+ }
+
+ return \@allmodules;
+}
+
+################################################################################
+# Removing all modules, that have a spellchecker language that is not
+# required for this product (spellchecker selection).
+# All required spellchecker languages are stored in
+# %installer::globals::spellcheckerlanguagehash
+################################################################################
+
+sub remove_not_required_spellcheckerlanguage_modules
+{
+ my ($modulesarrayref) = @_;
+
+ my $infoline = "";
+ my @allmodules = ();
+
+ for ( my $i = 0; $i <= $#{$modulesarrayref}; $i++ )
+ {
+ my $module = ${$modulesarrayref}[$i];
+ if ( $module->{'Spellcheckerlanguage'} ) # selecting modules with Spellcheckerlanguage
+ {
+ if ( exists($installer::globals::spellcheckerlanguagehash{$module->{'Spellcheckerlanguage'}}) )
+ {
+ push(@allmodules, $module);
+ }
+ else
+ {
+ $infoline = "Spellchecker selection: Removing module $module->{'gid'}\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # Collecting all files at modules that are removed
+
+ if ( $module->{'Files'} )
+ {
+ if ( $module->{'Files'} =~ /^\s*\((.*?)\)\s*$/ )
+ {
+ my $filelist = $1;
+
+ my $filelisthash = installer::converter::convert_stringlist_into_hash(\$filelist, ",");
+ foreach my $onefile ( keys %{$filelisthash} ) { $installer::globals::spellcheckerfilehash{$onefile} = 1; }
+ }
+ }
+ }
+ }
+ else
+ {
+ push(@allmodules, $module);
+ }
+ }
+
+ return \@allmodules;
+}
+
+################################################################################
+# Removing all modules, that belong to a module that was removed
+# in "remove_not_required_spellcheckerlanguage_modules" because of the
+# spellchecker language. The files belonging to the modules are collected
+# in %installer::globals::spellcheckerfilehash.
+################################################################################
+
+sub remove_not_required_spellcheckerlanguage_files
+{
+ my ($filesarrayref) = @_;
+
+ my @filesarray = ();
+ my $infoline = "";
+
+ for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
+ {
+ my $onefile = ${$filesarrayref}[$i];
+ # FIXME: some items don't have 'gid'
+ if ( (defined $onefile->{'gid'}) && exists($installer::globals::spellcheckerfilehash{$onefile->{'gid'}}) )
+ {
+ $infoline = "Spellchecker selection: Removing file $onefile->{'gid'}\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ next;
+ }
+ push(@filesarray, $onefile);
+ }
+
+ return \@filesarray;
+}
+
+################################################################################
+# Looking for directories without correct HostName
+################################################################################
+
+sub checking_directories_with_corrupt_hostname
+{
+ my ($dirsref, $languagesarrayref) = @_;
+
+ for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
+ {
+ my $onedir = ${$dirsref}[$i];
+
+ my $hostname = "";
+
+ if ( $onedir->{'HostName'} ) { $hostname = $onedir->{'HostName'}; }
+
+ if ( $hostname eq "" )
+ {
+ my $langstring = "";
+ for ( my $j = 0; $j <= $#{$languagesarrayref}; $j++ ) { $langstring .= ${$languagesarrayref}[$j] . " "; }
+ installer::exiter::exit_program("ERROR: HostName not defined for $onedir->{'gid'} for specified language. Probably you wanted to create an installation set, in a language not defined in scp2 project. You selected the following language(s): $langstring", "checking_directories_with_corrupt_hostname");
+ }
+
+ if ( $hostname eq "FAILURE" )
+ {
+ installer::exiter::exit_program("ERROR: Could not create HostName for $onedir->{'gid'} (missing language at parent). See logfile warning for more info!", "checking_directories_with_corrupt_hostname");
+ }
+ }
+}
+
+################################################################################
+# Setting global properties
+################################################################################
+
+sub set_global_directory_hostnames
+{
+ my ($dirsref, $allvariables) = @_;
+
+ for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
+ {
+ my $onedir = ${$dirsref}[$i];
+ my $styles = "";
+ if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
+
+ if ( $styles =~ /\bOFFICEDIRECTORY\b/ )
+ {
+ $installer::globals::officedirhostname = $onedir->{'HostName'};
+ $installer::globals::officedirgid = $onedir->{'gid'};
+ $allvariables->{'OFFICEDIRECTORYHOSTNAME'} = $installer::globals::officedirhostname;
+ }
+ }
+}
+
+########################################################
+# Recursively defined procedure to order
+# modules and directories
+########################################################
+
+sub get_children
+{
+ my ($allitems, $startparent, $newitemorder) = @_;
+
+ for ( my $i = 0; $i <= $#{$allitems}; $i++ )
+ {
+ my $gid = ${$allitems}[$i]->{'gid'};
+ my $parent = "";
+ if ( ${$allitems}[$i]->{'ParentID'} ) { $parent = ${$allitems}[$i]->{'ParentID'}; }
+
+ if ( $parent eq $startparent )
+ {
+ push(@{$newitemorder}, ${$allitems}[$i]);
+ my $parent = $gid;
+ get_children($allitems, $parent, $newitemorder); # recursive!
+ }
+ }
+}
+
+################################################################################
+# Using langpack copy action for language packs
+################################################################################
+
+sub use_langpack_copy_scpaction
+{
+ my ($scpactionsref) = @_;
+
+ for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
+ {
+ my $onescpaction = ${$scpactionsref}[$i];
+ if (( $onescpaction->{'LangPackCopy'} ) && ( $onescpaction->{'LangPackCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'LangPackCopy'}; }
+ }
+}
+
+################################################################################
+# Using dev copy patch action for developer snapshot builds
+################################################################################
+
+sub use_devversion_copy_scpaction
+{
+ my ($scpactionsref) = @_;
+
+ for ( my $i = 0; $i <= $#{$scpactionsref}; $i++ )
+ {
+ my $onescpaction = ${$scpactionsref}[$i];
+ if (( $onescpaction->{'DevVersionCopy'} ) && ( $onescpaction->{'DevVersionCopy'} ne "" )) { $onescpaction->{'Copy'} = $onescpaction->{'DevVersionCopy'}; }
+ }
+}
+
+################################################################################
+# Shifting parent directories of URE and Basis layer, so that
+# these directories are located below the Brand layer.
+# Style: SHIFT_BASIS_INTO_BRAND_LAYER
+################################################################################
+
+sub shift_basis_directory_parents
+{
+ my ($dirsref) = @_;
+
+ my @alldirs = ();
+
+ my $officedirgid = "";
+
+ for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
+ {
+ my $onedir = ${$dirsref}[$i];
+ my $styles = "";
+ if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
+
+ if ( $styles =~ /\bOFFICEDIRECTORY\b/ ) { $officedirgid = $onedir->{'gid'}; }
+ }
+
+ if ( $officedirgid ne "" )
+ {
+ for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
+ {
+ my $onedir = ${$dirsref}[$i];
+ my $styles = "";
+ if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
+
+ if (( $styles =~ /\bBASISDIRECTORY\b/ ) || ( $styles =~ /\bUREDIRECTORY\b/ ))
+ {
+ $onedir->{'ParentID'} = $officedirgid;
+ }
+ }
+
+ # Sorting directories
+ my $startgid = "PREDEFINED_PROGDIR";
+ get_children($dirsref, $startgid, \@alldirs);
+ }
+
+ return \@alldirs;
+}
+
+################################################################################
+# Setting the name of the directory with style OFFICEDIRECTORY.
+# The name can be defined in property OFFICEDIRECTORYNAME.
+################################################################################
+
+sub set_officedirectory_name
+{
+ my ($dirsref, $officedirname) = @_;
+
+ for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
+ {
+ my $onedir = ${$dirsref}[$i];
+ my $styles = "";
+ if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
+ if ( $styles =~ /\bOFFICEDIRECTORY\b/ )
+ {
+ $onedir->{'HostName'} = $officedirname;
+ last;
+ }
+ }
+}
+
+################################################################################
+# Simplifying the name for language dependent items from "Name (xy)" to "Name"
+################################################################################
+
+sub changing_name_of_language_dependent_keys
+{
+ my ($itemsarrayref) = @_;
+
+ # Changing key for multilingual items from "Name ( )" to "Name" or "HostName ( )" to "HostName"
+
+ for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
+ {
+ my $oneitem = ${$itemsarrayref}[$i];
+ my $onelanguage = $oneitem->{'specificlanguage'};
+
+ if (!($onelanguage eq "" )) # language dependent item
+ {
+ my $itemkey;
+
+ foreach $itemkey (keys %{$oneitem})
+ {
+ if ( $itemkey =~ /^\s*(\S+?)\s+\(\S+\)\s*$/ )
+ {
+ my $newitemkey = $1;
+ my $itemvalue = $oneitem->{$itemkey};
+ $oneitem->{$newitemkey} = $itemvalue;
+ delete($oneitem->{$itemkey});
+ }
+ }
+ }
+ }
+}
+
+################################################################################
+# Replacement of setup variables in ConfigurationItems and ProfileItems
+# <productkey>, <buildid>, <sequence_languages>, <productcode>, <upgradecode>, <productupdate>
+################################################################################
+
+sub replace_setup_variables
+{
+ my ($itemsarrayref, $languagestringref, $hashref) = @_;
+
+ my $languagesstring = $$languagestringref;
+ $languagesstring =~ s/\_/ /g; # replacing underscore with whitespace
+
+ my $productname = $hashref->{'PRODUCTNAME'};
+ my $productversion = $hashref->{'PRODUCTVERSION'};
+ my $libo_version_major = "";
+ if ( $hashref->{'LIBO_VERSION_MAJOR'} ) { $libo_version_major = $hashref->{'LIBO_VERSION_MAJOR'}; }
+ my $productkey = $productname . " " . $productversion;
+
+ # string $buildid, which is used to replace the setup variable <buildid>
+
+ my $localbuild = $installer::globals::build;
+
+ if ( $localbuild =~ /^\s*(\w+?)(\d+)\s*$/ ) { $localbuild = $2; } # using "680" instead of "src680"
+
+ my $buildidstring = `cd $ENV{'SRCDIR'} 2>&1 >/dev/null && git log -n 1 --pretty=format:"%H"`;
+ if ($? || !$buildidstring) {
+ $buildidstring = $localbuild . "(Build:" . $installer::globals::buildid . ")";
+ }
+
+ my $updateid = $productname . "_" . $libo_version_major . "_" . $$languagestringref;
+ $updateid =~ s/ /_/g;
+
+ my $updatechannel = "";
+ if ( $ENV{'UPDATE_CONFIG'} && $ENV{'UPDATE_CONFIG'} ne "")
+ {
+ open(CONFIG, glob($ENV{'UPDATE_CONFIG'}));
+ while (<CONFIG>)
+ {
+ chomp;
+ if (/^s*(\S+)=(\S+)$/)
+ {
+ $key = $1;
+ $val = $2;
+ if ($key eq "channel")
+ {
+ $updatechannel = $val;
+ }
+ }
+ }
+ close(CONFIG);
+ }
+
+ for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
+ {
+ my $oneitem = ${$itemsarrayref}[$i];
+ my $value = $oneitem->{'Value'};
+
+ $value =~ s/\<buildid\>/$buildidstring/;
+ $value =~ s/\<sequence_languages\>/$languagesstring/;
+ $value =~ s/\<productkey\>/$productkey/;
+ $value =~ s/\<productcode\>/$installer::globals::productcode/;
+ $value =~ s/\<upgradecode\>/$installer::globals::upgradecode/;
+ $value =~ s/\<alllanguages\>/$languagesstring/;
+ $value =~ s/\<sourceid\>/$installer::globals::build/;
+ $value =~ s/\<updateid\>/$updateid/;
+ $value =~ s/\<updatechannel\>/$updatechannel/;
+ $value =~ s/\<pkgformat\>/$installer::globals::packageformat/;
+ $ENV{'OOO_VENDOR'} = "" if !defined $ENV{'OOO_VENDOR'};
+ $value =~ s/\<vendor\>/$ENV{'OOO_VENDOR'}/;
+
+ $oneitem->{'Value'} = $value;
+ }
+}
+
+################################################################################
+# By defining variable LOCALUSERDIR in *.lst it is possible to change
+# the standard destination of user directory defined in scp2 ($SYSUSERCONFIG).
+################################################################################
+
+sub replace_userdir_variable
+{
+ my ($itemsarrayref) = @_;
+
+ my $userdir = "";
+ if ( $allvariableshashref->{'LOCALUSERDIR'} ) { $userdir = $allvariableshashref->{'LOCALUSERDIR'}; }
+ else { $userdir = $installer::globals::simpledefaultuserdir; }
+
+ if ( $userdir ne "" )
+ {
+ for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
+ {
+ my $oneitem = ${$itemsarrayref}[$i];
+ $oneitem->{'Value'} =~ s/\$SYSUSERCONFIG/$userdir/;
+ }
+ }
+}
+
+#####################################################################################
+# Files and ConfigurationItems are not included for all languages.
+# For instance asian fonts. These can be removed, if no "Name" is found.
+# ConfigurationItems are not always defined in the linguistic configuration file.
+# The "Key" cannot be found for them.
+#####################################################################################
+
+sub remove_non_existent_languages_in_productlists
+{
+ my ($itemsarrayref, $languagestringref, $searchkey, $itemtype) = @_;
+
+ # Removing of all non existent files, for instance asian fonts
+
+ installer::logger::include_header_into_logfile("Removing for this language $$languagestringref:");
+
+ my @allexistentitems = ();
+
+ my $infoline;
+
+ for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
+ {
+ my $oneitem = ${$itemsarrayref}[$i];
+ my $oneitemname = ""; # $searchkey is "Name" for files and "Key" for ConfigurationItems
+
+ if ( $oneitem->{$searchkey} ) { $oneitemname = $oneitem->{$searchkey} }
+
+ my $itemtoberemoved = 0;
+
+ if ($oneitemname eq "") # for instance asian font in english installation set
+ {
+ $itemtoberemoved = 1;
+ }
+
+ if ($itemtoberemoved)
+ {
+ $infoline = "WARNING: Language $$languagestringref: No $itemtype packed for $oneitem->{'gid'}!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ push(@allexistentitems, $oneitem);
+ }
+ }
+
+ $infoline = "\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return \@allexistentitems;
+}
+
+########################################################################
+# Input is the directory gid, output the "HostName" of the directory
+########################################################################
+
+sub get_Directoryname_From_Directorygid
+{
+ my ($dirsarrayref ,$searchgid, $onelanguage, $oneitemgid) = @_;
+
+ my $directoryname = "";
+ my $onedirectory;
+ my $foundgid = 0;
+
+ for ( my $i = 0; $i <= $#{$dirsarrayref}; $i++ )
+ {
+ $onedirectory = ${$dirsarrayref}[$i];
+ my $directorygid = $onedirectory->{'gid'};
+
+ if ($directorygid eq $searchgid)
+ {
+ $foundgid = 1;
+ last;
+ }
+ }
+
+ if (!($foundgid))
+ {
+ installer::exiter::exit_program("ERROR: Gid $searchgid not defined in $installer::globals::setupscriptname", "get_Directoryname_From_Directorygid");
+ }
+
+ if ( ! ( $onedirectory->{'ismultilingual'} )) # the directory is not language dependent
+ {
+ $directoryname = $onedirectory->{'HostName'};
+ }
+ else
+ {
+ $directoryname = $onedirectory->{"HostName ($onelanguage)"};
+ }
+
+ # gid_Dir_Template_Wizard_Letter is defined as language dependent directory, but the file gid_Dir_Template_Wizard_Letter
+ # is not language dependent. Therefore $onelanguage is not defined. But which language is the correct language for the
+ # directory?
+ # Perhaps better solution: In scp it must be forbidden to have a language independent file in a language dependent directory.
+
+ if (( ! $directoryname ) && ( $onelanguage eq "" ))
+ {
+ installer::exiter::exit_program("ERROR (in scp): Directory $searchgid is language dependent, but not $oneitemgid inside this directory", "get_Directoryname_From_Directorygid");
+ }
+
+ return \$directoryname;
+}
+
+##################################################################
+# Getting destination directory for links, files and profiles
+##################################################################
+
+sub get_Destination_Directory_For_Item_From_Directorylist # this is used for Files, Profiles and Links
+{
+ my ($itemarrayref, $dirsarrayref) = @_;
+
+ for ( my $i = 0; $i <= $#{$itemarrayref}; $i++ )
+ {
+ my $oneitem = ${$itemarrayref}[$i];
+ my $oneitemgid = $oneitem->{'gid'};
+ my $directorygid = $oneitem->{'Dir'}; # for instance gid_Dir_Program
+ my $netdirectorygid = "";
+ my $onelanguage = $oneitem->{'specificlanguage'};
+ my $ispredefinedprogdir = 0;
+ my $ispredefinedconfigdir = 0;
+
+ my $oneitemname = $oneitem->{'Name'};
+
+ if ( $oneitem->{'NetDir'} ) { $netdirectorygid = $oneitem->{'NetDir'}; }
+
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$oneitemname); # making /registry/schema/org/openoffice/VCL.xcs to VCL.xcs
+
+ my $searchdirgid;
+
+ if ( $netdirectorygid eq "" ) # if NetDir is defined, it is privileged
+ {
+ $searchdirgid = $directorygid
+ }
+ else
+ {
+ $searchdirgid = $netdirectorygid
+ }
+
+ if ($searchdirgid =~ /PREDEFINED_PROGDIR/) # the root directory is not defined in setup script
+ {
+ $ispredefinedprogdir = 1;
+ }
+
+ if ($searchdirgid =~ /PREDEFINED_CONFIGDIR/) # the root directory is not defined in setup script
+ {
+ $ispredefinedconfigdir = 1;
+ }
+
+ my $destfilename;
+
+ if ($oneitem->{'DoNotMessWithSymlinks'})
+ {
+ $destfilename = $oneitem->{'Name'};
+ }
+ elsif ((!( $ispredefinedprogdir )) && (!( $ispredefinedconfigdir )))
+ {
+ my $directorynameref = get_Directoryname_From_Directorygid($dirsarrayref, $searchdirgid, $onelanguage, $oneitemgid);
+ my $styles = "";
+ if ($oneitem->{'Styles'}) { $styles = $oneitem->{'Styles'}; }
+ if ($styles =~ /\bFILELIST\b/)
+ {
+ $destfilename = $$directorynameref . $installer::globals::separator . $oneitemname;
+ }
+ else
+ {
+ $destfilename = $$directorynameref . $installer::globals::separator . $oneitem->{'Name'};
+ }
+ }
+ else
+ {
+ $destfilename = $oneitemname;
+ }
+
+ $oneitem->{'destination'} = $destfilename;
+ }
+}
+
+##########################################################################
+# Searching a file in a list of paths
+##########################################################################
+
+sub get_sourcepath_from_filename_and_includepath_classic
+{
+ my ($searchfilenameref, $includepatharrayref, $write_logfile) = @_;
+
+ my ($onefile, $includepath, $infoline);
+
+ my $foundsourcefile = 0;
+
+ for ( my $j = 0; $j <= $#{$includepatharrayref}; $j++ )
+ {
+ $includepath = ${$includepatharrayref}[$j];
+ installer::remover::remove_leading_and_ending_whitespaces(\$includepath);
+
+ $onefile = $includepath . $installer::globals::separator . $$searchfilenameref;
+
+ if ( -f $onefile )
+ {
+ $foundsourcefile = 1;
+ last;
+ }
+ }
+
+ if (!($foundsourcefile))
+ {
+ $onefile = ""; # the sourcepath has to be empty
+ if ( $write_logfile)
+ {
+ $infoline = "ERROR: Source for $$searchfilenameref not found (classic)!\n"; # Important message in log file
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ else
+ {
+ if ( $write_logfile)
+ {
+ $infoline = "SUCCESS: Source for $$searchfilenameref: $onefile\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ return \$onefile;
+}
+
+##########################################################################
+# Input is one file name, output the complete absolute path of this file
+##########################################################################
+
+sub get_sourcepath_from_filename_and_includepath
+{
+ my ($searchfilenameref, $unused, $write_logfile) = @_;
+
+ my ($onefile, $includepath, $infoline);
+
+ my $foundsourcefile = 0;
+ my $foundnewname = 0;
+
+ for ( my $j = 0; $j <= $#installer::globals::allincludepaths; $j++ )
+ {
+ my $allfiles = $installer::globals::allincludepaths[$j];
+
+ if ( exists( $allfiles->{$$searchfilenameref} ))
+ {
+ $onefile = $allfiles->{'includepath'} . $installer::globals::separator . $$searchfilenameref;
+ $foundsourcefile = 1;
+ last;
+ }
+ }
+
+ if (!($foundsourcefile)) # testing with lowercase filename
+ {
+ # Attention: README01.html is copied for Windows to readme01.html, not case sensitive
+
+ for ( my $j = 0; $j <= $#installer::globals::allincludepaths; $j++ )
+ {
+ my $allfiles = $installer::globals::allincludepaths[$j];
+
+ my $newfilename = $$searchfilenameref;
+ $newfilename =~ s/readme/README/; # special handling for readme files
+ $newfilename =~ s/license/LICENSE/; # special handling for license files
+
+ if ( exists( $allfiles->{$newfilename} ))
+ {
+ $onefile = $allfiles->{'includepath'} . $installer::globals::separator . $newfilename;
+ $foundsourcefile = 1;
+ $foundnewname = 1;
+ last;
+ }
+ }
+ }
+
+ if (!($foundsourcefile))
+ {
+ $onefile = ""; # the sourcepath has to be empty
+ if ( $write_logfile)
+ {
+ $infoline = "ERROR: Source for $$searchfilenameref not found!\n"; # Important message in log file
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ else
+ {
+ if ( $write_logfile)
+ {
+ if (!($foundnewname))
+ {
+ $infoline = "SUCCESS: Source for $$searchfilenameref: $onefile\n";
+ }
+ else
+ {
+ $infoline = "SUCCESS/WARNING: Special handling for $$searchfilenameref: $onefile\n";
+ }
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ return \$onefile;
+}
+
+##############################################################
+# Getting all source paths for all files to be packed
+# $item can be "Files" or "ScpActions"
+##############################################################
+
+sub get_Source_Directory_For_Files_From_Includepathlist
+{
+ my ($filesarrayref, $includepatharrayref, $dirsref, $item, $allvariables) = @_;
+
+ installer::logger::include_header_into_logfile("$item:");
+
+ my ($foundit, $dontcare, $extrarootdir) =
+ get_office_directory_gid_and_hostname($dirsref);
+ my $infoline = "";
+
+ for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
+ {
+ my $onefile = ${$filesarrayref}[$i];
+ my $onelanguage = $onefile->{'specificlanguage'};
+
+ if ( ! $onefile->{'Name'} ) { installer::exiter::exit_program("ERROR: $item without name ! GID: $onefile->{'gid'} ! Language: $onelanguage", "get_Source_Directory_For_Files_From_Includepathlist"); }
+
+ my $onefilename = $onefile->{'Name'};
+ if ( $item eq "ScpActions" ) { $onefilename =~ s/\//$installer::globals::separator/g; }
+ $onefilename =~ s/^\s*\Q$installer::globals::separator\E//; # filename begins with a slash, for instance /registry/schema/org/openoffice/VCL.xcs
+
+ my $styles = "";
+ my $file_can_miss = 0;
+ if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
+
+ if (( $installer::globals::languagepack ) && ( ! $onefile->{'ismultilingual'} ) && ( ! ( $styles =~ /\bFORCELANGUAGEPACK\b/ ))) { $file_can_miss = 1; }
+ if (( $installer::globals::helppack ) && ( ! $onefile->{'ismultilingual'} ) && ( ! ( $styles =~ /\bFORCEHELPPACK\b/ ))) { $file_can_miss = 1; }
+
+ my $sourcepathref = "";
+
+ my $destination = $onefile->{'destination'};
+ my $instdirdestination;
+ if ($destination)
+ {
+ if (($installer::globals::iswindowsbuild) && $foundit && $extrarootdir)
+ {
+ $destination =~ s,$extrarootdir/,,; # remove it from path
+ }
+ if (($installer::globals::languagepack) && ($installer::globals::ismacbuild))
+ { # source files are in $(PRODUCTNAME).app where they will
+ # actually copied by the user executing the Language Pack.app
+ $destination =~ s, Language Pack.app/,.app/,;
+ }
+ $instdirdestination = $ENV{'INSTDIR'} . $installer::globals::separator . $destination;
+ }
+ if ($instdirdestination && -f $instdirdestination)
+ {
+ $infoline = "SUCCESS: INSTDIR Source for $onefilename: $instdirdestination\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $$sourcepathref = $instdirdestination;
+ }
+ else
+ {
+ if ( $file_can_miss ) { $sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 0); }
+ else { $sourcepathref = get_sourcepath_from_filename_and_includepath(\$onefilename, $includepatharrayref, 1); }
+ }
+
+ $onefile->{'sourcepath'} = $$sourcepathref; # This $$sourcepathref is empty, if no source was found
+ }
+
+ $infoline = "\n"; # empty line after listing of all files
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+#################################################################################
+# Removing files, that shall not be included into languagepacks
+# (because of rpm conflicts)
+#################################################################################
+
+sub remove_Files_For_Languagepacks
+{
+ my ($itemsarrayref) = @_;
+
+ my $infoline;
+
+ my @newitemsarray = ();
+
+ for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
+ {
+ my $oneitem = ${$itemsarrayref}[$i];
+ my $gid = $oneitem->{'gid'};
+
+ # scp Todo: Remove asap after removal of old setup
+
+ if (( $gid eq "gid_File_Extra_Fontunxpsprint" ) ||
+ ( $gid eq "gid_File_Extra_Migration_Lang" ))
+ {
+ $infoline = "ATTENTION: Removing item $oneitem->{'gid'} from the installation set.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ next;
+ }
+
+ push(@newitemsarray, $oneitem);
+ }
+
+ return \@newitemsarray;
+}
+
+#################################################################################
+# Files, whose source directory is not found, are removed now (this is an ERROR)
+#################################################################################
+
+sub remove_Files_Without_Sourcedirectory
+{
+ my ($filesarrayref) = @_;
+
+ my $infoline;
+
+ my $error_occurred = 0;
+ my @missingfiles = ();
+ push(@missingfiles, "ERROR: The following files could not be found: \n");
+
+ my @newfilesarray = ();
+
+ for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
+ {
+ my $onefile = ${$filesarrayref}[$i];
+ my $sourcepath = $onefile->{'sourcepath'};
+
+ if ($sourcepath eq "")
+ {
+ my $styles = $onefile->{'Styles'};
+ my $filename = $onefile->{'Name'};
+
+ if ( ! $installer::globals::languagepack && !$installer::globals::helppack)
+ {
+ $infoline = "ERROR: Removing file $filename from file list.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ push(@missingfiles, "ERROR: File not found: $filename\n");
+ $error_occurred = 1;
+
+ next; # removing this file from list, if sourcepath is empty
+ }
+ elsif ( $installer::globals::languagepack ) # special case for language packs
+ {
+ if (( $onefile->{'ismultilingual'} ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ ))
+ {
+ $infoline = "ERROR: Removing file $filename from file list.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ push(@missingfiles, "ERROR: File not found: $filename\n");
+ $error_occurred = 1;
+
+ next; # removing this file from list, if sourcepath is empty
+ }
+ else
+ {
+ $infoline = "INFO: Removing file $filename from file list. It is not language dependent.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "INFO: It is not language dependent and can be ignored in language packs.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ next; # removing this file from list, if sourcepath is empty
+ }
+ }
+ else # special case for help packs
+ {
+ if (( $onefile->{'ismultilingual'} ) || ( $styles =~ /\bFORCEHELPPACK\b/ ))
+ {
+ $infoline = "ERROR: Removing file $filename from file list.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ push(@missingfiles, "ERROR: File not found: $filename\n");
+ $error_occurred = 1;
+
+ next; # removing this file from list, if sourcepath is empty
+ }
+ else
+ {
+ $infoline = "INFO: Removing file $filename from file list. It is not language dependent.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "INFO: It is not language dependent and can be ignored in help packs.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ next; # removing this file from list, if sourcepath is empty
+ }
+ }
+ }
+
+ push(@newfilesarray, $onefile);
+ }
+
+ $infoline = "\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ( $error_occurred )
+ {
+ for ( my $i = 0; $i <= $#missingfiles; $i++ ) { print "$missingfiles[$i]"; }
+ installer::exiter::exit_program("ERROR: Missing files", "remove_Files_Without_Sourcedirectory");
+ }
+
+ return \@newfilesarray;
+}
+
+############################################################################
+# License and Readme files in the default language have to be installed
+# in the directory with flag OFFICEDIRECTORY. If this is not defined
+# they have to be installed in the installation root.
+############################################################################
+
+sub get_office_directory_gid_and_hostname
+{
+ my ($dirsarrayref) = @_;
+
+ my $foundofficedir = 0;
+ my $gid = "";
+ my $hostname = "";
+
+ for ( my $i = 0; $i <= $#{$dirsarrayref}; $i++ )
+ {
+ my $onedir = ${$dirsarrayref}[$i];
+ if ( $onedir->{'Styles'} )
+ {
+ my $styles = $onedir->{'Styles'};
+
+ if ( $styles =~ /\bOFFICEDIRECTORY\b/ )
+ {
+ $foundofficedir = 1;
+ $gid = $onedir->{'gid'};
+ $hostname = $onedir->{'HostName'};
+ last;
+ }
+ }
+ }
+
+ return ($foundofficedir, $gid, $hostname);
+}
+
+############################################################################
+# License and Readme files in the default language have to be installed
+# in the installation root (next to the program dir). This is in scp
+# project done by a post install basic script
+############################################################################
+
+sub add_License_Files_into_Installdir
+{
+ my ($filesarrayref, $dirsarrayref, $languagesarrayref) = @_;
+
+ my $infoline;
+
+ my @newfilesarray = ();
+
+ my $defaultlanguage = installer::languages::get_default_language($languagesarrayref);
+
+ my ($foundofficedir, $officedirectorygid, $officedirectoryhostname) = get_office_directory_gid_and_hostname($dirsarrayref);
+
+ # copy all files from directory share/readme, that contain the default language in their name
+ # without default language into the installation root. This makes the settings of the correct
+ # file names superfluous. On the other hand this requires a dependency to the directory
+ # share/readme
+
+ for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
+ {
+ my $onefile = ${$filesarrayref}[$i];
+ my $destination = $onefile->{'destination'};
+ my $styles = "";
+ if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
+
+ if ( ( $destination =~ /share\Q$installer::globals::separator\Ereadme\Q$installer::globals::separator\E(\w+?)_?$defaultlanguage\.?(\w*)\s*/ )
+ || (( $styles =~ /\bROOTLICENSEFILE\b/ ) && ( $destination =~ /\Q$installer::globals::separator\E?(\w+?)_?$defaultlanguage\.?(\w*?)\s*$/ )) )
+ {
+ my $filename = $1;
+ my $extension = $2;
+
+ my $newfilename;
+
+ if ( $extension eq "" ) { $newfilename = $filename; }
+ else { $newfilename = $filename . "\." . $extension; }
+
+ my %newfile = ();
+ my $newfile = \%newfile;
+
+ installer::converter::copy_item_object($onefile, $newfile);
+
+ $newfile->{'gid'} = $onefile->{'gid'} . "_Copy";
+ $newfile->{'Name'} = $newfilename;
+ $newfile->{'ismultilingual'} = "0";
+ $newfile->{'specificlanguage'} = "";
+ $newfile->{'haslanguagemodule'} = "0";
+
+ if ( defined $newfile->{'InstallName'} )
+ {
+ if ( $newfile->{'InstallName'} =~ /^\s*(.*?)_$defaultlanguage\.?(\w*?)\s*$/ )
+ {
+ my $localfilename = $1;
+ my $localextension = $2;
+
+ if ( $localextension eq "" ) { $newfile->{'InstallName'} = $localfilename; }
+ else { $newfile->{'InstallName'} = $localfilename . "\." . $localextension; }
+ }
+ }
+
+ $newfile->{'removelangfromfile'} = "1"; # Important for files with an InstallName, because language also has to be removed there.
+
+ if ( $foundofficedir )
+ {
+ $newfile->{'Dir'} = $officedirectorygid;
+ $newfile->{'destination'} = $officedirectoryhostname . $installer::globals::separator . $newfilename;
+ }
+ else
+ {
+ $newfile->{'Dir'} = "PREDEFINED_PROGDIR";
+ $newfile->{'destination'} = $newfilename;
+ }
+
+ # Also setting "modules=gid_Module_Root_Brand" (module with style: ROOT_BRAND_PACKAGE)
+ if ( $installer::globals::rootbrandpackageset )
+ {
+ $newfile->{'modules'} = $installer::globals::rootbrandpackage;
+ }
+
+ push(@newfilesarray, $newfile);
+
+ $infoline = "New files: Adding file $newfilename for the installation root to the file list. Language: $defaultlanguage\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ( defined $newfile->{'InstallName'} )
+ {
+ $infoline = "New files: Using installation name: $newfile->{'InstallName'}\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ push(@newfilesarray, $onefile);
+ }
+
+ return \@newfilesarray;
+}
+
+############################################################################
+# Some files are included for more than one language and have the same
+# name and the same destination directory for all languages. This would
+# lead to conflicts, if the filenames are not changed.
+# In scp project this files must have the flag MAKE_LANG_SPECIFIC
+# For this files, the language is included into the filename.
+############################################################################
+
+sub make_filename_language_specific
+{
+ my ($filesarrayref) = @_;
+
+ my $infoline = "";
+
+ for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
+ {
+ my $onefile = ${$filesarrayref}[$i];
+
+ if ( $onefile->{'ismultilingual'} )
+ {
+ my $styles = "";
+ if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
+ if ( $styles =~ /\bMAKE_LANG_SPECIFIC\b/ )
+ {
+ my $language = $onefile->{'specificlanguage'};
+ my $olddestination = $onefile->{'destination'};
+ my $oldname = $onefile->{'Name'};
+
+ # Including the language into the file name.
+ # But be sure, to include the language before the file extension.
+
+ my $fileextension = "";
+
+ if ( $onefile->{'Name'} =~ /(\.\w+?)\s*$/ ) { $fileextension = $1; }
+ if ( $fileextension ne "" )
+ {
+ $onefile->{'Name'} =~ s/\Q$fileextension\E\s*$/_$language$fileextension/;
+ $onefile->{'destination'} =~ s/\Q$fileextension\E\s*$/_$language$fileextension/;
+ }
+
+ $infoline = "Flag MAKE_LANG_SPECIFIC:\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "Changing name from $oldname to $onefile->{'Name'} !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "Changing destination from $olddestination to $onefile->{'destination'} !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+}
+
+############################################################################
+# Because of the item "File" the source name must be "Name". Therefore
+# "Copy" is changed to "Name" and "Name" is changed to "DestinationName".
+############################################################################
+
+sub change_keys_of_scpactions
+{
+ my ($itemsarrayref) = @_;
+
+ for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
+ {
+ my $oneitem = ${$itemsarrayref}[$i];
+
+ my $key;
+
+ # First Name to DestinationName, then deleting Name
+ foreach $key (keys %{$oneitem})
+ {
+ if ( $key =~ /\bName\b/ )
+ {
+ my $value = $oneitem->{$key};
+ my $oldkey = $key;
+ $key =~ s/Name/DestinationName/;
+ $oneitem->{$key} = $value;
+ delete($oneitem->{$oldkey});
+ }
+ }
+
+ # Second Copy to Name, then deleting Copy
+ foreach $key (keys %{$oneitem})
+ {
+ if ( $key =~ /\bCopy\b/ )
+ {
+ my $value = $oneitem->{$key};
+ my $oldkey = $key;
+ $key =~ s/Copy/Name/;
+ $oneitem->{$key} = $value;
+ delete($oneitem->{$oldkey});
+ }
+ }
+ }
+}
+
+############################################################################
+# Removing all language pack files from installation set (files with
+# the style LANGUAGEPACK), except this is a language pack.
+############################################################################
+
+sub remove_Languagepacklibraries_from_Installset
+{
+ my ($itemsarrayref) = @_;
+
+ my $infoline;
+
+ my @newitemsarray = ();
+
+ for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
+ {
+ my $oneitem = ${$itemsarrayref}[$i];
+ my $styles = "";
+ if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
+
+ if ( $styles =~ /\bLANGUAGEPACK\b/ )
+ {
+ $infoline = "Removing language pack file $oneitem->{'gid'} from the installation set.\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ next;
+ }
+
+ push(@newitemsarray, $oneitem);
+ }
+
+ $infoline = "\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ return \@newitemsarray;
+}
+
+############################################################################
+# Removing all help pack files from installation set (files with
+# the style HELPPACK), except this is a help pack.
+############################################################################
+
+sub remove_Helppacklibraries_from_Installset
+{
+ my ($itemsarrayref) = @_;
+
+ my $infoline;
+
+ my @newitemsarray = ();
+
+ for ( my $i = 0; $i <= $#{$itemsarrayref}; $i++ )
+ {
+ my $oneitem = ${$itemsarrayref}[$i];
+ my $styles = "";
+ if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
+
+ if ( $styles =~ /\bHELPPACK\b/ )
+ {
+ $infoline = "Removing help pack file $oneitem->{'gid'} from the installation set.\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ next;
+ }
+
+ push(@newitemsarray, $oneitem);
+ }
+
+ $infoline = "\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ return \@newitemsarray;
+}
+
+############################################################################
+# Some files contain a $ in their name. epm conflicts with such files.
+# Solution: Renaming this files, converting "$" to "$$"
+############################################################################
+
+sub quoting_illegal_filenames
+{
+ my ($filesarrayref) = @_;
+
+ # This function has to be removed as soon as possible!
+
+ installer::logger::include_header_into_logfile("Renaming illegal filenames:");
+
+ for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ )
+ {
+ my $onefile = ${$filesarrayref}[$i];
+ my $filename = $onefile->{'Name'};
+
+ if ( $filename =~ /\$/ )
+ {
+ my $sourcepath = $onefile->{'sourcepath'};
+ my $destpath = $onefile->{'destination'};
+
+ # sourcepath and destination have to be quoted for epm list file
+
+ $destpath =~ s/\$/\$\$/g;
+ $sourcepath =~ s/\$/\$\$/g;
+
+ my $infoline = "ATTENTION: Files: Quoting sourcepath $onefile->{'sourcepath'} to $sourcepath\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "ATTENTION: Files: Quoting destination path $onefile->{'destination'} to $destpath\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ $onefile->{'sourcepath'} = $sourcepath;
+ $onefile->{'destination'} = $destpath;
+ }
+ }
+}
+
+############################################################################
+# Removing multiple occurrences of same module.
+############################################################################
+
+sub optimize_list
+{
+ my ( $longlist ) = @_;
+ my %tmpHash;
+
+ $longlist =~ s/^\s+//;
+ $longlist =~ s/\s+$//;
+ $longlist =~ s/\s*,\s*/,/g;
+
+ @tmpHash{split /,/, $longlist} = ();
+ return join(",", sort keys %tmpHash);
+}
+
+#######################################################################
+# Collecting all directories needed for the epm list
+# 1. Looking for all destination paths in the files array
+# 2. Looking for directories with CREATE flag in the directory array
+#######################################################################
+
+##################################
+# Collecting directories: Part 1
+##################################
+
+sub collect_directories_from_filesarray
+{
+ my ($filesarrayref, $unixlinksarrayref) = @_;
+ my @allfiles;
+ push @allfiles, @{$filesarrayref};
+ push @allfiles, @{$unixlinksarrayref};
+
+ my @alldirectories = ();
+ my %alldirectoryhash = ();
+
+ my $predefinedprogdir_added = 0;
+
+ # Preparing this already as hash, although the only needed value at the moment is the HostName
+ # But also adding: "specificlanguage" and "Dir" (for instance gid_Dir_Program)
+
+ for ( my $i = 0; $i <= $#allfiles; $i++ )
+ {
+ my $onefile = $allfiles[$i];
+ my $destinationpath = $onefile->{'destination'};
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationpath);
+ $destinationpath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes or backslashes
+
+ do
+ {
+ if (!exists($alldirectoryhash{$destinationpath}))
+ {
+ my %directoryhash = ();
+ $directoryhash{'HostName'} = $destinationpath;
+ $directoryhash{'specificlanguage'} = $onefile->{'specificlanguage'};
+ $directoryhash{'Dir'} = $onefile->{'Dir'};
+ $directoryhash{'modules'} = $onefile->{'modules'}; # NEW, saving modules
+ $directoryhash{'gid'} = $onefile->{'gid'};
+
+ $predefinedprogdir_added ||= $onefile->{'Dir'} eq "PREDEFINED_PROGDIR";
+
+ $alldirectoryhash{$destinationpath} = \%directoryhash;
+ }
+ else
+ {
+ # Adding the modules to the module list!
+ $alldirectoryhash{$destinationpath}->{'modules'} .= "," . $onefile->{'modules'};
+ # Save file's gid iff this directory appears in only a single
+ # file's FILELIST (so that unused directories will be filtered
+ # out in remove_not_required_spellcheckerlanguage_files, based
+ # on gid):
+ if ($alldirectoryhash{$destinationpath}->{'gid'}
+ ne $onefile->{'gid'})
+ {
+ $alldirectoryhash{$destinationpath}->{'gid'} = '';
+ }
+ }
+ } while ($destinationpath =~ s/(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/$1/); # as long as the path contains slashes
+ }
+
+ # if there is no file in the root directory PREDEFINED_PROGDIR, it has to be included into the directory array now
+ # HostName= specificlanguage= Dir=PREDEFINED_PROGDIR
+
+ if (! $predefinedprogdir_added )
+ {
+ my %directoryhash = ();
+ $directoryhash{'HostName'} = "";
+ $directoryhash{'specificlanguage'} = "";
+ $directoryhash{'modules'} = ""; # ToDo?
+ $directoryhash{'Dir'} = "PREDEFINED_PROGDIR";
+
+ push(@alldirectories, \%directoryhash);
+ }
+
+ # Creating directory array
+ foreach my $destdir ( sort keys %alldirectoryhash )
+ {
+ $alldirectoryhash{$destdir}->{'modules'} = optimize_list($alldirectoryhash{$destdir}->{'modules'});
+ push(@alldirectories, $alldirectoryhash{$destdir});
+ }
+
+ return (\@alldirectories, \%alldirectoryhash);
+}
+
+##################################
+# Collecting directories: Part 2
+##################################
+
+sub collect_directories_with_create_flag_from_directoryarray
+{
+ my ($directoryarrayref, $alldirectoryhash) = @_;
+
+ my $alreadyincluded = 0;
+ my @alldirectories = ();
+
+ for ( my $i = 0; $i <= $#{$directoryarrayref}; $i++ )
+ {
+ my $onedir = ${$directoryarrayref}[$i];
+ my $styles = "";
+ $newdirincluded = 0;
+
+ if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
+
+ if ( $styles =~ /\bCREATE\b/ )
+ {
+ my $directoryname = "";
+
+ if ( $onedir->{'HostName'} ) { $directoryname = $onedir->{'HostName'}; }
+ else { installer::exiter::exit_program("ERROR: No directory name (HostName) set for specified language in gid $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); }
+
+ $alreadyincluded = 0;
+ if ( exists($alldirectoryhash->{$directoryname}) ) { $alreadyincluded = 1; }
+
+ if (!($alreadyincluded))
+ {
+ my %directoryhash = ();
+ $directoryhash{'HostName'} = $directoryname;
+ $directoryhash{'specificlanguage'} = $onedir->{'specificlanguage'};
+ $directoryhash{'Dir'} = $onedir->{'gid'};
+ $directoryhash{'Styles'} = $onedir->{'Styles'};
+
+ # saving also the modules
+ if ( ! $onedir->{'modules'} ) { installer::exiter::exit_program("ERROR: No assigned modules found for directory $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); }
+ $directoryhash{'modules'} = $onedir->{'modules'};
+
+ $alldirectoryhash->{$directoryname} = \%directoryhash;
+ $newdirincluded = 1;
+
+ # Problem: The $destinationpath can be share/registry/schema/org/openoffice
+ # but not all directories contain files and will be added to this list.
+ # Therefore the path has to be analyzed.
+
+ while ( $directoryname =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ ) # as long as the path contains slashes
+ {
+ $directoryname = $1;
+
+ $alreadyincluded = 0;
+ if ( exists($alldirectoryhash->{$directoryname}) ) { $alreadyincluded = 1; }
+
+ if (!($alreadyincluded))
+ {
+ my %directoryhash = ();
+
+ $directoryhash{'HostName'} = $directoryname;
+ $directoryhash{'specificlanguage'} = $onedir->{'specificlanguage'};
+ $directoryhash{'Dir'} = $onedir->{'gid'};
+ if ( ! $installer::globals::iswindowsbuild ) { $directoryhash{'Styles'} = "(CREATE)"; } # Exception for Windows?
+
+ # saving also the modules
+ $directoryhash{'modules'} = $onedir->{'modules'};
+
+ $alldirectoryhash->{$directoryname} = \%directoryhash;
+ $newdirincluded = 1;
+ }
+ else
+ {
+ # Adding the modules to the module list!
+ $alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'};
+ }
+ }
+ }
+ else
+ {
+ # Adding the modules to the module list!
+ $alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'};
+
+ while ( $directoryname =~ /(^.*\S)\Q$installer::globals::separator\E(\S.*?)\s*$/ ) # as long as the path contains slashes
+ {
+ $directoryname = $1;
+ # Adding the modules to the module list!
+ $alldirectoryhash->{$directoryname}->{'modules'} = $alldirectoryhash->{$directoryname}->{'modules'} . "," . $onedir->{'modules'};
+ }
+ }
+ }
+
+ # Saving the styles for already added directories in function collect_directories_from_filesarray
+
+ if (( ! $newdirincluded ) && ( $styles ne "" ))
+ {
+ $styles =~ s/\bWORKSTATION\b//;
+ $styles =~ s/\bCREATE\b//;
+
+ if (( ! ( $styles =~ /^\s*\(\s*\)\s*$/ )) && ( ! ( $styles =~ /^\s*\(\s*\,\s*\)\s*$/ )) && ( ! ( $styles =~ /^\s*$/ ))) # checking, if there are styles left
+ {
+ my $directoryname = "";
+ if ( $onedir->{'HostName'} ) { $directoryname = $onedir->{'HostName'}; }
+ else { installer::exiter::exit_program("ERROR: No directory name (HostName) set for specified language in gid $onedir->{'gid'}", "collect_directories_with_create_flag_from_directoryarray"); }
+
+ if ( exists($alldirectoryhash->{$directoryname}) )
+ {
+ $alldirectoryhash->{$directoryname}->{'Styles'} = $styles;
+ }
+ }
+ }
+ }
+
+ # Creating directory array
+ foreach my $destdir ( sort keys %{$alldirectoryhash} )
+ {
+ $alldirectoryhash->{$destdir}->{'modules'} = optimize_list($alldirectoryhash->{$destdir}->{'modules'});
+ push(@alldirectories, $alldirectoryhash->{$destdir});
+ }
+
+ return (\@alldirectories, \%alldirectoryhash);
+}
+
+#################################################
+# Determining the destination file of a link
+#################################################
+
+sub get_destination_file_path_for_links
+{
+ my ($linksarrayref, $filesarrayref) = @_;
+
+ my $infoline;
+
+ for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ )
+ {
+ my $fileid = "";
+ my $onelink = ${$linksarrayref}[$i];
+ if ( $onelink->{'FileID'} ) { $fileid = $onelink->{'FileID'}; }
+
+ if (!( $fileid eq "" ))
+ {
+ my $foundfile = 0;
+
+ for ( my $j = 0; $j <= $#{$filesarrayref}; $j++ )
+ {
+ my $onefile = ${$filesarrayref}[$j];
+ my $filegid = $onefile->{'gid'};
+
+ if ( $filegid eq $fileid )
+ {
+ $foundfile = 1;
+ $onelink->{'destinationfile'} = $onefile->{'destination'};
+ last;
+ }
+ }
+
+ if (!($foundfile))
+ {
+ $infoline = "Warning: FileID $fileid for Link $onelink->{'gid'} not found!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+
+ $infoline = "\n";
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+#################################################
+# Determining the destination link of a link
+#################################################
+
+sub get_destination_link_path_for_links
+{
+ my ($linksarrayref) = @_;
+
+ my $infoline;
+
+ for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ )
+ {
+ my $shortcutid = "";
+ my $onelink = ${$linksarrayref}[$i];
+ if ( $onelink->{'ShortcutID'} ) { $shortcutid = $onelink->{'ShortcutID'}; }
+
+ if (!( $shortcutid eq "" ))
+ {
+ my $foundlink = 0;
+
+ for ( my $j = 0; $j <= $#{$linksarrayref}; $j++ )
+ {
+ my $destlink = ${$linksarrayref}[$j];
+ $shortcutgid = $destlink->{'gid'};
+
+ if ( $shortcutgid eq $shortcutid )
+ {
+ $foundlink = 1;
+ $onelink->{'destinationfile'} = $destlink->{'destination'}; # making key 'destinationfile'
+ last;
+ }
+ }
+
+ if (!($foundlink))
+ {
+ $infoline = "Warning: ShortcutID $shortcutid for Link $onelink->{'gid'} not found!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+
+ $infoline = "\n";
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+###################################################################################
+# Items with flag WORKSTATION are not needed (here: links and configurationitems)
+###################################################################################
+
+sub remove_workstation_only_items
+{
+ my ($itemarrayref) = @_;
+
+ my @newitemarray = ();
+
+ for ( my $i = 0; $i <= $#{$itemarrayref}; $i++ )
+ {
+ my $oneitem = ${$itemarrayref}[$i];
+ my $styles = $oneitem->{'Styles'};
+
+ if (( $styles =~ /\bWORKSTATION\b/ ) &&
+ (!( $styles =~ /\bNETWORK\b/ )) &&
+ (!( $styles =~ /\bSTANDALONE\b/ )))
+ {
+ next; # removing this link, it is only needed for a workstation installation
+ }
+
+ push(@newitemarray, $oneitem);
+ }
+
+ return \@newitemarray;
+}
+
+################################################
+# Resolving relative path in links
+################################################
+
+sub resolve_links_with_flag_relative
+{
+ my ($linksarrayref) = @_;
+
+ # Before this step is:
+ # destination=program/libsalhelperC52.so.3, this will be the name of the link
+ # destinationfile=program/libsalhelperC52.so.3, this will be the linked file or name
+ # If the flag RELATIVE is set, the paths have to be analyzed. If the flag is not set
+ # (this will not occur in the future?) destinationfile has to be an absolute path name
+
+ for ( my $i = 0; $i <= $#{$linksarrayref}; $i++ )
+ {
+ my $onelink = ${$linksarrayref}[$i];
+ my $styles = $onelink->{'Styles'};
+
+ if ( $styles =~ /\bRELATIVE\b/ )
+ {
+ # ToDo: This is only a simple not sufficient mechanism
+
+ my $destination = $onelink->{'destination'};
+ my $destinationfile = $onelink->{'destinationfile'};
+
+ my $destinationpath = $destination;
+
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationpath);
+
+ my $destinationfilepath = $destinationfile;
+
+ # it is possible, that the destinationfile is no longer part of the files collector
+ if ($destinationfilepath) { installer::pathanalyzer::get_path_from_fullqualifiedname(\$destinationfilepath); }
+ else { $destinationfilepath = ""; }
+
+ if ( $destinationpath eq $destinationfilepath )
+ {
+ # link and file are in the same directory
+ # Therefore the path of the file can be removed
+
+ my $newdestinationfile = $destinationfile;
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$newdestinationfile);
+
+ $onelink->{'destinationfile'} = $newdestinationfile;
+ }
+ }
+ }
+}
+
+########################################################################
+# This function is a helper of function "assigning_modules_to_items"
+########################################################################
+
+sub insert_for_item ($$$)
+{
+ my ($hash, $item, $id) = @_;
+
+ if (!defined $hash->{$item})
+ {
+ my @gids = ();
+ $hash->{$item} = \@gids;
+ }
+ my $gid_list = $hash->{$item};
+ push @{$gid_list}, $id;
+ $hash->{$item} = $gid_list;
+}
+
+sub build_modulegids_table
+{
+ my ($modulesref, $itemname) = @_;
+
+ my %module_lookup_table = ();
+
+ # build map of item names to list of respective module gids
+ # containing these items
+ for my $onemodule (@{$modulesref})
+ {
+ next if ( ! defined $onemodule->{$itemname} );
+ # these are the items contained in this module
+ # eg. Files = (gid_a_b_c,gid_d_e_f)
+ my $module_gids = $onemodule->{$itemname};
+
+ # prune outer brackets
+ $module_gids =~ s|^\s*\(||g;
+ $module_gids =~ s|\)\s*$||g;
+ for my $id (split (/,/, $module_gids))
+ {
+ chomp $id;
+ insert_for_item(\%module_lookup_table, lc ($id), $onemodule->{'gid'});
+ }
+ }
+
+ return \%module_lookup_table;
+}
+
+########################################################################
+# Items like files do not know their modules
+# This function is a helper of function "assigning_modules_to_items"
+########################################################################
+
+sub get_string_of_modulegids_for_itemgid
+{
+ my ($module_lookup_table, $modulesref, $itemgid, $itemname) = @_;
+
+ my $allmodules = "";
+ my $haslanguagemodule = 0;
+ my %foundmodules = ();
+
+ my $gid_list = $module_lookup_table->{lc($itemgid)};
+
+ for my $gid (@{$gid_list})
+ {
+ $foundmodules{$gid} = 1;
+ $allmodules = $allmodules . "," . $gid;
+ # Is this module a language module? This info should be stored at the file.
+ if ( exists($installer::globals::alllangmodules{$gid}) ) { $haslanguagemodule = 1; }
+ }
+
+ $allmodules =~ s/^\s*\,//; # removing leading comma
+
+ # Check: All modules or no module must have flag LANGUAGEMODULE
+ if ( $haslanguagemodule )
+ {
+ my $isreallylanguagemodule = _key_in_a_is_also_key_in_b(\%foundmodules, \%installer::globals::alllangmodules);
+ if ( ! $isreallylanguagemodule ) { installer::exiter::exit_program("ERROR: \"$itemgid\" is assigned to modules with flag \"LANGUAGEMODULE\" and also to modules without this flag! Modules: $allmodules", "get_string_of_modulegids_for_itemgid"); }
+ }
+
+ return ($allmodules, $haslanguagemodule);
+}
+
+########################################################
+# Items like files do not know their modules
+# This function add the {'modules'} to these items
+########################################################
+
+sub assigning_modules_to_items
+{
+ my ($modulesref, $itemsref, $itemname) = @_;
+
+ my $infoline = "";
+ my $languageassignmenterror = 0;
+ my @languageassignmenterrors = ();
+
+ my $module_lookup_table = build_modulegids_table($modulesref, $itemname);
+
+ for my $oneitem (@{$itemsref})
+ {
+ my $itemgid = $oneitem->{'gid'};
+
+ my $styles = "";
+ if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
+ if (( $itemname eq "Dirs" ) && ( ! ( $styles =~ /\bCREATE\b/ ))) { next; }
+
+ if ( $itemgid eq "" )
+ {
+ installer::exiter::exit_program("ERROR in item collection: No gid for item $oneitem->{'Name'}", "assigning_modules_to_items");
+ }
+
+ # every item can belong to many modules
+
+ my ($modulegids, $haslanguagemodule) = get_string_of_modulegids_for_itemgid($module_lookup_table, $modulesref, $itemgid, $itemname);
+
+ if ($modulegids eq "")
+ {
+ installer::exiter::exit_program("ERROR in file collection: No module found for $itemname $itemgid", "assigning_modules_to_items");
+ }
+
+ $oneitem->{'modules'} = $modulegids;
+ $oneitem->{'haslanguagemodule'} = $haslanguagemodule;
+
+ # Important check: "ismultilingual" and "haslanguagemodule" must have the same value !
+ if (( $oneitem->{'ismultilingual'} ) && ( ! $oneitem->{'haslanguagemodule'} ))
+ {
+ $infoline = "Error: \"$oneitem->{'gid'}\" is multi lingual, but not in language pack (Assigned module: $modulegids)!\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ push( @languageassignmenterrors, $infoline );
+ $languageassignmenterror = 1;
+ }
+ if (( $oneitem->{'haslanguagemodule'} ) && ( ! $oneitem->{'ismultilingual'} ))
+ {
+ $infoline = "Error: \"$oneitem->{'gid'}\" is in language pack, but not multi lingual (Assigned module: $modulegids)!\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ push( @languageassignmenterrors, $infoline );
+ $languageassignmenterror = 1;
+ }
+ }
+
+ if ($languageassignmenterror)
+ {
+ for ( my $i = 0; $i <= $#languageassignmenterrors; $i++ ) { print "$languageassignmenterrors[$i]"; }
+ installer::exiter::exit_program("ERROR: Incorrect assignments for language packs.", "assigning_modules_to_items");
+ }
+
+}
+
+#################################################################################################
+# Root path (for instance /opt/openofficeorg20) needs to be added to directories, files and links
+#################################################################################################
+
+sub add_rootpath_to_directories
+{
+ my ($dirsref, $rootpath) = @_;
+
+ for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
+ {
+ my $onedir = ${$dirsref}[$i];
+ my $dir = "";
+
+ if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; }
+
+ if (!($dir =~ /\bPREDEFINED_/ ))
+ {
+ my $hostname = $onedir->{'HostName'};
+ $hostname = $rootpath . $installer::globals::separator . $hostname;
+ $onedir->{'HostName'} = $hostname;
+ }
+
+ # added
+
+ if ( $dir =~ /\bPREDEFINED_PROGDIR\b/ )
+ {
+ my $hostname = $onedir->{'HostName'};
+ if ( $hostname eq "" ) { $onedir->{'HostName'} = $rootpath; }
+ else { $onedir->{'HostName'} = $rootpath . $installer::globals::separator . $hostname; }
+ }
+ }
+}
+
+sub add_rootpath_to_files
+{
+ my ($filesref, $rootpath) = @_;
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+ my $destination = $onefile->{'destination'};
+ $destination = $rootpath . $installer::globals::separator . $destination;
+ $onefile->{'destination'} = $destination;
+ }
+}
+
+sub add_rootpath_to_links
+{
+ my ($linksref, $rootpath) = @_;
+
+ for ( my $i = 0; $i <= $#{$linksref}; $i++ )
+ {
+ my $onelink = ${$linksref}[$i];
+ my $styles = $onelink->{'Styles'};
+
+ my $destination = $onelink->{'destination'};
+ $destination = $rootpath . $installer::globals::separator . $destination;
+ $onelink->{'destination'} = $destination;
+
+ if (!($styles =~ /\bRELATIVE\b/ )) # for absolute links
+ {
+ my $destinationfile = $onelink->{'destinationfile'};
+ $destinationfile = $rootpath . $installer::globals::separator . $destinationfile;
+ $onelink->{'destinationfile'} = $destinationfile;
+ }
+ }
+}
+
+#################################################################################
+# Collecting all parent gids
+#################################################################################
+
+sub collect_all_parent_feature
+{
+ my ($modulesref) = @_;
+
+ my @allparents = ();
+
+ my $found_root_module = 0;
+
+ for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
+ {
+ my $onefeature = ${$modulesref}[$i];
+
+ my $parentgid = "";
+ if ( $onefeature->{'ParentID'} )
+ {
+ $parentgid = $onefeature->{'ParentID'};
+ }
+
+ if ( $parentgid ne "" )
+ {
+ if (! grep {$_ eq $parentgid} @allparents)
+ {
+ push(@allparents, $parentgid);
+ }
+ }
+
+ # Setting the global root module
+
+ if ( $parentgid eq "" )
+ {
+ if ( $found_root_module ) { installer::exiter::exit_program("ERROR: Only one module without ParentID or with empty ParentID allowed ($installer::globals::rootmodulegid, $onefeature->{'gid'}).", "collect_all_parent_feature"); }
+ $installer::globals::rootmodulegid = $onefeature->{'gid'};
+ $found_root_module = 1;
+ $infoline = "Setting Root Module: $installer::globals::rootmodulegid\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ }
+
+ if ( ! $found_root_module ) { installer::exiter::exit_program("ERROR: Could not define root module. No module without ParentID or with empty ParentID exists.", "collect_all_parent_feature"); }
+
+ }
+
+ return \@allparents;
+}
+
+#################################################################################
+# Checking for every feature, whether it has children
+#################################################################################
+
+sub set_children_flag
+{
+ my ($modulesref) = @_;
+
+ my $allparents = collect_all_parent_feature($modulesref);
+
+ for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
+ {
+ my $onefeature = ${$modulesref}[$i];
+ my $gid = $onefeature->{'gid'};
+
+ # is this gid a parent?
+
+ if ( grep {$_ eq $gid} @{$allparents} )
+ {
+ $onefeature->{'has_children'} = 1;
+ }
+ else
+ {
+ $onefeature->{'has_children'} = 0;
+ }
+ }
+}
+
+#################################################################################
+# All modules, that use a template module, do now get the assignments of
+# the template module.
+#################################################################################
+
+sub resolve_assigned_modules
+{
+ my ($modulesref) = @_;
+
+ # collecting all template modules
+
+ my %directaccess = ();
+
+ for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
+ {
+ my $onefeature = ${$modulesref}[$i];
+ my $styles = "";
+ if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
+ if ( $styles =~ /\bTEMPLATEMODULE\b/ ) { $directaccess{$onefeature->{'gid'}} = $onefeature; }
+
+ # also looking for module with flag ROOT_BRAND_PACKAGE, to save is for further usage
+ if ( $styles =~ /\bROOT_BRAND_PACKAGE\b/ )
+ {
+ $installer::globals::rootbrandpackage = $onefeature->{'gid'};
+ $installer::globals::rootbrandpackageset = 1;
+ }
+ }
+
+ # looking, where template modules are assigned
+
+ for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
+ {
+ my $onefeature = ${$modulesref}[$i];
+ if ( $onefeature->{'Assigns'} )
+ {
+ my $templategid = $onefeature->{'Assigns'};
+
+ if ( ! exists($directaccess{$templategid}) )
+ {
+ installer::exiter::exit_program("ERROR: Did not find definition of assigned template module \"$templategid\"", "resolve_assigned_modules");
+ }
+
+ # Currently no merging of Files, Dirs, ...
+ # This has to be included here, if it is required
+ my @items_at_modules = ("Files", "Dirs", "Unixlinks");
+ for my $item (@items_at_modules)
+ {
+ if ( exists($directaccess{$templategid}->{$item}) ) { $onefeature->{$item} = $directaccess{$templategid}->{$item}; }
+ }
+ }
+ }
+}
+
+#################################################################################
+# Removing the template modules from the list, after all
+# assignments are transferred to the "real" modules.
+#################################################################################
+
+sub remove_template_modules
+{
+ my ($modulesref) = @_;
+
+ my @modules = ();
+
+ for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
+ {
+ my $onefeature = ${$modulesref}[$i];
+ my $styles = "";
+ if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
+ if ( $styles =~ /\bTEMPLATEMODULE\b/ ) { next; }
+
+ push(@modules, $onefeature);
+ }
+
+ return \@modules;
+}
+
+#################################################################################
+# Collecting all modules with flag LANGUAGEMODULE in a global
+# collector.
+#################################################################################
+
+sub collect_all_languagemodules
+{
+ my ($modulesref) = @_;
+
+ for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
+ {
+ my $onefeature = ${$modulesref}[$i];
+ my $styles = "";
+ if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
+ if ( $styles =~ /\bLANGUAGEMODULE\b/ )
+ {
+ if ( ! exists($onefeature->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$onefeature->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "collect_all_languagemodules"); }
+ $installer::globals::alllangmodules{$onefeature->{'gid'}} = $onefeature->{'Language'};
+ # Collecting also the english names, that are used for nsis unpack directory for language packs
+ my $lang = $onefeature->{'Language'};
+ my $name = "";
+ foreach my $localkey ( keys %{$onefeature} )
+ {
+ if ( $localkey =~ /^\s*Name\s*\(\s*en-US\s*\)\s*$/ )
+ {
+ $installer::globals::all_english_languagestrings{$lang} = $onefeature->{$localkey};
+ }
+ }
+ }
+ }
+}
+
+#################################################################################
+# Selecting from all collected english language strings those, that are really
+# required in this installation set.
+#################################################################################
+
+sub select_required_language_strings
+{
+ my ($modulesref) = @_;
+
+ for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
+ {
+ my $onefeature = ${$modulesref}[$i];
+ my $styles = "";
+ if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
+ if ( $styles =~ /\bLANGUAGEMODULE\b/ )
+ {
+ if ( ! exists($onefeature->{'Language'}) ) { installer::exiter::exit_program("ERROR: \"$onefeature->{'gid'}\" has flag LANGUAGEMODULE, but does not know its language!", "select_required_language_strings"); }
+ my $lang = $onefeature->{'Language'};
+
+ if (( exists($installer::globals::all_english_languagestrings{$lang}) ) && ( ! exists($installer::globals::all_required_english_languagestrings{$lang}) ))
+ {
+ $installer::globals::all_required_english_languagestrings{$lang} = $installer::globals::all_english_languagestrings{$lang};
+ }
+ }
+ }
+}
+
+################################################
+# Controlling that all keys in hash A are
+# also key in hash B.
+################################################
+
+sub _key_in_a_is_also_key_in_b
+{
+ my ( $hashref_a, $hashref_b) = @_;
+
+ my $returnvalue = 1;
+
+ my $key;
+ foreach $key ( keys %{$hashref_a} )
+ {
+ if ( ! exists($hashref_b->{$key}) )
+ {
+ print "*****\n";
+ foreach $keyb ( keys %{$hashref_b} ) { print "$keyb : $hashref_b->{$keyb}\n"; }
+ print "*****\n";
+ $returnvalue = 0;
+ }
+ }
+
+ return $returnvalue;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/setupscript.pm b/solenv/bin/modules/installer/setupscript.pm
new file mode 100644
index 000000000..6eefe01f0
--- /dev/null
+++ b/solenv/bin/modules/installer/setupscript.pm
@@ -0,0 +1,486 @@
+#
+# 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 .
+#
+
+package installer::setupscript;
+
+use base 'Exporter';
+
+use installer::exiter;
+use installer::globals;
+use installer::logger qw(globallog);
+use installer::remover;
+use installer::scriptitems;
+use installer::ziplist;
+
+our @EXPORT_OK = qw(
+ add_installationobject_to_variables
+ add_lowercase_productname_setupscriptvariable
+ add_predefined_folder
+ get_all_items_from_script
+ get_all_scriptvariables_from_installation_object
+ prepare_non_advertised_files
+ replace_all_setupscriptvariables_in_script
+ replace_preset_properties
+ resolve_lowercase_productname_setupscriptvariable
+ set_setupscript_name
+);
+
+#######################################################
+# Set setup script name, if not defined as parameter
+#######################################################
+
+sub set_setupscript_name
+{
+ my ( $allsettingsarrayref, $includepatharrayref ) = @_;
+
+ my $scriptnameref = installer::ziplist::getinfofromziplist($allsettingsarrayref, "script");
+
+ my $scriptname = $$scriptnameref;
+
+ if ( $scriptname eq "" ) # not defined on command line and not in product list
+ {
+ installer::exiter::exit_program("ERROR: Setup script not defined on command line (-l) and not in product list!", "set_setupscript_name");
+ }
+
+ if ( $installer::globals::os eq 'WNT')
+ {
+ $scriptname .= ".inf";
+ }
+ else
+ {
+ $scriptname .= ".ins";
+ }
+
+ # and now the complete path for the setup script is needed
+ # The log file cannot be used, because this is the language independent section
+
+ $scriptnameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$scriptname, $includepatharrayref, 1);
+
+ $installer::globals::setupscriptname = $$scriptnameref;
+
+ if ( $installer::globals::setupscriptname eq "" )
+ {
+ installer::exiter::exit_program("ERROR: Script $scriptname not found!", "set_setupscript_name");
+ }
+}
+
+#####################################################################
+# Reading script variables from installation object of script file
+#####################################################################
+
+sub get_all_scriptvariables_from_installation_object
+{
+ my ($scriptref) = @_;
+
+ my @installobjectvariables;
+
+ for ( my $i = 0; $i <= $#{$scriptref}; $i++ )
+ {
+ my $line = ${$scriptref}[$i];
+
+ if ( $line =~ /^\s*Installation\s+\w+\s*$/ ) # should be the first line
+ {
+ my $counter = $i+1;
+ my $installline = ${$scriptref}[$counter];
+
+ while (!($installline =~ /^\s*End\s*$/ ))
+ {
+ if ( $installline =~ /^\s*(\w+)\s+\=\s*(.*?)\s*\;\s*$/ )
+ {
+ my $key = $1;
+ my $value = $2;
+
+ # removing leading and ending " in $value
+
+ if ( $value =~ /^\s*\"(.*)\"\s*$/ )
+ {
+ $value = $1;
+ }
+
+ $key = "\%" . uc($key); # $key is %PRODUCTNAME
+
+ my $input = $key . " " . $value . "\n"; # $key can only be the first word
+
+ push(@installobjectvariables ,$input);
+ }
+
+ $counter++;
+ $installline = ${$scriptref}[$counter];
+ }
+ }
+
+ last; # not interesting after installation object
+ }
+
+ return \@installobjectvariables;
+}
+
+######################################################################
+# Including LCPRODUCTNAME into the array
+######################################################################
+
+sub add_lowercase_productname_setupscriptvariable
+{
+ my ( $variablesref ) = @_;
+
+ for ( my $j = 0; $j <= $#{$variablesref}; $j++ )
+ {
+ my $variableline = ${$variablesref}[$j];
+
+ my ($key, $value);
+
+ if ( $variableline =~ /^\s*\%(\w+?)\s+(.*?)\s*$/ )
+ {
+ $key = $1;
+ $value = $2;
+
+ if ( $key eq "PRODUCTNAME" )
+ {
+ my $newline = "\%LCPRODUCTNAME " . lc($value) . "\n";
+ push(@{$variablesref} ,$newline);
+ my $original = $value;
+ $value =~ s/\s*//g;
+ $newline = "\%ONEWORDPRODUCTNAME " . $value . "\n";
+ push(@{$variablesref} ,$newline);
+ $newline = "\%LCONEWORDPRODUCTNAME " . lc($value) . "\n";
+ push(@{$variablesref} ,$newline);
+ $value = $original;
+ $value =~ s/\s*$//g;
+ $value =~ s/^\s*//g;
+ $value =~ s/ /\%20/g;
+ $newline = "\%MASKEDPRODUCTNAME " . $value . "\n";
+ push(@{$variablesref} ,$newline);
+ $value = $original;
+ $value =~ s/\s/\_/g;
+ $newline = "\%UNIXPRODUCTNAME " . lc($value) . "\n";
+ push(@{$variablesref} ,$newline);
+ $newline = "\%SYSTEMINTUNIXPACKAGENAME " . lc($value) . "\n";
+ push(@{$variablesref} ,$newline);
+ $newline = "\%UNIXPACKAGENAME " . lc($value) . "\n";
+ push(@{$variablesref} ,$newline);
+ $value = $original;
+ $value =~ s/\s/\_/g;
+ $value =~ s/\.//g;
+ $newline = "\%WITHOUTDOTUNIXPRODUCTNAME " . lc($value) . "\n";
+ push(@{$variablesref} ,$newline);
+ $newline = "\%WITHOUTDOTUNIXPACKAGENAME " . lc($value) . "\n";
+ push(@{$variablesref} ,$newline);
+ $newline = "\%SOLARISBRANDPACKAGENAME " . lc($value) . "\n";
+ push(@{$variablesref} ,$newline);
+ $value = $original;
+ }
+ elsif ( $key eq "PRODUCTEXTENSION" )
+ {
+ my $newline = "\%LCPRODUCTEXTENSION " . lc($value) . "\n";
+ push(@{$variablesref} ,$newline);
+ }
+ elsif ( $key eq "PRODUCTVERSION" )
+ {
+ $value =~ s/\.//g;
+ my $newline = "\%WITHOUTDOTPRODUCTVERSION " . $value . "\n";
+ push(@{$variablesref} ,$newline);
+ }
+ }
+ }
+}
+
+######################################################################
+# Resolving the new introduced lowercase script variables
+######################################################################
+
+sub resolve_lowercase_productname_setupscriptvariable
+{
+ my ( $variablesref ) = @_;
+
+ my %variables = ();
+
+ # First step: Collecting variables
+
+ for ( my $j = 0; $j <= $#{$variablesref}; $j++ )
+ {
+ my $variableline = ${$variablesref}[$j];
+
+ my ($key, $value);
+
+ if ( $variableline =~ /^\s*\%(\w+?)\s+(.*?)\s*$/ )
+ {
+ $key = $1;
+ $value = $2;
+ $variables{$key} = $value;
+ }
+ }
+
+ # Second step: Resolving variables
+
+ for ( my $j = 0; $j <= $#{$variablesref}; $j++ )
+ {
+ if ( ${$variablesref}[$j] =~ /\$\{(.*?)\}/ )
+ {
+ my $key = $1;
+ ${$variablesref}[$j] =~ s/\$\{\Q$key\E\}/$variables{$key}/g;
+ }
+ }
+
+}
+
+######################################################################
+# Replacing all setup script variables inside the setup script file
+######################################################################
+
+sub replace_all_setupscriptvariables_in_script
+{
+ my ( $scriptref, $variablesref ) = @_;
+
+ globallog("Replacing variables in setup script (start)");
+
+ # make hash of variables to be substituted if they appear in the script
+ my %subs;
+ for ( my $j = 0; $j <= $#{$variablesref}; $j++ )
+ {
+ my $variableline = ${$variablesref}[$j];
+
+ if ( $variableline =~ /^\s*(\%\w+?)\s+(.*?)\s*$/ )
+ {
+ $subs{$1}= $2;
+ }
+ }
+
+ # This is far faster than running a regexp for each line
+ my $bigstring = '';
+ for my $line (@{$scriptref}) { $bigstring = $bigstring . $line; }
+
+ foreach my $key (sort { length ($b) <=> length ($a) } keys %subs)
+ {
+ # Attention: It must be possible to substitute "%PRODUCTNAMEn", "%PRODUCTNAME%PRODUCTVERSIONabc"
+ my $value = $subs{$key};
+ $bigstring =~ s/$key/$value/g;
+ }
+
+ my @newlines = split /\n/, $bigstring;
+ $scriptref = \@newlines;
+
+ # now check for any mis-named '%' variables that we have left
+ my $num = 0;
+ for my $check (@newlines)
+ {
+ $num++;
+ if ( $check =~ /^.*\%\w+.*$/ )
+ {
+ if (( $check =~ /%1/ ) || ( $check =~ /%2/ ) || ( $check =~ /%verify/ )) { next; }
+ my $infoline = "WARNING: mis-named or un-known '%' variable in setup script at line $num:\n$check\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ }
+ }
+
+ globallog("Replacing variables in setup script (end)");
+
+ return $scriptref;
+}
+
+#######################################################################
+# Collecting all items of the type "searchitem" from the setup script
+#######################################################################
+
+sub get_all_items_from_script
+{
+ my ($scriptref, $searchitem) = @_;
+
+ my @allitemarray = ();
+
+ my ($itemkey, $itemvalue);
+
+ for ( my $i = 0; $i <= $#{$scriptref}; $i++ )
+ {
+ my $line = ${$scriptref}[$i];
+
+ next unless ($line =~ /^\s*\Q$searchitem\E\s+(\S+)\s*$/);
+ my $gid = $1;
+
+ my %oneitemhash = ();
+ my $ismultilang = 0;
+
+ $oneitemhash{'gid'} = $gid;
+
+ while (!( $line =~ /^\s*End\s*$/ ))
+ {
+ if ( $i >= $#{$scriptref} ) {
+ installer::exiter::exit_program("Invalid setup script file. End of file reached before 'End' line of '$searchitem' section.", "get_all_items_from_script");
+ }
+ $line = ${$scriptref}[++$i];
+
+ if ( $line =~ /^\s*(.+?)\=\s*(.+?)\;\s*$/ ) # only oneliner!
+ {
+ $itemkey = $1;
+ $itemvalue = $2;
+
+ $itemkey =~ s/\s+$//;
+ $itemvalue =~ s/\s+$//;
+
+ installer::remover::remove_leading_and_ending_quotationmarks(\$itemvalue);
+
+ $oneitemhash{$itemkey} = $itemvalue;
+
+ $ismultilang ||= $itemkey =~ /^\S+\s+\(\S+\)$/;
+ }
+ elsif (($searchitem eq "Module") &&
+ ($line =~ /^\s*.+?\s*\=\s*\(/) &&
+ (!($line =~ /\)\;\s*$/))) # more than one line, for instance files at modules!
+ {
+ $line =~ /^\s*(.+?)\s*\=\s*(.+?)\s*$/; # the first line
+ $itemkey = $1;
+ $itemvalue = $2;
+
+ # collecting the complete itemvalue
+ do
+ {
+ if ( $i >= $#{$scriptref} ) {
+ installer::exiter::exit_program("Invalid setup script file. Premature end of file.", "get_all_items_from_script");
+ }
+ $line = ${$scriptref}[++$i];
+ installer::remover::remove_leading_and_ending_whitespaces(\$line);
+ $itemvalue .= $line;
+ } while (!($line =~ /\)\;\s*$/));
+
+ # removing ending ";"
+ $itemvalue =~ s/\;\s*$//;
+
+ $oneitemhash{$itemkey} = $itemvalue;
+
+ $ismultilang ||= $itemkey =~ /^\S+\s+\(\S+\)$/;
+ }
+ }
+
+ $oneitemhash{'ismultilingual'} = $ismultilang+0;
+
+ push(@allitemarray, \%oneitemhash);
+ }
+
+ return \@allitemarray;
+}
+
+######################################################################
+# Collecting all folder at folderitems, that are predefined values
+# For example: PREDEFINED_AUTOSTART
+######################################################################
+
+sub add_predefined_folder
+{
+ my ( $folderitemref, $folderref ) = @_;
+
+ for my $folderid ( map { $_->{FolderID} } @{$folderitemref} ) {
+ # FIXME: Anchor to start of line?
+ next unless ( $folderid =~ /PREDEFINED_/ );
+ next if grep { $_->{gid} eq $folderid } @{$folderref};
+
+ push @{$folderref}, {
+ ismultilingual => 0,
+ Name => "",
+ gid => $folderid,
+ };
+ }
+}
+
+#####################################################################################
+# If folderitems are non-advertised, the component needs to have a registry key
+# below HKCU as key path. Therefore it is required, to mark the file belonging
+# to a non-advertised shortcut, that a special userreg_xxx registry key can be
+# created during packing process.
+#####################################################################################
+
+sub prepare_non_advertised_files
+{
+ my ( $folderitemref, $filesref ) = @_;
+
+ for ( my $i = 0; $i <= $#{$folderitemref}; $i++ )
+ {
+ my $folderitem = ${$folderitemref}[$i];
+ my $styles = "";
+ if ( $folderitem->{'Styles'} ) { $styles = $folderitem->{'Styles'}; }
+
+ if ( $styles =~ /\bNON_ADVERTISED\b/ )
+ {
+ my $fileid = $folderitem->{'FileID'};
+ if ( $folderitem->{'ComponentIDFile'} ) { $fileid = $folderitem->{'ComponentIDFile'}; }
+ my $onefile = installer::worker::find_file_by_id($filesref, $fileid);
+
+ if ( $onefile ne "" ) { $onefile->{'needs_user_registry_key'} = 1; }
+ else {
+ installer::exiter::exit_program("ERROR: Did not find FileID $fileid in file collection", "prepare_non_advertised_files");
+ }
+ }
+ }
+}
+
+#####################################################################################
+# Adding all variables defined in the installation object into the hash
+# of all variables from the zip list file.
+# This is needed if variables are defined in the installation object,
+# but not in the zip list file.
+# If there is a definition in the zip list file and in the installation
+# object, the installation object is more important
+#####################################################################################
+
+sub add_installationobject_to_variables
+{
+ my ($allvariables, $allscriptvariablesref) = @_;
+
+ for ( my $i = 0; $i <= $#{$allscriptvariablesref}; $i++ )
+ {
+ my $line = ${$allscriptvariablesref}[$i];
+
+ if ( $line =~ /^\s*\%(\w+)\s+(.*?)\s*$/ )
+ {
+ my $key = $1;
+ my $value = $2;
+
+ $allvariables->{$key} = $value; # overwrite existing values from zip.lst
+ }
+ }
+}
+
+#####################################################################################
+# Some properties are created automatically. It should be possible to
+# overwrite them, with PRESET properties. For example UNIXPRODUCTNAME
+# with PRESETUNIXPRODUCTNAME, if this is defined and the automatic process
+# does not deliver the desired results.
+#####################################################################################
+
+sub replace_preset_properties
+{
+ my ($allvariables) = @_;
+
+ # SOLARISBRANDPACKAGENAME
+ # needs to be replaced by
+ # PRESETSOLARISBRANDPACKAGENAME
+
+ my @presetproperties = ();
+ push(@presetproperties, "SOLARISBRANDPACKAGENAME");
+ push(@presetproperties, "SYSTEMINTUNIXPACKAGENAME");
+
+
+ foreach $property ( @presetproperties )
+ {
+ my $presetproperty = "PRESET" . $property;
+ if (( exists($allvariables->{$presetproperty}) ) && ( $allvariables->{$presetproperty} ne "" ))
+ {
+ $allvariables->{$property} = $allvariables->{$presetproperty};
+ }
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/simplepackage.pm b/solenv/bin/modules/installer/simplepackage.pm
new file mode 100644
index 000000000..e681a00ff
--- /dev/null
+++ b/solenv/bin/modules/installer/simplepackage.pm
@@ -0,0 +1,732 @@
+#
+# 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 .
+#
+
+package installer::simplepackage;
+
+use Cwd;
+use File::Copy;
+use installer::download;
+use installer::exiter;
+use installer::globals;
+use installer::logger;
+use installer::strip qw(strip_libraries);
+use installer::systemactions;
+use installer::worker;
+
+####################################################
+# Checking if the simple packager is required.
+# This can be achieved by setting the global
+# variable SIMPLE_PACKAGE in *.lst file or by
+# setting the environment variable SIMPLE_PACKAGE.
+####################################################
+
+sub check_simple_packager_project
+{
+ my ( $allvariables ) = @_;
+
+ if (( $installer::globals::packageformat eq "installed" ) ||
+ ( $installer::globals::packageformat eq "archive" ))
+ {
+ $installer::globals::is_simple_packager_project = 1;
+ $installer::globals::patch_user_dir = 1;
+ }
+ elsif( $installer::globals::packageformat eq "dmg" )
+ {
+ $installer::globals::is_simple_packager_project = 1;
+ }
+}
+
+####################################################
+# Detecting the directory with extensions
+####################################################
+
+sub get_extensions_dir
+{
+ my ( $subfolderdir ) = @_;
+
+ my $extensiondir = $subfolderdir . $installer::globals::separator;
+ if ( $installer::globals::officedirhostname ne "" ) { $extensiondir = $extensiondir . $installer::globals::officedirhostname . $installer::globals::separator; }
+ my $extensionsdir = $extensiondir . "share" . $installer::globals::separator . "extensions";
+
+ return $extensionsdir;
+}
+
+##################################################################
+# Collecting all identifier from ulf file
+##################################################################
+
+sub get_identifier
+{
+ my ( $translationfile ) = @_;
+
+ my @identifier = ();
+
+ for ( my $i = 0; $i <= $#{$translationfile}; $i++ )
+ {
+ my $oneline = ${$translationfile}[$i];
+
+ if ( $oneline =~ /^\s*\[(.+)\]\s*$/ )
+ {
+ my $identifier = $1;
+ push(@identifier, $identifier);
+ }
+ }
+
+ return \@identifier;
+}
+
+##############################################################
+# Returning the complete block in all languages
+# for a specified string
+##############################################################
+
+sub get_language_block_from_language_file
+{
+ my ($searchstring, $languagefile) = @_;
+
+ my @language_block = ();
+
+ for ( my $i = 0; $i <= $#{$languagefile}; $i++ )
+ {
+ if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ )
+ {
+ my $counter = $i;
+
+ push(@language_block, ${$languagefile}[$counter]);
+ $counter++;
+
+ while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ )))
+ {
+ push(@language_block, ${$languagefile}[$counter]);
+ $counter++;
+ }
+
+ last;
+ }
+ }
+
+ return \@language_block;
+}
+
+##############################################################
+# Returning a specific language string from the block
+# of all translations
+##############################################################
+
+sub get_language_string_from_language_block
+{
+ my ($language_block, $language) = @_;
+
+ my $newstring = "";
+
+ for ( my $i = 0; $i <= $#{$language_block}; $i++ )
+ {
+ if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
+ {
+ $newstring = $1;
+ last;
+ }
+ }
+
+ if ( $newstring eq "" )
+ {
+ $language = "en-US"; # defaulting to english
+
+ for ( my $i = 0; $i <= $#{$language_block}; $i++ )
+ {
+ if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
+ {
+ $newstring = $1;
+ last;
+ }
+ }
+ }
+
+ return $newstring;
+}
+
+########################################################################
+# Localizing the script for the Mac Language Pack installer
+########################################################################
+
+sub localize_scriptfile
+{
+ my ($scriptfile, $translationfile, $languagestringref) = @_;
+
+ my $onelanguage = $$languagestringref;
+ if ( $onelanguage =~ /^\s*(.*?)_/ ) { $onelanguage = $1; }
+
+ # Analyzing the ulf file, collecting all Identifier
+ my $allidentifier = get_identifier($translationfile);
+
+ for ( my $i = 0; $i <= $#{$allidentifier}; $i++ )
+ {
+ my $identifier = ${$allidentifier}[$i];
+ my $language_block = get_language_block_from_language_file($identifier, $translationfile);
+ my $newstring = get_language_string_from_language_block($language_block, $onelanguage);
+
+ # removing mask
+ $newstring =~ s/\\\'/\'/g;
+
+ replace_one_variable_in_shellscript($scriptfile, $newstring, $identifier);
+ }
+}
+
+#################################################################################
+# Replacing one variable in Mac shell script
+#################################################################################
+
+sub replace_one_variable_in_shellscript
+{
+ my ($scriptfile, $variable, $searchstring) = @_;
+
+ for ( my $i = 0; $i <= $#{$scriptfile}; $i++ )
+ {
+ ${$scriptfile}[$i] =~ s/\[$searchstring\]/$variable/g;
+ }
+}
+
+#############################################
+# Replacing variables in Mac shell script
+#############################################
+
+sub replace_variables_in_scriptfile
+{
+ my ($scriptfile, $volume_name, $volume_name_app, $allvariables) = @_;
+
+ replace_one_variable_in_shellscript($scriptfile, $volume_name, "FULLPRODUCTNAME" );
+ replace_one_variable_in_shellscript($scriptfile, $volume_name_app, "FULLAPPPRODUCTNAME" );
+ replace_one_variable_in_shellscript($scriptfile, $allvariables->{'PRODUCTNAME'}, "PRODUCTNAME" );
+ replace_one_variable_in_shellscript($scriptfile, $allvariables->{'PRODUCTVERSION'}, "PRODUCTVERSION" );
+
+ my $scriptname = $allvariables->{'BUNDLEIDENTIFIER'};
+
+ replace_one_variable_in_shellscript($scriptfile, $scriptname, "SEARCHSCRIPTNAME" );
+}
+
+#############################################
+# Creating the "simple" package.
+# "zip" for Windows
+# "tar.gz" for all other platforms
+# additionally "dmg" on macOS
+#############################################
+
+sub create_package
+{
+ my ( $installdir, $archivedir, $packagename, $allvariables, $includepatharrayref, $languagestringref, $format ) = @_;
+
+ installer::logger::print_message( "... creating $installer::globals::packageformat file ...\n" );
+ installer::logger::include_header_into_logfile("Creating $installer::globals::packageformat file:");
+
+ # moving dir into temporary directory
+ my $pid = $$; # process id
+ my $tempdir = $installdir . "_temp" . "." . $pid;
+ my $systemcall = "";
+ my $from = "";
+ my $makesystemcall = 1;
+ my $return_to_start = 0;
+ installer::systemactions::rename_directory($installdir, $tempdir);
+
+ # creating new directory with original name
+ installer::systemactions::create_directory($archivedir);
+
+ my $archive = $archivedir . $installer::globals::separator . $packagename . $format;
+
+ if ( $archive =~ /zip$/ )
+ {
+ $from = cwd();
+ $return_to_start = 1;
+ chdir($tempdir);
+ $systemcall = "$installer::globals::zippath -qr $archive .";
+
+ # Using Archive::Zip fails because of very long path names below "share/uno_packages/cache"
+ # my $packzip = Archive::Zip->new();
+ # $packzip->addTree("."); # after changing into $tempdir
+ # $packzip->writeToFileNamed($archive);
+ # $makesystemcall = 0;
+ }
+ elsif ( $archive =~ /dmg$/ )
+ {
+ my $folder = (( -l "$tempdir/$packagename/Applications" ) or ( -l "$tempdir/$packagename/opt" )) ? $packagename : "\.";
+
+ if ( $allvariables->{'PACK_INSTALLED'} ) {
+ $folder = $packagename;
+ }
+
+ my $volume_name = $allvariables->{'PRODUCTNAME'};
+ my $volume_name_classic = $allvariables->{'PRODUCTNAME'} . ' ' . $allvariables->{'PRODUCTVERSION'};
+ my $volume_name_classic_app = $volume_name; # "app" should not contain version number
+ if ( $allvariables->{'DMG_VOLUMEEXTENSION'} ) {
+ $volume_name = $volume_name . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'};
+ $volume_name_classic = $volume_name_classic . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'};
+ $volume_name_classic_app = $volume_name_classic_app . ' ' . $allvariables->{'DMG_VOLUMEEXTENSION'};
+ }
+
+ my $sla = 'sla.r';
+ my $ref = "";
+
+ if ( ! $allvariables->{'HIDELICENSEDIALOG'} )
+ {
+ installer::scriptitems::get_sourcepath_from_filename_and_includepath( \$sla, $includepatharrayref, 0);
+ }
+
+ my $localtempdir = $tempdir;
+
+ if (( $installer::globals::languagepack ) || ( $installer::globals::helppack ))
+ {
+ # LanguagePack and HelpPack files are collected in $srcfolder, packaged into
+ # tarball.tar.bz2 and finally the Language Pack.app is assembled in $appfolder
+ $localtempdir = "$tempdir/$packagename";
+ my $srcfolder = $localtempdir . "/" . $volume_name_classic_app . "\.app";
+
+ $volume_name .= " " . $$languagestringref . " Language Pack";
+ $volume_name_classic .= " Language Pack";
+ $volume_name_classic_app .= " Language Pack";
+
+ my $appfolder = $localtempdir . "/" . $volume_name_classic_app . "\.app";
+ my $contentsfolder = $appfolder . "/Contents";
+ my $tarballname = "tarball.tar.bz2";
+
+ my $localfrom = cwd();
+ chdir $srcfolder;
+
+ $systemcall = "tar -cjf $tarballname Contents/";
+
+ print "... $systemcall ...\n";
+ my $localreturnvalue = system($systemcall);
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($localreturnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ my $sourcefile = $srcfolder . "/" . $tarballname;
+ my $destfile = $contentsfolder . "/Resources/" . $tarballname;
+
+ installer::systemactions::remove_complete_directory($appfolder);
+ installer::systemactions::create_directory($appfolder);
+ installer::systemactions::create_directory($contentsfolder);
+ installer::systemactions::create_directory($contentsfolder . "/Resources");
+
+ installer::systemactions::copy_one_file($sourcefile, $destfile);
+ installer::systemactions::remove_complete_directory($srcfolder);
+
+ # Copy two files into installation set next to the tar ball
+ # 1. "osx_install.applescript"
+ # 2 "OpenOffice.org Languagepack"
+
+ my $scriptrealfilename = "osx_install.applescript";
+ my $scriptfilename = "";
+ if ( $installer::globals::languagepack ) { $scriptfilename = "osx_install_languagepack.applescript"; }
+ if ( $installer::globals::helppack ) { $scriptfilename = "osx_install_helppack.applescript"; }
+ my $scripthelperfilename = $ENV{'SRCDIR'} . "/setup_native/scripts/mac_install.script";
+ my $scripthelperrealfilename = $volume_name_classic_app;
+
+ # Finding both files in source tree
+
+ my $scriptref = $ENV{'SRCDIR'} . "/setup_native/scripts/" . $scriptfilename;
+ if (! -f $scriptref) { installer::exiter::exit_program("ERROR: Could not find Apple script $scriptfilename ($scriptref)!", "create_package"); }
+ if (! -f $scripthelperfilename) { installer::exiter::exit_program("ERROR: Could not find Apple script $scripthelperfilename!", "create_package"); }
+
+ $scriptfilename = $contentsfolder . "/Resources/" . $scriptrealfilename;
+ $scripthelperrealfilename = $contentsfolder . "/" . $scripthelperrealfilename;
+
+ installer::systemactions::copy_one_file($scriptref, $scriptfilename);
+ installer::systemactions::copy_one_file($scripthelperfilename, $scripthelperrealfilename);
+
+ # Replacing variables in script $scriptfilename
+ # Localizing script $scriptfilename
+ my $scriptfilecontent = installer::files::read_file($scriptfilename);
+ my $translationfilecontent = installer::files::read_file($installer::globals::macinstallfilename);
+ localize_scriptfile($scriptfilecontent, $translationfilecontent, $languagestringref);
+
+ replace_variables_in_scriptfile($scriptfilecontent, $volume_name_classic, $volume_name_classic_app, $allvariables);
+ installer::files::save_file($scriptfilename, $scriptfilecontent);
+
+ chmod 0775, $scriptfilename;
+ chmod 0775, $scripthelperrealfilename;
+
+ # Copy also Info.plist and icon file
+ # Finding both files in source tree
+ my $iconfile = "ooo3_installer.icns";
+ my $iconfileref = $ENV{'SRCDIR'} . "/setup_native/source/mac/" . $iconfile;
+ if (! -f $iconfileref) { installer::exiter::exit_program("ERROR: Could not find Apple script icon file $iconfile ($iconfileref)!", "create_package"); }
+ my $subdir = $contentsfolder . "/" . "Resources";
+ if ( ! -d $subdir ) { installer::systemactions::create_directory($subdir); }
+ $destfile = $subdir . "/" . $iconfile;
+ installer::systemactions::copy_one_file($iconfileref, $destfile);
+
+ my $infoplistfile = $ENV{'SRCDIR'} . "/setup_native/source/mac/Info.plist.langpack";
+ if (! -f $infoplistfile) { installer::exiter::exit_program("ERROR: Could not find Apple script Info.plist: $infoplistfile!", "create_package"); }
+ $destfile = "$contentsfolder/Info.plist";
+ # Replacing variables in Info.plist
+ $scriptfilecontent = installer::files::read_file($infoplistfile);
+
+ replace_one_variable_in_shellscript($scriptfilecontent, $volume_name_classic_app, "FULLAPPPRODUCTNAME" ); # OpenOffice.org Language Pack
+ replace_one_variable_in_shellscript($scriptfilecontent, $ENV{'MACOSX_BUNDLE_IDENTIFIER'}, "BUNDLEIDENTIFIER" );
+ installer::files::save_file($destfile, $scriptfilecontent);
+
+ chdir $localfrom;
+
+ if ( $ENV{'MACOSX_CODESIGNING_IDENTITY'} ) {
+ my $lp_sign = "codesign --verbose --sign $ENV{'MACOSX_CODESIGNING_IDENTITY'} --deep '$appfolder'" ;
+ my $output = `$lp_sign 2>&1`;
+ unless ($?) {
+ $infoline = "Success: \"$lp_sign\" executed successfully!\n";
+ } else {
+ $infoline = "ERROR: Could not codesign the languagepack using \"$lp_sign\"!\n$output\n";
+ }
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ elsif ($volume_name_classic_app eq 'LibreOffice' || $volume_name_classic_app eq 'LibreOfficeDev')
+ {
+ my $subdir = "$tempdir/$packagename/$volume_name_classic_app.app/Contents/Resources";
+ if ( ! -d $subdir ) { installer::systemactions::create_directory($subdir); }
+ if ( $ENV{'MACOSX_CODESIGNING_IDENTITY'} )
+ {
+ $systemcall = "$ENV{'SRCDIR'}/solenv/bin/macosx-codesign-app-bundle $localtempdir/$folder/$volume_name_classic_app.app";
+ print "... $systemcall ...\n";
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ my $output = `$systemcall 2>&1`;
+ if ($?)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n$output\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+ elsif ($volume_name_classic_app eq 'LibreOffice SDK' || $volume_name_classic_app eq 'LibreOfficeDev SDK')
+ {
+ if ( $ENV{'MACOSX_CODESIGNING_IDENTITY'} )
+ {
+ my $sdkbindir = "$localtempdir/$folder/$allvariables->{'PRODUCTNAME'}$allvariables->{'PRODUCTVERSION'}_SDK/bin";
+ opendir(my $dh, $sdkbindir);
+ foreach my $sdkbinary (readdir $dh) {
+ next unless -f "$sdkbindir/$sdkbinary";
+ $systemcall = "codesign --force --verbose --options=runtime --identifier='$ENV{MACOSX_BUNDLE_IDENTIFIER}.$sdkbinary' --sign '$ENV{MACOSX_CODESIGNING_IDENTITY}' --entitlements $ENV{BUILDDIR}/hardened_runtime.xcent $sdkbindir/$sdkbinary > /tmp/codesign_losdk_$sdkbinary.log 2>&1";
+ print "... $systemcall ...\n";
+ my $returnvalue = system($systemcall);
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ unlink "/tmp/codesign_losdk_$sdkbinary.log";
+ }
+ }
+ closedir($dh);
+ }
+ }
+ my $megabytes = 1500;
+ $megabytes = 3000 if $ENV{'ENABLE_DEBUG'};
+
+ # tdf#151341 Use lzfse compression instead of bzip2
+ # Several users reported that copying the LibreOffice.app package
+ # in the Finder from a .dmg file compressed with lzfse compression
+ # copies the package several times faster than from a .dmg compressed
+ # with bzip2 compression.
+ # On a mid-2015 Intel MacBook Pro running macOS, copying in the Finder
+ # was at least 5 times faster with lzfse than with bzip2. Also, the
+ # hdiutil man page as of macOS Monterey 12.6.2 has marked bzip2 as
+ # deprecated. lzfse is marked as supported since macOS El Capitan 10.11
+ # so this change appears safe.
+ # The one thing that bzip2 has is better compression so a .dmg with
+ # bzip2 should be smaller than with lzfse. A .dmg built from a debug
+ # build was 262M with bzip2 and 273MB for lzfse. So it appears that
+ # lzfse creates .dmg files that are only 4% or 5% larger than bzip2.
+ $systemcall = "cd $localtempdir && hdiutil create -megabytes $megabytes -srcfolder $folder $archive -ov -fs HFS+ -volname \"$volume_name\" -format ULFO";
+ if (( $ref ne "" ) && ( $$ref ne "" ) && system("hdiutil 2>&1 | grep unflatten") == 0) {
+ $systemcall .= " && hdiutil unflatten $archive && Rez -a $$ref -o $archive && hdiutil flatten $archive &&";
+ }
+ }
+ else
+ {
+ # use fakeroot (only required for Solaris and Linux)
+ my $fakerootstring = "";
+ if (( $installer::globals::issolarisbuild ) || ( $installer::globals::islinuxbuild ))
+ {
+ $fakerootstring = "fakeroot";
+ }
+
+ $systemcall = "cd $tempdir; $fakerootstring tar -cf - . | $installer::globals::packertool > $archive";
+ }
+
+ if ( $makesystemcall )
+ {
+ print "... $systemcall ...\n";
+ my $returnvalue = system($systemcall);
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\": $returnvalue\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ if ( $return_to_start ) { chdir($from); }
+
+ print "... removing $tempdir ...\n";
+ installer::systemactions::remove_complete_directory($tempdir);
+}
+
+####################################################
+# Main method for creating the simple package
+# installation sets
+####################################################
+
+sub create_simple_package
+{
+ my ( $filesref, $dirsref, $scpactionsref, $linksref, $unixlinksref, $loggingdir, $languagestringref, $shipinstalldir, $allsettingsarrayref, $allvariables, $includepatharrayref ) = @_;
+
+ # Creating directories
+
+ my $current_install_number = "";
+ my $infoline = "";
+
+ installer::logger::print_message( "... creating installation directory ...\n" );
+ installer::logger::include_header_into_logfile("Creating installation directory");
+
+ $installer::globals::csp_installdir = installer::worker::create_installation_directory($shipinstalldir, $languagestringref, \$current_install_number);
+ $installer::globals::csp_installlogdir = installer::systemactions::create_directory_next_to_directory($installer::globals::csp_installdir, "log");
+
+ my $installdir = $installer::globals::csp_installdir;
+ my $installlogdir = $installer::globals::csp_installlogdir;
+
+ # Setting package name (similar to the download name)
+ my $packagename = "";
+
+ if ( $installer::globals::packageformat eq "archive" ||
+ $installer::globals::packageformat eq "dmg" )
+ {
+ $installer::globals::csp_languagestring = $$languagestringref;
+
+ my $locallanguage = $installer::globals::csp_languagestring;
+
+ $packagename = installer::download::set_download_filename(\$locallanguage, $allvariables);
+ }
+
+ # Work around Windows problems with long pathnames (see issue 50885) by
+ # putting the to-be-archived installation tree into the temp directory
+ # instead of the module output tree (unless LOCALINSTALLDIR dictates
+ # otherwise, anyway); can be removed once issue 50885 is fixed:
+ my $tempinstalldir = $installdir;
+ if ( $installer::globals::iswindowsbuild &&
+ $installer::globals::packageformat eq "archive" &&
+ !$installer::globals::localinstalldirset )
+ {
+ $tempinstalldir = File::Temp::tempdir;
+ }
+
+ # Creating subfolder in installdir, which shall become the root of package or zip file
+ my $subfolderdir = "";
+ if ( $packagename ne "" ) { $subfolderdir = $tempinstalldir . $installer::globals::separator . $packagename; }
+ else { $subfolderdir = $tempinstalldir; }
+
+ if ( ! -d $subfolderdir ) { installer::systemactions::create_directory($subfolderdir); }
+
+ # Create directories, copy files and ScpActions
+
+ installer::logger::print_message( "... creating directories ...\n" );
+ installer::logger::include_header_into_logfile("Creating directories:");
+
+ for ( my $i = 0; $i <= $#{$dirsref}; $i++ )
+ {
+ my $onedir = ${$dirsref}[$i];
+
+ if ( $onedir->{'HostName'} )
+ {
+ my $destdir = $subfolderdir . $installer::globals::separator . $onedir->{'HostName'};
+
+ if ( ! -d $destdir )
+ {
+ if ( $^O =~ /cygwin/i ) # Cygwin performance check
+ {
+ $infoline = "Try to create directory $destdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ # Directories in $dirsref are sorted and all parents were added -> "mkdir" works without parent creation!
+ if ( ! ( -d $destdir )) { mkdir($destdir, 0775); }
+ }
+ else
+ {
+ installer::systemactions::create_directory_structure($destdir);
+ }
+ }
+ }
+ }
+
+ # stripping files ?!
+ if (( $installer::globals::strip ) && ( ! $installer::globals::iswindowsbuild )) { strip_libraries($filesref, $languagestringref); }
+
+ # copy Files
+ installer::logger::print_message( "... copying files ...\n" );
+ installer::logger::include_header_into_logfile("Copying files:");
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+
+ if (( $onefile->{'Styles'} ) && ( $onefile->{'Styles'} =~ /\bBINARYTABLE_ONLY\b/ )) { next; }
+
+ my $source = $onefile->{'sourcepath'};
+ my $destination = $onefile->{'destination'};
+ $destination = $subfolderdir . $installer::globals::separator . $destination;
+
+ # Replacing $$ by $ is necessary to install files with $ in its name (back-masquerading)
+ # Otherwise, the following shell command does not work and the file list is not correct
+ $source =~ s/\$\$/\$/;
+ $destination =~ s/\$\$/\$/;
+
+ if ( $^O =~ /cygwin/i ) # Cygwin performance, do not use copy_one_file. "chmod -R" at the end
+ {
+ my $copyreturn = copy($source, $destination);
+
+ if ($copyreturn)
+ {
+ $infoline = "Copy: $source to $destination\n";
+ $returnvalue = 1;
+ }
+ else
+ {
+ $infoline = "ERROR: Could not copy $source to $destination $!\n";
+ $returnvalue = 0;
+ }
+
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ installer::systemactions::copy_one_file($source, $destination);
+
+ if ( ! $installer::globals::iswindowsbuild )
+ {
+ # see issue 102274
+ if ( $onefile->{'UnixRights'} )
+ {
+ if ( ! -l $destination ) # that would be rather pointless
+ {
+ chmod oct($onefile->{'UnixRights'}), $destination;
+ }
+ }
+ }
+ }
+ }
+
+ # creating Links
+
+ installer::logger::print_message( "... creating links ...\n" );
+ installer::logger::include_header_into_logfile("Creating links:");
+
+ for ( my $i = 0; $i <= $#{$linksref}; $i++ )
+ {
+ my $onelink = ${$linksref}[$i];
+
+ my $destination = $onelink->{'destination'};
+ $destination = $subfolderdir . $installer::globals::separator . $destination;
+ my $destinationfile = $onelink->{'destinationfile'};
+
+ my $localcall = "ln -sf \'$destinationfile\' \'$destination\' \>\/dev\/null 2\>\&1";
+ system($localcall);
+
+ $infoline = "Creating link: \"ln -sf $destinationfile $destination\"\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ for ( my $i = 0; $i <= $#{$unixlinksref}; $i++ )
+ {
+ my $onelink = ${$unixlinksref}[$i];
+
+ my $target = $onelink->{'Target'};
+ my $destination = $subfolderdir . $installer::globals::separator . $onelink->{'destination'};
+
+ my @localcall = ('ln', '-sf', $target, $destination);
+ system(@localcall) == 0 or die "system @localcall failed: $?";
+
+ $infoline = "Creating Unix link: \"@localcall\"\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ # Setting privileges for cygwin globally
+
+ if ( $^O =~ /cygwin/i )
+ {
+ installer::logger::print_message( "... changing privileges in $subfolderdir ...\n" );
+ installer::logger::include_header_into_logfile("Changing privileges in $subfolderdir:");
+
+ my $localcall = "chmod -R 755 " . "\"" . $subfolderdir . "\"";
+ system($localcall);
+ }
+
+ installer::logger::print_message( "... removing superfluous directories ...\n" );
+ installer::logger::include_header_into_logfile("Removing superfluous directories:");
+
+ my $extensionfolder = get_extensions_dir($subfolderdir);
+ installer::systemactions::remove_empty_dirs_in_folder($extensionfolder);
+
+ if ( $installer::globals::ismacbuild )
+ {
+ installer::worker::put_scpactions_into_installset("$installdir/$packagename");
+ }
+
+ # Creating archive file
+ if ( $installer::globals::packageformat eq "archive" )
+ {
+ create_package($tempinstalldir, $installdir, $packagename, $allvariables, $includepatharrayref, $languagestringref, $installer::globals::archiveformat);
+ }
+ elsif ( $installer::globals::packageformat eq "dmg" )
+ {
+ create_package($installdir, $installdir, $packagename, $allvariables, $includepatharrayref, $languagestringref, ".dmg");
+ }
+
+ # Analyzing the log file
+
+ installer::worker::clean_output_tree(); # removing directories created in the output tree
+ installer::worker::analyze_and_save_logfile($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number);
+}
+
+1;
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/bin/modules/installer/strip.pm b/solenv/bin/modules/installer/strip.pm
new file mode 100644
index 000000000..207497382
--- /dev/null
+++ b/solenv/bin/modules/installer/strip.pm
@@ -0,0 +1,136 @@
+#
+# 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 .
+#
+
+package installer::strip;
+
+use strict;
+use warnings;
+
+use base 'Exporter';
+
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::systemactions;
+
+our @EXPORT_OK = qw(strip_libraries);
+
+#####################################################################
+# Checking whether a file has to be stripped
+#####################################################################
+
+sub _need_to_strip
+{
+ my ( $filename ) = @_;
+
+ my $strip = 0;
+
+ # Check using the "file" command
+
+ $filename =~ s/'/'\\''/g;
+ open (FILE, "file '$filename' |");
+ my $fileoutput = <FILE>;
+ close (FILE);
+
+ if (( $fileoutput =~ /not stripped/i ) && ( $fileoutput =~ /\bELF\b/ )) { $strip = 1; }
+
+ return $strip
+}
+
+#####################################################################
+# Checking whether a file has to be stripped
+#####################################################################
+
+sub _do_strip
+{
+ my ( $filename ) = @_;
+
+ my $systemcall = "strip" . " " . $filename;
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not strip $filename!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "SUCCESS: Stripped library $filename!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+#####################################################################
+# Resolving all variables in the packagename
+#####################################################################
+
+sub strip_libraries
+{
+ my ( $filelist, $languagestringref ) = @_;
+
+ installer::logger::include_header_into_logfile("Stripping files:");
+
+ my $strippeddirbase = installer::systemactions::create_directories("stripped", $languagestringref);
+
+ if (! grep {$_ eq $strippeddirbase} @installer::globals::removedirs)
+ {
+ push(@installer::globals::removedirs, $strippeddirbase);
+ }
+
+ for ( my $i = 0; $i <= $#{$filelist}; $i++ )
+ {
+ my $sourcefilename = ${$filelist}[$i]->{'sourcepath'};
+
+ if ( _need_to_strip($sourcefilename) )
+ {
+ my $shortfilename = $sourcefilename;
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$shortfilename);
+
+ my $infoline = "Strip: $shortfilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # copy file into directory for stripped libraries
+
+ my $onelanguage = ${$filelist}[$i]->{'specificlanguage'};
+
+ # files without language into directory "00"
+
+ if ($onelanguage eq "") { $onelanguage = "00"; }
+
+ my $strippeddir = $strippeddirbase . $installer::globals::separator . $onelanguage;
+ installer::systemactions::create_directory($strippeddir); # creating language specific subdirectories
+
+ my $destfilename = $strippeddir . $installer::globals::separator . $shortfilename;
+ installer::systemactions::copy_one_file($sourcefilename, $destfilename);
+
+ # change sourcepath in files collector
+
+ ${$filelist}[$i]->{'sourcepath'} = $destfilename;
+
+ # strip file
+
+ _do_strip($destfilename);
+ }
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/systemactions.pm b/solenv/bin/modules/installer/systemactions.pm
new file mode 100644
index 000000000..a33c5a957
--- /dev/null
+++ b/solenv/bin/modules/installer/systemactions.pm
@@ -0,0 +1,1329 @@
+#
+# 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 .
+#
+
+package installer::systemactions;
+
+use Cwd;
+use File::Copy;
+use installer::converter;
+use installer::exiter;
+use installer::globals;
+use installer::pathanalyzer;
+use installer::remover;
+use installer::windows::msiglobal;
+
+######################################################
+# Creating a new directory
+######################################################
+
+sub create_directory
+{
+ my ($directory) = @_;
+
+ create_directory_with_privileges( $directory, "755" );
+}
+
+######################################################
+# Creating a new directory with defined privileges
+######################################################
+
+sub create_directory_with_privileges
+{
+ my ($directory, $privileges) = @_;
+
+ my $returnvalue = 1;
+ my $infoline = "";
+ my $localprivileges = oct("0".$privileges); # changes "777" to 0777
+
+ if (!(-d $directory))
+ {
+ $returnvalue = mkdir($directory, $localprivileges);
+
+ if ($returnvalue)
+ {
+ $infoline = "\nCreated directory: $directory\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ chmod $localprivileges, $directory;
+ }
+ else
+ {
+ # New solution in parallel packing: It is possible, that the directory now exists, although it
+ # was not created in this process. There is only an important error, if the directory does not
+ # exist now.
+
+ $infoline = "\nDid not succeed in creating directory: \"$directory\". Further attempts will follow.\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ if (!(-d $directory))
+ {
+ # Problem with parallel packaging? -> Try a little harder, before exiting.
+ # Did someone else remove the parent directory in the meantime?
+ my $parentdir = $directory;
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir);
+ if (!(-d $parentdir))
+ {
+ $returnvalue = mkdir($directory, $localprivileges);
+
+ if ($returnvalue)
+ {
+ $infoline = "\nAttention: Successfully created parent directory (should already be created before): $parentdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ chmod $localprivileges, $parentdir;
+ }
+ else
+ {
+ $infoline = "\nError: \"$directory\" could not be created. Even the parent directory \"$parentdir\" does not exist and could not be created.\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ if ( -d $parentdir )
+ {
+ $infoline = "\nAttention: Finally the parent directory \"$parentdir\" exists, but I could not create it.\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ # Now it is time to exit, even the parent could not be created.
+ installer::exiter::exit_program("ERROR: Could not create parent directory \"$parentdir\"", "create_directory_with_privileges");
+ }
+ }
+ }
+
+ # At this point we have to assume, that the parent directory exist.
+ # Trying once more to create the desired directory
+
+ $returnvalue = mkdir($directory, $localprivileges);
+
+ if ($returnvalue)
+ {
+ $infoline = "\nAttention: Created directory \"$directory\" in the second try.\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ chmod $localprivileges, $directory;
+ }
+ else
+ {
+ if ( -d $directory )
+ {
+ $infoline = "\nAttention: Finally the directory \"$directory\" exists, but I could not create it.\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ # It is time to exit, even the second try failed.
+ installer::exiter::exit_program("ERROR: Failed to create the directory: $directory", "create_directory_with_privileges");
+ }
+ }
+ }
+ else
+ {
+ $infoline = "\nAnother process created this directory in exactly this moment :-) : $directory\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+ else
+ {
+ $infoline = "\nAlready existing directory, did not create: $directory\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ chmod $localprivileges, $directory;
+ }
+}
+
+#######################################################################
+# Calculating the number of languages in the string
+#######################################################################
+
+sub get_number_of_langs
+{
+ my ($languagestring) = @_;
+
+ my $number = 1;
+
+ my $workstring = $languagestring;
+
+ while ( $workstring =~ /^\s*(.*)_(.*?)\s*$/ )
+ {
+ $workstring = $1;
+ $number++;
+ }
+
+ return $number;
+}
+
+#######################################################################
+# Creating the directories, in which files are generated or unzipped
+#######################################################################
+
+sub create_directories
+{
+ my ($newdirectory, $languagesref) =@_;
+
+ $installer::globals::unpackpath =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes
+
+ my $path = "";
+
+ if (( $newdirectory eq "uno" ) || ( $newdirectory eq "zip" ) || ( $newdirectory eq "cab" ) || ( $newdirectory =~ /rdb\s*$/i )) # special handling for zip files, cab files and services file because of performance reasons
+ {
+ if ( $installer::globals::temppathdefined ) { $path = $installer::globals::temppath; }
+ else { $path = $installer::globals::unpackpath; }
+ $path =~ s/\Q$installer::globals::separator\E\s*$//; # removing ending slashes and backslashes
+ $path = $path . $installer::globals::separator;
+ }
+ else
+ {
+ $path = $installer::globals::unpackpath . $installer::globals::separator;
+
+ # special handling, if LOCALINSTALLDIR is set
+ if (( $installer::globals::localinstalldirset ) && ( $newdirectory eq "install" ))
+ {
+ $installer::globals::localinstalldir =~ s/\Q$installer::globals::separator\E\s*$//;
+ $path = $installer::globals::localinstalldir . $installer::globals::separator;
+ }
+ }
+
+ $infoline = "create_directories: Using $path for $newdirectory !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($newdirectory eq "unzip" ) # special handling for common directory
+ {
+ }
+ else
+ {
+ my $localproductname = $installer::globals::product;
+ my $localproductsubdir = "";
+
+ if ( $installer::globals::product =~ /^\s*(.+?)\_\_(.+?)\s*$/ )
+ {
+ $localproductname = $1;
+ $localproductsubdir = $2;
+ }
+
+ if ( $installer::globals::languagepack ) { $path = $path . $localproductname . "_languagepack" . $installer::globals::separator; }
+ elsif ( $installer::globals::helppack ) { $path = $path . $localproductname . "_helppack" . $installer::globals::separator; }
+ else { $path = $path . $localproductname . $installer::globals::separator; }
+
+ create_directory($path);
+
+ if ( $localproductsubdir )
+ {
+ $path = $path . $localproductsubdir . $installer::globals::separator;
+ create_directory($path);
+ }
+
+ $path = $path . $installer::globals::installertypedir . $installer::globals::separator;
+ create_directory($path);
+
+ $path = $path . $newdirectory . $installer::globals::separator;
+ create_directory($path);
+
+ my $locallanguagesref = "";
+
+ if ( $$languagesref ) { $locallanguagesref = $$languagesref; }
+
+ if ($newdirectory eq "install" && $installer::globals::ooodownloadfilename ne "" )
+ {
+ # put packages into versioned path; needed only on linux (fdo#30837)
+ $path = $path . "$installer::globals::ooodownloadfilename" . $installer::globals::separator;
+ create_directory($path);
+ }
+ else
+ {
+ if ($locallanguagesref ne "") # this will be a path like "01_49", for Profiles and ConfigurationFiles, idt-Files
+ {
+
+ my $languagestring = $$languagesref;
+
+ if (length($languagestring) > $installer::globals::max_lang_length )
+ {
+ my $number_of_languages = get_number_of_langs($languagestring);
+ #replace this in the same it was done in installer/windows/directory.pm
+ #chomp(my $shorter = `echo $languagestring | $ENV{'MD5SUM'} | sed -e "s/ .*//g"`);
+ #my $id = substr($shorter, 0, 8); # taking only the first 8 digits
+ my $id = installer::windows::msiglobal::calculate_id($languagestring, 8); # taking only the first 8 digits
+ $languagestring = "lang_" . $number_of_languages . "_id_" . $id;
+ }
+
+ $path = $path . $languagestring . $installer::globals::separator;
+ create_directory($path);
+ }
+ }
+ }
+
+ installer::remover::remove_ending_pathseparator(\$path);
+
+ $path = installer::converter::make_path_conform($path);
+
+ return $path;
+}
+
+########################
+# Copying one file
+########################
+
+sub is_empty_dir
+{
+ my ($dir) = @_;
+ my ($handle, $count);
+ opendir($handle, $dir) or return 0;
+ $count = scalar(grep { $_ ne '.' && $_ ne '..' } readdir($handle));
+ closedir($handle);
+ return $count == 0;
+}
+
+sub copy_one_file
+{
+ my ($source, $dest) = @_;
+
+ my ($returnvalue, $infoline, $copyreturn);
+
+ if ( -l $source ) {
+ $copyreturn = symlink(readlink("$source"), "$dest");
+ }
+ elsif (-d $source && is_empty_dir($source)) {
+ my $mode = (stat($source))[2] & 07777;
+ $copyreturn = mkdir($dest, $mode);
+ }
+ else {
+ $copyreturn = copy($source, $dest);
+ }
+
+ if ($copyreturn)
+ {
+ $infoline = "Copy: $source to $dest\n";
+ $returnvalue = 1;
+ }
+ else
+ {
+ $infoline = "ERROR: Could not copy $source to $dest $!\n";
+ $returnvalue = 0;
+ }
+
+ push(@installer::globals::logfileinfo, $infoline);
+
+ if ( !$returnvalue ) {
+ return $returnvalue;
+ }
+
+ # taking care of file attributes
+ if ($installer::globals::iswin && -f $dest) {
+ my $mode = -x $source ? 0775 : 0664;
+ my $mode_str = sprintf("%o", $mode);
+ my $chmodreturn = chmod($mode, $dest);
+ if ($chmodreturn)
+ {
+ $infoline = "chmod $mode_str, $dest\n";
+ $returnvalue = 1;
+ }
+ else
+ {
+ $infoline = "WARNING: Could not chmod $dest: $!\n";
+ $returnvalue = 0;
+ }
+
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ return $returnvalue;
+}
+
+##########################
+# Hard linking one file
+##########################
+
+sub hardlink_one_file
+{
+ my ($source, $dest) = @_;
+
+ my ($returnvalue, $infoline);
+
+ my $copyreturn = link($source, $dest);
+
+ if ($copyreturn)
+ {
+ $infoline = "Link: $source to $dest\n";
+ $returnvalue = 1;
+ }
+ else
+ {
+ $infoline = "ERROR: Could not link $source to $dest\n";
+ $returnvalue = 0;
+ }
+
+ push(@installer::globals::logfileinfo, $infoline);
+
+ return $returnvalue;
+}
+
+##########################
+# Soft linking one file
+##########################
+
+sub softlink_one_file
+{
+ my ($source, $dest) = @_;
+
+ my ($returnvalue, $infoline);
+
+ my $linkreturn = symlink($source, $dest);
+
+ if ($linkreturn)
+ {
+ $infoline = "Symlink: $source to $dest\n";
+ $returnvalue = 1;
+ }
+ else
+ {
+ $infoline = "ERROR: Could not symlink $source to $dest\n";
+ $returnvalue = 0;
+ }
+
+ push(@installer::globals::logfileinfo, $infoline);
+
+ return $returnvalue;
+}
+
+########################
+# Renaming one file
+########################
+
+sub rename_one_file
+{
+ my ($source, $dest) = @_;
+
+ my ($returnvalue, $infoline);
+
+ my $renamereturn = rename($source, $dest);
+
+ if ($renamereturn)
+ {
+ $infoline = "Rename: $source to $dest\n";
+ $returnvalue = 1;
+ }
+ else
+ {
+ $infoline = "ERROR: Could not rename $source to $dest\n";
+ $returnvalue = 0;
+ }
+
+ push(@installer::globals::logfileinfo, $infoline);
+
+ return $returnvalue;
+}
+
+##########################################
+# Copying all files from one directory
+# to another directory
+##########################################
+
+sub copy_directory
+{
+ my ($sourcedir, $destdir) = @_;
+
+ my @sourcefiles = ();
+
+ $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
+ $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ my $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Copying files from directory $sourcedir to directory $destdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ opendir(DIR, $sourcedir);
+ @sourcefiles = readdir(DIR);
+ closedir(DIR);
+
+ my $onefile;
+
+ foreach $onefile (@sourcefiles)
+ {
+ if ((!($onefile eq ".")) && (!($onefile eq "..")))
+ {
+ my $sourcefile = $sourcedir . $installer::globals::separator . $onefile;
+ my $destfile = $destdir . $installer::globals::separator . $onefile;
+ if ( -f $sourcefile ) # only files, no directories
+ {
+ copy_one_file($sourcefile, $destfile);
+ }
+ }
+ }
+}
+
+#####################################################################
+# Creating hard links to a complete directory with sub directories.
+#####################################################################
+
+sub hardlink_complete_directory
+{
+ my ($sourcedir, $destdir) = @_;
+
+ my @sourcefiles = ();
+
+ $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
+ $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ if ( ! -d $destdir ) { create_directory($destdir); }
+
+ my $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Creating hard links for all files from directory $sourcedir to directory $destdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ opendir(DIR, $sourcedir);
+ @sourcefiles = readdir(DIR);
+ closedir(DIR);
+
+ my $onefile;
+
+ foreach $onefile (@sourcefiles)
+ {
+ if ((!($onefile eq ".")) && (!($onefile eq "..")))
+ {
+ my $source = $sourcedir . $installer::globals::separator . $onefile;
+ my $dest = $destdir . $installer::globals::separator . $onefile;
+ if ( -f $source ) # only files, no directories
+ {
+ hardlink_one_file($source, $dest);
+ }
+ if ( -d $source ) # recursive
+ {
+ hardlink_complete_directory($source, $dest);
+ }
+ }
+ }
+}
+
+#####################################################################
+# Creating hard links to a complete directory with sub directories.
+#####################################################################
+
+sub softlink_complete_directory
+{
+ my ($sourcedir, $destdir, $depth) = @_;
+
+ my @sourcefiles = ();
+
+ $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
+ $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ if ( ! -d $destdir ) { create_directory($destdir); }
+
+ my $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Creating soft links for all files from directory $sourcedir to directory $destdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ opendir(DIR, $sourcedir);
+ @sourcefiles = readdir(DIR);
+ closedir(DIR);
+
+ my $onefile;
+
+ foreach $onefile (@sourcefiles)
+ {
+ if ((!($onefile eq ".")) && (!($onefile eq "..")))
+ {
+ my $source = $sourcedir . $installer::globals::separator . $onefile;
+ my $dest = $destdir . $installer::globals::separator . $onefile;
+ if ( -f $source ) # only files, no directories
+ {
+ my $localsource = $source;
+ if ( $depth > 0 ) { for ( my $i = 1; $i <= $depth; $i++ ) { $localsource = "../" . $localsource; } }
+ softlink_one_file($localsource, $dest);
+ }
+ if ( -d $source ) # recursive
+ {
+ my $newdepth = $depth + 1;
+ softlink_complete_directory($source, $dest, $newdepth);
+ }
+ }
+ }
+}
+
+#####################################################
+# Copying a complete directory with sub directories.
+#####################################################
+
+sub copy_complete_directory
+{
+ my ($sourcedir, $destdir) = @_;
+
+ my @sourcefiles = ();
+
+ $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
+ $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ if ( ! -d $destdir ) { create_directory($destdir); }
+
+ my $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Copying files from directory $sourcedir to directory $destdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ opendir(DIR, $sourcedir);
+ @sourcefiles = readdir(DIR);
+ closedir(DIR);
+
+ my $onefile;
+
+ foreach $onefile (@sourcefiles)
+ {
+ if ((!($onefile eq ".")) && (!($onefile eq "..")))
+ {
+ my $source = $sourcedir . $installer::globals::separator . $onefile;
+ my $dest = $destdir . $installer::globals::separator . $onefile;
+ if ( -f $source ) # only files, no directories
+ {
+ copy_one_file($source, $dest);
+ }
+ if ( -d $source ) # recursive
+ {
+ if ((!( $source =~ /packages\/SUNW/ )) && (!( $source =~ /packages\/OOO/ ))) # do not copy complete Solaris packages!
+ {
+ copy_complete_directory($source, $dest);
+ }
+ }
+ }
+ }
+}
+
+#####################################################
+# Copying all files with a specified file extension
+# from one directory to another directory.
+#####################################################
+
+sub copy_directory_with_fileextension
+{
+ my ($sourcedir, $destdir, $extension) = @_;
+
+ my @sourcefiles = ();
+
+ $sourcedir =~ s/\Q$installer::globals::separator\E\s*$//;
+ $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Copying files with extension $extension from directory $sourcedir to directory $destdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ opendir(DIR, $sourcedir);
+ @sourcefiles = readdir(DIR);
+ closedir(DIR);
+
+ my $onefile;
+
+ foreach $onefile (@sourcefiles)
+ {
+ if ((!($onefile eq ".")) && (!($onefile eq "..")))
+ {
+ if ( $onefile =~ /\.$extension\s*$/ ) # only copying specified files
+ {
+ my $sourcefile = $sourcedir . $installer::globals::separator . $onefile;
+ my $destfile = $destdir . $installer::globals::separator . $onefile;
+ if ( -f $sourcefile ) # only files, no directories
+ {
+ copy_one_file($sourcefile, $destfile);
+ }
+ }
+ }
+ }
+}
+
+########################################################
+# Renaming all files with a specified file extension
+# in a specified directory.
+# Example: "Feature.idt.01" -> "Feature.idt"
+########################################################
+
+sub rename_files_with_fileextension
+{
+ my ($dir, $extension) = @_;
+
+ my @sourcefiles = ();
+
+ $dir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ my $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Renaming files with extension \"$extension\" in the directory $dir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ opendir(DIR, $dir);
+ @sourcefiles = readdir(DIR);
+ closedir(DIR);
+
+ my $onefile;
+
+ foreach $onefile (@sourcefiles)
+ {
+ if ((!($onefile eq ".")) && (!($onefile eq "..")))
+ {
+ if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ ) # only renaming specified files
+ {
+ my $destfile = $1;
+ my $sourcefile = $dir . $installer::globals::separator . $onefile;
+ $destfile = $dir . $installer::globals::separator . $destfile;
+ if ( -f $sourcefile ) # only files, no directories
+ {
+ rename_one_file($sourcefile, $destfile);
+ }
+ }
+ }
+ }
+}
+
+########################################################
+# Finding all files with a specified file extension
+# in a specified directory.
+########################################################
+
+sub find_file_with_file_extension
+{
+ my ($extension, $dir) = @_;
+
+ my @allfiles = ();
+
+ $dir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ my $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Searching files with extension \"$extension\" in the directory $dir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ opendir(DIR, $dir);
+ @sourcefiles = sort readdir(DIR);
+ closedir(DIR);
+
+ my $onefile;
+
+ foreach $onefile (@sourcefiles)
+ {
+ if ((!($onefile eq ".")) && (!($onefile eq "..")))
+ {
+ if ( $onefile =~ /^\s*(\S.*?)\.$extension\s*$/ )
+ {
+ push(@allfiles, $onefile)
+ }
+ }
+ }
+
+ return \@allfiles;
+}
+
+##############################################################
+# Creating a unique directory, for example "01_inprogress_7"
+# in the install directory.
+##############################################################
+
+sub make_numbered_dir
+{
+ my ($newstring, $olddir) = @_;
+
+ my $basedir = $olddir;
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir);
+
+ my $alldirs = get_all_directories($basedir);
+
+ # searching for the highest number extension
+
+ my $maxnumber = 0;
+
+ for ( my $i = 0; $i <= $#{$alldirs}; $i++ )
+ {
+ if ( ${$alldirs}[$i] =~ /\_(\d+)\s*$/ )
+ {
+ my $number = $1;
+ if ( $number > $maxnumber ) { $maxnumber = $number; }
+ }
+ }
+
+ my $newnumber = $maxnumber + 1;
+
+ my $newdir = $olddir . "_" . $newstring . "_" . $newnumber;
+
+ my $returndir = "";
+
+ if ( move($olddir, $newdir) )
+ {
+ $infoline = "\nMoved directory from $olddir to $newdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $returndir = $newdir;
+ }
+ else
+ {
+ $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"make_numbered_dir\"\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $returndir = $olddir;
+ }
+
+ return $returndir;
+}
+
+#####################################################################################
+# Renaming a directory by exchanging a string, for example from "01_inprogress_7"
+# to "01_witherror_7".
+#####################################################################################
+
+sub rename_string_in_directory
+{
+ my ($olddir, $oldstring, $newstring) = @_;
+
+ my $newdir = $olddir;
+ my $infoline = "";
+
+ $newdir =~ s/$oldstring/$newstring/g;
+
+ if (( -d $newdir ) && ( $olddir ne $newdir )) { remove_complete_directory($newdir, 1); }
+
+ if ( move($olddir, $newdir) )
+ {
+ $infoline = "\nMoved directory from $olddir to $newdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "\nATTENTION: Could not move directory from $olddir to $newdir, \"rename_string_in_directory\"\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ return $newdir;
+}
+
+######################################################
+# Returning the complete directory name,
+# input is the first part of the directory name.
+######################################################
+
+sub get_directoryname
+{
+ my ($searchdir, $startstring) = @_;
+
+ my $dirname = "";
+ my $founddir = 0;
+ my $direntry;
+
+ opendir(DIR, $searchdir);
+
+ foreach $direntry (readdir (DIR))
+ {
+ next if $direntry eq ".";
+ next if $direntry eq "..";
+
+ if (( -d $direntry ) && ( $direntry =~ /^\s*\Q$startstring\E/ ))
+ {
+ $dirname = $direntry;
+ $founddir = 1;
+ last;
+ }
+ }
+
+ closedir(DIR);
+
+ if ( ! $founddir ) { installer::exiter::exit_program("ERROR: Did not find directory beginning with $startstring in directory $searchdir", "get_directoryname"); }
+
+ return $dirname;
+}
+
+
+###################################
+# Renaming a directory
+###################################
+
+sub rename_directory
+{
+ my ($olddir, $newdir) = @_;
+
+ my $infoline = "";
+
+ if ( move($olddir, $newdir) )
+ {
+ $infoline = "\nMoved directory from $olddir to $newdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Could not move directory from $olddir to $newdir $!", "rename_directory");
+ }
+
+ return $newdir;
+}
+
+##############################################################
+# Creating a directory next to an existing directory
+##############################################################
+
+sub create_directory_next_to_directory
+{
+ my ($topdir, $dirname) = @_;
+
+ my $basedir = $topdir;
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$basedir);
+
+ $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ my $newdir = $basedir . $installer::globals::separator . $dirname;
+
+ create_directory($newdir);
+
+ return $newdir;
+}
+
+##############################################################
+# Collecting all directories inside a directory
+##############################################################
+
+sub get_all_directories
+{
+ my ($basedir) = @_;
+
+ my @alldirs = ();
+ my $direntry;
+
+ $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ opendir(DIR, $basedir);
+
+ foreach $direntry (readdir (DIR))
+ {
+ next if $direntry eq ".";
+ next if $direntry eq "..";
+
+ my $completeentry = $basedir . $installer::globals::separator . $direntry;
+
+ if ( -d $completeentry ) { push(@alldirs, $completeentry); }
+ }
+
+ closedir(DIR);
+
+ return \@alldirs;
+}
+
+##############################################################
+# Collecting all directories inside a directory
+# Returning without path
+##############################################################
+
+sub get_all_directories_without_path
+{
+ my ($basedir) = @_;
+
+ my @alldirs = ();
+ my $direntry;
+
+ $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ opendir(DIR, $basedir);
+
+ foreach $direntry (readdir (DIR))
+ {
+ next if $direntry eq ".";
+ next if $direntry eq "..";
+
+ my $completeentry = $basedir . $installer::globals::separator . $direntry;
+
+ if ( -d $completeentry ) { push(@alldirs, $direntry); }
+ }
+
+ closedir(DIR);
+
+ return \@alldirs;
+}
+
+##############################################################
+# Collecting all files and directories inside one directory
+##############################################################
+
+sub read_directory
+{
+ my ($basedir) = @_;
+
+ my @allcontent = ();
+ my $direntry;
+
+ $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ opendir(DIR, $basedir);
+
+ foreach $direntry (readdir (DIR))
+ {
+ next if $direntry eq ".";
+ next if $direntry eq "..";
+
+ my $completeentry = $basedir . $installer::globals::separator . $direntry;
+
+ if (( -f $completeentry ) || ( -d $completeentry )) { push(@allcontent, $completeentry); }
+ }
+
+ closedir(DIR);
+
+ return \@allcontent;
+}
+
+##############################################################
+# Finding the new content in a directory
+##############################################################
+
+sub find_new_content_in_directory
+{
+ my ( $basedir, $oldcontent ) = @_;
+
+ my @newcontent = ();
+ my @allcontent = ();
+
+ my $direntry;
+
+ $basedir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ opendir(DIR, $basedir);
+
+ foreach $direntry (readdir (DIR))
+ {
+ next if $direntry eq ".";
+ next if $direntry eq "..";
+
+ my $completeentry = $basedir . $installer::globals::separator . $direntry;
+
+ if (( -f $completeentry ) || ( -d $completeentry ))
+ {
+ push(@allcontent, $completeentry);
+ if (! grep {$_ eq $completeentry} @{$oldcontent})
+ {
+ push(@newcontent, $completeentry);
+ }
+ }
+ }
+
+ closedir(DIR);
+
+ return (\@newcontent, \@allcontent);
+}
+
+##############################################################
+# Trying to create a directory, no error if this fails
+##############################################################
+
+sub try_to_create_directory
+{
+ my ($directory) = @_;
+
+ my $returnvalue = 1;
+ my $created_directory = 0;
+
+ if (!(-d $directory))
+ {
+ $returnvalue = mkdir($directory, 0775);
+
+ if ($returnvalue)
+ {
+ $created_directory = 1;
+ $infoline = "\nCreated directory: $directory\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ chmod 0775, $directory;
+ }
+ else
+ {
+ $created_directory = 0;
+ }
+ }
+ else
+ {
+ $created_directory = 1;
+ }
+
+ return $created_directory;
+}
+
+##############################################################
+# Creating a complete directory structure
+##############################################################
+
+sub create_directory_structure
+{
+ my ($directory) = @_;
+
+ if ( ! try_to_create_directory($directory) )
+ {
+ my $parentdir = $directory;
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$parentdir);
+
+ my $infoline = "INFO: Did not create directory $directory\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Now trying to create parent directory $parentdir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ create_directory_structure($parentdir); # recursive
+ }
+
+ create_directory($directory); # now it has to succeed
+}
+
+######################################################
+# Removing a complete directory with subdirectories
+######################################################
+
+sub remove_complete_directory
+{
+ my ($directory, $start) = @_;
+
+ my @content = ();
+ my $infoline = "";
+
+ $directory =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ if ( -d $directory )
+ {
+ if ( $start )
+ {
+ $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Removing directory $directory\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ opendir(DIR, $directory);
+ @content = readdir(DIR);
+ closedir(DIR);
+
+ my $oneitem;
+
+ foreach $oneitem (@content)
+ {
+ if ((!($oneitem eq ".")) && (!($oneitem eq "..")))
+ {
+ my $item = $directory . $installer::globals::separator . $oneitem;
+
+ if ( -f $item || -l $item ) # deleting files or links
+ {
+ unlink($item);
+ }
+
+ if ( -d $item ) # recursive
+ {
+ remove_complete_directory($item, 0);
+ }
+ }
+ }
+
+ # try to remove empty directory
+
+ my $returnvalue = rmdir $directory;
+
+ if ( ! $returnvalue )
+ {
+ $infoline = "Warning: Problem with removing empty dir $directory\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ # try a little bit harder (sometimes there is a performance problem)
+ if ( -d $directory )
+ {
+ for ( my $j = 1; $j <= 3; $j++ )
+ {
+ if ( -d $directory )
+ {
+ $infoline = "\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Warning (Try $j): Problems with removing directory $directory\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ $returnvalue = rmdir $directory;
+
+ if ( $returnvalue )
+ {
+ $infoline = "Successfully removed empty dir $directory\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ } else {
+ $infoline = "Warning: rmdir $directory failed.\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+ }
+ }
+}
+
+######################################################
+# Creating a unique directory with pid extension
+######################################################
+
+sub create_pid_directory
+{
+ my ($directory) = @_;
+
+ $directory =~ s/\Q$installer::globals::separator\E\s*$//;
+ my $pid = $$; # process id
+ my $time = time(); # time
+
+ $directory = $directory . "_" . $pid . $time;
+
+ if ( ! -d $directory ) { create_directory($directory); }
+ else { installer::exiter::exit_program("ERROR: Directory $directory already exists!", "create_pid_directory"); }
+
+ return $directory;
+}
+
+##############################################################
+# Reading all files from a directory and its subdirectories
+##############################################################
+
+sub read_complete_directory
+{
+ my ($directory, $pathstring, $filecollector) = @_;
+
+ my @content = ();
+ opendir(DIR, $directory);
+ @content = readdir(DIR);
+ closedir(DIR);
+
+ my $onefile;
+
+ foreach $onefile (@content)
+ {
+ if ((!($onefile eq ".")) && (!($onefile eq "..")))
+ {
+ my $completefilename = $directory . $installer::globals::separator . $onefile;
+ my $sep = "";
+ if ( $pathstring ne "" ) { $sep = $installer::globals::separator; }
+
+ if ( ! -d $completefilename ) # only files, no directories
+ {
+ my $content = $pathstring . $sep . $onefile;
+ push(@{$filecollector}, $content);
+ }
+ else # recursive for directories
+ {
+ my $newpathstring = $pathstring . $sep . $onefile;
+ read_complete_directory($completefilename, $newpathstring, $filecollector);
+ }
+ }
+ }
+}
+
+##############################################################
+# Reading all files from a directory and its subdirectories
+# Version 2
+##############################################################
+
+sub read_full_directory {
+ my ( $currentdir, $pathstring, $collector ) = @_;
+ my $item;
+ my $fullname;
+ local *DH;
+
+ unless (opendir(DH, $currentdir))
+ {
+ return;
+ }
+ while (defined ($item = readdir(DH)))
+ {
+ next if($item eq "." or $item eq "..");
+ $fullname = $currentdir . $installer::globals::separator . $item;
+ my $sep = "";
+ if ( $pathstring ne "" ) { $sep = $installer::globals::separator; }
+
+ if( -d $fullname)
+ {
+ my $newpathstring = $pathstring . $sep . $item;
+ read_full_directory($fullname, $newpathstring, $collector) if(-d $fullname);
+ }
+ else
+ {
+ my $content = $pathstring . $sep . $item;
+ push(@{$collector}, $content);
+ }
+ }
+ closedir(DH);
+ return
+}
+
+##############################################################
+# Removing all empty directories below a specified directory
+##############################################################
+
+sub remove_empty_dirs_in_folder
+{
+ my ( $dir ) = @_;
+
+ my @content = ();
+ my $infoline = "";
+
+ $dir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ if ( -d $dir )
+ {
+ opendir(DIR, $dir);
+ @content = readdir(DIR);
+ closedir(DIR);
+
+ my $oneitem;
+
+ foreach $oneitem (@content)
+ {
+ if ((!($oneitem eq ".")) && (!($oneitem eq "..")))
+ {
+ my $item = $dir . $installer::globals::separator . $oneitem;
+
+ if ( -d $item ) # recursive
+ {
+ remove_empty_dirs_in_folder($item);
+ }
+ }
+ }
+
+ # try to remove empty directory
+ my $returnvalue = rmdir $dir;
+
+ if ( $returnvalue )
+ {
+ $infoline = "Successfully removed empty dir $dir\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ }
+
+}
+
+######################################################
+# Making systemcall
+######################################################
+
+sub make_systemcall
+{
+ my ($systemcall) = @_;
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/admin.pm b/solenv/bin/modules/installer/windows/admin.pm
new file mode 100644
index 000000000..27e4ba7c3
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/admin.pm
@@ -0,0 +1,515 @@
+#
+# 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 .
+#
+
+package installer::windows::admin;
+
+use File::Copy;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::pathanalyzer;
+use installer::systemactions;
+use installer::worker;
+use installer::windows::idtglobal;
+
+#################################################################################
+# Unpacking cabinet files with expand
+#################################################################################
+
+sub unpack_cabinet_file
+{
+ my ($cabfilename, $unpackdir) = @_;
+
+ my $infoline = "Unpacking cabinet file: $cabfilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $expandfile = "expand.exe"; # Has to be in the path
+
+ # expand.exe has to be located in the system directory.
+ # Cygwin has another tool expand.exe, that converts tabs to spaces. This cannot be used of course.
+ # But this wrong expand.exe is typically in the PATH before this expand.exe, to unpack
+ # cabinet files.
+
+ if ( $^O =~ /cygwin/i )
+ {
+ $expandfile = qx(cygpath -u "$ENV{WINDIR}"/System32/expand.exe);
+ chomp $expandfile;
+ }
+
+ my $expandlogfile = $unpackdir . $installer::globals::separator . "expand.log";
+
+ # exclude cabinet file
+
+ my $systemcall = "";
+ if ( $^O =~ /cygwin/i ) {
+ my $localunpackdir = qx{cygpath -w "$unpackdir"};
+ chomp ($localunpackdir);
+ $localunpackdir =~ s/\\/\\\\/g;
+ $cabfilename =~ s/\\/\\\\/g;
+ $cabfilename =~ s/\s*$//g;
+ $systemcall = $expandfile . " " . $cabfilename . " -F:\* " . $localunpackdir . " \> " . $expandlogfile;
+ }
+ else
+ {
+ $systemcall = $expandfile . " " . $cabfilename . " -F:\* " . $unpackdir . " \> " . $expandlogfile;
+ }
+
+ my $returnvalue = system($systemcall);
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not extract cabinet file: $mergemodulehash->{'cabinetfile'} !", "change_file_table");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+#################################################################################
+# Extracting tables from msi database
+#################################################################################
+
+sub extract_tables_from_pcpfile
+{
+ my ($fullmsidatabasepath, $workdir, $tablelist) = @_;
+
+ my $msidb = "msidb.exe"; # Has to be in the path
+ my $infoline = "";
+ my $systemcall = "";
+ my $returnvalue = "";
+
+ my $localfullmsidatabasepath = $fullmsidatabasepath;
+
+ # Export of all tables by using "*"
+
+ if ( $^O =~ /cygwin/i ) {
+ # Copying the msi database locally guarantees the format of the directory.
+ # Otherwise it is defined in the file of UPDATE_DATABASE_LISTNAME
+
+ my $msifilename = $localfullmsidatabasepath;
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$msifilename);
+ my $destdatabasename = $workdir . $installer::globals::separator . $msifilename;
+ installer::systemactions::copy_one_file($localfullmsidatabasepath, $destdatabasename);
+ $localfullmsidatabasepath = $destdatabasename;
+
+ chomp( $localfullmsidatabasepath = qx{cygpath -w "$localfullmsidatabasepath"} );
+ chomp( $workdir = qx{cygpath -w "$workdir"} );
+
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ $localfullmsidatabasepath =~ s/\\/\\\\/g;
+ $workdir =~ s/\\/\\\\/g;
+
+ # and if there are still slashes, they also need to be double backslash
+ $localfullmsidatabasepath =~ s/\//\\\\/g;
+ $workdir =~ s/\//\\\\/g;
+ }
+
+ $systemcall = $msidb . " -d " . $localfullmsidatabasepath . " -f " . $workdir . " -e $tablelist";
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not exclude tables from pcp file: $localfullmsidatabasepath !", "extract_tables_from_pcpfile");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+################################################################################
+# Analyzing the content of Directory.idt
+#################################################################################
+
+sub analyze_directory_file
+{
+ my ($filecontent) = @_;
+
+ my %table = ();
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; }
+
+ if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my $dir = $1;
+ my $parent = $2;
+ my $name = $3;
+
+ if ( $name =~ /^\s*(.*?)\s*\:\s*(.*?)\s*$/ ) { $name = $2; }
+ if ( $name =~ /^\s*(.*?)\s*\|\s*(.*?)\s*$/ ) { $name = $2; }
+
+ my %helphash = ();
+ $helphash{'Directory_Parent'} = $parent;
+ $helphash{'DefaultDir'} = $name;
+ $table{$dir} = \%helphash;
+ }
+ }
+
+ return \%table;
+}
+
+#################################################################################
+# Analyzing the content of Component.idt
+#################################################################################
+
+sub analyze_component_file
+{
+ my ($filecontent) = @_;
+
+ my %table = ();
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; }
+
+ if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my $component = $1;
+ my $dir = $3;
+
+ $table{$component} = $dir;
+ }
+ }
+
+ return \%table;
+}
+
+#################################################################################
+# Analyzing the content of File.idt
+#################################################################################
+
+sub analyze_file_file
+{
+ my ($filecontent) = @_;
+
+ my %table = ();
+ my %fileorder = ();
+ my $maxsequence = 0;
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; }
+
+ if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my $file = $1;
+ my $comp = $2;
+ my $filename = $3;
+ my $sequence = $8;
+
+ if ( $filename =~ /^\s*(.*?)\s*\|\s*(.*?)\s*$/ ) { $filename = $2; }
+
+ my %helphash = ();
+ $helphash{'Component'} = $comp;
+ $helphash{'FileName'} = $filename;
+ $helphash{'Sequence'} = $sequence;
+
+ $table{$file} = \%helphash;
+
+ $fileorder{$sequence} = $file;
+
+ if ( $sequence > $maxsequence ) { $maxsequence = $sequence; }
+ }
+ }
+
+ return (\%table, \%fileorder, $maxsequence);
+}
+
+####################################################################################
+# Recursively creating the directory tree
+####################################################################################
+
+sub create_directory_tree
+{
+ my ($parent, $pathcollector, $fulldir, $dirhash) = @_;
+
+ foreach my $dir ( keys %{$dirhash} )
+ {
+ if (( $dirhash->{$dir}->{'Directory_Parent'} eq $parent ) && ( $dirhash->{$dir}->{'DefaultDir'} ne "." ))
+ {
+ my $dirname = $dirhash->{$dir}->{'DefaultDir'};
+ # Create the directory
+ my $newdir = $fulldir . $installer::globals::separator . $dirname;
+ if ( ! -f $newdir ) { mkdir $newdir; }
+ # Saving in collector
+ $pathcollector->{$dir} = $newdir;
+ # Iteration
+ create_directory_tree($dir, $pathcollector, $newdir, $dirhash);
+ }
+ }
+}
+
+####################################################################################
+# Creating the directory tree
+####################################################################################
+
+sub create_directory_structure
+{
+ my ($dirhash, $targetdir) = @_;
+
+ my %fullpathhash = ();
+
+ my @startparents = ("TARGETDIR", "INSTALLLOCATION");
+
+ foreach $dir (@startparents) { create_directory_tree($dir, \%fullpathhash, $targetdir, $dirhash); }
+
+ # Also adding the paths of the startparents
+ foreach $dir (@startparents)
+ {
+ if ( ! exists($fullpathhash{$dir}) ) { $fullpathhash{$dir} = $targetdir; }
+ }
+
+ return \%fullpathhash;
+}
+
+####################################################################################
+# Copying files into installation set
+####################################################################################
+
+sub copy_files_into_directory_structure
+{
+ my ($fileorder, $filehash, $componenthash, $fullpathhash, $maxsequence, $unpackdir, $installdir, $dirhash) = @_;
+
+ for ( my $i = 1; $i <= $maxsequence; $i++ )
+ {
+ if ( exists($fileorder->{$i}) )
+ {
+ my $file = $fileorder->{$i};
+ if ( ! exists($filehash->{$file}->{'Component'}) ) { installer::exiter::exit_program("ERROR: Did not find component for file: \"$file\".", "copy_files_into_directory_structure"); }
+ my $component = $filehash->{$file}->{'Component'};
+ if ( ! exists($componenthash->{$component}) ) { installer::exiter::exit_program("ERROR: Did not find directory for component: \"$component\".", "copy_files_into_directory_structure"); }
+ my $dirname = $componenthash->{$component};
+ if ( ! exists($fullpathhash->{$dirname}) ) { installer::exiter::exit_program("ERROR: Did not find full directory path for dir: \"$dirname\".", "copy_files_into_directory_structure"); }
+ my $destdir = $fullpathhash->{$dirname};
+ if ( ! exists($filehash->{$file}->{'FileName'}) ) { installer::exiter::exit_program("ERROR: Did not find \"FileName\" for file: \"$file\".", "copy_files_into_directory_structure"); }
+ my $destfile = $filehash->{$file}->{'FileName'};
+
+ $destfile = $destdir . $installer::globals::separator . $destfile;
+ my $sourcefile = $unpackdir . $installer::globals::separator . $file;
+
+ if ( ! -f $sourcefile )
+ {
+ # It is possible, that this was an unpacked file
+ # Looking in the dirhash, to find the subdirectory in the installation set (the id is $dirname)
+ # subdir is not recursively analyzed, only one directory.
+
+ my $oldsourcefile = $sourcefile;
+ my $subdir = "";
+ if ( exists($dirhash->{$dirname}->{'DefaultDir'}) ) { $subdir = $dirhash->{$dirname}->{'DefaultDir'} . $installer::globals::separator; }
+ my $realfilename = $filehash->{$file}->{'FileName'};
+ my $localinstalldir = $installdir;
+
+ $localinstalldir =~ s/\\\s*$//;
+ $localinstalldir =~ s/\/\s*$//;
+
+ $sourcefile = $localinstalldir . $installer::globals::separator . $subdir . $realfilename;
+
+ if ( ! -f $sourcefile )
+ {
+ installer::exiter::exit_program("ERROR: File not found: \"$oldsourcefile\" (or \"$sourcefile\").", "copy_files_into_directory_structure");
+ }
+ }
+
+ my $copyreturn = copy($sourcefile, $destfile);
+
+ if ( ! $copyreturn) # only logging problems
+ {
+ my $infoline = "ERROR: Could not copy $sourcefile to $destfile (insufficient disc space for $destfile ?)\n";
+ $returnvalue = 0;
+ push(@installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program($infoline, "copy_files_into_directory_structure");
+ }
+ }
+ }
+}
+
+
+###############################################################
+# Setting the time string for the
+# Summary Information stream in the
+# msi database of the admin installations.
+###############################################################
+
+sub get_sis_time_string
+{
+ # Syntax: <yyyy/mm/dd hh:mm:ss>
+ my $second = (localtime())[0];
+ my $minute = (localtime())[1];
+ my $hour = (localtime())[2];
+ my $day = (localtime())[3];
+ my $month = (localtime())[4];
+ my $year = 1900 + (localtime())[5];
+
+ $month++; # zero based month
+
+ if ( $second < 10 ) { $second = "0" . $second; }
+ if ( $minute < 10 ) { $minute = "0" . $minute; }
+ if ( $hour < 10 ) { $hour = "0" . $hour; }
+ if ( $day < 10 ) { $day = "0" . $day; }
+ if ( $month < 10 ) { $month = "0" . $month; }
+
+ my $timestring = $year . "/" . $month . "/" . $day . " " . $hour . ":" . $minute . ":" . $second;
+
+ return $timestring;
+}
+
+###############################################################
+# Writing content of administrative installations into
+# Summary Information Stream of msi database.
+# This is required for example for following
+# patch processes using Windows Installer service.
+###############################################################
+
+sub write_sis_info
+{
+ my ($msidatabase) = @_ ;
+
+ if ( ! -f $msidatabase ) { installer::exiter::exit_program("ERROR: Cannot find file $msidatabase", "write_sis_info"); }
+
+ my $msiinfo = "msiinfo.exe"; # Has to be in the path
+ my $infoline = "";
+ my $systemcall = "";
+ my $returnvalue = "";
+
+ # Required setting for administrative installations:
+ # -w 4 (source files are unpacked), wordcount
+ # -s <date of admin installation>, LastPrinted, Syntax: <yyyy/mm/dd hh:mm:ss>
+ # -l <person_making_admin_installation>, LastSavedBy
+
+ my $wordcount = 4; # Unpacked files
+ my $lastprinted = get_sis_time_string();
+ my $lastsavedby = "Installer";
+
+ my $localmsidatabase = $msidatabase;
+
+ if( $^O =~ /cygwin/i )
+ {
+ $localmsidatabase = qx{cygpath -w "$localmsidatabase"};
+ $localmsidatabase =~ s/\\/\\\\/g;
+ $localmsidatabase =~ s/\s*$//g;
+ }
+
+ $systemcall = $msiinfo . " " . "\"" . $localmsidatabase . "\"" . " -w " . $wordcount . " -s " . "\"" . $lastprinted . "\"" . " -l $lastsavedby";
+ push(@installer::globals::logfileinfo, $systemcall);
+ $returnvalue = system($systemcall);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program($infoline, "write_sis_info");
+ }
+}
+
+####################################################################################
+# Simulating an administrative installation
+####################################################################################
+
+sub make_admin_install
+{
+ my ($databasepath, $targetdir) = @_;
+
+ # Create helper directory
+
+ installer::logger::print_message( "... installing $databasepath in directory $targetdir ...\n" );
+
+ my $helperdir = $targetdir . $installer::globals::separator . "installhelper";
+ installer::systemactions::create_directory($helperdir);
+
+ # Get File.idt, Component.idt and Directory.idt from database
+
+ my $tablelist = "File Directory Component Registry";
+ extract_tables_from_pcpfile($databasepath, $helperdir, $tablelist);
+
+ # Unpack all cab files into $helperdir, cab files must be located next to msi database
+ my $installdir = $databasepath;
+
+ if ( $^O =~ /cygwin/i ) { $installdir =~ s/\\/\//g; } # backslash to slash
+
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$installdir);
+
+ if ( $^O =~ /cygwin/i ) { $installdir =~ s/\//\\/g; } # slash to backslash
+
+ my $databasefilename = $databasepath;
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$databasefilename);
+
+ my $cabfiles = installer::systemactions::find_file_with_file_extension("cab", $installdir);
+
+ if ( $#{$cabfiles} < 0 ) { installer::exiter::exit_program("ERROR: Did not find any cab file in directory $installdir", "make_admin_install"); }
+
+ # Set unpackdir
+ my $unpackdir = $helperdir . $installer::globals::separator . "unpack";
+ installer::systemactions::create_directory($unpackdir);
+
+ for ( my $i = 0; $i <= $#{$cabfiles}; $i++ )
+ {
+ my $cabfile = "";
+ if ( $^O =~ /cygwin/i )
+ {
+ $cabfile = $installdir . ${$cabfiles}[$i];
+ }
+ else
+ {
+ $cabfile = $installdir . $installer::globals::separator . ${$cabfiles}[$i];
+ }
+ unpack_cabinet_file($cabfile, $unpackdir);
+ }
+
+ # Reading tables
+ my $filename = $helperdir . $installer::globals::separator . "Directory.idt";
+ my $filecontent = installer::files::read_file($filename);
+ my $dirhash = analyze_directory_file($filecontent);
+
+ $filename = $helperdir . $installer::globals::separator . "Component.idt";
+ my $componentfilecontent = installer::files::read_file($filename);
+ my $componenthash = analyze_component_file($componentfilecontent);
+
+ $filename = $helperdir . $installer::globals::separator . "File.idt";
+ $filecontent = installer::files::read_file($filename);
+ my ( $filehash, $fileorder, $maxsequence ) = analyze_file_file($filecontent);
+
+ # Creating the directory structure
+ my $fullpathhash = create_directory_structure($dirhash, $targetdir);
+
+ # Copying files
+ copy_files_into_directory_structure($fileorder, $filehash, $componenthash, $fullpathhash, $maxsequence, $unpackdir, $installdir, $dirhash);
+
+ my $msidatabase = $targetdir . $installer::globals::separator . $databasefilename;
+ installer::systemactions::copy_one_file($databasepath, $msidatabase);
+
+ # Saving info in Summary Information Stream of msi database (required for following patches)
+ write_sis_info($msidatabase);
+
+ return $msidatabase;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/assembly.pm b/solenv/bin/modules/installer/windows/assembly.pm
new file mode 100644
index 000000000..38c04a799
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/assembly.pm
@@ -0,0 +1,279 @@
+#
+# 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 .
+#
+
+package installer::windows::assembly;
+
+use installer::files;
+use installer::globals;
+use installer::worker;
+use installer::windows::idtglobal;
+
+##############################################################
+# Returning the first module of a file from the
+# comma separated list of modules.
+##############################################################
+
+sub get_msiassembly_feature
+{
+ my ( $onefile ) = @_;
+
+ my $module = "";
+
+ if ( $onefile->{'modules'} ) { $module = $onefile->{'modules'}; }
+
+ # If modules contains a list of modules, only taking the first one.
+
+ if ( $module =~ /^\s*(.*?)\,/ ) { $module = $1; }
+
+ # Attention: Maximum feature length is 38!
+ installer::windows::idtglobal::shorten_feature_gid(\$module);
+
+ return $module;
+}
+
+##############################################################
+# Returning the component of a file.
+##############################################################
+
+sub get_msiassembly_component
+{
+ my ( $onefile ) = @_;
+
+ my $component = "";
+
+ $component = $onefile->{'componentname'};
+
+ return $component;
+}
+
+##############################################################
+# Returning the file name as manifest file
+##############################################################
+
+sub get_msiassembly_filemanifest
+{
+ my ( $onefile ) = @_;
+
+ my $filemanifest = "";
+
+ $filemanifest = $onefile->{'uniquename'};
+
+ return $filemanifest;
+}
+
+##############################################################
+# Returning the file application
+##############################################################
+
+sub get_msiassembly_fileapplication
+{
+ my ( $onefile ) = @_;
+
+ my $fileapplication = "";
+
+ return $fileapplication;
+}
+
+##############################################################
+# Returning the file attributes
+##############################################################
+
+sub get_msiassembly_attributes
+{
+ my ( $onefile ) = @_;
+
+ my $fileattributes = "";
+
+ if ( $onefile->{'Attributes'} ne "" ) { $fileattributes = $onefile->{'Attributes'}; }
+
+ return $fileattributes;
+}
+
+####################################################################################
+# Creating the file MsiAssembly.idt dynamically
+# Content:
+# Component_ Feature_ File_Manifest File_Application Attributes
+# s72 s38 S72 S72 I2
+# MsiAssembly Component_
+####################################################################################
+
+sub create_msiassembly_table
+{
+ my ($filesref, $basedir) = @_;
+
+ $installer::globals::msiassemblyfiles = installer::worker::collect_all_items_with_special_flag($filesref, "ASSEMBLY");
+
+ my @msiassemblytable = ();
+
+ installer::windows::idtglobal::write_idt_header(\@msiassemblytable, "msiassembly");
+
+ # Registering all libraries listed in $installer::globals::msiassemblyfiles
+
+ for ( my $i = 0; $i <= $#{$installer::globals::msiassemblyfiles}; $i++ )
+ {
+ my $onefile = ${$installer::globals::msiassemblyfiles}[$i];
+
+ my %msiassembly = ();
+
+ $msiassembly{'Component_'} = get_msiassembly_component($onefile);
+ $msiassembly{'Feature_'} = get_msiassembly_feature($onefile);
+ $msiassembly{'File_Manifest'} = get_msiassembly_filemanifest($onefile);
+ $msiassembly{'File_Application'} = get_msiassembly_fileapplication($onefile);
+ $msiassembly{'Attributes'} = get_msiassembly_attributes($onefile);
+
+ my $oneline = $msiassembly{'Component_'} . "\t" . $msiassembly{'Feature_'} . "\t" .
+ $msiassembly{'File_Manifest'} . "\t" . $msiassembly{'File_Application'} . "\t" .
+ $msiassembly{'Attributes'} . "\n";
+
+ push(@msiassemblytable, $oneline);
+ }
+
+ # Saving the file
+
+ my $msiassemblytablename = $basedir . $installer::globals::separator . "MsiAssem.idt";
+ installer::files::save_file($msiassemblytablename ,\@msiassemblytable);
+ my $infoline = "Created idt file: $msiassemblytablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+}
+
+####################################################################################
+# Creating the file MsiAssemblyName.idt dynamically
+# Content:
+# Component_ Name Value
+# s72 s255 s255
+# MsiAssemblyName Component_ Name
+####################################################################################
+
+sub create_msiassemblyname_table
+{
+ my ($filesref, $basedir) = @_;
+
+ my @msiassemblynametable = ();
+
+ installer::windows::idtglobal::write_idt_header(\@msiassemblynametable, "msiassemblyname");
+
+ for ( my $i = 0; $i <= $#{$installer::globals::msiassemblyfiles}; $i++ )
+ {
+ my $onefile = ${$installer::globals::msiassemblyfiles}[$i];
+
+ my $component = get_msiassembly_component($onefile);
+ my $oneline = "";
+
+ # Order: (Assembly)name, publicKeyToken, version, culture.
+
+ if ( $onefile->{'Assemblyname'} )
+ {
+ $oneline = $component . "\t" . "name" . "\t" . $onefile->{'Assemblyname'} . "\n";
+ push(@msiassemblynametable, $oneline);
+ }
+
+ if ( $onefile->{'PublicKeyToken'} )
+ {
+ $oneline = $component . "\t" . "publicKeyToken" . "\t" . $onefile->{'PublicKeyToken'} . "\n";
+ push(@msiassemblynametable, $oneline);
+ }
+
+ if ( $onefile->{'Version'} )
+ {
+ $oneline = $component . "\t" . "version" . "\t" . $onefile->{'Version'} . "\n";
+ push(@msiassemblynametable, $oneline);
+ }
+
+ if ( $onefile->{'Culture'} )
+ {
+ $oneline = $component . "\t" . "culture" . "\t" . $onefile->{'Culture'} . "\n";
+ push(@msiassemblynametable, $oneline);
+ }
+
+ if ( $onefile->{'ProcessorArchitecture'} )
+ {
+ $oneline = $component . "\t" . "processorArchitecture" . "\t" . $onefile->{'ProcessorArchitecture'} . "\n";
+ push(@msiassemblynametable, $oneline);
+ }
+ }
+
+ # Saving the file
+
+ my $msiassemblynametablename = $basedir . $installer::globals::separator . "MsiAsseN.idt";
+ installer::files::save_file($msiassemblynametablename ,\@msiassemblynametable);
+ my $infoline = "Created idt file: $msiassemblynametablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+####################################################################################
+# setting an installation condition for the assembly libraries saved in
+# @installer::globals::msiassemblynamecontent
+####################################################################################
+
+sub add_assembly_condition_into_component_table
+{
+ my ($filesref, $basedir) = @_;
+
+ my $componenttablename = $basedir . $installer::globals::separator . "Componen.idt";
+ my $componenttable = installer::files::read_file($componenttablename);
+ my $changed = 0;
+ my $infoline = "";
+
+ for ( my $i = 0; $i <= $#{$installer::globals::msiassemblyfiles}; $i++ )
+ {
+ my $onefile = ${$installer::globals::msiassemblyfiles}[$i];
+
+ my $filecomponent = get_msiassembly_component($onefile);
+
+ for ( my $j = 0; $j <= $#{$componenttable}; $j++ )
+ {
+ my $oneline = ${$componenttable}[$j];
+
+ if ( $oneline =~ /(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)/ )
+ {
+ my $component = $1;
+ my $componentid = $2;
+ my $directory = $3;
+ my $attributes = $4;
+ my $condition = $5;
+ my $keypath = $6;
+
+ if ( $component eq $filecomponent )
+ {
+ # setting the condition
+
+ $condition = "MsiNetAssemblySupport >= \"4.0.0.0\"";
+ $oneline = $component . "\t" . $componentid . "\t" . $directory . "\t" . $attributes . "\t" . $condition . "\t" . $keypath . "\n";
+ ${$componenttable}[$j] = $oneline;
+ $changed = 1;
+ $infoline = "Changing $componenttablename :\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = $oneline;
+ push(@installer::globals::logfileinfo, $infoline);
+ last;
+ }
+ }
+ }
+ }
+
+ if ( $changed )
+ {
+ # Saving the file
+ installer::files::save_file($componenttablename ,$componenttable);
+ $infoline = "Saved idt file: $componenttablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/binary.pm b/solenv/bin/modules/installer/windows/binary.pm
new file mode 100644
index 000000000..b6f979ce0
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/binary.pm
@@ -0,0 +1,67 @@
+#
+# 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 .
+#
+
+package installer::windows::binary;
+
+use installer::files;
+use installer::globals;
+
+###########################################################################################################
+# Updating the table Binary dynamically with all files from $binarytablefiles
+# Content:
+# Name Data
+# s72 v0
+# Binary Name
+###########################################################################################################
+
+sub update_binary_table
+{
+ my ($languageidtdir, $filesref, $binarytablefiles) = @_;
+
+ my $binaryidttablename = $languageidtdir . $installer::globals::separator . "Binary.idt";
+ my $binaryidttable = installer::files::read_file($binaryidttablename);
+
+ # Only the iconfiles, that are used in the shortcut table for the
+ # FolderItems (entries in Windows startmenu) are added into the icon table.
+
+ for ( my $i = 0; $i <= $#{$binarytablefiles}; $i++ )
+ {
+ my $binaryfile = ${$binarytablefiles}[$i];
+ my $binaryfilename = $binaryfile->{'Name'};
+ my $binaryfiledata = $binaryfilename;
+
+ $binaryfilename =~ s/\.//g; # removing "." in filename: "abc.dll" to "abcdll" in name column
+
+ my %binary = ();
+
+ $binary{'Name'} = $binaryfilename;
+ $binary{'Data'} = $binaryfiledata;
+
+ my $oneline = $binary{'Name'} . "\t" . $binary{'Data'} . "\n";
+
+ push(@{$binaryidttable}, $oneline);
+ }
+
+ # Saving the file
+
+ installer::files::save_file($binaryidttablename ,$binaryidttable);
+ my $infoline = "Updated idt file: $binaryidttablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/component.pm b/solenv/bin/modules/installer/windows/component.pm
new file mode 100644
index 000000000..9751caabd
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/component.pm
@@ -0,0 +1,505 @@
+#
+# 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 .
+#
+
+package installer::windows::component;
+
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+use installer::windows::language;
+
+##############################################################
+# Returning a globally unique ID (GUID) for a component
+# If the component is new, a unique guid has to be created.
+# If the component already exists, the guid has to be
+# taken from a list component <-> guid
+# Sample for a guid: {B68FD953-3CEF-4489-8269-8726848056E8}
+##############################################################
+
+sub get_component_guid
+{
+ my ( $componentname, $componentidhashref ) = @_;
+
+ # At this time only a template
+ my $returnvalue = "\{COMPONENTGUID\}";
+
+ if (( $installer::globals::updatedatabase ) && ( exists($componentidhashref->{$componentname}) ))
+ {
+ $returnvalue = $componentidhashref->{$componentname};
+ }
+
+ # Returning a ComponentID, that is assigned in scp project
+ if ( exists($installer::globals::componentid{$componentname}) )
+ {
+ $returnvalue = "\{" . $installer::globals::componentid{$componentname} . "\}";
+ }
+
+ return $returnvalue;
+}
+
+##############################################################
+# Returning the directory for a file component.
+##############################################################
+
+sub get_file_component_directory
+{
+ my ($componentname, $filesref, $dirref) = @_;
+
+ my ($onefile, $component, $onedir, $hostname, $uniquedir);
+ my $found = 0;
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ $onefile = ${$filesref}[$i];
+ $component = $onefile->{'componentname'};
+
+ if ( $component eq $componentname )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ # This component can be ignored, if it exists in a version with extension "_pff" (this was renamed in file::get_sequence_for_file() )
+ my $ignore_this_component = 0;
+ my $origcomponentname = $componentname;
+ my $componentname = $componentname . "_pff";
+
+ for ( my $j = 0; $j <= $#{$filesref}; $j++ )
+ {
+ $onefile = ${$filesref}[$j];
+ $component = $onefile->{'componentname'};
+
+ if ( $component eq $componentname )
+ {
+ $ignore_this_component = 1;
+ last;
+ }
+ }
+
+ if ( $ignore_this_component ) { return "IGNORE_COMP"; }
+ else { installer::exiter::exit_program("ERROR: Did not find component \"$origcomponentname\" in file collection", "get_file_component_directory"); }
+ }
+
+ my $localstyles = "";
+
+ if ( $onefile->{'Styles'} ) { $localstyles = $onefile->{'Styles'}; }
+
+ if ( $localstyles =~ /\bFONT\b/ ) # special handling for font files
+ {
+ return $installer::globals::fontsfolder;
+ }
+
+ my $destdir = "";
+
+ if ( $onefile->{'Dir'} ) { $destdir = $onefile->{'Dir'}; }
+
+ my $destination = $onefile->{'destination'};
+
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination);
+
+ $destination =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ # This path has to be defined in the directory collection at "HostName"
+
+ if ($destination eq "") # files in the installation root
+ {
+ $uniquedir = "INSTALLLOCATION";
+ }
+ else
+ {
+ $found = 0;
+
+ for ( my $i = 0; $i <= $#{$dirref}; $i++ )
+ {
+ $onedir = ${$dirref}[$i];
+ $hostname = $onedir->{'HostName'};
+
+ if ( $hostname eq $destination )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ installer::exiter::exit_program("ERROR: Did not find destination $destination in directory collection", "get_file_component_directory");
+ }
+
+ $uniquedir = $onedir->{'uniquename'};
+
+ if ( $uniquedir eq $installer::globals::officeinstalldirectory )
+ {
+ $uniquedir = "INSTALLLOCATION";
+ }
+ }
+
+ $onefile->{'uniquedirname'} = $uniquedir; # saving it in the file collection
+
+ return $uniquedir
+}
+
+##############################################################
+# Returning the directory for a registry component.
+# This cannot be a useful value
+##############################################################
+
+sub get_registry_component_directory
+{
+ my $componentdir = "INSTALLLOCATION";
+
+ return $componentdir;
+}
+
+##############################################################
+# Returning the attributes for a file component.
+##############################################################
+
+sub get_file_component_attributes
+{
+ my ($componentname, $filesref, $allvariables) = @_;
+
+ my $attributes;
+
+ $attributes = 2;
+
+ # special handling for font files
+
+ my $onefile;
+ my $found = 0;
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ $onefile = ${$filesref}[$i];
+ my $component = $onefile->{'componentname'};
+
+ if ( $component eq $componentname )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ installer::exiter::exit_program("ERROR: Did not find component in file collection", "get_file_component_attributes");
+ }
+
+ my $localstyles = "";
+
+ if ( $onefile->{'Styles'} ) { $localstyles = $onefile->{'Styles'}; }
+
+ if ( $localstyles =~ /\bFONT\b/ )
+ {
+ $attributes = 8; # font files will be deinstalled if the ref count is 0
+ }
+
+ if ( $localstyles =~ /\bASSEMBLY\b/ )
+ {
+ $attributes = 0; # Assembly files cannot run from source
+ }
+
+ if ( $onefile->{'needs_user_registry_key'} )
+ {
+ $attributes = 4; # Files in non advertised startmenu entries must have user registry key as KeyPath
+ }
+
+ # Setting msidbComponentAttributes64bit, if this is a 64 bit installation set.
+ if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $attributes |= 256; }
+
+ return $attributes;
+}
+
+##############################################################
+# Returning the attributes for a registry component.
+# Always 4, indicating, the keypath is a defined in
+# table registry
+##############################################################
+
+sub get_registry_component_attributes
+{
+ my ($componentname, $allvariables) = @_;
+
+ my $attributes;
+
+ $attributes = 4;
+
+ # Setting msidbComponentAttributes64bit, if this is a 64 bit installation set.
+ if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $attributes |= 256; }
+
+ # Setting msidbComponentAttributes64bit for 64 bit shell extension in 32 bit installer, too
+ if ( $componentname =~ m/winexplorerext_x64/ ) { $attributes |= 256; }
+
+ return $attributes;
+}
+
+##############################################################
+# Returning the conditions for a component.
+# This is important for language dependent components
+# in multilingual installation sets.
+##############################################################
+
+sub get_file_component_condition
+{
+ my ($componentname, $filesref) = @_;
+
+ my $condition = "";
+
+ if (exists($installer::globals::componentcondition{$componentname}))
+ {
+ $condition = $installer::globals::componentcondition{$componentname};
+ }
+
+ # there can be also tree conditions for multilayer products
+ if (exists($installer::globals::treeconditions{$componentname}))
+ {
+ if ( $condition eq "" )
+ {
+ $condition = $installer::globals::treeconditions{$componentname};
+ }
+ else
+ {
+ $condition = "($condition) And ($installer::globals::treeconditions{$componentname})";
+ }
+ }
+
+ return $condition
+}
+
+##############################################################
+# Returning the conditions for a registry component.
+##############################################################
+
+sub get_component_condition
+{
+ my ($componentname) = @_;
+
+ my $condition;
+
+ $condition = ""; # Always ?
+
+ if (exists($installer::globals::componentcondition{$componentname}))
+ {
+ $condition = $installer::globals::componentcondition{$componentname};
+ }
+
+ return $condition
+}
+
+####################################################################
+# Returning the keypath for a component.
+# This will be the name of the first file/registry, found in the
+# collection $itemsref
+# Attention: This has to be the unique (file)name, not the
+# real filename!
+####################################################################
+
+sub get_component_keypath
+{
+ my ($componentname, $itemsref, $componentidkeypathhashref) = @_;
+
+ my $oneitem;
+ my $found = 0;
+ my $infoline = "";
+
+ for ( my $i = 0; $i <= $#{$itemsref}; $i++ )
+ {
+ $oneitem = ${$itemsref}[$i];
+ my $component = $oneitem->{'componentname'};
+
+ if ( $component eq $componentname )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ installer::exiter::exit_program("ERROR: Did not find component in file/registry collection, function get_component_keypath", "get_component_keypath");
+ }
+
+ my $keypath = $oneitem->{'uniquename'}; # "uniquename", not "Name"
+
+ # Special handling for updates from existing databases, because KeyPath must not change
+ if (( $installer::globals::updatedatabase ) && ( exists($componentidkeypathhashref->{$componentname}) ))
+ {
+ $keypath = $componentidkeypathhashref->{$componentname};
+ # -> check, if this is a valid key path?!
+ if ( $keypath ne $oneitem->{'uniquename'} )
+ {
+ # Warning: This keypath was changed because of info from old database
+ $infoline = "WARNING: The KeyPath for component \"$componentname\" was changed from \"$oneitem->{'uniquename'}\" to \"$keypath\" because of information from update database";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ if ( $oneitem->{'userregkeypath'} ) { $keypath = $oneitem->{'userregkeypath'}; }
+
+ # saving it in the file and registry collection
+ $oneitem->{'keypath'} = $keypath;
+
+ return $keypath
+}
+
+###################################################################
+# Creating the file Componen.idt dynamically
+# Content:
+# Component ComponentId Directory_ Attributes Condition KeyPath
+###################################################################
+
+sub create_component_table
+{
+ my ($filesref, $registryref, $dirref, $allfilecomponentsref, $allregistrycomponents, $basedir, $componentidhashref, $componentidkeypathhashref, $allvariables) = @_;
+
+ my @componenttable = ();
+
+ my ($oneline, $infoline);
+
+ installer::windows::idtglobal::write_idt_header(\@componenttable, "component");
+
+ # File components
+
+ for ( my $i = 0; $i <= $#{$allfilecomponentsref}; $i++ )
+ {
+ my %onecomponent = ();
+
+ $onecomponent{'name'} = ${$allfilecomponentsref}[$i];
+ $onecomponent{'guid'} = get_component_guid($onecomponent{'name'}, $componentidhashref);
+ $onecomponent{'directory'} = get_file_component_directory($onecomponent{'name'}, $filesref, $dirref);
+ if ( $onecomponent{'directory'} eq "IGNORE_COMP" ) { next; }
+ $onecomponent{'attributes'} = get_file_component_attributes($onecomponent{'name'}, $filesref, $allvariables);
+ $onecomponent{'condition'} = get_file_component_condition($onecomponent{'name'}, $filesref);
+ $onecomponent{'keypath'} = get_component_keypath($onecomponent{'name'}, $filesref, $componentidkeypathhashref);
+
+ $oneline = $onecomponent{'name'} . "\t" . $onecomponent{'guid'} . "\t" . $onecomponent{'directory'} . "\t"
+ . $onecomponent{'attributes'} . "\t" . $onecomponent{'condition'} . "\t" . $onecomponent{'keypath'} . "\n";
+
+ push(@componenttable, $oneline);
+ }
+
+ # Registry components
+
+ for ( my $i = 0; $i <= $#{$allregistrycomponents}; $i++ )
+ {
+ my %onecomponent = ();
+
+ $onecomponent{'name'} = ${$allregistrycomponents}[$i];
+ $onecomponent{'guid'} = get_component_guid($onecomponent{'name'}, $componentidhashref);
+ $onecomponent{'directory'} = get_registry_component_directory();
+ $onecomponent{'attributes'} = get_registry_component_attributes($onecomponent{'name'}, $allvariables);
+ $onecomponent{'condition'} = get_component_condition($onecomponent{'name'});
+ $onecomponent{'keypath'} = get_component_keypath($onecomponent{'name'}, $registryref, $componentidkeypathhashref);
+
+ $oneline = $onecomponent{'name'} . "\t" . $onecomponent{'guid'} . "\t" . $onecomponent{'directory'} . "\t"
+ . $onecomponent{'attributes'} . "\t" . $onecomponent{'condition'} . "\t" . $onecomponent{'keypath'} . "\n";
+
+ push(@componenttable, $oneline);
+ }
+
+ # Saving the file
+
+ my $componenttablename = $basedir . $installer::globals::separator . "Componen.idt";
+ installer::files::save_file($componenttablename ,\@componenttable);
+ $infoline = "Created idt file: $componenttablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+}
+
+####################################################################################
+# Returning a component for a scp module gid.
+# Pairs are saved in the files collector.
+####################################################################################
+
+sub get_component_name_from_modulegid
+{
+ my ($modulegid, $filesref) = @_;
+
+ my $componentname = "";
+
+ for my $file ( @{$filesref} )
+ {
+ next if ( ! $file->{'modules'} );
+
+ my @filemodules = split /,\s*/, $file->{'modules'};
+
+ if (grep {$_ eq $modulegid} @filemodules)
+ {
+ $componentname = $file->{'componentname'};
+ last;
+ }
+ }
+
+ return $componentname;
+}
+
+####################################################################################
+# Updating the file Environm.idt dynamically
+# Content:
+# Environment Name Value Component_
+####################################################################################
+
+sub set_component_in_environment_table
+{
+ my ($basedir, $filesref) = @_;
+
+ my $infoline = "";
+
+ my $environmentfilename = $basedir . $installer::globals::separator . "Environm.idt";
+
+ if ( -f $environmentfilename ) # only do something, if file exists
+ {
+ my $environmentfile = installer::files::read_file($environmentfilename);
+
+ for ( my $i = 3; $i <= $#{$environmentfile}; $i++ ) # starting in line 4 of Environm.idt
+ {
+ if ( ${$environmentfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my $modulegid = $4; # in Environment table a scp module gid can be used as component replacement
+
+ my $componentname = get_component_name_from_modulegid($modulegid, $filesref);
+
+ if ( $componentname ) # only do something if a component could be found
+ {
+ $infoline = "Updated Environment table:\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Old line: ${$environmentfile}[$i]\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ ${$environmentfile}[$i] =~ s/$modulegid/$componentname/;
+
+ $infoline = "New line: ${$environmentfile}[$i]\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ }
+ }
+ }
+
+ # Saving the file
+
+ installer::files::save_file($environmentfilename ,$environmentfile);
+ $infoline = "Updated idt file: $environmentfilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/createfolder.pm b/solenv/bin/modules/installer/windows/createfolder.pm
new file mode 100644
index 000000000..a5c534c43
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/createfolder.pm
@@ -0,0 +1,154 @@
+#
+# 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 .
+#
+
+package installer::windows::createfolder;
+
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+
+##############################################################
+# Returning directory for createfolder table.
+##############################################################
+
+sub get_createfolder_directory
+{
+ my ($onedir) = @_;
+
+ my $uniquename = $onedir->{'uniquename'};
+
+ return $uniquename;
+}
+
+##############################################################
+# Searching the correct file for language pack directories.
+##############################################################
+
+sub get_languagepack_file
+{
+ my ($filesref, $onedir) = @_;
+
+ my $language = $onedir->{'specificlanguage'};
+ my $foundfile = 0;
+ my $onefile = "";
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ $onefile = ${$filesref}[$i];
+
+ if ( $onefile->{'specificlanguage'} eq $onedir->{'specificlanguage'} )
+ {
+ $foundfile = 1;
+ last;
+ }
+ }
+
+ if ( ! $foundfile ) { installer::exiter::exit_program("ERROR: No file with correct language found (language pack build)!", "get_languagepack_file"); }
+
+ return $onefile;
+}
+
+##############################################################
+# Returning component for createfolder table.
+##############################################################
+
+sub get_createfolder_component
+{
+ my ($onedir, $filesref, $allvariableshashref) = @_;
+
+ # Directories do not belong to a module.
+ # Therefore they can only belong to the root module and
+ # will be added to a component at the root module.
+ # All directories will be added to the component
+ # $allvariableshashref->{'ROOTMODULEGID'}
+
+ if ( ! $allvariableshashref->{'ROOTMODULEGID'} ) { installer::exiter::exit_program("ERROR: ROOTMODULEGID must be defined in list file!", "get_createfolder_component"); }
+
+ my $rootmodulegid = $allvariableshashref->{'ROOTMODULEGID'};
+
+ my $onefile;
+ if ( $installer::globals::languagepack ) { $onefile = get_languagepack_file($filesref, $onedir); }
+ elsif ( $installer::globals::helppack ) { ($onefile) = grep {$_->{gid} eq 'gid_File_Help_Common_Zip'} @{$filesref} }
+ else {
+ foreach my $file (@{$filesref}) {
+ if ($file->{'modules'} eq $rootmodulegid)
+ {
+ $onefile = $file;
+ last;
+ }
+ }
+ }
+
+ if (! defined $onefile) {
+ installer::exiter::exit_program("ERROR: Could not find file!", "get_createfolder_component");
+ }
+
+ return $onefile->{'componentname'};
+}
+
+####################################################################################
+# Creating the file CreateFo.idt dynamically for creation of empty directories
+# Content:
+# Directory_ Component_
+####################################################################################
+
+sub create_createfolder_table
+{
+ my ($dirref, $filesref, $basedir, $allvariableshashref) = @_;
+
+ my @createfoldertable = ();
+
+ my $infoline;
+
+ installer::windows::idtglobal::write_idt_header(\@createfoldertable, "createfolder");
+
+ for ( my $i = 0; $i <= $#{$dirref}; $i++ )
+ {
+ my $onedir = ${$dirref}[$i];
+
+ # language packs and help packs get only language dependent directories
+ if (( $installer::globals::languagepack ) || ( $installer::globals::languagepack ) && ( $onedir->{'specificlanguage'} eq "" )) { next };
+
+ my $styles = "";
+
+ if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
+
+ if ( $styles =~ /\bCREATE\b/ )
+ {
+ my %directory = ();
+
+ $directory{'Directory_'} = get_createfolder_directory($onedir);
+ $directory{'Component_'} = get_createfolder_component($onedir, $filesref, $allvariableshashref);
+
+ my $oneline = $directory{'Directory_'} . "\t" . $directory{'Component_'} . "\n";
+
+ push(@createfoldertable, $oneline);
+ }
+ }
+
+ # Saving the file
+
+ my $createfoldertablename = $basedir . $installer::globals::separator . "CreateFo.idt";
+ installer::files::save_file($createfoldertablename ,\@createfoldertable);
+ $infoline = "Created idt file: $createfoldertablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/directory.pm b/solenv/bin/modules/installer/windows/directory.pm
new file mode 100644
index 000000000..829687e8b
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/directory.pm
@@ -0,0 +1,634 @@
+#
+# 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 .
+#
+
+package installer::windows::directory;
+
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::pathanalyzer;
+use installer::windows::idtglobal;
+use installer::windows::msiglobal;
+
+##############################################################
+# Collecting all directory trees in global hash
+##############################################################
+
+my @msistandarddirectorynames = qw(
+ AdminToolsFolder
+ AppDataFolder
+ CommonAppDataFolder
+ CommonFiles64Folder
+ CommonFilesFolder
+ DesktopFolder
+ FavoritesFolder
+ FontsFolder
+ LocalAppDataFolder
+ MyPicturesFolder
+ NetHoodFolder
+ PersonalFolder
+ PrintHoodFolder
+ ProgramFiles64Folder
+ ProgramFilesFolder
+ ProgramMenuFolder
+ RecentFolder
+ SendToFolder
+ StartMenuFolder
+ StartupFolder
+ System16Folder
+ System64Folder
+ SystemFolder
+ TempFolder
+ TemplateFolder
+ WindowsFolder
+ WindowsVolume
+);
+
+sub collectdirectorytrees
+{
+ my ( $directoryref ) = @_;
+
+ for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
+ {
+ my $onedir = ${$directoryref}[$i];
+ my $styles = "";
+ if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
+
+ if ( $styles ne "" )
+ {
+ foreach my $treestyle ( keys %installer::globals::treestyles )
+ {
+ if ( $styles =~ /\b$treestyle\b/ )
+ {
+ my $hostname = $onedir->{'HostName'};
+ # -> hostname is the key, the style the value!
+ $installer::globals::hostnametreestyles{$hostname} = $treestyle;
+ }
+ }
+ }
+ }
+}
+
+##############################################################
+# Overwriting global programfilesfolder, if required
+##############################################################
+
+sub overwrite_programfilesfolder
+{
+ my ( $allvariables ) = @_;
+
+ if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 ))
+ {
+ $installer::globals::programfilesfolder = "ProgramFiles64Folder";
+ }
+}
+
+##############################################################
+# Maximum length of directory name is 72.
+# Taking care of underlines, which are the separator.
+##############################################################
+
+sub make_short_dir_version
+{
+ my ($longstring) = @_;
+
+ my $shortstring = "";
+ my $cutlength = 60;
+ my $length = 5; # So the directory can still be recognized
+ my $longstring_save = $longstring;
+
+ # Splitting the string at each "underline" and allowing only
+ # $length characters per directory name.
+ # Checking also uniqueness and length.
+
+ for my $onestring ( split /_\s*/, $longstring )
+ {
+ my $partstring = "";
+
+ if ( $onestring =~ /\-/ )
+ {
+ for my $onelocalstring ( split /-\s*/, $onestring )
+ {
+ if ( length($onelocalstring) > $length ) {
+ $onelocalstring = substr($onelocalstring, 0, $length);
+ }
+ $partstring .= "-" . $onelocalstring;
+ }
+ $partstring =~ s/^\s*\-//;
+ }
+ else
+ {
+ if ( length($onestring) > $length ) {
+ $partstring = substr($onestring, 0, $length);
+ }
+ else {
+ $partstring = $onestring;
+ }
+ }
+
+ $shortstring .= "_" . $partstring;
+ }
+
+ $shortstring =~ s/^\s*\_//;
+
+ # Setting unique ID to each directory
+ # No counter allowed, process must be absolute reproducible due to patch creation process.
+
+ # chomp(my $id = `echo $longstring_save | md5sum | sed -e "s/ .*//g"`); # Very, very slow
+ # my $subid = substr($id, 0, 9); # taking only the first 9 digits
+
+ my $subid = installer::windows::msiglobal::calculate_id($longstring_save, 9); # taking only the first 9 digits
+
+ if ( length($shortstring) > $cutlength ) { $shortstring = substr($shortstring, 0, $cutlength); }
+
+ $shortstring = $shortstring . "_" . $subid;
+
+ return $shortstring;
+}
+
+##############################################################
+# Adding unique directory names to the directory collection
+##############################################################
+
+my $already_checked_the_frigging_directories_for_uniqueness = 0;
+
+sub create_unique_directorynames
+{
+ my ($directoryref, $allvariables) = @_;
+
+ my %completedirhashstep1 = ();
+ my %shortdirhash = ();
+ my %shortdirhashreverse = ();
+ my $infoline = "";
+
+ for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
+ {
+ my $onedir = ${$directoryref}[$i];
+ my $uniquename = $onedir->{'HostName'};
+
+ my $styles = "";
+ if ( $onedir->{'Styles'} ) { $styles = $onedir->{'Styles'}; }
+
+ $uniquename =~ s/^\s*//g; # removing beginning white spaces
+ $uniquename =~ s/\s*$//g; # removing ending white spaces
+ $uniquename =~ s/\s//g; # removing white spaces
+ $uniquename =~ s/\_//g; # removing existing underlines
+ $uniquename =~ s/\.//g; # removing dots in directoryname
+ $uniquename =~ s/\Q$installer::globals::separator\E/\_/g; # replacing slash and backslash with underline
+ $uniquename =~ s/OpenOffice/OO/g;
+ $uniquename =~ s/LibreOffice/LO/g;
+ $uniquename =~ s/_registry/_rgy/g;
+ $uniquename =~ s/_registration/_rgn/g;
+ $uniquename =~ s/_extension/_ext/g;
+ $uniquename =~ s/_frame/_frm/g;
+ $uniquename =~ s/_table/_tbl/g;
+ $uniquename =~ s/_chart/_crt/g;
+ $uniquename =~ s/_plat-linux/_plx/g;
+
+ # The names after this small changes must still be unique!
+ if ( exists($completedirhashstep1{$uniquename}) ) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 1): \"$uniquename\".", "create_unique_directorynames"); }
+ $completedirhashstep1{$uniquename} = 1;
+
+ # Starting to make unique name for the parent and its directory
+ my $originaluniquename = $uniquename;
+
+ $uniquename = make_short_dir_version($uniquename);
+
+ # Checking if the same directory already exists, but has another short version.
+ if (( exists($shortdirhash{$originaluniquename}) ) && ( $shortdirhash{$originaluniquename} ne $uniquename )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 2A): \"$uniquename\".", "create_unique_directorynames"); }
+
+ # Also checking vice versa
+ # Checking if the same short directory already exists, but has another long version.
+ if (( exists($shortdirhashreverse{$uniquename}) ) && ( $shortdirhashreverse{$uniquename} ne $originaluniquename )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 2B): \"$uniquename\".", "create_unique_directorynames"); }
+
+ # Creating assignment from long to short directory names
+ $shortdirhash{$originaluniquename} = $uniquename;
+ $shortdirhashreverse{$uniquename} = $originaluniquename;
+
+ # Important: The unique parent is generated from the string $originaluniquename (with the use of underlines).
+
+ my $uniqueparentname = $originaluniquename;
+ my $keepparent = 1;
+
+ if ( $uniqueparentname =~ /^\s*(.*)\_(.*?)\s*$/ ) # the underline is now the separator
+ {
+ $uniqueparentname = $1;
+ $keepparent = 0;
+ }
+ else
+ {
+ $uniqueparentname = $installer::globals::programfilesfolder;
+ $keepparent = 1;
+ }
+
+ if ( $styles =~ /\bPROGRAMFILESFOLDER\b/ )
+ {
+ $uniqueparentname = $installer::globals::programfilesfolder;
+ $keepparent = 1;
+ }
+ if ( $styles =~ /\bCOMMONFILESFOLDER\b/ )
+ {
+ $uniqueparentname = $installer::globals::commonfilesfolder;
+ $keepparent = 1;
+ }
+ if ( $styles =~ /\bCOMMONAPPDATAFOLDER\b/ )
+ {
+ $uniqueparentname = $installer::globals::commonappdatafolder;
+ $keepparent = 1;
+ }
+ if ( $styles =~ /\bLOCALAPPDATAFOLDER\b/ )
+ {
+ $uniqueparentname = $installer::globals::localappdatafolder;
+ $keepparent = 1;
+ }
+
+ if ( $styles =~ /\bSHAREPOINTPATH\b/ )
+ {
+ $uniqueparentname = "SHAREPOINTPATH";
+ $installer::globals::usesharepointpath = 1;
+ $keepparent = 1;
+ }
+
+ # also setting short directory name for the parent
+
+ my $originaluniqueparentname = $uniqueparentname;
+
+ if ( ! $keepparent )
+ {
+ $uniqueparentname = make_short_dir_version($uniqueparentname);
+ }
+
+ # Again checking if the same directory already exists, but has another short version.
+ if (( exists($shortdirhash{$originaluniqueparentname}) ) && ( $shortdirhash{$originaluniqueparentname} ne $uniqueparentname )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 3A): \"$uniqueparentname\".", "create_unique_directorynames"); }
+
+ # Also checking vice versa
+ # Checking if the same short directory already exists, but has another long version.
+ if (( exists($shortdirhashreverse{$uniqueparentname}) ) && ( $shortdirhashreverse{$uniqueparentname} ne $originaluniqueparentname )) { installer::exiter::exit_program("ERROR: Error in packaging process. Unallowed modification of directory name, not unique (step 3B): \"$uniqueparentname\".", "create_unique_directorynames"); }
+
+ $shortdirhash{$originaluniqueparentname} = $uniqueparentname;
+ $shortdirhashreverse{$uniqueparentname} = $originaluniqueparentname;
+
+ # Hyphen not allowed in database
+ $uniquename =~ s/\-/\_/g; # making "-" to "_"
+ $uniqueparentname =~ s/\-/\_/g; # making "-" to "_"
+
+ # And finally setting the values for the directories
+ $onedir->{'uniquename'} = $uniquename;
+ $onedir->{'uniqueparentname'} = $uniqueparentname;
+
+ # setting the installlocation directory
+ if ( $styles =~ /\bISINSTALLLOCATION\b/ )
+ {
+ if ( $installer::globals::installlocationdirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag ISINSTALLLOCATION already set: \"$installer::globals::installlocationdirectory\".", "create_unique_directorynames"); }
+ $installer::globals::installlocationdirectory = $uniquename;
+ $installer::globals::installlocationdirectoryset = 1;
+ }
+ }
+}
+
+#####################################################
+# Adding ":." to selected default directory names
+#####################################################
+
+sub check_sourcedir_addon
+{
+ my ( $onedir, $allvariableshashref ) = @_;
+
+ if (($installer::globals::languagepack) ||
+ ($installer::globals::helppack) ||
+ ($allvariableshashref->{'CHANGETARGETDIR'}))
+ {
+ my $sourcediraddon = "\:\.";
+ $onedir->{'defaultdir'} = $onedir->{'defaultdir'} . $sourcediraddon;
+ }
+
+}
+
+#####################################################
+# The directory with the style ISINSTALLLOCATION
+# will be replaced by INSTALLLOCATION
+#####################################################
+
+sub set_installlocation_directory
+{
+ my ( $directoryref, $allvariableshashref ) = @_;
+
+ if ( ! $installer::globals::installlocationdirectoryset ) { installer::exiter::exit_program("ERROR: Directory with flag ISINSTALLLOCATION not set!", "set_installlocation_directory"); }
+
+ for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
+ {
+ my $onedir = ${$directoryref}[$i];
+
+ if ( $onedir->{'uniquename'} eq $installer::globals::installlocationdirectory )
+ {
+ $onedir->{'uniquename'} = "INSTALLLOCATION";
+ check_sourcedir_addon($onedir, $allvariableshashref);
+ }
+
+ if ( $onedir->{'uniquename'} eq $installer::globals::vendordirectory )
+ {
+ check_sourcedir_addon($onedir, $allvariableshashref);
+ }
+
+ if ( $onedir->{'uniqueparentname'} eq $installer::globals::installlocationdirectory )
+ {
+ $onedir->{'uniqueparentname'} = "INSTALLLOCATION";
+ }
+ }
+}
+
+#####################################################
+# Getting the name of the top level directory. This
+# can have only one letter
+#####################################################
+
+sub get_last_directory_name
+{
+ my ($completepathref) = @_;
+
+ if ( $$completepathref =~ /^.*[\/\\](.+?)\s*$/ )
+ {
+ $$completepathref = $1;
+ }
+}
+
+#####################################################
+# Creating the defaultdir for the file Director.idt
+#####################################################
+
+sub create_defaultdir_directorynames
+{
+ my ($directoryref, $shortdirnamehashref) = @_;
+
+ my @shortnames = ();
+ if ( $installer::globals::updatedatabase ) { @shortnames = values(%{$shortdirnamehashref}); }
+ elsif ( $installer::globals::prepare_winpatch ) { @shortnames = values(%installer::globals::saved83dirmapping); }
+
+ for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
+ {
+ my $onedir = ${$directoryref}[$i];
+ my $hostname = $onedir->{'HostName'};
+
+ $hostname =~ s/\Q$installer::globals::separator\E\s*$//;
+ get_last_directory_name(\$hostname);
+ my $uniquename = $onedir->{'uniquename'};
+ my $shortstring;
+ if (( $installer::globals::updatedatabase ) && ( exists($shortdirnamehashref->{$uniquename}) ))
+ {
+ $shortstring = $shortdirnamehashref->{$uniquename};
+ }
+ elsif (( $installer::globals::prepare_winpatch ) && ( exists($installer::globals::saved83dirmapping{$uniquename}) ))
+ {
+ $shortstring = $installer::globals::saved83dirmapping{$uniquename};
+ }
+ else
+ {
+ $shortstring = installer::windows::idtglobal::make_eight_three_conform($hostname, "dir", \@shortnames);
+ }
+
+ my $defaultdir;
+
+ if ( $shortstring eq $hostname )
+ {
+ $defaultdir = $hostname;
+ }
+ else
+ {
+ $defaultdir = $shortstring . "|" . $hostname;
+ }
+
+ $onedir->{'defaultdir'} = $defaultdir;
+
+ my $fontdir = "";
+ if ( $onedir->{'Dir'} ) { $fontdir = $onedir->{'Dir'}; }
+
+ my $fontdefaultdir = "";
+ if ( $onedir->{'defaultdir'} ) { $fontdefaultdir = $onedir->{'defaultdir'}; }
+
+ if (( $fontdir eq $installer::globals::fontsdirhostname ) && ( $fontdefaultdir eq $installer::globals::fontsdirhostname ))
+ {
+ $installer::globals::fontsdirname = $onedir->{'defaultdir'};
+ $installer::globals::fontsdirparent = $onedir->{'uniqueparentname'};
+ }
+ }
+}
+
+###############################################
+# Fill content into the directory table
+###############################################
+
+sub create_directorytable_from_collection
+{
+ my ($directorytableref, $directoryref) = @_;
+
+ for ( my $i = 0; $i <= $#{$directoryref}; $i++ )
+ {
+ my $onedir = ${$directoryref}[$i];
+ my $hostname = $onedir->{'HostName'};
+ my $dir = "";
+
+ if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; }
+
+ if (( $dir eq "PREDEFINED_PROGDIR" ) && ( $hostname eq "" )) { next; } # removing files from root directory
+
+ my $oneline = $onedir->{'uniquename'} . "\t" . $onedir->{'uniqueparentname'} . "\t" . $onedir->{'defaultdir'} . "\n";
+
+ push(@{$directorytableref}, $oneline);
+ }
+}
+
+###############################################
+# Defining the root installation structure
+###############################################
+
+sub add_root_directories
+{
+ my ($directorytableref, $allvariableshashref, $onelanguage) = @_;
+
+ my $oneline = "";
+
+ if (( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack ) && ( ! $allvariableshashref->{'DONTUSESTARTMENUFOLDER'} ))
+ {
+ my $productname;
+
+ $productname = $allvariableshashref->{'PRODUCTNAME'};
+ my $productversion = $allvariableshashref->{'PRODUCTVERSION'};
+ my $baseproductversion = $productversion;
+
+ if (( $installer::globals::prepare_winpatch ) && ( $allvariableshashref->{'BASEPRODUCTVERSION'} ))
+ {
+ $baseproductversion = $allvariableshashref->{'BASEPRODUCTVERSION'}; # for example "2.0" for OOo
+ }
+
+ my $realproductkey = $productname . " " . $productversion;
+ my $productkey = $productname . " " . $baseproductversion;
+
+ if (( $allvariableshashref->{'POSTVERSIONEXTENSION'} ) && ( ! $allvariableshashref->{'DONTUSEEXTENSIONINDEFAULTDIR'} ))
+ {
+ $productkey = $productkey . " " . $allvariableshashref->{'POSTVERSIONEXTENSION'};
+ $realproductkey = $realproductkey . " " . $allvariableshashref->{'POSTVERSIONEXTENSION'};
+ }
+ if ( $allvariableshashref->{'NOVERSIONINDIRNAME'} )
+ {
+ $productkey = $productname;
+ $realproductkey = $realproductname;
+ }
+ if ( $allvariableshashref->{'NOSPACEINDIRECTORYNAME'} )
+ {
+ $productkey =~ s/\ /\_/g;
+ $realproductkey =~ s/\ /\_/g;
+ }
+
+ my $shortproductkey = installer::windows::idtglobal::make_eight_three_conform($productkey, "dir"); # third parameter not used
+ $shortproductkey =~ s/\s/\_/g; # changing empty space to underline
+
+ $oneline = "$installer::globals::officemenufolder\t$installer::globals::programmenufolder\t$shortproductkey|$realproductkey\n";
+ push(@{$directorytableref}, $oneline);
+ }
+
+ $oneline = "TARGETDIR\t\tSourceDir\n";
+ push(@{$directorytableref}, $oneline);
+
+ $oneline = "WindowsFolder\tTARGETDIR\tWindows\n";
+ push(@{$directorytableref}, $oneline);
+
+ $oneline = "$installer::globals::programfilesfolder\tTARGETDIR\t.\n";
+ push(@{$directorytableref}, $oneline);
+
+ $oneline = "$installer::globals::programmenufolder\tTARGETDIR\t.\n";
+ push(@{$directorytableref}, $oneline);
+
+ $oneline = "$installer::globals::startupfolder\tTARGETDIR\t.\n";
+ push(@{$directorytableref}, $oneline);
+
+ $oneline = "$installer::globals::desktopfolder\tTARGETDIR\t.\n";
+ push(@{$directorytableref}, $oneline);
+
+ $oneline = "$installer::globals::startmenufolder\tTARGETDIR\t.\n";
+ push(@{$directorytableref}, $oneline);
+
+ $oneline = "$installer::globals::commonfilesfolder\tTARGETDIR\t.\n";
+ push(@{$directorytableref}, $oneline);
+
+ $oneline = "$installer::globals::commonappdatafolder\tTARGETDIR\t.\n";
+ push(@{$directorytableref}, $oneline);
+
+ $oneline = "$installer::globals::localappdatafolder\tTARGETDIR\t.\n";
+ push(@{$directorytableref}, $oneline);
+
+ if ( $installer::globals::usesharepointpath )
+ {
+ $oneline = "SHAREPOINTPATH\tTARGETDIR\t.\n";
+ push(@{$directorytableref}, $oneline);
+ }
+
+ my $localtemplatefoldername = $installer::globals::templatefoldername;
+ my $directorytableentry = $localtemplatefoldername;
+ my $shorttemplatefoldername = installer::windows::idtglobal::make_eight_three_conform($localtemplatefoldername, "dir");
+ if ( $shorttemplatefoldername ne $localtemplatefoldername ) { $directorytableentry = "$shorttemplatefoldername|$localtemplatefoldername"; }
+ $oneline = "$installer::globals::templatefolder\tTARGETDIR\t$directorytableentry\n";
+ push(@{$directorytableref}, $oneline);
+
+ if ( $installer::globals::fontsdirname )
+ {
+ $oneline = "$installer::globals::fontsfolder\t$installer::globals::fontsdirparent\t$installer::globals::fontsfoldername\:$installer::globals::fontsdirname\n";
+ }
+ else
+ {
+ $oneline = "$installer::globals::fontsfolder\tTARGETDIR\t$installer::globals::fontsfoldername\n";
+ }
+
+ push(@{$directorytableref}, $oneline);
+
+}
+
+###############################################
+# Creating the file Director.idt dynamically
+###############################################
+
+sub create_directory_table
+{
+ my ($directoryref, $languagesarrayref, $basedir, $allvariableshashref, $shortdirnamehashref, $loggingdir) = @_;
+
+ # Structure of the directory table:
+ # Directory Directory_Parent DefaultDir
+ # Directory is a unique identifier
+ # Directory_Parent is the unique identifier of the parent
+ # DefaultDir is .:APPLIC~1|Application Data with
+ # Before ":" : [sourcedir]:[destdir] (not programmed yet)
+ # After ":" : 8+3 and not 8+3 the destination directory name
+
+ for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ )
+ {
+ my $onelanguage = ${$languagesarrayref}[$m];
+ $installer::globals::installlocationdirectoryset = 0;
+
+ my @directorytable = ();
+ my $infoline;
+
+ overwrite_programfilesfolder($allvariableshashref);
+ create_unique_directorynames($directoryref, $allvariableshashref);
+ $already_checked_the_frigging_directories_for_uniqueness++;
+ create_defaultdir_directorynames($directoryref, $shortdirnamehashref); # only destdir!
+ set_installlocation_directory($directoryref, $allvariableshashref);
+ installer::windows::idtglobal::write_idt_header(\@directorytable, "directory");
+ add_root_directories(\@directorytable, $allvariableshashref, $onelanguage);
+ create_directorytable_from_collection(\@directorytable, $directoryref);
+
+ # Saving the file
+
+ my $directorytablename = $basedir . $installer::globals::separator . "Director.idt" . "." . $onelanguage;
+ installer::files::save_file($directorytablename ,\@directorytable);
+ $infoline = "Created idt file: $directorytablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+}
+
+################################################
+# Check if the string starts with another string
+################################################
+
+sub starts_with
+{
+ my ($first, $second) = @_;
+
+ return substr($first, 0, length($second)) eq $second;
+}
+
+###############################################
+# Check if the directory prefix is a standard
+# directory name. If it is the case, then the
+# standard directory name is returned in $var.
+###############################################
+
+sub has_standard_directory_prefix
+{
+ my ($dir, $var) = @_;
+
+ for my $d (@msistandarddirectorynames) {
+ if (starts_with($dir, $d) && $dir ne $d) {
+ installer::logger::print_message("... match found: [$d]\n");
+ ${$var} = $d;
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/feature.pm b/solenv/bin/modules/installer/windows/feature.pm
new file mode 100644
index 000000000..356220829
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/feature.pm
@@ -0,0 +1,403 @@
+#
+# 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 .
+#
+
+package installer::windows::feature;
+
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::worker;
+use installer::windows::idtglobal;
+use installer::windows::language;
+
+##############################################################
+# Returning the gid for a feature.
+# Attention: Maximum length
+##############################################################
+
+sub get_feature_gid
+{
+ my ($onefeature) = @_;
+
+ my $gid = "";
+
+ if ( $onefeature->{'gid'} ) { $gid = $onefeature->{'gid'}; }
+
+ # Attention: Maximum feature length is 38!
+ installer::windows::idtglobal::shorten_feature_gid(\$gid);
+
+ return $gid
+}
+
+##############################################################
+# Returning the gid of the parent.
+# Attention: Maximum length
+##############################################################
+
+sub get_feature_parent
+{
+ my ($onefeature) = @_;
+
+ my $parentgid = "";
+
+ if ( $onefeature->{'ParentID'} ) { $parentgid = $onefeature->{'ParentID'}; }
+
+ # The modules, hanging directly below the root, have to be root modules.
+ # Only then it is possible to make the "real" root module invisible by
+ # setting the display to "0".
+
+ if ( $parentgid eq $installer::globals::rootmodulegid ) { $parentgid = ""; }
+
+ # Attention: Maximum feature length is 38!
+ installer::windows::idtglobal::shorten_feature_gid(\$parentgid);
+
+ return $parentgid
+}
+
+##############################################################
+# Returning the display for a feature.
+# 0: Feature is not shown
+# odd: subfeatures are shown
+# even: subfeatures are not shown
+##############################################################
+
+sub get_feature_display
+{
+ my ($onefeature) = @_;
+
+ my $display;
+ my $parentid = "";
+
+ if ( $onefeature->{'ParentID'} ) { $parentid = $onefeature->{'ParentID'}; }
+
+ if ( $parentid eq "" )
+ {
+ $display = "0"; # root module is not visible
+ }
+ elsif ( $onefeature->{'gid'} eq "gid_Module_Prg") # program module shows subfeatures
+ {
+ $display = "1"; # root module shows subfeatures
+ }
+ else
+ {
+ $display = "2"; # all other modules do not show subfeatures
+ }
+
+ # special case: Feature has flag "HIDDEN_ROOT" -> $display is 0
+ my $styles = "";
+ if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
+ if ( $styles =~ /\bHIDDEN_ROOT\b/ ) { $display = "0"; }
+
+ # Special handling for language modules. Only visible in multilingual installation set
+ if (( $styles =~ /\bSHOW_MULTILINGUAL_ONLY\b/ ) && ( ! $installer::globals::ismultilingual )) { $display = "0"; }
+
+ # No program module visible.
+ if ( $onefeature->{'gid'} eq "gid_Module_Prg" ) { $display = "0"; }
+
+ # making all feature invisible in Language packs and in Help packs!
+ if ( $installer::globals::languagepack || $installer::globals::helppack ) { $display = "0"; }
+
+ return $display
+}
+
+##############################################################
+# Returning the level for a feature.
+##############################################################
+
+sub get_feature_level
+{
+ my ($onefeature) = @_;
+
+ my $level = "20"; # the default
+
+ if ( $onefeature->{'Disabled'} )
+ {
+ if ( $onefeature->{'Disabled'} eq "YES" ) # Disabled = "YES"
+ {
+ $level = "0"; # disabled for installation at any INSTALLLEVEL
+ }
+ }
+ elsif ( $onefeature->{'Default'} )
+ {
+ if ( $onefeature->{'Default'} eq "NO" ) # explicitly set Default = "NO"
+ {
+ $level = "200"; # deselected in default installation, base is 100
+ }
+ }
+
+ return $level
+}
+
+##############################################################
+# Returning the directory for a feature.
+##############################################################
+
+sub get_feature_directory
+{
+ my ($onefeature) = @_;
+
+ my $directory;
+
+ $directory = "INSTALLLOCATION";
+
+ return $directory
+}
+
+##############################################################
+# Returning the directory for a feature.
+##############################################################
+
+sub get_feature_attributes
+{
+ my ($onefeature) = @_;
+
+ my $attributes;
+
+ # 2 = msidbFeatureAttributesFollowParent
+ # 8 = msidbFeatureAttributesDisallowAdvertise
+ # 16 = msidbFeatureAttributesUIDisallowAbsent
+
+ # No advertising of features and no leaving on network.
+ # Feature without parent must not have the "2"
+
+ my $parentgid = "";
+ if ( $onefeature->{'ParentID'} ) { $parentgid = $onefeature->{'ParentID'}; }
+
+ if (( $parentgid eq "" ) || ( $parentgid eq $installer::globals::rootmodulegid )) { $attributes = "8"; }
+ elsif ( $onefeature->{'Independent'} && ($onefeature->{'Independent'} eq "YES") ) { $attributes = "8"; }
+ elsif ( get_feature_display($onefeature) eq "0" ) { $attributes = "26"; } # fdo#33798
+ else { $attributes = "10"; }
+
+ return $attributes
+}
+
+#################################################################################
+# Collecting the feature recursively.
+#################################################################################
+
+sub collect_modules_recursive
+{
+ my ($modulesref, $parentid, $feature, $directaccess, $directgid, $directparent, $directsortkey, $sorted) = @_;
+
+ my @allchildren = ();
+ my $childrenexist = 0;
+
+ # Collecting children from Module $parentid
+
+ my $modulegid;
+ foreach $modulegid ( keys %{$directparent})
+ {
+ if ( $directparent->{$modulegid} eq $parentid )
+ {
+ push @allchildren, [ $directsortkey->{$modulegid}, $modulegid ];
+ $childrenexist = 1;
+ }
+ }
+
+ # Sorting children
+
+ if ( $childrenexist )
+ {
+ # Sort children
+ @allchildren = map { $_->[1] }
+ sort { $a->[0] <=> $b->[0] }
+ @allchildren;
+
+ # Adding children to new array
+ foreach my $gid ( @allchildren )
+ {
+ # Saving all lines, that have this 'gid'
+
+ my $unique;
+ foreach $unique ( keys %{$directgid} )
+ {
+ if ( $directgid->{$unique} eq $gid )
+ {
+ push(@{$feature}, ${$modulesref}[$directaccess->{$unique}]);
+ if ( $sorted->{$unique} == 1 ) { installer::exiter::exit_program("ERROR: Sorting feature failed! \"$unique\" already sorted.", "sort_feature"); }
+ $sorted->{$unique} = 1;
+ }
+ }
+
+ collect_modules_recursive($modulesref, $gid, $feature, $directaccess, $directgid, $directparent, $directsortkey, $sorted);
+ }
+ }
+}
+
+#################################################################################
+# Sorting the feature in specified order. Evaluated is the key "Sortkey", that
+# is set in scp2 projects.
+# The display order of modules in Windows Installer is dependent from the order
+# in the idt file. Therefore the order of the modules array has to be adapted
+# to the Sortkey order, before the idt file is created.
+#################################################################################
+
+sub sort_feature
+{
+ my ($modulesref) = @_;
+
+ my @feature = ();
+
+ my %directaccess = ();
+ my %directparent = ();
+ my %directgid = ();
+ my %directsortkey = ();
+ my %sorted = ();
+
+ for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
+ {
+ my $onefeature = ${$modulesref}[$i];
+
+ my $uniquekey = $onefeature->{'uniquekey'};
+ my $modulegid = $onefeature->{'gid'};
+
+ $directaccess{$uniquekey} = $i;
+
+ $directgid{$uniquekey} = $onefeature->{'gid'};
+
+ # ParentID and Sortkey are not saved for the 'uniquekey', but only for the 'gid'
+
+ if ( $onefeature->{'ParentID'} ) { $directparent{$modulegid} = $onefeature->{'ParentID'}; }
+ else { $directparent{$modulegid} = ""; }
+
+ if ( $onefeature->{'Sortkey'} ) { $directsortkey{$modulegid} = $onefeature->{'Sortkey'}; }
+ else { $directsortkey{$modulegid} = "9999"; }
+
+ # Bookkeeping:
+ $sorted{$uniquekey} = 0;
+ }
+
+ # Searching all feature recursively, beginning with ParentID = ""
+ my $parentid = "";
+ collect_modules_recursive($modulesref, $parentid, \@feature, \%directaccess, \%directgid, \%directparent, \%directsortkey, \%sorted);
+
+ # Bookkeeping
+ my $modulekey;
+ foreach $modulekey ( keys %sorted )
+ {
+ if ( $sorted{$modulekey} == 0 )
+ {
+ my $infoline = "Warning: Module \"$modulekey\" could not be sorted. Added to the end of the module array.\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ push(@feature, ${$modulesref}[$directaccess{$modulekey}]);
+ }
+ }
+
+ return \@feature;
+}
+
+#################################################################################
+# Adding a unique key to the modules array. The gid is not unique for
+# multilingual modules. Only the combination from gid and specific language
+# is unique. Uniqueness is required for sorting mechanism.
+#################################################################################
+
+sub add_uniquekey
+{
+ my ( $modulesref ) = @_;
+
+ for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
+ {
+ my $uniquekey = ${$modulesref}[$i]->{'gid'};
+ if ( ${$modulesref}[$i]->{'specificlanguage'} ) { $uniquekey = $uniquekey . "_" . ${$modulesref}[$i]->{'specificlanguage'}; }
+ ${$modulesref}[$i]->{'uniquekey'} = $uniquekey;
+ }
+}
+
+#################################################################################
+# Creating the file Feature.idt dynamically
+# Content:
+# Feature Feature_Parent Title Description Display Level Directory_ Attributes
+#################################################################################
+
+sub create_feature_table
+{
+ my ($modulesref, $basedir, $languagesarrayref, $allvariableshashref) = @_;
+
+ for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ )
+ {
+ my $onelanguage = ${$languagesarrayref}[$m];
+
+ my $infoline;
+
+ my @featuretable = ();
+
+ installer::windows::idtglobal::write_idt_header(\@featuretable, "feature");
+
+ for ( my $i = 0; $i <= $#{$modulesref}; $i++ )
+ {
+ my $onefeature = ${$modulesref}[$i];
+
+ # Java and Ada only, if the correct settings are set
+ my $styles = "";
+ if ( $onefeature->{'Styles'} ) { $styles = $onefeature->{'Styles'}; }
+
+ # Controlling the language!
+ # Only language independent feature or feature with the correct language will be included into the table
+ # But help packs are different. They have en-US added as setup language.
+
+ if (! (!(( $onefeature->{'ismultilingual'} )) || ( $onefeature->{'specificlanguage'} eq $onelanguage ) || $installer::globals::helppack ) ) { next; }
+
+ my %feature = ();
+
+ $feature{'feature'} = get_feature_gid($onefeature);
+ $feature{'feature_parent'} = get_feature_parent($onefeature);
+ $feature{'Title'} = $onefeature->{'Name'} // "";
+ $feature{'Description'} = $onefeature->{'Description'} // "";
+ $feature{'Description'} =~ s/\\\"/\"/g; # no more masquerading of '"'
+ $feature{'Display'} = get_feature_display($onefeature);
+ $feature{'Level'} = get_feature_level($onefeature);
+ $feature{'Directory_'} = get_feature_directory($onefeature);
+ $feature{'Attributes'} = get_feature_attributes($onefeature);
+
+ my $oneline = $feature{'feature'} . "\t" . $feature{'feature_parent'} . "\t" . $feature{'Title'} . "\t"
+ . $feature{'Description'} . "\t" . $feature{'Display'} . "\t" . $feature{'Level'} . "\t"
+ . $feature{'Directory_'} . "\t" . $feature{'Attributes'} . "\n";
+
+ push(@featuretable, $oneline);
+
+ # collecting all feature in global feature collector (so that properties can be set in property table)
+ if ( ! grep {$_ eq $feature{'feature'}} @installer::globals::featurecollector )
+ {
+ push(@installer::globals::featurecollector, $feature{'feature'});
+ }
+
+ # collecting all language feature in feature collector for check of language selection
+ if (( $styles =~ /\bSHOW_MULTILINGUAL_ONLY\b/ ) && ( $onefeature->{'ParentID'} ne $installer::globals::rootmodulegid ))
+ {
+ $installer::globals::multilingual_only_modules{$feature{'feature'}} = 1;
+ }
+
+ # collecting all application feature in global feature collector for check of application selection
+ if ( $styles =~ /\bAPPLICATIONMODULE\b/ )
+ {
+ $installer::globals::application_modules{$feature{'feature'}} = 1;
+ }
+ }
+
+ # Saving the file
+
+ my $featuretablename = $basedir . $installer::globals::separator . "Feature.idt" . "." . $onelanguage;
+ installer::files::save_file($featuretablename ,\@featuretable);
+ $infoline = "Created idt file: $featuretablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/featurecomponent.pm b/solenv/bin/modules/installer/windows/featurecomponent.pm
new file mode 100644
index 000000000..26ab9281c
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/featurecomponent.pm
@@ -0,0 +1,165 @@
+#
+# 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 .
+#
+
+package installer::windows::featurecomponent;
+
+use installer::converter;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+
+#################################################################################
+# Collecting all pairs of features and components from the files collector
+#################################################################################
+
+sub create_featurecomponent_table_from_files_collector
+{
+ my ($featurecomponenttableref, $filesref) = @_;
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+
+ my $filecomponent = $onefile->{'componentname'};
+ my $filemodules = $onefile->{'modules'};
+
+ if ( $filecomponent eq "" )
+ {
+ installer::exiter::exit_program("ERROR: No component defined for file $onefile->{'Name'}", "create_featurecomponent_table_from_files_collector");
+ }
+ if ( $filemodules eq "" )
+ {
+ installer::exiter::exit_program("ERROR: No modules found for file $onefile->{'Name'}", "create_featurecomponent_table_from_files_collector");
+ }
+
+ my $filemodulesarrayref = installer::converter::convert_stringlist_into_array(\$filemodules, ",");
+
+ for ( my $j = 0; $j <= $#{$filemodulesarrayref}; $j++ )
+ {
+ my %featurecomponent = ();
+
+ my $onemodule = ${$filemodulesarrayref}[$j];
+ $onemodule =~ s/\s*$//;
+ $featurecomponent{'Feature'} = $onemodule;
+ $featurecomponent{'Component'} = $filecomponent;
+
+ # Attention: Features are renamed, because the maximum length is 38.
+ # But in the files collector ($filesref), the original names are saved.
+
+ installer::windows::idtglobal::shorten_feature_gid(\$featurecomponent{'Feature'});
+
+ $oneline = "$featurecomponent{'Feature'}\t$featurecomponent{'Component'}\n";
+
+ # control of uniqueness
+
+ if (! grep {$_ eq $oneline} @{$featurecomponenttableref})
+ {
+ push(@{$featurecomponenttableref}, $oneline);
+ }
+ }
+ }
+}
+
+#################################################################################
+# Collecting all pairs of features and components from the registry collector
+#################################################################################
+
+sub create_featurecomponent_table_from_registry_collector
+{
+ my ($featurecomponenttableref, $registryref) = @_;
+
+ for ( my $i = 0; $i <= $#{$registryref}; $i++ )
+ {
+ my $oneregistry = ${$registryref}[$i];
+
+ my $registrycomponent = $oneregistry->{'componentname'};
+ my $registrymodule = $oneregistry->{'ModuleID'};
+
+ if ( $registrycomponent eq "" )
+ {
+ installer::exiter::exit_program("ERROR: No component defined for registry $oneregistry->{'gid'}", "create_featurecomponent_table_from_registry_collector");
+ }
+ if ( $registrymodule eq "" )
+ {
+ installer::exiter::exit_program("ERROR: No modules found for registry $oneregistry->{'gid'}", "create_featurecomponent_table_from_registry_collector");
+ }
+
+ my %featurecomponent = ();
+
+ $featurecomponent{'Feature'} = $registrymodule;
+ $featurecomponent{'Component'} = $registrycomponent;
+
+ # Attention: Features are renamed, because the maximum length is 38.
+ # But in the files collector ($filesref), the original names are saved.
+
+ installer::windows::idtglobal::shorten_feature_gid(\$featurecomponent{'Feature'});
+
+ $oneline = "$featurecomponent{'Feature'}\t$featurecomponent{'Component'}\n";
+
+ # control of uniqueness
+
+ if (! grep {$_ eq $oneline} @{$featurecomponenttableref})
+ {
+ push(@{$featurecomponenttableref}, $oneline);
+ }
+ }
+}
+
+#################################################################################
+# Creating the file FeatureC.idt dynamically
+# Content:
+# Feature Component
+#################################################################################
+
+sub create_featurecomponent_table
+{
+ my ($filesref, $registryref, $basedir) = @_;
+
+ my @featurecomponenttable = ();
+ my $infoline;
+
+ installer::windows::idtglobal::write_idt_header(\@featurecomponenttable, "featurecomponent");
+
+ # This is the first time, that features and components are related
+ # Problem: How about created profiles, configurationfiles, services.rdb
+ # -> simple solution: putting them all to the root module
+ # Otherwise profiles and configurationfiles cannot be created the way, they are now created
+ # -> especially a problem for the configurationfiles! # ToDo
+ # Very good: All ProfileItems belong to the root
+ # services.rdb belongs to the root anyway.
+
+ # At the moment only the files are related to components (and the files know their modules).
+ # The component for each file is written into the files collector $filesinproductlanguageresolvedarrayref
+
+ create_featurecomponent_table_from_files_collector(\@featurecomponenttable, $filesref);
+
+ create_featurecomponent_table_from_registry_collector(\@featurecomponenttable, $registryref);
+
+ # Additional components have to be added here
+
+ # Saving the file
+
+ my $featurecomponenttablename = $basedir . $installer::globals::separator . "FeatureC.idt";
+ installer::files::save_file($featurecomponenttablename ,\@featurecomponenttable);
+ $infoline = "Created idt file: $featurecomponenttablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/file.pm b/solenv/bin/modules/installer/windows/file.pm
new file mode 100644
index 000000000..100002f5a
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/file.pm
@@ -0,0 +1,1019 @@
+#
+# 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 .
+#
+
+package installer::windows::file;
+
+use Digest::MD5;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::worker;
+use installer::windows::font;
+use installer::windows::idtglobal;
+use installer::windows::msiglobal;
+use installer::windows::language;
+use installer::windows::component;
+
+##########################################################################
+# Assigning one cabinet file to each file. This is required,
+# if cabinet files shall be equivalent to packages.
+##########################################################################
+
+sub assign_cab_to_files
+{
+ my ( $filesref ) = @_;
+
+ my $infoline = "";
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ if ( ! exists(${$filesref}[$i]->{'modules'}) ) { installer::exiter::exit_program("ERROR: No module assignment found for ${$filesref}[$i]->{'gid'} !", "assign_cab_to_files"); }
+ my $module = ${$filesref}[$i]->{'modules'};
+ # If modules contains a list of modules, only taking the first one.
+ if ( $module =~ /^\s*(.*?)\,/ ) { $module = $1; }
+
+ if ( ! exists($installer::globals::allcabinetassigns{$module}) ) { installer::exiter::exit_program("ERROR: No cabinet file assigned to module \"$module\" (${$filesref}[$i]->{'gid'}) !", "assign_cab_to_files"); }
+ ${$filesref}[$i]->{'assignedcabinetfile'} = $installer::globals::allcabinetassigns{$module};
+
+ # Counting the files in each cabinet file
+ if ( ! exists($installer::globals::cabfilecounter{${$filesref}[$i]->{'assignedcabinetfile'}}) )
+ {
+ $installer::globals::cabfilecounter{${$filesref}[$i]->{'assignedcabinetfile'}} = 1;
+ }
+ else
+ {
+ $installer::globals::cabfilecounter{${$filesref}[$i]->{'assignedcabinetfile'}}++;
+ }
+ }
+
+ # logging the number of files in each cabinet file
+
+ $infoline = "\nCabinet file content:\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ my $cabfile;
+ foreach $cabfile ( sort keys %installer::globals::cabfilecounter )
+ {
+ $infoline = "$cabfile : $installer::globals::cabfilecounter{$cabfile} files\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ # assigning startsequencenumbers for each cab file
+
+ my $offset = 1;
+ foreach $cabfile ( sort keys %installer::globals::cabfilecounter )
+ {
+ my $filecount = $installer::globals::cabfilecounter{$cabfile};
+ $installer::globals::cabfilecounter{$cabfile} = $offset;
+ $offset = $offset + $filecount;
+
+ $installer::globals::lastsequence{$cabfile} = $offset - 1;
+ }
+
+ # logging the start sequence numbers
+
+ $infoline = "\nCabinet file start sequences:\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ foreach $cabfile ( sort keys %installer::globals::cabfilecounter )
+ {
+ $infoline = "$cabfile : $installer::globals::cabfilecounter{$cabfile}\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ # logging the last sequence numbers
+
+ $infoline = "\nCabinet file last sequences:\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ foreach $cabfile ( sort keys %installer::globals::lastsequence )
+ {
+ $infoline = "$cabfile : $installer::globals::lastsequence{$cabfile}\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+}
+
+##########################################################################
+# Assigning sequencenumbers to files. This is required,
+# if cabinet files shall be equivalent to packages.
+##########################################################################
+
+sub assign_sequencenumbers_to_files
+{
+ my ( $filesref ) = @_;
+
+ my %directaccess = ();
+ my %allassigns = ();
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+
+ # Keeping order in cabinet files
+ # -> collecting all files in one cabinet file
+ # -> sorting files and assigning numbers
+
+ # Saving counter $i for direct access into files array
+ # "destination" of the file is a unique identifier ('Name' is not unique!)
+ if ( exists($directaccess{$onefile->{'destination'}}) ) { installer::exiter::exit_program("ERROR: 'destination' at file not unique: $onefile->{'destination'}", "assign_sequencenumbers_to_files"); }
+ $directaccess{$onefile->{'destination'}} = $i;
+
+ my $cabfilename = $onefile->{'assignedcabinetfile'};
+ # collecting files in cabinet files
+ if ( ! exists($allassigns{$cabfilename}) )
+ {
+ my %onecabfile = ();
+ $onecabfile{$onefile->{'destination'}} = 1;
+ $allassigns{$cabfilename} = \%onecabfile;
+ }
+ else
+ {
+ $allassigns{$cabfilename}->{$onefile->{'destination'}} = 1;
+ }
+ }
+
+ # Sorting each hash and assigning numbers
+ # The destination of the file determines the sort order, not the filename!
+ my $cabfile;
+ foreach $cabfile ( sort keys %allassigns )
+ {
+ my $counter = $installer::globals::cabfilecounter{$cabfile};
+ my $dest;
+ foreach $dest ( sort keys %{$allassigns{$cabfile}} ) # <- sorting the destination!
+ {
+ my $directaccessnumber = $directaccess{$dest};
+ ${$filesref}[$directaccessnumber]->{'assignedsequencenumber'} = $counter;
+ $counter++;
+ }
+ }
+}
+
+#########################################################
+# Create a shorter version of a long component name,
+# because maximum length in msi database is 72.
+# Attention: In multi msi installation sets, the short
+# names have to be unique over all packages, because
+# this string is used to create the globally unique id
+# -> no resetting of
+# %installer::globals::allshortcomponents
+# after a package was created.
+# Using no counter because of reproducibility.
+#########################################################
+
+sub generate_new_short_componentname
+{
+ my ($componentname) = @_;
+
+ my $startversion = substr($componentname, 0, 60); # taking only the first 60 characters
+ my $subid = installer::windows::msiglobal::calculate_id($componentname, 9); # taking only the first 9 digits
+ my $shortcomponentname = $startversion . "_" . $subid;
+
+ if ( exists($installer::globals::allshortcomponents{$shortcomponentname}) ) { installer::exiter::exit_program("Failed to create unique component name: \"$shortcomponentname\"", "generate_new_short_componentname"); }
+
+ $installer::globals::allshortcomponents{$shortcomponentname} = 1;
+
+ return $shortcomponentname;
+}
+
+###############################################
+# Generating the component name from a file
+###############################################
+
+sub get_file_component_name
+{
+ my ($fileref, $filesref) = @_;
+
+ my $componentname = "";
+
+ # Special handling for files with ASSIGNCOMPONENT
+
+ my $styles = "";
+ if ( $fileref->{'Styles'} ) { $styles = $fileref->{'Styles'}; }
+ if ( $styles =~ /\bASSIGNCOMPONENT\b/ )
+ {
+ $componentname = get_component_from_assigned_file($fileref->{'AssignComponent'}, $filesref);
+ }
+ else
+ {
+ # In this function exists the rule to create components from files
+ # Rule:
+ # Two files get the same componentid, if:
+ # both have the same destination directory.
+ # both have the same "gid" -> both were packed in the same zip file
+ # All other files are included into different components!
+
+ # my $componentname = $fileref->{'gid'} . "_" . $fileref->{'Dir'};
+
+ # $fileref->{'Dir'} is not sufficient! All files in a zip file have the same $fileref->{'Dir'},
+ # but can be in different subdirectories.
+ # Solution: destination=share\Scripts\beanshell\Capitalise\capitalise.bsh
+ # in which the filename (capitalise.bsh) has to be removed and all backslashes (slashes) are
+ # converted into underline.
+
+ my $destination = $fileref->{'destination'};
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination);
+ $destination =~ s/\s//g;
+ $destination =~ s/\\/\_/g;
+ $destination =~ s/\//\_/g;
+ $destination =~ s/\_\s*$//g; # removing ending underline
+
+ $componentname = $fileref->{'gid'} . "__" . $destination;
+
+ # Files with different languages, need to be packed into different components.
+ # Then the installation of the language specific component is determined by a language condition.
+
+ if ( $fileref->{'ismultilingual'} )
+ {
+ my $officelanguage = $fileref->{'specificlanguage'};
+ $componentname = $componentname . "_" . $officelanguage;
+ }
+
+ $componentname = lc($componentname); # componentnames always lowercase
+
+ $componentname =~ s/\-/\_/g; # converting "-" to "_"
+ $componentname =~ s/\./\_/g; # converting "-" to "_"
+
+ # Attention: Maximum length for the componentname is 72
+ # %installer::globals::allcomponents_in_this_database : reset for each database
+ # %installer::globals::allcomponents : not reset for each database
+ # Component strings must be unique for the complete product, because they are used for
+ # the creation of the globally unique identifier.
+
+ my $fullname = $componentname; # This can be longer than 72
+
+ if (( exists($installer::globals::allcomponents{$fullname}) ) && ( ! exists($installer::globals::allcomponents_in_this_database{$fullname}) ))
+ {
+ # This is not allowed: One component cannot be installed with different packages.
+ installer::exiter::exit_program("ERROR: Component \"$fullname\" is already included into another package. This is not allowed.", "get_file_component_name");
+ }
+
+ if ( exists($installer::globals::allcomponents{$fullname}) )
+ {
+ $componentname = $installer::globals::allcomponents{$fullname};
+ }
+ else
+ {
+ if ( length($componentname) > 70 )
+ {
+ $componentname = generate_new_short_componentname($componentname); # This has to be unique for the complete product, not only one package
+ }
+
+ $installer::globals::allcomponents{$fullname} = $componentname;
+ $installer::globals::allcomponents_in_this_database{$fullname} = 1;
+ }
+
+ # $componentname =~ s/gid_file_/g_f_/g;
+ # $componentname =~ s/_extra_/_e_/g;
+ # $componentname =~ s/_config_/_c_/g;
+ # $componentname =~ s/_org_openoffice_/_o_o_/g;
+ # $componentname =~ s/_program_/_p_/g;
+ # $componentname =~ s/_typedetection_/_td_/g;
+ # $componentname =~ s/_linguistic_/_l_/g;
+ # $componentname =~ s/_module_/_m_/g;
+ # $componentname =~ s/_optional_/_opt_/g;
+ # $componentname =~ s/_packages/_pack/g;
+ # $componentname =~ s/_menubar/_mb/g;
+ # $componentname =~ s/_common_/_cm_/g;
+ # $componentname =~ s/_export_/_exp_/g;
+ # $componentname =~ s/_table_/_tb_/g;
+ # $componentname =~ s/_sofficecfg_/_sc_/g;
+ # $componentname =~ s/_soffice_cfg_/_sc_/g;
+ # $componentname =~ s/_startmodulecommands_/_smc_/g;
+ # $componentname =~ s/_drawimpresscommands_/_dic_/g;
+ # $componentname =~ s/_basiccommands_/_bac_/g;
+ # $componentname =~ s/_basicidecommands_/_baic_/g;
+ # $componentname =~ s/_genericcommands_/_genc_/g;
+ # $componentname =~ s/_bibliographycommands_/_bibc_/g;
+ # $componentname =~ s/_gentiumbookbasicbolditalic_/_gbbbi_/g;
+ # $componentname =~ s/_share_/_s_/g;
+ # $componentname =~ s/_extension_/_ext_/g;
+ # $componentname =~ s/_extensions_/_exs_/g;
+ # $componentname =~ s/_modules_/_ms_/g;
+ # $componentname =~ s/_uiconfig_zip_/_ucz_/g;
+ # $componentname =~ s/_productivity_/_pr_/g;
+ # $componentname =~ s/_wizard_/_wz_/g;
+ # $componentname =~ s/_import_/_im_/g;
+ # $componentname =~ s/_javascript_/_js_/g;
+ # $componentname =~ s/_template_/_tpl_/g;
+ # $componentname =~ s/_tplwizletter_/_twl_/g;
+ # $componentname =~ s/_beanshell_/_bs_/g;
+ # $componentname =~ s/_presentation_/_bs_/g;
+ # $componentname =~ s/_columns_/_cls_/g;
+ # $componentname =~ s/_python_/_py_/g;
+
+ # $componentname =~ s/_tools/_ts/g;
+ # $componentname =~ s/_transitions/_trs/g;
+ # $componentname =~ s/_scriptbinding/_scrb/g;
+ # $componentname =~ s/_spreadsheet/_ssh/g;
+ # $componentname =~ s/_publisher/_pub/g;
+ # $componentname =~ s/_presenter/_pre/g;
+ # $componentname =~ s/_registry/_reg/g;
+
+ # $componentname =~ s/screen/sc/g;
+ # $componentname =~ s/wordml/wm/g;
+ # $componentname =~ s/openoffice/oo/g;
+ }
+
+ return $componentname;
+}
+
+####################################################################
+# Returning the component name for a defined file gid.
+# This is necessary for files with flag ASSIGNCOMPONENT
+####################################################################
+
+sub get_component_from_assigned_file
+{
+ my ($gid, $filesref) = @_;
+
+ my ($onefile) = grep {$_->{gid} eq $gid} @{$filesref};
+ if (! defined $onefile) {
+ installer::exiter::exit_program("ERROR: Could not find file $gid in list of files!", "get_component_from_assigned_file");
+ }
+
+ my $componentname = "";
+ if ( $onefile->{'componentname'} ) { $componentname = $onefile->{'componentname'}; }
+ else { installer::exiter::exit_program("ERROR: No component defined for file: $gid", "get_component_from_assigned_file"); }
+
+ return $componentname;
+}
+
+####################################################################
+# Generating the special filename for the database file File.idt
+# Sample: CONTEXTS, CONTEXTS1
+# This name has to be unique.
+# In most cases this is simply the filename.
+####################################################################
+
+sub generate_unique_filename_for_filetable
+{
+ my ($fileref, $component, $uniquefilenamehashref) = @_;
+
+ # This new filename has to be saved into $fileref, because this is needed to find the source.
+ # The filename sbasic.idx/OFFSETS is changed to OFFSETS, but OFFSETS is not unique.
+ # In this procedure names like OFFSETS5 are produced. And exactly this string has to be added to
+ # the array of all files.
+
+ my $uniquefilename = "";
+ my $counter = 0;
+
+ if ( $fileref->{'Name'} ) { $uniquefilename = $fileref->{'Name'}; }
+
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$uniquefilename); # making /registry/schema/org/openoffice/VCL.xcs to VCL.xcs
+
+ # Reading unique filename with help of "Component_" in File table from old database
+ if (( $installer::globals::updatedatabase ) && ( exists($uniquefilenamehashref->{"$component/$uniquefilename"}) ))
+ {
+ $uniquefilename = $uniquefilenamehashref->{"$component/$uniquefilename"}; # syntax of $value: ($uniquename;$shortname)
+ if ( $uniquefilename =~ /^\s*(.*?)\;\s*(.*?)\s*$/ ) { $uniquefilename = $1; }
+ $lcuniquefilename = lc($uniquefilename);
+ $installer::globals::alluniquefilenames{$uniquefilename} = 1;
+ $installer::globals::alllcuniquefilenames{$lcuniquefilename} = 1;
+ return $uniquefilename;
+ }
+ elsif (( $installer::globals::prepare_winpatch ) && ( exists($installer::globals::savedmapping{"$component/$uniquefilename"}) ))
+ {
+ # If we have a FTK mapping for this component/file, use it.
+ $installer::globals::savedmapping{"$component/$uniquefilename"} =~ m/^(.*);/;
+ $uniquefilename = $1;
+ $lcuniquefilename = lc($uniquefilename);
+ $installer::globals::alluniquefilenames{$uniquefilename} = 1;
+ $installer::globals::alllcuniquefilenames{$lcuniquefilename} = 1;
+ return $uniquefilename;
+ }
+
+ $uniquefilename =~ s/\-/\_/g; # no "-" allowed
+ $uniquefilename =~ s/\@/\_/g; # no "@" allowed
+ $uniquefilename =~ s/\$/\_/g; # no "$" allowed
+ $uniquefilename =~ s/^\s*\./\_/g; # no "." at the beginning allowed
+ $uniquefilename =~ s/^\s*\d/\_d/g; # no number at the beginning allowed (even file "0.gif", replacing to "_d.gif")
+ $uniquefilename =~ s/org_openoffice_/ooo_/g; # shorten the unique file name
+
+ my $lcuniquefilename = lc($uniquefilename); # only lowercase names
+
+ my $newname = 0;
+
+ if ( ! exists($installer::globals::alllcuniquefilenames{$lcuniquefilename}) &&
+ ! exists($installer::globals::savedrevmapping{$lcuniquefilename}) )
+ {
+ $installer::globals::alluniquefilenames{$uniquefilename} = 1;
+ $installer::globals::alllcuniquefilenames{$lcuniquefilename} = 1;
+ $newname = 1;
+ }
+
+ if ( ! $newname )
+ {
+ # adding a number until the name is really unique: OFFSETS, OFFSETS1, OFFSETS2, ...
+ # But attention: Making "abc.xcu" to "abc1.xcu"
+
+ my $uniquefilenamebase = $uniquefilename;
+
+ do
+ {
+ $counter++;
+
+ if ( $uniquefilenamebase =~ /\./ )
+ {
+ $uniquefilename = $uniquefilenamebase;
+ $uniquefilename =~ s/\./$counter\./;
+ }
+ else
+ {
+ $uniquefilename = $uniquefilenamebase . $counter;
+ }
+
+ $newname = 0;
+ $lcuniquefilename = lc($uniquefilename); # only lowercase names
+
+ if ( ! exists($installer::globals::alllcuniquefilenames{$lcuniquefilename}) &&
+ ! exists($installer::globals::savedrevmapping{$lcuniquefilename}) )
+ {
+ $installer::globals::alluniquefilenames{$uniquefilename} = 1;
+ $installer::globals::alllcuniquefilenames{$lcuniquefilename} = 1;
+ $newname = 1;
+ }
+ }
+ until ( $newname )
+ }
+
+ return $uniquefilename;
+}
+
+####################################################################
+# Generating the special file column for the database file File.idt
+# Sample: NAMETR~1.TAB|.nametranslation.table
+# The first part has to be 8.3 conform.
+####################################################################
+
+sub generate_filename_for_filetable
+{
+ my ($fileref, $shortnamesref, $uniquefilenamehashref) = @_;
+
+ my $returnstring = "";
+
+ my $filename = $fileref->{'Name'};
+
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$filename); # making /registry/schema/org/openoffice/VCL.xcs to VCL.xcs
+
+ my $shortstring;
+
+ # Reading short string with help of "FileName" in File table from old database
+ if (( $installer::globals::updatedatabase ) && ( exists($uniquefilenamehashref->{"$fileref->{'componentname'}/$filename"}) ))
+ {
+ my $value = $uniquefilenamehashref->{"$fileref->{'componentname'}/$filename"}; # syntax of $value: ($uniquename;$shortname)
+ if ( $value =~ /^\s*(.*?)\;\s*(.*?)\s*$/ ) { $shortstring = $2; } # already collected in function "collect_shortnames_from_old_database"
+ else { $shortstring = $filename; }
+ }
+ elsif (( $installer::globals::prepare_winpatch ) && ( exists($installer::globals::savedmapping{"$fileref->{'componentname'}/$filename"}) ))
+ {
+ $installer::globals::savedmapping{"$fileref->{'componentname'}/$filename"} =~ m/.*;(.*)/;
+ if ($1 ne '')
+ {
+ $shortstring = $1;
+ }
+ else
+ {
+ $shortstring = installer::windows::idtglobal::make_eight_three_conform_with_hash($filename, "file", $shortnamesref);
+ }
+ }
+ else
+ {
+ $shortstring = installer::windows::idtglobal::make_eight_three_conform_with_hash($filename, "file", $shortnamesref);
+ }
+
+ if ( $shortstring eq $filename ) { $returnstring = $filename; } # nothing changed
+ else {$returnstring = $shortstring . "\|" . $filename; }
+
+ return $returnstring;
+}
+
+#########################################
+# Returning the filesize of a file
+#########################################
+
+sub get_filesize
+{
+ my ($fileref) = @_;
+
+ my $file = $fileref->{'sourcepath'};
+
+ my $filesize;
+
+ if ( -f $file ) # test of existence. For instance services.rdb does not always exist
+ {
+ $filesize = ( -s $file ); # file size can be "0"
+ }
+ else
+ {
+ $filesize = -1;
+ }
+
+ return $filesize;
+}
+
+#############################################
+# Returning the file version, if required
+# Sample: "8.0.1.8976";
+#############################################
+
+sub get_fileversion
+{
+ my ($onefile, $allvariables, $styles) = @_;
+
+ my $fileversion = "";
+
+ if ( $onefile->{'Name'} =~ /\.bin$|\.com$|\.dll$|\.exe$|\.pyd$/ )
+ {
+ open (EXE, "<$onefile->{'sourcepath'}");
+ binmode EXE;
+ {local $/ = undef; $exedata = <EXE>;}
+ close EXE;
+
+ my $binaryfileversion = "(V\x00S\x00_\x00V\x00E\x00R\x00S\x00I\x00O\x00N\x00_\x00I\x00N\x00F\x00O\x00\x00\x00\x00\x00\xbd\x04\xef\xfe\x00\x00\x01\x00)(........)";
+
+ if ($exedata =~ /$binaryfileversion/ms)
+ {
+ my ($header, $subversion, $version, $vervariant, $microversion) = ($1,unpack( "vvvv", $2));
+ $fileversion = $version . "." . $subversion . "." . $microversion . "." . $vervariant;
+ }
+ }
+ # file version for font files (tdf#76239)
+ if ( $onefile->{'Name'} =~ /\.(otf|ttf|ttc)$/i )
+ {
+ require Font::TTF::Font;
+ Font::TTF::Font->import;
+ my $fnt = Font::TTF::Font->open("<$onefile->{'sourcepath'}");
+ # 5 is pre-defined name ID for version string - see
+ # https://docs.microsoft.com/en-us/typography/opentype/spec/name
+ my $ttfdata = $fnt->{'name'}->read->find_name(5);
+ $fnt->release;
+
+ if ($ttfdata =~ /(Version )?([0-9]+(\.[0-9]+)*)/i)
+ {
+ my ($version, $subversion, $microversion, $vervariant) = split(/\./,$2);
+ $subversion = 0 if not defined $subversion;
+ $microversion = 0 if not defined $microversion;
+ $vervariant = 0 if not defined $vervariant;
+ $fileversion = int($version) . "." . int($subversion) . "." . int($microversion) . "." . int($vervariant);
+ }
+ else
+ {
+ $fileversion = "1.0.0.0";
+ }
+ }
+
+ return $fileversion;
+}
+
+#############################################
+# Returning the sequence for a file
+#############################################
+
+sub get_sequence_for_file
+{
+ my ($number, $onefile, $fileentry, $allupdatesequenceshashref, $allupdatecomponentshashref, $allupdatefileorderhashref, $allfilecomponents) = @_;
+
+ my $sequence = "";
+ my $infoline = "";
+ my $pffcomponentname = $onefile->{'componentname'} . "_pff";
+
+ if ( $installer::globals::updatedatabase )
+ {
+ if (( exists($allupdatesequenceshashref->{$onefile->{'uniquename'}}) ) &&
+ (( $onefile->{'componentname'} eq $allupdatecomponentshashref->{$onefile->{'uniquename'}} ) ||
+ ( $pffcomponentname eq $allupdatecomponentshashref->{$onefile->{'uniquename'}} )))
+ {
+ # The second condition is necessary to find shifted files, that have same "uniquename", but are now
+ # located in another directory. This can be seen at the component name.
+ $sequence = $allupdatesequenceshashref->{$onefile->{'uniquename'}};
+ $onefile->{'assignedsequencenumber'} = $sequence;
+ # Collecting all used sequences, to guarantee, that no number is unused
+ $installer::globals::allusedupdatesequences{$sequence} = 1;
+ # Special help for files, that already have a "pff" component name (for example after ServicePack 1)
+ if ( $pffcomponentname eq $allupdatecomponentshashref->{$onefile->{'uniquename'}} )
+ {
+ $infoline = "Warning: Special handling for component \"$pffcomponentname\". This file was added after the final, but before this ServicePack.\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $onefile->{'componentname'} = $pffcomponentname; # pff for "post final file"
+ $fileentry->{'Component_'} = $onefile->{'componentname'};
+ if ( ! exists($allfilecomponents->{$fileentry->{'Component_'}}) ) { $allfilecomponents->{$fileentry->{'Component_'}} = 1; }
+ }
+ }
+ else
+ {
+ $installer::globals::updatesequencecounter++;
+ $sequence = $installer::globals::updatesequencecounter;
+ $onefile->{'assignedsequencenumber'} = $sequence;
+ # $onefile->{'assignedcabinetfile'} = $installer::globals::pffcabfilename; # assigning to cabinet file for "post final files"
+ # Collecting all new files
+ $installer::globals::newupdatefiles{$sequence} = $onefile;
+ # Saving in sequence hash
+ $allupdatefileorderhashref->{$sequence} = $onefile->{'uniquename'};
+
+ # If the new file is part of an existing component, this must be changed now. All files
+ # of one component have to be included in one cabinet file. But because the order must
+ # not change, all new files have to be added to new components.
+ # $onefile->{'componentname'} = $file{'Component_'};
+
+ $onefile->{'componentname'} = $onefile->{'componentname'} . "_pff"; # pff for "post final file"
+ $fileentry->{'Component_'} = $onefile->{'componentname'};
+ if ( ! exists($allfilecomponents->{$fileentry->{'Component_'}}) ) { $allfilecomponents->{$fileentry->{'Component_'}} = 1; }
+ $onefile->{'PostFinalFile'} = 1;
+ # The sequence for this file has changed. It has to be inserted at the end of the files collector.
+ $installer::globals::insert_file_at_end = 1;
+ $installer::globals::newfilescollector{$sequence} = $onefile; # Adding new files to the end of the filescollector
+ $installer::globals::newfilesexist = 1;
+ }
+ }
+ else
+ {
+ $sequence = $number;
+ # my $sequence = $number + 1;
+
+ # Idea: Each component is packed into a cab file.
+ # This requires that all files in one cab file have sequences directly following each other,
+ # for instance from 1456 to 1466. Then in the media table the LastSequence for this cab file
+ # is 1466.
+ # Because all files belonging to one component are directly behind each other in the file
+ # collector, it is possible to use simply an increasing number as sequence value.
+ # If files belonging to one component are not directly behind each other in the files collector
+ # this mechanism will no longer work.
+ }
+
+ return $sequence;
+}
+
+#############################################
+# Returning the Windows language of a file
+#############################################
+
+sub get_language_for_file
+{
+ my ($fileref) = @_;
+
+ my $language = "";
+
+ if ( $fileref->{'specificlanguage'} ) { $language = $fileref->{'specificlanguage'}; }
+
+ if ( $language eq "" )
+ {
+ $language = 0; # language independent
+ # If this is not a font, the return value should be "0" (Check ICE 60)
+ my $styles = "";
+ if ( $fileref->{'Styles'} ) { $styles = $fileref->{'Styles'}; }
+ if ( $styles =~ /\bFONT\b/ ) { $language = ""; }
+ }
+ else
+ {
+ $language = installer::windows::language::get_windows_language($language);
+ }
+
+ return $language;
+}
+
+####################################################################
+# Creating a new KeyPath for components in TemplatesFolder.
+####################################################################
+
+sub generate_registry_keypath
+{
+ my ($onefile) = @_;
+
+ my $keypath = $onefile->{'Name'};
+ $keypath =~ s/\.//g;
+ $keypath = lc($keypath);
+ $keypath = "userreg_" . $keypath;
+
+ return $keypath;
+}
+
+####################################################################
+# Check, if in an update process files are missing. No removal
+# of files allowed for Windows Patch creation.
+# Also logging all new files, that have to be included in extra
+# components and cab files.
+####################################################################
+
+sub check_file_sequences
+{
+ my ($allupdatefileorderhashref, $allupdatecomponentorderhashref) = @_;
+
+ # All used sequences stored in %installer::globals::allusedupdatesequences
+ # Maximum sequence number of old database stored in $installer::globals::updatelastsequence
+ # All new files stored in %installer::globals::newupdatefiles
+
+ my $infoline = "";
+
+ my @missing_sequences = ();
+ my @really_missing_sequences = ();
+
+ for ( my $i = 1; $i <= $installer::globals::updatelastsequence; $i++ )
+ {
+ if ( ! exists($installer::globals::allusedupdatesequences{$i}) ) { push(@missing_sequences, $i); }
+ }
+
+ if ( $#missing_sequences > -1 )
+ {
+ # Missing sequences can also be caused by files included in merge modules. This files are added later into the file table.
+ # Therefore now it is time to check the content of the merge modules.
+
+ for ( my $j = 0; $j <= $#missing_sequences; $j++ )
+ {
+ my $filename = $allupdatefileorderhashref->{$missing_sequences[$j]};
+
+ # Is this a file from a merge module? Then this is no error.
+ if ( ! exists($installer::globals::mergemodulefiles{$filename}) )
+ {
+ push(@really_missing_sequences, $missing_sequences[$j]);
+ }
+ }
+ }
+
+ if ( $#really_missing_sequences > -1 )
+ {
+ my $errorstring = "";
+ for ( my $j = 0; $j <= $#really_missing_sequences; $j++ )
+ {
+ my $filename = $allupdatefileorderhashref->{$really_missing_sequences[$j]};
+ my $comp = $allupdatecomponentorderhashref->{$really_missing_sequences[$j]};
+ $errorstring = "$errorstring$filename (Sequence: $really_missing_sequences[$j], Component: \"$comp\")\n";
+ }
+
+ $infoline = "ERROR: Files are removed compared with update database.\nThe following files are missing:\n$errorstring";
+ push(@installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program($infoline, "check_file_sequences");
+ }
+
+ # Searching for new files
+
+ my $counter = 0;
+
+ foreach my $key ( keys %installer::globals::newupdatefiles )
+ {
+ my $onefile = $installer::globals::newupdatefiles{$key};
+ $counter++;
+ if ( $counter == 1 )
+ {
+ $infoline = "\nNew files compared to the update database:\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ $infoline = "$onefile->{'Name'} ($onefile->{'gid'}) Sequence: $onefile->{'assignedsequencenumber'}\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+ if ( $counter == 0 )
+ {
+ $infoline = "Info: No new file compared with update database!\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+
+}
+
+###################################################################
+# Collecting further conditions for the component table.
+# This is used by multilayer products, to enable installation
+# of separate layers.
+###################################################################
+
+sub get_tree_condition_for_component
+{
+ my ($onefile, $componentname) = @_;
+
+ if ( $onefile->{'destination'} )
+ {
+ my $dest = $onefile->{'destination'};
+
+ # Comparing the destination path with
+ # $installer::globals::hostnametreestyles{$hostname} = $treestyle;
+ # (-> hostname is the key, the style the value!)
+
+ foreach my $hostname ( keys %installer::globals::hostnametreestyles )
+ {
+ if (( $dest eq $hostname ) || ( $dest =~ /^\s*\Q$hostname\E\\/ ))
+ {
+ # the value is the style
+ my $style = $installer::globals::hostnametreestyles{$hostname};
+ # the condition is saved in %installer::globals::treestyles
+ my $condition = $installer::globals::treestyles{$style};
+ # Saving condition to be added in table Property
+ $installer::globals::usedtreeconditions{$condition} = 1;
+ $condition = $condition . "=1";
+ # saving this condition
+ $installer::globals::treeconditions{$componentname} = $condition;
+
+ # saving also at the file, for usage in fileinfo
+ $onefile->{'layer'} = $installer::globals::treelayername{$style};
+ }
+ }
+ }
+}
+
+############################################
+# Collecting all short names, that are
+# already used by the old database
+############################################
+
+sub collect_shortnames_from_old_database
+{
+ my ($uniquefilenamehashref, $shortnameshashref) = @_;
+
+ foreach my $key ( keys %{$uniquefilenamehashref} )
+ {
+ my $value = $uniquefilenamehashref->{$key}; # syntax of $value: ($uniquename;$shortname)
+
+ if ( $value =~ /^\s*(.*?)\;\s*(.*?)\s*$/ )
+ {
+ my $shortstring = $2;
+ $shortnameshashref->{$shortstring} = 1; # adding the shortname to the array of all shortnames
+ }
+ }
+}
+
+############################################
+# Creating the file File.idt dynamically
+############################################
+
+sub create_files_table
+{
+ my ($filesref, $dirref, $allfilecomponentsref, $basedir, $allvariables, $uniquefilenamehashref, $allupdatesequenceshashref, $allupdatecomponentshashref, $allupdatefileorderhashref) = @_;
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: File Table start");
+
+ # Structure of the files table:
+ # File Component_ FileName FileSize Version Language Attributes Sequence
+ # In this function, all components are created.
+ #
+ # $allfilecomponentsref is empty at the beginning
+
+ my $infoline;
+
+ my @allfiles = ();
+ my @filetable = ();
+ my @filehashtable = ();
+ my %allfilecomponents = ();
+ my $counter = 0;
+
+ if ( $^O =~ /cygwin/i ) { installer::worker::generate_cygwin_paths($filesref); }
+
+ # The filenames must be collected because of uniqueness
+ # 01-44-~1.DAT, 01-44-~2.DAT, ...
+ my %shortnames = ();
+
+ if ( $installer::globals::updatedatabase ) { collect_shortnames_from_old_database($uniquefilenamehashref, \%shortnames); }
+
+ installer::windows::idtglobal::write_idt_header(\@filetable, "file");
+ installer::windows::idtglobal::write_idt_header(\@filehashtable, "filehash");
+ installer::windows::idtglobal::write_idt_header(\@installer::globals::removefiletable, "removefile");
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my %file = ();
+
+ my $onefile = ${$filesref}[$i];
+
+ my $styles = "";
+ if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
+
+ $file{'Component_'} = get_file_component_name($onefile, $filesref);
+ $file{'File'} = generate_unique_filename_for_filetable($onefile, $file{'Component_'}, $uniquefilenamehashref);
+
+ $onefile->{'uniquename'} = $file{'File'};
+ $onefile->{'componentname'} = $file{'Component_'};
+
+ # Collecting all components
+
+ if ( ! exists($allfilecomponents{$file{'Component_'}}) ) { $allfilecomponents{$file{'Component_'}} = 1; }
+
+ $file{'FileName'} = generate_filename_for_filetable($onefile, \%shortnames, $uniquefilenamehashref);
+
+ $file{'FileSize'} = get_filesize($onefile);
+
+ $file{'Version'} = get_fileversion($onefile, $allvariables, $styles);
+
+ $file{'Language'} = get_language_for_file($onefile);
+
+ if ( $styles =~ /\bDONT_PACK\b/ ) { $file{'Attributes'} = "8192"; }
+ else { $file{'Attributes'} = "16384"; }
+
+ # $file{'Attributes'} = "16384"; # Sourcefile is packed
+ # $file{'Attributes'} = "8192"; # Sourcefile is unpacked
+
+ $installer::globals::insert_file_at_end = 0;
+ $counter++;
+ $file{'Sequence'} = get_sequence_for_file($counter, $onefile, \%file, $allupdatesequenceshashref, $allupdatecomponentshashref, $allupdatefileorderhashref, \%allfilecomponents);
+
+ $onefile->{'sequencenumber'} = $file{'Sequence'};
+
+ my $oneline = $file{'File'} . "\t" . $file{'Component_'} . "\t" . $file{'FileName'} . "\t"
+ . $file{'FileSize'} . "\t" . $file{'Version'} . "\t" . $file{'Language'} . "\t"
+ . $file{'Attributes'} . "\t" . $file{'Sequence'} . "\n";
+
+ push(@filetable, $oneline);
+
+ if ( $file{'File'} =~ /\.py$/ )
+ {
+ my %removefile = ();
+
+ $removefile{'FileKey'} = "remove_" . $file{'File'} . "c";
+ $removefile{'Component_'} = $file{'Component_'};
+ $removefile{'FileName'} = $file{'FileName'};
+ $removefile{'FileName'} =~ s/\.py$/.pyc/;
+ $removefile{'FileName'} =~ s/\.PY\|/.PYC|/;
+ $removefile{'DirProperty'} = installer::windows::component::get_file_component_directory($file{'Component_'}, $filesref, $dirref);
+ $removefile{'InstallMode'} = 2; # msiInstallStateAbsent
+ $oneline = $removefile{'FileKey'} . "\t" . $removefile{'Component_'} . "\t" . $removefile{'FileName'} . "\t"
+ . $removefile{'DirProperty'} . "\t" . $removefile{'InstallMode'} . "\n";
+
+ push(@installer::globals::removefiletable, $oneline);
+ }
+
+ if ( ! $installer::globals::insert_file_at_end ) { push(@allfiles, $onefile); }
+
+ # Collecting all component conditions
+ if ( $onefile->{'ComponentCondition'} )
+ {
+ if ( ! exists($installer::globals::componentcondition{$file{'Component_'}}))
+ {
+ $installer::globals::componentcondition{$file{'Component_'}} = $onefile->{'ComponentCondition'};
+ }
+ }
+
+ # Collecting also all tree conditions for multilayer products
+ get_tree_condition_for_component($onefile, $file{'Component_'});
+
+ unless ( $file{'Version'} )
+ {
+ my $path = $onefile->{'sourcepath'};
+ if ( $^O =~ /cygwin/i ) { $path = $onefile->{'cyg_sourcepath'}; }
+
+ open(FILE, $path) or die "ERROR: Can't open $path for creating file hash";
+ binmode(FILE);
+ my $hashinfo = pack("l", 20);
+ $hashinfo .= Digest::MD5->new->addfile(*FILE)->digest;
+
+ my @i = unpack ('x[l]l4', $hashinfo);
+ $oneline = $file{'File'} . "\t" .
+ "0" . "\t" .
+ $i[0] . "\t" .
+ $i[1] . "\t" .
+ $i[2] . "\t" .
+ $i[3] . "\n";
+ push (@filehashtable, $oneline);
+ }
+
+ # Saving the sequence number in a hash with uniquefilename as key.
+ # This is used for better performance in "save_packorder"
+ $installer::globals::uniquefilenamesequence{$onefile->{'uniquename'}} = $onefile->{'sequencenumber'};
+
+ my $destdir = "";
+ if ( $onefile->{'Dir'} ) { $destdir = $onefile->{'Dir'}; }
+
+ if ( $onefile->{'needs_user_registry_key'} )
+ {
+ my $keypath = generate_registry_keypath($onefile);
+ $onefile->{'userregkeypath'} = $keypath;
+ push(@installer::globals::userregistrycollector, $onefile);
+ $installer::globals::addeduserregitrykeys = 1;
+ }
+ }
+
+ # putting content from %allfilecomponents to $allfilecomponentsref for later usage
+ foreach $localkey (keys %allfilecomponents ) { push( @{$allfilecomponentsref}, $localkey); }
+
+ my $filetablename = $basedir . $installer::globals::separator . "File.idt";
+ installer::files::save_file($filetablename ,\@filetable);
+ $infoline = "\nCreated idt file: $filetablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: File Table end");
+
+ my $filehashtablename = $basedir . $installer::globals::separator . "MsiFileHash.idt";
+ installer::files::save_file($filehashtablename ,\@filehashtable);
+ $infoline = "\nCreated idt file: $filehashtablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ # Now the new files can be added to the files collector (only in update packaging processes)
+ if ( $installer::globals::newfilesexist )
+ {
+ foreach my $seq (sort keys %installer::globals::newfilescollector) { push(@allfiles, $installer::globals::newfilescollector{$seq}) }
+ }
+
+ return \@allfiles;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/font.pm b/solenv/bin/modules/installer/windows/font.pm
new file mode 100644
index 000000000..f1b678870
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/font.pm
@@ -0,0 +1,69 @@
+#
+# 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 .
+#
+
+package installer::windows::font;
+
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+
+
+#################################################################################
+# Creating the file Font.idt dynamically
+# Content:
+# File_ FontTitle
+#################################################################################
+
+sub create_font_table
+{
+ my ($filesref, $basedir) = @_;
+
+ my @fonttable = ();
+
+ installer::windows::idtglobal::write_idt_header(\@fonttable, "font");
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+ my $styles = "";
+
+ if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; }
+
+ if ( $styles =~ /\bFONT\b/ )
+ {
+ my %font = ();
+
+ $font{'File_'} = $onefile->{'uniquename'};
+ $font{'FontTitle'} = "";
+
+ my $oneline = $font{'File_'} . "\t" . $font{'FontTitle'} . "\n";
+
+ push(@fonttable, $oneline);
+ }
+ }
+
+ # Saving the file
+
+ my $fonttablename = $basedir . $installer::globals::separator . "Font.idt";
+ installer::files::save_file($fonttablename ,\@fonttable);
+ my $infoline = "Created idt file: $fonttablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/icon.pm b/solenv/bin/modules/installer/windows/icon.pm
new file mode 100644
index 000000000..10cd24e46
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/icon.pm
@@ -0,0 +1,68 @@
+#
+# 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 .
+#
+
+package installer::windows::icon;
+
+use installer::files;
+use installer::globals;
+use installer::pathanalyzer;
+use installer::windows::idtglobal;
+
+###########################################################################################################
+# Creating the file Icon.idt dynamically
+# Content:
+# Name Data
+###########################################################################################################
+
+sub create_icon_table
+{
+ my ($iconfilecollector, $basedir) = @_;
+
+ my @icontable = ();
+
+ installer::windows::idtglobal::write_idt_header(\@icontable, "icon");
+
+ # Only the iconfiles, that are used in the shortcut table for the
+ # FolderItems (entries in Windows startmenu) are added into the icon table.
+
+ for ( my $i = 0; $i <= $#{$iconfilecollector}; $i++ )
+ {
+ my $iconfile = ${$iconfilecollector}[$i];
+
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$iconfile);
+
+ my %icon = ();
+
+ $icon{'Name'} = $iconfile; # simply soffice.exe
+ $icon{'Data'} = $iconfile; # simply soffice.exe
+
+ my $oneline = $icon{'Name'} . "\t" . $icon{'Data'} . "\n";
+
+ push(@icontable, $oneline);
+ }
+
+ # Saving the file
+
+ my $icontablename = $basedir . $installer::globals::separator . "Icon.idt";
+ installer::files::save_file($icontablename ,\@icontable);
+ my $infoline = "Created idt file: $icontablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/idtglobal.pm b/solenv/bin/modules/installer/windows/idtglobal.pm
new file mode 100644
index 000000000..26c8e951c
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/idtglobal.pm
@@ -0,0 +1,1862 @@
+#
+# 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 .
+#
+
+package installer::windows::idtglobal;
+
+use Cwd;
+use installer::converter;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::pathanalyzer;
+use installer::remover;
+use installer::scriptitems;
+use installer::systemactions;
+use installer::windows::language;
+
+##############################################################
+# Shorten the gid for a feature.
+# Attention: Maximum length is 38
+##############################################################
+
+sub shorten_feature_gid
+{
+ my ($stringref) = @_;
+
+ $$stringref =~ s/gid_Module_/gm_/;
+ $$stringref =~ s/_Extension_/_ex_/;
+ $$stringref =~ s/_Root_/_r_/;
+ $$stringref =~ s/_Prg_/_p_/;
+ $$stringref =~ s/_Optional_/_o_/;
+ $$stringref =~ s/_Tools_/_tl_/;
+ $$stringref =~ s/_Wrt_Flt_/_w_f_/;
+ $$stringref =~ s/_Productivity_/_pr_/;
+# $$stringref =~ s/_Replacement_/_rpl_/; # native373 fix
+}
+
+############################################
+# Getting the next free number, that
+# can be added.
+# Sample: 01-44-~1.DAT, 01-44-~2.DAT, ...
+############################################
+
+sub get_next_free_number
+{
+ my ($name, $shortnamesref) = @_;
+
+ my $counter = 0;
+ my $dontsave = 0;
+ my $alreadyexists;
+ my ($newname, $shortname);
+
+ do
+ {
+ $alreadyexists = 0;
+ $counter++;
+ $newname = $name . $counter;
+
+ for ( my $i = 0; $i <= $#{$shortnamesref}; $i++ )
+ {
+ $shortname = ${$shortnamesref}[$i];
+
+ if ( uc($shortname) eq uc($newname) ) # case insensitive
+ {
+ $alreadyexists = 1;
+ last;
+ }
+ }
+ }
+ until (!($alreadyexists));
+
+ if (( $counter > 9 ) && ( length($name) > 6 )) { $dontsave = 1; }
+ if (( $counter > 99 ) && ( length($name) > 5 )) { $dontsave = 1; }
+
+ if (!($dontsave))
+ {
+ push(@{$shortnamesref}, $newname); # adding the new shortname to the array of shortnames
+ }
+
+ return $counter
+}
+
+############################################
+# Getting the next free number, that
+# can be added.
+# Sample: 01-44-~1.DAT, 01-44-~2.DAT, ...
+############################################
+
+sub get_next_free_number_with_hash
+{
+ my ($name, $shortnamesref, $ext) = @_;
+
+ my $counter = 0;
+ my $dontsave = 0;
+ my $saved = 0;
+ my $alreadyexists;
+ my ($newname, $shortname);
+
+ do
+ {
+ $alreadyexists = 0;
+ $counter++;
+ $newname = $name . $counter;
+ $newname = uc($newname); # case insensitive, always upper case
+ if ( exists($shortnamesref->{$newname}) ||
+ exists($installer::globals::savedrev83mapping{$newname.$ext}) )
+ {
+ $alreadyexists = 1;
+ }
+ }
+ until (!($alreadyexists));
+
+ if (( $counter > 9 ) && ( length($name) > 6 )) { $dontsave = 1; }
+ if (( $counter > 99 ) && ( length($name) > 5 )) { $dontsave = 1; }
+
+ if (!($dontsave))
+ {
+ $shortnamesref->{$newname} = 1; # adding the new shortname to the array of shortnames, always uppercase
+ $saved = 1;
+ }
+
+ return ( $counter, $saved )
+}
+
+#########################################
+# 8.3 for filenames and directories
+#########################################
+
+sub make_eight_three_conform
+{
+ my ($inputstring, $pattern, $shortnamesref) = @_;
+
+ # all shortnames are collected in $shortnamesref, because of uniqueness
+
+ my ($name, $namelength, $number);
+ my $conformstring = "";
+ my $changed = 0;
+
+ if (( $inputstring =~ /^\s*(.*?)\.(.*?)\s*$/ ) && ( $pattern eq "file" )) # files with a dot
+ {
+ $name = $1;
+ my $extension = $2;
+
+ $namelength = length($name);
+ my $extensionlength = length($extension);
+
+ if ( $extensionlength > 3 )
+ {
+ # simply taking the first three letters
+ $extension = substr($extension, 0, 3); # name, offset, length
+ }
+
+ # Attention: readme.html -> README~1.HTM
+
+ if (( $namelength > 8 ) || ( $extensionlength > 3 ))
+ {
+ # taking the first six letters
+ $name = substr($name, 0, 6); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ $number = get_next_free_number($name, $shortnamesref);
+
+ # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed
+
+ if ( $number > 9 )
+ {
+ $name = substr($name, 0, 5); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ $number = get_next_free_number($name, $shortnamesref);
+
+ if ( $number > 99 )
+ {
+ $name = substr($name, 0, 4); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ $number = get_next_free_number($name, $shortnamesref);
+ }
+ }
+
+ $name = $name . "$number";
+
+ $changed = 1;
+ }
+
+ $conformstring = $name . "\." . $extension;
+
+ if ( $changed ) { $conformstring= uc($conformstring); }
+ }
+ else # no dot in filename or directory (also used for shortcuts)
+ {
+ $name = $inputstring;
+ $namelength = length($name);
+
+ if ( $namelength > 8 )
+ {
+ # taking the first six letters
+ $name = substr($name, 0, 6); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ $number = get_next_free_number($name, $shortnamesref);
+
+ # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed
+
+ if ( $number > 9 )
+ {
+ $name = substr($name, 0, 5); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ $number = get_next_free_number($name, $shortnamesref);
+
+ if ( $number > 99 )
+ {
+ $name = substr($name, 0, 4); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ $number = get_next_free_number($name, $shortnamesref);
+ }
+ }
+
+ $name = $name . "$number";
+ $changed = 1;
+ if ( $pattern eq "dir" ) { $name =~ s/\./\_/g; } # in directories replacing "." with "_"
+ }
+
+ $conformstring = $name;
+
+ if ( $changed ) { $conformstring = uc($name); }
+ }
+
+ return $conformstring;
+}
+
+#########################################
+# 8.3 for filenames and directories
+# $shortnamesref is a hash in this case
+# -> performance reasons
+#########################################
+
+sub make_eight_three_conform_with_hash
+{
+ my ($inputstring, $pattern, $shortnamesref) = @_;
+
+ # all shortnames are collected in $shortnamesref, because of uniqueness (a hash!)
+
+ my ($name, $namelength, $number);
+ my $conformstring = "";
+ my $changed = 0;
+ my $saved;
+
+ if (( $inputstring =~ /^\s*(.*)\.(.*?)\s*$/ ) && ( $pattern eq "file" )) # files with a dot
+ {
+ # extension has to be non-greedy, but name is. This is important to find the last dot in the filename
+ $name = $1;
+ my $extension = $2;
+
+ if ( $name =~ /^\s*(.*?)\s*$/ ) { $name = $1; } # now the name is also non-greedy
+ $name =~ s/\.//g; # no dots in 8+3 conform filename
+
+ $namelength = length($name);
+ my $extensionlength = length($extension);
+
+ if ( $extensionlength > 3 )
+ {
+ # simply taking the first three letters
+ $extension = substr($extension, 0, 3); # name, offset, length
+ $changed = 1;
+ }
+
+ # Attention: readme.html -> README~1.HTM
+
+ if (( $namelength > 8 ) || ( $extensionlength > 3 ))
+ {
+ # taking the first six letters, if filename is longer than 6 characters
+ if ( $namelength > 6 )
+ {
+ $name = substr($name, 0, 6); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension));
+
+ # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed
+
+ if ( ! $saved )
+ {
+ $name = substr($name, 0, 5); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension));
+
+ # if $number>99 the new name would be "abcde~100.xyz", which is 9+3, and therefore not allowed
+
+ if ( ! $saved )
+ {
+ $name = substr($name, 0, 4); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension));
+
+ if ( ! $saved )
+ {
+ installer::exiter::exit_program("ERROR: Could not set 8+3 conform name for $inputstring !", "make_eight_three_conform_with_hash");
+ }
+ }
+ }
+
+ $name = $name . "$number";
+ $changed = 1;
+ }
+ }
+
+ $conformstring = $name . "\." . $extension;
+
+ if ( $changed ) { $conformstring= uc($conformstring); }
+ }
+ else # no dot in filename or directory (also used for shortcuts)
+ {
+ $name = $inputstring;
+ $namelength = length($name);
+
+ if ( $namelength > 8 )
+ {
+ # taking the first six letters
+ $name = substr($name, 0, 6); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, '');
+
+ # if $number>9 the new name would be "abcdef~10", which is 9+0, and therefore not allowed
+
+ if ( ! $saved )
+ {
+ $name = substr($name, 0, 5); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, '');
+
+ # if $number>99 the new name would be "abcde~100", which is 9+0, and therefore not allowed
+
+ if ( ! $saved )
+ {
+ $name = substr($name, 0, 4); # name, offset, length
+ $name =~ s/\s*$//; # removing ending whitespaces
+ $name = $name . "\~";
+ ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, '');
+
+ if ( ! $saved ) { installer::exiter::exit_program("ERROR: Could not set 8+3 conform name for $inputstring !", "make_eight_three_conform_with_hash"); }
+ }
+ }
+
+ $name = $name . "$number";
+ $changed = 1;
+ if ( $pattern eq "dir" ) { $name =~ s/\./\_/g; } # in directories replacing "." with "_"
+ }
+
+ $conformstring = $name;
+
+ if ( $changed ) { $conformstring = uc($name); }
+ }
+
+ return $conformstring;
+}
+
+#########################################
+# Writing the header for idt files
+#########################################
+
+sub write_idt_header
+{
+ my ($idtref, $definestring) = @_;
+
+ my $oneline;
+
+ if ( $definestring eq "file" )
+ {
+ $oneline = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti4\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "File\tFile\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "filehash" )
+ {
+ $oneline = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ti2\ti4\ti4\ti4\ti4\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "MsiFileHash\tFile_\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "directory" )
+ {
+ $oneline = "Directory\tDirectory_Parent\tDefaultDir\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\tS72\tl255\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "Directory\tDirectory\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "component" )
+ {
+ $oneline = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\tS38\ts72\ti2\tS255\tS72\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "Component\tComponent\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "feature" )
+ {
+ $oneline = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "65001\tFeature\tFeature\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "featurecomponent" )
+ {
+ $oneline = "Feature_\tComponent_\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s38\ts72\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "FeatureComponents\tFeature_\tComponent_\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "media" )
+ {
+ $oneline = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "i2\ti4\tL64\tS255\tS32\tS72\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "Media\tDiskId\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "font" )
+ {
+ $oneline = "File_\tFontTitle\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\tS128\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "Font\tFile_\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "shortcut" )
+ {
+ $oneline = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "65001\tShortcut\tShortcut\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "msishortcutproperty" )
+ {
+ $oneline = "MsiShortcutProperty\tShortcut_\tPropertyKey\tPropVariantValue\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ts72\ts255\ts255\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "MsiShortcutProperty\tMsiShortcutProperty\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "registry" )
+ {
+ $oneline = "Registry\tRoot\tKey\tName\tValue\tComponent_\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ti2\tl255\tL255\tL0\ts72\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "Registry\tRegistry\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "createfolder" )
+ {
+ $oneline = "Directory_\tComponent_\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ts72\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "CreateFolder\tDirectory_\tComponent_\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "removefile" )
+ {
+ $oneline = "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ts72\tL255\ts72\ti2\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "RemoveFile\tFileKey\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "upgrade" )
+ {
+ $oneline = "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s38\tS20\tS20\tS255\ti4\tS255\ts72\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "icon" )
+ {
+ $oneline = "Name\tData\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\tv0\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "Icon\tName\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "inifile" )
+ {
+ $oneline = "IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "IniFile\tIniFile\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "msiassembly" )
+ {
+ $oneline = "Component_\tFeature_\tFile_Manifest\tFile_Application\tAttributes\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ts38\tS72\tS72\tI2\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "MsiAssembly\tComponent_\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "msiassemblyname" )
+ {
+ $oneline = "Component_\tName\tValue\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ts255\ts255\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "MsiAssemblyName\tComponent_\tName\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "appsearch" )
+ {
+ $oneline = "Property\tSignature_\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ts72\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "AppSearch\tProperty\tSignature_\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "reglocat" )
+ {
+ $oneline = "Signature_\tRoot\tKey\tName\tType\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ti2\ts255\tS255\tI2\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "RegLocator\tSignature_\n";
+ push(@{$idtref}, $oneline);
+ }
+
+ if ( $definestring eq "signatur" )
+ {
+ $oneline = "Signature\tFileName\tMinVersion\tMaxVersion\tMinSize\tMaxSize\tMinDate\tMaxDate\tLanguages\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "s72\ts255\tS20\tS20\tI4\tI4\tI4\tI4\tS255\n";
+ push(@{$idtref}, $oneline);
+ $oneline = "Signature\tSignature\n";
+ push(@{$idtref}, $oneline);
+ }
+
+}
+
+##############################################################
+# Returning the name of the translation file for a
+# given language.
+# Sample: "01" order "en-US" -> "1033.txt"
+##############################################################
+
+sub get_languagefilename
+{
+ my ($idtfilename, $basedir) = @_;
+
+ $idtfilename =~ s/\.idt/\.ulf/;
+
+ my $languagefilename = $basedir . $installer::globals::separator . $idtfilename;
+
+ return $languagefilename;
+}
+
+##############################################################
+# Returning the complete block in all languages
+# for a specified string
+##############################################################
+
+sub get_language_block_from_language_file
+{
+ my ($searchstring, $languagefile) = @_;
+
+ my @language_block = ();
+
+ for ( my $i = 0; $i <= $#{$languagefile}; $i++ )
+ {
+ if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ )
+ {
+ my $counter = $i;
+
+ push(@language_block, ${$languagefile}[$counter]);
+ $counter++;
+
+ while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ )))
+ {
+ push(@language_block, ${$languagefile}[$counter]);
+ $counter++;
+ }
+
+ last;
+ }
+ }
+
+ return \@language_block;
+}
+
+##############################################################
+# Returning a specific language string from the block
+# of all translations
+##############################################################
+
+sub get_language_string_from_language_block
+{
+ my ($language_block, $language, $oldstring) = @_;
+
+ my $newstring = "";
+
+ for ( my $i = 0; $i <= $#{$language_block}; $i++ )
+ {
+ if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
+ {
+ $newstring = $1;
+ $newstring =~ s/\\\"/\"/g; #un-escape quotes, fdo#59321
+ last;
+ }
+ }
+
+ if ( $newstring eq "" )
+ {
+ $language = "en-US"; # defaulting to english
+
+ for ( my $i = 0; $i <= $#{$language_block}; $i++ )
+ {
+ if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
+ {
+ $newstring = $1;
+ last;
+ }
+ }
+ }
+
+ return $newstring;
+}
+
+##############################################################
+# Returning a specific code from the block
+# of all codes. No defaulting to english!
+##############################################################
+
+sub get_code_from_code_block
+{
+ my ($codeblock, $language) = @_;
+
+ my $newstring = "";
+
+ for ( my $i = 0; $i <= $#{$codeblock}; $i++ )
+ {
+ if ( ${$codeblock}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
+ {
+ $newstring = $1;
+ last;
+ }
+ }
+
+ return $newstring;
+}
+
+##############################################################
+# Translating an idt file
+##############################################################
+
+sub translate_idtfile
+{
+ my ($idtfile, $languagefile, $onelanguage) = @_;
+
+ for ( my $i = 0; $i <= $#{$idtfile}; $i++ )
+ {
+ my @allstrings = ();
+
+ my $oneline = ${$idtfile}[$i];
+
+ while ( $oneline =~ /\b(OOO_\w+)\b/ )
+ {
+ my $replacestring = $1;
+ push(@allstrings, $replacestring);
+ $oneline =~ s/$replacestring//;
+ }
+
+ my $oldstring;
+
+ foreach $oldstring (@allstrings)
+ {
+ my $language_block = get_language_block_from_language_file($oldstring, $languagefile);
+ my $newstring = get_language_string_from_language_block($language_block, $onelanguage, $oldstring);
+
+ ${$idtfile}[$i] =~ s/$oldstring/$newstring/; # always substitute, even if $newstring eq "" (there are empty strings for control.idt)
+ }
+ }
+}
+
+##############################################################
+# Copying all needed files to create a msi database
+# into one language specific directory
+##############################################################
+
+sub prepare_language_idt_directory
+{
+ my ($destinationdir, $newidtdir, $onelanguage, $filesref, $iconfilecollector, $binarytablefiles, $allvariables) = @_;
+
+ # Copying all idt-files from the source $installer::globals::idttemplatepath to the destination $destinationdir
+ # Copying all files in the subdirectory "Binary"
+ # Copying all files in the subdirectory "Icon"
+
+ my $infoline = "";
+
+ installer::systemactions::copy_directory($installer::globals::idttemplatepath, $destinationdir);
+
+ if ( -d $installer::globals::idttemplatepath . $installer::globals::separator . "Binary")
+ {
+ installer::systemactions::create_directory($destinationdir . $installer::globals::separator . "Binary");
+ installer::systemactions::copy_directory($installer::globals::idttemplatepath . $installer::globals::separator . "Binary", $destinationdir . $installer::globals::separator . "Binary");
+ }
+
+ installer::systemactions::create_directory($destinationdir . $installer::globals::separator . "Icon");
+
+ if ( -d $installer::globals::idttemplatepath . $installer::globals::separator . "Icon")
+ {
+ installer::systemactions::copy_directory($installer::globals::idttemplatepath . $installer::globals::separator . "Icon", $destinationdir . $installer::globals::separator . "Icon");
+ }
+
+ # Copying all files in $iconfilecollector, that describe icons of folderitems
+
+ for ( my $i = 0; $i <= $#{$iconfilecollector}; $i++ )
+ {
+ my $iconfilename = ${$iconfilecollector}[$i];
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$iconfilename);
+ installer::systemactions::copy_one_file(${$iconfilecollector}[$i], $destinationdir . $installer::globals::separator . "Icon" . $installer::globals::separator . $iconfilename);
+ }
+
+ # Copying all files in $binarytablefiles in the binary directory
+
+ for ( my $i = 0; $i <= $#{$binarytablefiles}; $i++ )
+ {
+ my $binaryfile = ${$binarytablefiles}[$i];
+ my $binaryfilepath = $binaryfile->{'sourcepath'};
+ my $binaryfilename = $binaryfilepath;
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$binaryfilename);
+ installer::systemactions::copy_one_file($binaryfilepath, $destinationdir . $installer::globals::separator . "Binary" . $installer::globals::separator . $binaryfilename);
+ }
+
+ # Copying all new created and language independent idt-files to the destination $destinationdir.
+ # Example: "File.idt"
+
+ installer::systemactions::copy_directory_with_fileextension($newidtdir, $destinationdir, "idt");
+
+ # Copying all new created and language dependent idt-files to the destination $destinationdir.
+ # Example: "Feature.idt.01"
+
+ installer::systemactions::copy_directory_with_fileextension($newidtdir, $destinationdir, $onelanguage);
+ installer::systemactions::rename_files_with_fileextension($destinationdir, $onelanguage);
+
+}
+
+##############################################################
+# Returning the source path of the rtf licensefile for
+# a specified language
+##############################################################
+
+sub get_rtflicensefilesource
+{
+ my ($language, $includepatharrayref) = @_;
+
+ my $licensefilename = "license_" . $language . ".rtf";
+
+ my $sourcefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $includepatharrayref, 1);
+
+ if ($$sourcefileref eq "") { installer::exiter::exit_program("ERROR: Could not find $licensefilename!", "get_rtflicensefilesource"); }
+
+ my $infoline = "Using licensefile: $$sourcefileref\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return $$sourcefileref;
+}
+
+##############################################################
+# A simple converter to create a license txt string from
+# the rtf format
+##############################################################
+
+sub make_string_licensetext
+{
+ my ($licensefile) = @_;
+
+ my $rtf_licensetext = "";
+
+ for ( my $i = 0; $i <= $#{$licensefile}; $i++ )
+ {
+ my $oneline = ${$licensefile}[$i];
+ $oneline =~ s/\s*$//g; # no whitespace at line end
+
+ $rtf_licensetext = $rtf_licensetext . $oneline . " ";
+ }
+
+ return $rtf_licensetext;
+}
+
+##############################################################
+# Including the license text into the table control.idt
+##############################################################
+
+sub add_licensefile_to_database
+{
+ my ($licensefile, $controltable) = @_;
+
+ # Nine tabs before the license text and two tabs after it
+ # The license text has to be included into the dialog
+ # LicenseAgreement into the control Memo.
+
+ my $foundlicenseline = 0;
+ my ($number, $line);
+
+ for ( my $i = 0; $i <= $#{$controltable}; $i++ )
+ {
+ $line = ${$controltable}[$i];
+
+ if ( $line =~ /^\s*\bLicenseAgreement\b\t\bMemo\t/ )
+ {
+ $foundlicenseline = 1;
+ $number = $i;
+ last;
+ }
+ }
+
+ if (!($foundlicenseline))
+ {
+ installer::exiter::exit_program("ERROR: Line for license file in Control.idt not found!", "add_licensefile_to_database");
+ }
+ else
+ {
+ my %control = ();
+
+ if ( $line =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ $control{'Dialog_'} = $1;
+ $control{'Control'} = $2;
+ $control{'Type'} = $3;
+ $control{'X'} = $4;
+ $control{'Y'} = $5;
+ $control{'Width'} = $6;
+ $control{'Height'} = $7;
+ $control{'Attributes'} = $8;
+ $control{'Property'} = $9;
+ $control{'Text'} = $10;
+ $control{'Control_Next'} = $11;
+ $control{'Help'} = $12;
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Could not split line correctly!", "add_licensefile_to_database");
+ }
+
+ my $licensetext = make_string_licensetext($licensefile);
+
+ $control{'Text'} = $licensetext;
+
+ my $newline = $control{'Dialog_'} . "\t" . $control{'Control'} . "\t" . $control{'Type'} . "\t" .
+ $control{'X'} . "\t" . $control{'Y'} . "\t" . $control{'Width'} . "\t" .
+ $control{'Height'} . "\t" . $control{'Attributes'} . "\t" . $control{'Property'} . "\t" .
+ $control{'Text'} . "\t" . $control{'Control_Next'} . "\t" . $control{'Help'} . "\n";
+
+ ${$controltable}[$number] = $newline
+ }
+}
+
+###################################################################
+# Determining the last position in a sequencetable
+# into the tables CustomAc.idt and InstallE.idt.
+###################################################################
+
+sub get_last_position_in_sequencetable
+{
+ my ($sequencetable) = @_;
+
+ my $position = 0;
+
+ for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
+ {
+ my $line = ${$sequencetable}[$i];
+
+ if ( $line =~ /^\s*\w+\t.*\t\s*(\d+)\s$/ )
+ {
+ my $newposition = $1;
+ if ( $newposition > $position ) { $position = $newposition; }
+ }
+ }
+
+ return $position;
+}
+
+#########################################################################
+# Determining the position of a specified Action in the sequencetable
+#########################################################################
+
+sub get_position_in_sequencetable
+{
+ my ($action, $sequencetable) = @_;
+
+ my $position = 0;
+
+ $action =~ s/^\s*behind_//;
+
+ for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
+ {
+ my $line = ${$sequencetable}[$i];
+
+ if ( $line =~ /^\s*(\w+)\t.*\t\s*(\d+)\s$/ )
+ {
+ my $compareaction = $1;
+ $position = $2;
+ if ( $compareaction eq $action ) { last; }
+ }
+ }
+
+ return $position;
+}
+
+################################################################################################
+# Including the CustomAction for the configuration
+# into the tables CustomAc.idt and InstallE.idt.
+#
+# CustomAc.idt: ExecutePkgchk 82 pkgchk.exe -s
+# InstallE.idt: ExecutePkgchk Not REMOVE="ALL" 3175
+#
+# CustomAc.idt: ExecuteQuickstart 82 install_quickstart.exe
+# InstallE.idt: ExecuteQuickstart &gm_o_Quickstart=3 3200
+#
+# CustomAc.idt: ExecuteInstallRegsvrex 82 regsvrex.exe shlxthdl.dll
+# InstallE.idt: ExecuteInstallRegsvrex Not REMOVE="ALL" 3225
+#
+# CustomAc.idt: ExecuteUninstallRegsvrex 82 regsvrex.exe /u shlxthdl.dll
+# InstallE.idt: ExecuteUninstallRegsvrex REMOVE="ALL" 690
+#
+# CustomAc.idt: Regmsdocmsidll1 1 reg4msdocmsidll Reg4MsDocEntry
+# InstallU.idt: Regmsdocmsidll1 Not REMOVE="ALL" 610
+#
+# CustomAc.idt: Regmsdocmsidll2 1 reg4msdocmsidll Reg4MsDocEntry
+# InstallE.idt: Regmsdocmsidll2 Not REMOVE="ALL" 3160
+################################################################################################
+
+sub set_custom_action
+{
+ my ($customactionidttable, $actionname, $actionflags, $exefilename, $actionparameter, $inbinarytable, $filesref, $customactionidttablename, $styles) = @_;
+
+ my $included_customaction = 0;
+ my $infoline = "";
+ my $customaction_exefilename = $exefilename;
+ my $uniquename = "";
+
+ # when the style NO_FILE is set, no searching for the file is needed, no filtering is done, we can add that custom action
+ if ( $styles =~ /\bNO_FILE\b/ )
+ {
+ my $line = $actionname . "\t" . $actionflags . "\t" . $customaction_exefilename . "\t" . $actionparameter . "\n";
+ push(@{$customactionidttable}, $line);
+
+ $infoline = "Added $actionname CustomAction into table $customactionidttablename (NO_FILE has been set)\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ $included_customaction = 1;
+ return $included_customaction;
+ }
+
+ # is the $exefilename a library that is included into the binary table
+
+ if ( $inbinarytable ) { $customaction_exefilename =~ s/\.//g; } # this is the entry in the binary table ("abc.dll" -> "abcdll")
+
+ # is the $exefilename included into the product?
+
+ my $contains_file = 0;
+
+ # All files are located in $filesref and in @installer::globals::binarytableonlyfiles.
+ # Both must be added together
+ my $localfilesref = [@installer::globals::binarytableonlyfiles, @{$filesref}];
+
+ for ( my $i = 0; $i <= $#{$localfilesref}; $i++ )
+ {
+ my $onefile = ${$localfilesref}[$i];
+ my $filename = "";
+ if ( exists($onefile->{'Name'}) )
+ {
+ $filename = $onefile->{'Name'};
+
+ if ( $filename eq $exefilename )
+ {
+ $contains_file = 1;
+ $uniquename = ${$localfilesref}[$i]->{'uniquename'};
+ last;
+ }
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Did not find \"Name\" for file \"$onefile->{'uniquename'}\" ($onefile->{'gid'})!", "set_custom_action");
+ }
+ }
+
+ if ( $contains_file )
+ {
+ # Now the CustomAction can be included into the CustomAc.idt
+
+ if ( ! $inbinarytable ) { $customaction_exefilename = $uniquename; } # the unique file name has to be added to the custom action table
+
+ my $line = $actionname . "\t" . $actionflags . "\t" . $customaction_exefilename . "\t" . $actionparameter . "\n";
+ push(@{$customactionidttable}, $line);
+
+ $included_customaction = 1;
+ }
+
+ if ( $included_customaction ) { $infoline = "Added $actionname CustomAction into table $customactionidttablename\n"; }
+ else { $infoline = "Did not add $actionname CustomAction into table $customactionidttablename\n"; }
+ push(@installer::globals::logfileinfo, $infoline);
+
+ return $included_customaction;
+}
+
+####################################################################
+# Adding a Custom Action to InstallExecuteTable or InstallUITable
+####################################################################
+
+sub add_custom_action_to_install_table
+{
+ my ($installtable, $exefilename, $actionname, $actioncondition, $position, $filesref, $installtablename, $styles) = @_;
+
+ my $included_customaction = 0;
+ my $feature = "";
+ my $infoline = "";
+
+ # when the style NO_FILE is set, no searching for the file is needed, no filtering is done, we can add that custom action
+ if ( $styles =~ /\bNO_FILE\b/ )
+ {
+ # then the InstallE.idt.idt or InstallU.idt.idt
+ $actioncondition =~ s/FEATURETEMPLATE/$feature/g; # only execute Custom Action, if feature of the file is installed
+
+ my $actionposition = 0;
+
+ if ( $position =~ /^\s*\d+\s*$/ ) { $actionposition = $position; } # setting the position directly, number defined in scp2
+ else { $actionposition = "POSITIONTEMPLATE_" . $position; }
+
+ my $line = $actionname . "\t" . $actioncondition . "\t" . $actionposition . "\n";
+ push(@{$installtable}, $line);
+
+ $infoline = "Added $actionname CustomAction into table $installtablename (NO_FILE has been set)\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ return;
+ }
+
+ my $contains_file = 0;
+
+ # All files are located in $filesref and in @installer::globals::binarytableonlyfiles.
+ # Both must be added together
+ my $localfilesref = [@installer::globals::binarytableonlyfiles, @{$filesref}];
+
+ for ( my $i = 0; $i <= $#{$localfilesref}; $i++ )
+ {
+ my $filename = ${$localfilesref}[$i]->{'Name'};
+
+ if ( $filename eq $exefilename )
+ {
+ $contains_file = 1;
+
+ # Determining the feature of the file
+
+ if ( ${$localfilesref}[$i] ) { $feature = ${$localfilesref}[$i]->{'modules'}; }
+
+ # If modules contains a list of modules, only taking the first one.
+ if ( $feature =~ /^\s*(.*?)\,/ ) { $feature = $1; }
+ # Attention: Maximum feature length is 38!
+ shorten_feature_gid(\$feature);
+
+ last;
+ }
+ }
+
+ if ( $contains_file )
+ {
+ # then the InstallE.idt.idt or InstallU.idt.idt
+
+ $actioncondition =~ s/FEATURETEMPLATE/$feature/g; # only execute Custom Action, if feature of the file is installed
+
+ my $positiontemplate = "";
+ if ( $position =~ /^\s*\d+\s*$/ ) { $positiontemplate = $position; } # setting the position directly, number defined in scp2
+ else { $positiontemplate = "POSITIONTEMPLATE_" . $position; }
+
+ my $line = $actionname . "\t" . $actioncondition . "\t" . $positiontemplate . "\n";
+ push(@{$installtable}, $line);
+
+ $included_customaction = 1;
+ }
+
+ if ( $included_customaction ) { $infoline = "Added $actionname CustomAction into table $installtablename\n"; }
+ else { $infoline = "Did not add $actionname CustomAction into table $installtablename\n"; }
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+##################################################################
+# A line in the table ControlEvent connects a Control
+# with a Custom Action
+#################################################################
+
+sub connect_custom_action_to_control
+{
+ my ( $table, $tablename, $dialog, $control, $event, $argument, $condition, $ordering) = @_;
+
+ my $line = $dialog . "\t" . $control. "\t" . $event. "\t" . $argument. "\t" . $condition. "\t" . $ordering . "\n";
+
+ push(@{$table}, $line);
+
+ $line =~ s/\s*$//g;
+
+ $infoline = "Added line \"$line\" into table $tablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+}
+
+##################################################################
+# A line in the table ControlCondition connects a Control state
+# with a condition
+##################################################################
+
+sub connect_condition_to_control
+{
+ my ( $table, $tablename, $dialog, $control, $event, $condition) = @_;
+
+ my $line = $dialog . "\t" . $control. "\t" . $event. "\t" . $condition. "\n";
+
+ push(@{$table}, $line);
+
+ $line =~ s/\s*$//g;
+
+ $infoline = "Added line \"$line\" into table $tablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+}
+
+##################################################################
+# Searching for a sequencenumber in InstallUISequence table
+# "ExecuteAction" must be the last action
+##################################################################
+
+sub get_free_number_in_uisequence_table
+{
+ my ( $installuitable ) = @_;
+
+ # determining the sequence of "ExecuteAction"
+
+ my $executeactionnumber = 0;
+
+ for ( my $i = 0; $i <= $#{$installuitable}; $i++ )
+ {
+ if ( ${$installuitable}[$i] =~ /^\s*(\w+)\t\w*\t(\d+)\s*$/ )
+ {
+ my $actionname = $1;
+ my $actionnumber = $2;
+
+ if ( $actionname eq "ExecuteAction" )
+ {
+ $executeactionnumber = $actionnumber;
+ last;
+ }
+ }
+ }
+
+ if ( $executeactionnumber == 0 ) { installer::exiter::exit_program("ERROR: Did not find \"ExecuteAction\" in InstallUISequence table!", "get_free_number_in_uisequence_table"); }
+
+ # determining the sequence of the action before "ExecuteAction"
+
+ my $lastactionnumber = 0;
+
+ for ( my $i = 0; $i <= $#{$installuitable}; $i++ )
+ {
+ if ( ${$installuitable}[$i] =~ /^\s*\w+\t\w*\t(\d+)\s*$/ )
+ {
+ my $actionnumber = $1;
+
+ if (( $actionnumber > $lastactionnumber ) && ( $actionnumber != $executeactionnumber ))
+ {
+ $lastactionnumber = $actionnumber;
+ }
+ }
+ }
+
+ # the new number can now be calculated
+
+ my $newnumber = 0;
+
+ if ((( $lastactionnumber + $executeactionnumber ) % 2 ) == 0 ) { $newnumber = ( $lastactionnumber + $executeactionnumber ) / 2; }
+ else { $newnumber = ( $lastactionnumber + $executeactionnumber -1 ) / 2; }
+
+ return $newnumber;
+}
+
+#############################################################
+# Including the new subdir into the directory table
+#############################################################
+
+sub include_subdirname_into_directory_table
+{
+ my ($dirname, $directorytable, $directorytablename, $onefile) = @_;
+
+ my $subdir = "";
+ if ( $onefile->{'Subdir'} ) { $subdir = $onefile->{'Subdir'}; }
+ if ( $subdir eq "" ) { installer::exiter::exit_program("ERROR: No \"Subdir\" defined for $onefile->{'Name'}", "include_subdirname_into_directory_table"); }
+
+ # program INSTALLLOCATION program -> subjava INSTALLLOCATION program:java
+
+ my $uniquename = "";
+ my $parent = "";
+ my $name = "";
+
+ my $includedline = 0;
+
+ my $newdir = "";
+
+ for ( my $i = 0; $i <= $#{$directorytable}; $i++ )
+ {
+
+ if ( ${$directorytable}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ $uniquename = $1;
+ $parent = $2;
+ $name = $3;
+
+ if ( $dirname eq $name )
+ {
+ my $newuniquename = "sub" . $subdir;
+ $newdir = $newuniquename;
+ my $newparent = "INSTALLLOCATION";
+ my $newname = $name . "\:" . $subdir;
+ my $newline =
+ $line = "$newuniquename\t$newparent\t$newname\n";
+ push(@{$directorytable}, $line);
+ installer::remover::remove_leading_and_ending_whitespaces(\$line);
+ $infoline = "Added $line into directory table $directorytablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ $includedline = 1;
+ last;
+ }
+ }
+ }
+
+ if ( ! $includedline ) { installer::exiter::exit_program("ERROR: Could not include new subdirectory into directory table for file $onefile->{'Name'}!", "include_subdirname_into_directory_table"); }
+
+ return $newdir;
+}
+
+##################################################################
+# Including the new sub directory into the component table
+##################################################################
+
+sub include_subdir_into_componenttable
+{
+ my ($subdir, $onefile, $componenttable) = @_;
+
+ my $componentname = $onefile->{'componentname'};
+
+ my $changeddirectory = 0;
+
+ for ( my $i = 0; $i <= $#{$componenttable}; $i++ )
+ {
+ if ( ${$componenttable}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my $localcomponentname = $1;
+ my $directory = $3;
+
+ if ( $componentname eq $localcomponentname )
+ {
+ my $oldvalue = ${$componenttable}[$i];
+ ${$componenttable}[$i] =~ s/\b\Q$directory\E\b/$subdir/;
+ my $newvalue = ${$componenttable}[$i];
+
+ installer::remover::remove_leading_and_ending_whitespaces(\$oldvalue);
+ installer::remover::remove_leading_and_ending_whitespaces(\$newvalue);
+ $infoline = "Change in Component table: From \"$oldvalue\" to \"$newvalue\"\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ $changeddirectory = 1;
+ last;
+ }
+ }
+ }
+
+ if ( ! $changeddirectory ) { installer::exiter::exit_program("ERROR: Could not change directory for component: $onefile->{'Name'}!", "include_subdir_into_componenttable"); }
+
+}
+
+##################################################################
+# Setting the condition, that at least one module is selected.
+# All modules with flag SHOW_MULTILINGUAL_ONLY were already
+# collected. In table ControlE.idt, the string
+# LANGUAGECONDITIONINSTALL needs to be replaced.
+# Also for APPLICATIONCONDITIONINSTALL for the applications
+# with flag APPLICATIONMODULE.
+##################################################################
+
+sub set_multilanguageonly_condition
+{
+ my ( $languageidtdir ) = @_;
+
+ my $onefilename = $languageidtdir . $installer::globals::separator . "ControlE.idt";
+ my $onefile = installer::files::read_file($onefilename);
+
+ # Language modules
+
+ my $condition = "";
+
+ foreach my $module ( sort keys %installer::globals::multilingual_only_modules )
+ {
+ $condition = $condition . " &$module=3 Or";
+ }
+
+ $condition =~ s/^\s*//;
+ $condition =~ s/\s*Or\s*$//; # removing the ending "Or"
+
+ if ( $condition eq "" ) { $condition = "1"; }
+
+ for ( my $j = 0; $j <= $#{$onefile}; $j++ )
+ {
+ ${$onefile}[$j] =~ s/LANGUAGECONDITIONINSTALL/$condition/;
+ }
+
+ # Application modules
+
+ $condition = "";
+
+ foreach my $module ( sort keys %installer::globals::application_modules )
+ {
+ $condition = $condition . " &$module=3 Or";
+ }
+
+ $condition =~ s/^\s*//;
+ $condition =~ s/\s*Or\s*$//; # removing the ending "Or"
+
+ if ( $condition eq "" ) { $condition = "1"; }
+
+ for ( my $j = 0; $j <= $#{$onefile}; $j++ )
+ {
+ ${$onefile}[$j] =~ s/APPLICATIONCONDITIONINSTALL/$condition/;
+ }
+
+ installer::files::save_file($onefilename, $onefile);
+}
+
+#############################################
+# Putting array values into hash
+#############################################
+
+sub fill_assignment_hash
+{
+ my ($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray) = @_;
+
+ my $max = $parameter - 1;
+
+ if ( $max != $#{$assignmentarray} )
+ {
+ my $definedparameter = $#{$assignmentarray} + 1;
+ installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Wrong parameter in scp. For table $tablename $parameter parameter are required ! You defined: $definedparameter", "fill_assignment_hash");
+ }
+
+ for ( my $i = 0; $i <= $#{$assignmentarray}; $i++ )
+ {
+ my $counter = $i + 1;
+ my $key = "parameter". $counter;
+
+ my $localvalue = ${$assignmentarray}[$i];
+ installer::remover::remove_leading_and_ending_quotationmarks(\$localvalue);
+ $localvalue =~ s/\\\"/\"/g;
+ $localvalue =~ s/\\\!/\!/g;
+ $localvalue =~ s/\\\&/\&/g;
+ $localvalue =~ s/\\\</\</g;
+ $localvalue =~ s/\\\>/\>/g;
+ $assignmenthashref->{$key} = $localvalue;
+ }
+}
+
+##########################################################################
+# Checking the assignment of a Windows CustomAction and putting it
+# into a hash
+##########################################################################
+
+sub create_customaction_assignment_hash
+{
+ my ($gid, $name, $key, $assignmentarray) = @_;
+
+ my %assignment = ();
+ my $assignmenthashref = \%assignment;
+
+ my $tablename = ${$assignmentarray}[0];
+ installer::remover::remove_leading_and_ending_quotationmarks(\$tablename);
+
+ my $tablename_defined = 0;
+ my $parameter = 0;
+
+ if ( $tablename eq "InstallUISequence" )
+ {
+ $tablename_defined = 1;
+ $parameter = 3;
+ fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray);
+ }
+
+ if ( $tablename eq "InstallExecuteSequence" )
+ {
+ $tablename_defined = 1;
+ $parameter = 3;
+ fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray);
+ }
+
+ if ( $tablename eq "AdminExecuteSequence" )
+ {
+ $tablename_defined = 1;
+ $parameter = 3;
+ fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray);
+ }
+
+ if ( $tablename eq "ControlEvent" )
+ {
+ $tablename_defined = 1;
+ $parameter = 7;
+ fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray);
+ }
+
+ if ( $tablename eq "ControlCondition" )
+ {
+ $tablename_defined = 1;
+ $parameter = 5;
+ fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray);
+ }
+
+ if ( ! $tablename_defined )
+ {
+ installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Unknown Windows CustomAction table: $tablename ! Currently supported: InstallUISequence, InstallExecuteSequence, ControlEvent, ControlCondition", "create_customaction_assignment_hash");
+ }
+
+ return $assignmenthashref;
+}
+
+##########################################################################
+# Finding the position of a specified CustomAction.
+# If the CustomAction is not found, the return value is "-1".
+# If the CustomAction position is not defined yet,
+# the return value is also "-1".
+##########################################################################
+
+sub get_customaction_position
+{
+ my ($action, $sequencetable) = @_;
+
+ my $position = -1;
+
+ for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
+ {
+ my $line = ${$sequencetable}[$i];
+
+ if ( $line =~ /^\s*([\w\.]+)\t.*\t\s*(\d+)\s$/ ) # matching only, if position is a number!
+ {
+ my $compareaction = $1;
+ my $localposition = $2;
+
+ if ( $compareaction eq $action )
+ {
+ $position = $localposition;
+ last;
+ }
+ }
+ }
+
+ return $position;
+}
+
+##########################################################################
+# Setting the position of CustomActions in sequence tables.
+# Replacing all occurrences of "POSITIONTEMPLATE_"
+##########################################################################
+
+sub set_positions_in_table
+{
+ my ( $sequencetable, $tablename ) = @_;
+
+ my $infoline = "\nSetting positions in table \"$tablename\".\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ # Step 1: Resolving all occurrences of "POSITIONTEMPLATE_end"
+
+ my $lastposition = get_last_position_in_sequencetable($sequencetable);
+
+ for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
+ {
+ if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*POSITIONTEMPLATE_end\s*$/ )
+ {
+ my $customaction = $1;
+ $lastposition = $lastposition + 25;
+ ${$sequencetable}[$i] =~ s/POSITIONTEMPLATE_end/$lastposition/;
+ $infoline = "Setting position \"$lastposition\" for custom action \"$customaction\".\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ # Step 2: Resolving all occurrences of "POSITIONTEMPLATE_abc" or "POSITIONTEMPLATE_behind_abc"
+ # where abc is the name of the reference Custom Action.
+ # This has to be done, until there is no more occurrence of POSITIONTEMPLATE (success)
+ # or there is no replacement in one circle (failure).
+
+ my $template_exists = 0;
+ my $template_replaced = 0;
+ my $counter = 0;
+
+ do
+ {
+ $template_exists = 0;
+ $template_replaced = 0;
+ $counter++;
+
+ for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
+ {
+ if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*(POSITIONTEMPLATE_.*?)\s*$/ )
+ {
+ my $onename = $1;
+ my $templatename = $2;
+ my $positionname = $templatename;
+ my $customaction = $templatename;
+ $customaction =~ s/POSITIONTEMPLATE_//;
+ $template_exists = 1;
+
+ # Trying to find the correct number.
+ # This can fail, if the custom action has no number
+
+ my $setbehind = 0;
+ if ( $customaction =~ /^\s*behind_(.*?)\s*$/ )
+ {
+ $customaction = $1;
+ $setbehind = 1;
+ }
+
+ my $position = get_customaction_position($customaction, $sequencetable);
+
+ if ( $position >= 0 ) # Found CustomAction and is has a position. Otherwise return value is "-1".
+ {
+ my $newposition = 0;
+ if ( $setbehind ) { $newposition = $position + 2; }
+ else { $newposition = $position - 2; }
+ ${$sequencetable}[$i] =~ s/$templatename/$newposition/;
+ $template_replaced = 1;
+ $infoline = "Setting position \"$newposition\" for custom action \"$onename\" (scp: \"$positionname\" at position $position).\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Could not assign position for custom action \"$onename\" yet (scp: \"$positionname\").\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+ } while (( $template_exists ) && ( $template_replaced ));
+
+ # An error occurred, because templates still exist, but could not be replaced.
+ # Reason:
+ # 1. Wrong name of CustomAction in scp2 (typo?)
+ # 2. Circular dependencies of CustomActions (A after B and B after A)
+
+ # Problem: It is allowed, that a CustomAction is defined in scp2 in a library that is
+ # part of product ABC, but this CustomAction is not used in this product
+ # and the reference CustomAction is not part of this product.
+ # Therefore this cannot be an error, but only produce a warning. The assigned number
+ # must be the last sequence number.
+
+ if (( $template_exists ) && ( ! $template_replaced ))
+ {
+ for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
+ {
+ if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*(POSITIONTEMPLATE_.*?)\s*$/ )
+ {
+ my $customactionname = $1;
+ my $fulltemplate = $2;
+ my $template = $fulltemplate;
+ $template =~ s/POSITIONTEMPLATE_//;
+ $lastposition = $lastposition + 25;
+ ${$sequencetable}[$i] =~ s/$fulltemplate/$lastposition/;
+ $infoline = "WARNING: Setting position \"$lastposition\" for custom action \"$customactionname\". Could not find CustomAction \"$template\".\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+}
+
+##########################################################################
+# Setting the Windows custom actions into different tables
+# CustomAc.idt, InstallE.idt, InstallU.idt, ControlE.idt, ControlC.idt
+##########################################################################
+
+sub addcustomactions
+{
+ my ($languageidtdir, $customactions, $filesarray) = @_;
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: addcustomactions start\n");
+
+ my $customactionidttablename = $languageidtdir . $installer::globals::separator . "CustomAc.idt";
+ my $customactionidttable = installer::files::read_file($customactionidttablename);
+ my $installexecutetablename = $languageidtdir . $installer::globals::separator . "InstallE.idt";
+ my $installexecutetable = installer::files::read_file($installexecutetablename);
+ my $adminexecutetablename = $languageidtdir . $installer::globals::separator . "AdminExe.idt";
+ my $adminexecutetable = installer::files::read_file($adminexecutetablename);
+ my $installuitablename = $languageidtdir . $installer::globals::separator . "InstallU.idt";
+ my $installuitable = installer::files::read_file($installuitablename);
+ my $controleventtablename = $languageidtdir . $installer::globals::separator . "ControlE.idt";
+ my $controleventtable = installer::files::read_file($controleventtablename);
+ my $controlconditiontablename = $languageidtdir . $installer::globals::separator . "ControlC.idt";
+ my $controlconditiontable = installer::files::read_file($controlconditiontablename);
+
+ # Iterating over all Windows custom actions
+
+ for ( my $i = 0; $i <= $#{$customactions}; $i++ )
+ {
+ my $customaction = ${$customactions}[$i];
+ my $name = $customaction->{'Name'};
+ my $typ = $customaction->{'Typ'};
+ my $source = $customaction->{'Source'};
+ my $target = $customaction->{'Target'};
+ my $inbinarytable = $customaction->{'Inbinarytable'};
+ my $gid = $customaction->{'gid'};
+
+ my $styles = "";
+ if ( $customaction->{'Styles'} ) { $styles = $customaction->{'Styles'}; }
+
+ my $added_customaction = set_custom_action($customactionidttable, $name, $typ, $source, $target, $inbinarytable, $filesarray, $customactionidttablename, $styles);
+
+ if ( $added_customaction )
+ {
+ # If the CustomAction was added into the CustomAc.idt, it can be connected to the installation.
+ # There are currently two different ways for doing this:
+ # 1. Using "add_custom_action_to_install_table", which adds the CustomAction to the install sequences,
+ # which are saved in InstallE.idt and InstallU.idt
+ # 2. Using "connect_custom_action_to_control" and "connect_custom_action_to_control". The first method
+ # connects a CustomAction to a control in ControlE.idt. The second method sets a condition for a control,
+ # which might be influenced by the CustomAction. This happens in ControlC.idt.
+
+ # Any Windows CustomAction can have a lot of different assignments.
+
+ for ( my $j = 1; $j <= 50; $j++ )
+ {
+ my $key = "Assignment" . $j;
+ my $value = "";
+ if ( $customaction->{$key} )
+ {
+ $value = $customaction->{$key};
+ }
+ else { last; }
+
+ # $value is now a comma separated list
+ if ( $value =~ /^\s*\(\s*(.*)\s*\);?\s*$/ ) { $value = $1; }
+ my $assignmentarray = installer::converter::convert_stringlist_into_array(\$value, ",");
+ my $assignment = create_customaction_assignment_hash($gid, $name, $key, $assignmentarray);
+
+ if ( $assignment->{'parameter1'} eq "InstallExecuteSequence" )
+ {
+ add_custom_action_to_install_table($installexecutetable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $installexecutetablename, $styles);
+ }
+ elsif ( $assignment->{'parameter1'} eq "AdminExecuteSequence" )
+ {
+ add_custom_action_to_install_table($adminexecutetable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $adminexecutetablename, $styles);
+ }
+ elsif ( $assignment->{'parameter1'} eq "InstallUISequence" )
+ {
+ add_custom_action_to_install_table($installuitable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $installuitablename, $styles);
+ }
+ elsif ( $assignment->{'parameter1'} eq "ControlEvent" )
+ {
+ connect_custom_action_to_control($controleventtable, $controleventtablename, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $assignment->{'parameter4'}, $assignment->{'parameter5'}, $assignment->{'parameter6'}, $assignment->{'parameter7'});
+ }
+ elsif ( $assignment->{'parameter1'} eq "ControlCondition" )
+ {
+ connect_condition_to_control($controlconditiontable, $controlconditiontablename, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $assignment->{'parameter4'}, $assignment->{'parameter5'});
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Unknown Windows CustomAction table: $assignmenthashref->{'parameter1'} ! Currently supported: InstallUISequence, InstallESequence, ControlEvent, ControlCondition", "addcustomactions");
+ }
+ }
+ }
+ }
+
+ # Setting the positions in the tables
+
+ set_positions_in_table($installexecutetable, $installexecutetablename);
+ set_positions_in_table($installuitable, $installuitablename);
+ set_positions_in_table($adminexecutetable, $adminexecutetablename);
+
+ # Saving the files
+
+ installer::files::save_file($customactionidttablename, $customactionidttable);
+ installer::files::save_file($installexecutetablename, $installexecutetable);
+ installer::files::save_file($adminexecutetablename, $adminexecutetable);
+ installer::files::save_file($installuitablename, $installuitable);
+ installer::files::save_file($controleventtablename, $controleventtable);
+ installer::files::save_file($controlconditiontablename, $controlconditiontable);
+
+ my $infoline = "Updated idt file: $customactionidttablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Updated idt file: $installexecutetablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Updated idt file: $adminexecutetablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Updated idt file: $installuitablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Updated idt file: $controleventtablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ $infoline = "Updated idt file: $controlconditiontablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: addcustomactions end\n");
+}
+
+##########################################################################
+# Setting bidi attributes in idt tables
+##########################################################################
+
+sub setbidiattributes
+{
+ my ($languageidtdir, $onelanguage) = @_;
+
+ # Editing the files Dialog.idt and Control.idt
+
+ my $dialogfilename = $languageidtdir . $installer::globals::separator . "Dialog.idt";
+ my $controlfilename = $languageidtdir . $installer::globals::separator . "Control.idt";
+
+ my $dialogfile = installer::files::read_file($dialogfilename);
+ my $controlfile = installer::files::read_file($controlfilename);
+
+ # Searching attributes in Dialog.idt and adding "896".
+ # Attributes are in column 6 (from 10).
+
+ my $bidiattribute = 896;
+ for ( my $i = 0; $i <= $#{$dialogfile}; $i++ )
+ {
+ if ( $i < 3 ) { next; }
+ if ( ${$dialogfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my $one = $1;
+ my $two = $2;
+ my $three = $3;
+ my $four = $4;
+ my $five = $5;
+ my $attribute = $6;
+ my $seven = $7;
+ my $eight = $8;
+ $attribute = $attribute + $bidiattribute;
+ ${$dialogfile}[$i] = "$one\t$two\t$three\t$four\t$five\t$attribute\t$seven\t$eight\n";
+ }
+ }
+
+ # Searching attributes in Control.idt and adding "224".
+ # Attributes are in column 8 (from 12).
+
+ $bidiattribute = 224;
+ for ( my $i = 0; $i <= $#{$controlfile}; $i++ )
+ {
+ if ( $i < 3 ) { next; }
+ if ( ${$controlfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my $one = $1;
+ my $two = $2;
+ my $three = $3;
+ my $four = $4;
+ my $five = $5;
+ my $six = $6;
+ my $seven = $7;
+ my $attribute = $8;
+ my $nine = $9;
+ my $ten = $10;
+ my $eleven = $11;
+ my $twelve = $12;
+ $attribute = $attribute + $bidiattribute;
+ ${$controlfile}[$i] = "$one\t$two\t$three\t$four\t$five\t$six\t$seven\t$attribute\t$nine\t$ten\t$eleven\t$twelve\n";
+ }
+ }
+
+ # Saving the file
+
+ installer::files::save_file($dialogfilename, $dialogfile);
+ $infoline = "Set bidi support in idt file \"$dialogfilename\" for language $onelanguage\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ installer::files::save_file($controlfilename, $controlfile);
+ $infoline = "Set bidi support in idt file \"$controlfilename\" for language $onelanguage\n";
+ push(@installer::globals::logfileinfo, $infoline);
+}
+
+###############################################
+# Emit custom action 51 for setting standard
+# directory variable. Reference to a hash is
+# returned, represented the custom action.
+# This can be passed in to addcustomaction
+# method.
+###############################################
+
+sub emit_custom_action_for_standard_directory
+{
+ my ($dir, $var) = @_;
+ my %action = ();
+
+ $action{'Name'} = $dir;
+ $action{'Typ'} = "51";
+ $action{'Source'} = $dir;
+ $action{'Target'} = "[$var]";
+ $action{'Styles'} = "NO_FILE";
+ $action{'Assignment1'} = '("AdminExecuteSequence", "", "CostInitialize")';
+ $action{'Assignment2'} = '("InstallExecuteSequence", "", "CostInitialize")';
+ $action{'Assignment3'} = '("InstallUISequence", "", "CostInitialize")';
+
+ return \%action;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/inifile.pm b/solenv/bin/modules/installer/windows/inifile.pm
new file mode 100644
index 000000000..b26e41836
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/inifile.pm
@@ -0,0 +1,121 @@
+#
+# 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 .
+#
+
+package installer::windows::inifile;
+
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+
+####################################################
+# Setting the profile for a special profileitem
+####################################################
+
+sub get_profile_for_profileitem
+{
+ my ($profileid, $filesref) = @_;
+
+ my ($profile) = grep {$_->{gid} eq $profileid} @{$filesref};
+ if (! defined $profile) {
+ installer::exiter::exit_program("ERROR: Could not find file $profileid in list of files!", "get_profile_for_profileitem");
+ }
+
+ return $profile;
+}
+
+####################################################
+# Checking whether profile is part of product
+####################################################
+
+sub file_is_part_of_product
+{
+ my ($profilegid, $filesref) = @_;
+
+ my $part_of_product = 0;
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ $onefile = ${$filesref}[$i];
+ my $filegid = $onefile->{'gid'};
+
+ if ( $filegid eq $profilegid )
+ {
+ $part_of_product = 1;
+ last;
+ }
+ }
+
+ return $part_of_product;
+}
+
+###########################################################################################################
+# Creating the file IniFile.idt dynamically
+# Content:
+# IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_
+###########################################################################################################
+
+sub create_inifile_table
+{
+ my ($inifiletableentries, $filesref, $basedir) = @_;
+
+ my @inifiletable = ();
+
+ installer::windows::idtglobal::write_idt_header(\@inifiletable, "inifile");
+
+ for ( my $i = 0; $i <= $#{$inifiletableentries}; $i++ )
+ {
+ my $profileitem = ${$inifiletableentries}[$i];
+
+ my $profileid = $profileitem->{'ProfileID'};
+
+ # Is this profile part of the product? This is not sure, for example in patch process.
+ # If the profile is not part of the product, this ProfileItem must be ignored.
+
+ if ( ! file_is_part_of_product($profileid, $filesref) ) { next; }
+
+ my $profile = get_profile_for_profileitem($profileid, $filesref);
+
+ my %inifile = ();
+
+ $inifile{'IniFile'} = $profileitem->{'Inifiletablekey'};
+ $inifile{'FileName'} = $profile->{'Name'};
+ $inifile{'DirProperty'} = $profile->{'uniquedirname'};
+ $inifile{'Section'} = $profileitem->{'Section'};
+ $inifile{'Key'} = $profileitem->{'Key'};
+ $inifile{'Value'} = $profileitem->{'Value'};
+ $inifile{'Action'} = $profileitem->{'Inifiletableaction'};
+ $inifile{'Component_'} = $profile->{'componentname'};
+
+ my $oneline = $inifile{'IniFile'} . "\t" . $inifile{'FileName'} . "\t" . $inifile{'DirProperty'} . "\t"
+ . $inifile{'Section'} . "\t" . $inifile{'Key'} . "\t" . $inifile{'Value'} . "\t"
+ . $inifile{'Action'} . "\t" . $inifile{'Component_'} . "\n";
+
+ push(@inifiletable, $oneline);
+ }
+
+ # Saving the file
+
+ my $inifiletablename = $basedir . $installer::globals::separator . "IniFile.idt";
+ installer::files::save_file($inifiletablename ,\@inifiletable);
+ my $infoline = "Created idt file: $inifiletablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/language.pm b/solenv/bin/modules/installer/windows/language.pm
new file mode 100644
index 000000000..2a5be5b64
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/language.pm
@@ -0,0 +1,41 @@
+#
+# 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 .
+#
+
+package installer::windows::language;
+
+use installer::exiter;
+
+####################################################
+# Determining the Windows language (LCID)
+# English: 1033
+####################################################
+
+sub get_windows_language
+{
+ my ($language) = @_;
+
+ my $windowslanguage = "";
+
+ if ( $installer::globals::msilanguage->{$language} ) { $windowslanguage = $installer::globals::msilanguage->{$language}; }
+
+ if ( $windowslanguage eq "" ) { installer::exiter::exit_program("ERROR: Unknown language $language in function get_windows_language", "get_windows_language"); }
+
+ return $windowslanguage;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/media.pm b/solenv/bin/modules/installer/windows/media.pm
new file mode 100644
index 000000000..e73013ee0
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/media.pm
@@ -0,0 +1,202 @@
+#
+# 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 .
+#
+
+package installer::windows::media;
+
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+
+##############################################################
+# Returning the diskid for the media table.
+##############################################################
+
+sub get_media_diskid
+{
+ my ($id) = @_;
+
+ return $id;
+}
+
+##############################################################
+# Returning the diskprompt for the media table.
+##############################################################
+
+sub get_media_diskprompt
+{
+ return 1;
+}
+
+##############################################################
+# Returning the volumelabel for the media table.
+##############################################################
+
+sub get_media_volumelabel
+{
+ return "DISK1";
+}
+
+##############################################################
+# Returning the source for the media table.
+##############################################################
+
+sub get_media_source
+{
+ return "";
+}
+
+#################################################
+# Creating the cab file name dynamically
+#################################################
+
+sub generate_cab_filename_for_some_cabs
+{
+ my ( $allvariables, $id ) = @_;
+
+ my $name = $allvariables->{'PRODUCTNAME'};
+
+ $name = lc($name);
+ $name =~ s/\.//g;
+ $name =~ s/\s//g;
+
+ # possibility to overwrite the name with variable CABFILENAME
+ if ( $allvariables->{'CABFILENAME'} ) { $name = $allvariables->{'CABFILENAME'}; }
+
+ $name = $name . $id . ".cab";
+
+ if ( $installer::globals::include_cab_in_msi ) { $name = "\#" . $name; }
+
+ return $name;
+}
+
+sub get_maximum_filenumber
+{
+ my ($allfiles, $maxcabfilenumber) = @_;
+
+ my $maxfile = 0;
+
+ while ( ! ( $allfiles%$maxcabfilenumber == 0 ))
+ {
+ $allfiles++;
+ }
+
+ $maxfile = $allfiles / $maxcabfilenumber;
+
+ $maxfile++; # for security
+
+ return $maxfile;
+}
+
+#################################################################################
+# Creating the file Media.idt dynamically
+# Content:
+# DiskId LastSequence DiskPrompt Cabinet VolumeLabel Source
+# Idea: Every component is packed into each own cab file
+#################################################################################
+
+sub create_media_table
+{
+ my ($filesref, $basedir, $allvariables, $allupdatelastsequences, $allupdatediskids) = @_;
+
+ my @mediatable = ();
+
+ my $diskid = 0;
+
+ installer::windows::idtglobal::write_idt_header(\@mediatable, "media");
+
+ if ( $installer::globals::fix_number_of_cab_files )
+ {
+ # number of cabfiles
+ my $maxcabfilenumber = $installer::globals::number_of_cabfiles;
+ if ( $allvariables->{'CABFILENUMBER'} ) { $maxcabfilenumber = $allvariables->{'CABFILENUMBER'}; }
+ my $allfiles = $#{$filesref} + 1;
+ my $maxfilenumber = get_maximum_filenumber($allfiles, $maxcabfilenumber);
+ my $cabfilenumber = 0;
+ my $cabfull = 0;
+ my $counter = 0;
+
+ # Sorting of files collector files required !
+ # Attention: The order in the cab file is not guaranteed (especially in update process)
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ if (( $counter >= $maxfilenumber ) || ( $i == $#{$filesref} )) { $cabfull = 1; }
+
+ $counter++; # counting the files in the cab file
+
+ my $onefile = ${$filesref}[$i];
+ my $nextfile = ${$filesref}[$i+1];
+
+ my $filecomponent = "";
+ my $nextcomponent = "";
+
+ if ( $onefile->{'componentname'} ) { $filecomponent = $onefile->{'componentname'}; }
+ if ( $nextfile->{'componentname'} ) { $nextcomponent = $nextfile->{'componentname'}; }
+
+ if ( $filecomponent eq $nextcomponent ) # all files of one component have to be in one cab file
+ {
+ next; # nothing to do, this is not the last file of a component
+ }
+
+ if ( $cabfull )
+ {
+ my %media = ();
+ $cabfilenumber++;
+
+ $media{'DiskId'} = get_media_diskid($cabfilenumber);
+ $media{'LastSequence'} = $i + 1; # This should be correct, also for unsorted files collectors
+ $media{'DiskPrompt'} = get_media_diskprompt();
+ $media{'Cabinet'} = generate_cab_filename_for_some_cabs($allvariables, $cabfilenumber);
+ $media{'VolumeLabel'} = get_media_volumelabel();
+ $media{'Source'} = get_media_source();
+
+ my $oneline = $media{'DiskId'} . "\t" . $media{'LastSequence'} . "\t" . $media{'DiskPrompt'} . "\t"
+ . $media{'Cabinet'} . "\t" . $media{'VolumeLabel'} . "\t" . $media{'Source'} . "\n";
+
+ push(@mediatable, $oneline);
+
+ # Saving the cabinet file name in the file collector
+
+ $media{'Cabinet'} =~ s/^\s*\#//; # removing leading hash
+
+ for ( my $j = 0; $j <= $i; $j++ )
+ {
+ my $onefile = ${$filesref}[$j];
+ if ( ! $onefile->{'cabinet'} ) { $onefile->{'cabinet'} = $media{'Cabinet'}; }
+ }
+
+ $cabfull = 0;
+ $counter = 0;
+ }
+ }
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: No cab file specification in globals.pm !", "create_media_table");
+ }
+
+ # Saving the file
+
+ my $mediatablename = $basedir . $installer::globals::separator . "Media.idt";
+ installer::files::save_file($mediatablename ,\@mediatable);
+ my $infoline = "Created idt file: $mediatablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/mergemodule.pm b/solenv/bin/modules/installer/windows/mergemodule.pm
new file mode 100644
index 000000000..defd59588
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/mergemodule.pm
@@ -0,0 +1,1703 @@
+#
+# 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 .
+#
+
+package installer::windows::mergemodule;
+
+use Cwd;
+use Digest::MD5;
+use installer::converter;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::remover;
+use installer::scriptitems;
+use installer::systemactions;
+use installer::worker;
+use installer::windows::idtglobal;
+use installer::windows::language;
+
+#################################################################
+# Merging the Windows MergeModules into the msi database.
+#################################################################
+
+sub merge_mergemodules_into_msi_database
+{
+ my ($mergemodules, $filesref, $msifilename, $languagestringref, $allvariables, $includepatharrayref, $allupdatesequences, $allupdatelastsequences, $allupdatediskids) = @_;
+
+ my $domerge = 0;
+ if (( $#{$mergemodules} > -1 ) && ( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack )) { $domerge = 1; }
+
+ if ( $domerge )
+ {
+ installer::logger::include_header_into_logfile("Merging merge modules into msi database");
+ installer::logger::print_message( "... merging msm files into msi database ... \n" );
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: MergeModule into msi database, start");
+
+ my $msidb = "msidb.exe"; # Has to be in the path
+ my $cabinetfile = "MergeModule.CABinet"; # the name of each cabinet file in a merge file
+ my $infoline = "";
+ my $systemcall = "";
+ my $returnvalue = "";
+
+ # 1. Analyzing the MergeModule (has only to be done once)
+ # a. -> Extracting cabinet file: msidb.exe -d <msmfile> -x MergeModule.CABinet
+ # b. -> Number of files in cabinet file: msidb.exe -d <msmfile> -f <directory> -e File
+ # c. -> List of components: msidb.exe -d <msmfile> -f <directory> -e Component
+
+ if ( ! $installer::globals::mergemodules_analyzed )
+ {
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Analyzing MergeModules, start");
+ $infoline = "Analyzing all Merge Modules\n\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ %installer::globals::mergemodules = ();
+
+ my $mergemoduledir = installer::systemactions::create_directories("mergefiles", $languagestringref);
+
+ my $mergemodule;
+ foreach $mergemodule ( @{$mergemodules} )
+ {
+ my $filename = $mergemodule->{'Name'};
+ my $mergefile = $ENV{'MSM_PATH'} . $filename;
+
+ if ( ! -f $mergefile ) { installer::exiter::exit_program("ERROR: msm file not found: $filename ($mergefile)!", "merge_mergemodules_into_msi_database"); }
+ my $completesource = $mergefile;
+
+ my $mergegid = $mergemodule->{'gid'};
+ my $workdir = $mergemoduledir . $installer::globals::separator . $mergegid;
+ if ( ! -d $workdir ) { installer::systemactions::create_directory($workdir); }
+
+ $infoline = "Analyzing Merge Module: $filename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # copy msm file into working directory
+ my $completedest = $workdir . $installer::globals::separator . $filename;
+ installer::systemactions::copy_one_file($completesource, $completedest);
+ if ( ! -f $completedest ) { installer::exiter::exit_program("ERROR: msm file not found: $completedest !", "merge_mergemodules_into_msi_database"); }
+
+ # changing directory
+ my $from = cwd();
+ my $to = $workdir;
+ chdir($to);
+
+ # remove an existing cabinet file
+ if ( -f $cabinetfile ) { unlink($cabinetfile); }
+
+ # exclude cabinet file
+ $systemcall = $msidb . " -d " . $filename . " -x " . $cabinetfile;
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not extract cabinet file from merge file: $completedest !", "merge_mergemodules_into_msi_database");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ # exclude tables from mergefile
+ # Attention: All listed tables have to exist in the database. If they not exist, an error window pops up
+ # and the return value of msidb.exe is not zero. The error window makes it impossible to check the existence
+ # of a table with the help of the return value.
+ # Solution: Export of all tables by using "*" . Some tables must exist (File Component Directory), other
+ # tables do not need to exist (MsiAssembly).
+
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ my $localworkdir = $workdir;
+ $localworkdir =~ s/\//\\\\/g;
+ $systemcall = $msidb . " -d " . $filename . " -f " . $localworkdir . " -e \\\*";
+ }
+ else
+ {
+ $systemcall = $msidb . " -d " . $filename . " -f " . $workdir . " -e \*";
+ }
+
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not exclude tables from merge file: $completedest !", "merge_mergemodules_into_msi_database");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ # Determining files
+ my $idtfilename = "File.idt"; # must exist
+ if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: File \"$idtfilename\" not found in directory \"$workdir\" !", "merge_mergemodules_into_msi_database"); }
+ my $filecontent = installer::files::read_file($idtfilename);
+ my @file_idt_content = ();
+ my $filecounter = 0;
+ my %mergefilesequence = ();
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ $filecounter++;
+ push(@file_idt_content, ${$filecontent}[$i]);
+ if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.*?)\t(.*?)\t(.*?)\t(\d+?)\s*$/ )
+ {
+ my $filename = $1;
+ my $filesequence = $8;
+ $mergefilesequence{$filename} = $filesequence;
+ }
+ else
+ {
+ my $linecount = $i + 1;
+ installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "merge_mergemodules_into_msi_database");
+ }
+ }
+
+ # Determining components
+ $idtfilename = "Component.idt"; # must exist
+ if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: File \"$idtfilename\" not found in directory \"$workdir\" !", "merge_mergemodules_into_msi_database"); }
+ $filecontent = installer::files::read_file($idtfilename);
+ my %componentnames = ();
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ if ( ${$filecontent}[$i] =~ /^\s*(\S+)\s+/ ) { $componentnames{$1} = 1; }
+ }
+
+ # Determining directories
+ $idtfilename = "Directory.idt"; # must exist
+ if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: File \"$idtfilename\" not found in directory \"$workdir\" !", "merge_mergemodules_into_msi_database"); }
+ $filecontent = installer::files::read_file($idtfilename);
+ my %mergedirectories = ();
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ if ( ${$filecontent}[$i] =~ /^\s*(\S+)\s+/ ) { $mergedirectories{$1} = 1; }
+ }
+
+ # Determining assemblies
+ $idtfilename = "MsiAssembly.idt"; # does not need to exist
+ my $hasmsiassemblies = 0;
+ my %mergeassemblies = ();
+ if ( -f $idtfilename )
+ {
+ $filecontent = installer::files::read_file($idtfilename);
+ $hasmsiassemblies = 1;
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ if ( ${$filecontent}[$i] =~ /^\s*(\S+)\s+/ ) { $mergeassemblies{$1} = 1; }
+ }
+ }
+
+ # It is possible, that other tables have to be checked here. This happens, if tables in the
+ # merge module have to know the "Feature" or the "Directory", under which the content of the
+ # msm file is integrated into the msi database.
+
+ # Determining name of cabinet file in installation set
+ my $cabfilename = $mergemodule->{'Cabfilename'};
+ if ( $cabfilename ) { installer::packagelist::resolve_packagevariables(\$cabfilename, $allvariables, 0); }
+
+ # Analyzing styles
+ # Flag REMOVE_FILE_TABLE is required for msvc9 Merge-Module, because otherwise msidb.exe
+ # fails during integration of msm file into msi database.
+
+ my $styles = "";
+ my $removefiletable = 0;
+ if ( $mergemodule->{'Styles'} ) { $styles = $mergemodule->{'Styles'}; }
+ if ( $styles =~ /\bREMOVE_FILE_TABLE\b/ ) { $removefiletable = 1; }
+
+ if ( $removefiletable )
+ {
+ my $removeworkdir = $workdir . $installer::globals::separator . "remove_file_idt";
+ if ( ! -d $removeworkdir ) { installer::systemactions::create_directory($removeworkdir); }
+ my $completeremovedest = $removeworkdir . $installer::globals::separator . $filename;
+ installer::systemactions::copy_one_file($completedest, $completeremovedest);
+ if ( ! -f $completeremovedest ) { installer::exiter::exit_program("ERROR: msm file not found: $completeremovedest !", "merge_mergemodules_into_msi_database"); }
+
+ # Unpacking msm file
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ my $localcompleteremovedest = $completeremovedest;
+ my $localremoveworkdir = $removeworkdir;
+ $localcompleteremovedest =~ s/\//\\\\/g;
+ $localremoveworkdir =~ s/\//\\\\/g;
+ $systemcall = $msidb . " -d " . $localcompleteremovedest . " -f " . $localremoveworkdir . " -e \\\*";
+ }
+ else
+ {
+ $systemcall = $msidb . " -d " . $completeremovedest . " -f " . $removeworkdir . " -e \*";
+ }
+
+ $returnvalue = system($systemcall);
+
+ my $idtfilename = $removeworkdir . $installer::globals::separator . "File.idt";
+ if ( -f $idtfilename ) { unlink $idtfilename; }
+ unlink $completeremovedest;
+
+ # Packing msm file without "File.idt"
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ my $localcompleteremovedest = $completeremovedest;
+ my $localremoveworkdir = $removeworkdir;
+ $localcompleteremovedest =~ s/\//\\\\/g;
+ $localremoveworkdir =~ s/\//\\\\/g;
+ $systemcall = $msidb . " -c -d " . $localcompleteremovedest . " -f " . $localremoveworkdir . " -i \\\*";
+ }
+ else
+ {
+ $systemcall = $msidb . " -c -d " . $completeremovedest . " -f " . $removeworkdir . " -i \*";
+ }
+ $returnvalue = system($systemcall);
+
+ # Using this msm file for merging
+ if ( -f $completeremovedest ) { $completedest = $completeremovedest; }
+ else { installer::exiter::exit_program("ERROR: Could not find msm file without File.idt: $completeremovedest !", "merge_mergemodules_into_msi_database"); }
+ }
+
+ # Saving MergeModule info
+
+ my %onemergemodulehash = ();
+ $onemergemodulehash{'mergefilepath'} = $completedest;
+ $onemergemodulehash{'workdir'} = $workdir;
+ $onemergemodulehash{'cabinetfile'} = $workdir . $installer::globals::separator . $cabinetfile;
+ $onemergemodulehash{'filenumber'} = $filecounter;
+ $onemergemodulehash{'componentnames'} = \%componentnames;
+ $onemergemodulehash{'componentcondition'} = $mergemodule->{'ComponentCondition'};
+ $onemergemodulehash{'attributes_add'} = $mergemodule->{'Attributes_Add'};
+ $onemergemodulehash{'cabfilename'} = $cabfilename;
+ $onemergemodulehash{'feature'} = $mergemodule->{'Feature'};
+ $onemergemodulehash{'rootdir'} = $mergemodule->{'RootDir'};
+ $onemergemodulehash{'name'} = $mergemodule->{'Name'};
+ $onemergemodulehash{'mergefilesequence'} = \%mergefilesequence;
+ $onemergemodulehash{'mergeassemblies'} = \%mergeassemblies;
+ $onemergemodulehash{'mergedirectories'} = \%mergedirectories;
+ $onemergemodulehash{'hasmsiassemblies'} = $hasmsiassemblies;
+ $onemergemodulehash{'removefiletable'} = $removefiletable;
+ $onemergemodulehash{'fileidtcontent'} = \@file_idt_content;
+
+ $installer::globals::mergemodules{$mergegid} = \%onemergemodulehash;
+
+ # Collecting all cab files, to copy them into installation set
+ if ( $cabfilename ) { $installer::globals::copy_msm_files{$cabfilename} = $onemergemodulehash{'cabinetfile'}; }
+
+ chdir($from);
+ }
+
+ $infoline = "All Merge Modules successfully analyzed\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ $installer::globals::mergemodules_analyzed = 1;
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Analyzing MergeModules, stop");
+
+ $infoline = "\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ # 2. Change msi database (has to be done for every msi database -> for every language)
+ # a. Merge msm file into msi database: msidb.exe -d <msifile> -m <mergefile>
+ # b. Extracting tables from msi database: msidb.exe -d <msifile> -f <directory> -e File Media, ...
+ # c. Changing content of msi database in tables: File, Media, Directory, FeatureComponent
+ # d. Including tables into msi database: msidb.exe -d <msifile> -f <directory> -i File Media, ...
+ # e. Copying cabinet file into installation set (later)
+
+ my $counter = 0;
+ my $mergemodulegid;
+ foreach $mergemodulegid (keys %installer::globals::mergemodules)
+ {
+ my $mergemodulehash = $installer::globals::mergemodules{$mergemodulegid};
+ $counter++;
+
+ installer::logger::include_header_into_logfile("Merging Module: $mergemodulehash->{'name'}");
+ installer::logger::print_message( "\t... $mergemodulehash->{'name'} ... \n" );
+
+ $msifilename = installer::converter::make_path_conform($msifilename);
+ my $workdir = $msifilename;
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$workdir);
+
+ # changing directory
+ my $from = cwd();
+ my $to = $workdir;
+ chdir($to);
+
+ # Saving original msi database
+ installer::systemactions::copy_one_file($msifilename, "$msifilename\.$counter");
+
+ # Merging msm file, this is the "real" merge command
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Before merging database");
+
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ my $localmergemodulepath = $mergemodulehash->{'mergefilepath'};
+ my $localmsifilename = $msifilename;
+ $localmergemodulepath =~ s/\//\\\\/g;
+ $localmsifilename =~ s/\//\\\\/g;
+ $systemcall = $msidb . " -d " . $localmsifilename . " -m " . $localmergemodulepath;
+ }
+ else
+ {
+ $systemcall = $msidb . " -d " . $msifilename . " -m " . $mergemodulehash->{'mergefilepath'};
+ }
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall . Returnvalue: $returnvalue!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("Could not merge msm file into database: $mergemodulehash->{'mergefilepath'}\n$infoline", "merge_mergemodules_into_msi_database");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: After merging database");
+
+ # Saving original idt files
+ if ( -f "File.idt" ) { installer::systemactions::rename_one_file("File.idt", "old.File.idt.$counter"); }
+ if ( -f "Media.idt" ) { installer::systemactions::rename_one_file("Media.idt", "old.Media.idt.$counter"); }
+ if ( -f "Directory.idt" ) { installer::systemactions::rename_one_file("Directory.idt", "old.Directory.idt.$counter"); }
+ if ( -f "Director.idt" ) { installer::systemactions::rename_one_file("Director.idt", "old.Director.idt.$counter"); }
+ if ( -f "FeatureComponents.idt" ) { installer::systemactions::rename_one_file("FeatureComponents.idt", "old.FeatureComponents.idt.$counter"); }
+ if ( -f "FeatureC.idt" ) { installer::systemactions::rename_one_file("FeatureC.idt", "old.FeatureC.idt.$counter"); }
+ if ( -f "MsiAssembly.idt" ) { installer::systemactions::rename_one_file("MsiAssembly.idt", "old.MsiAssembly.idt.$counter"); }
+ if ( -f "MsiAssem.idt" ) { installer::systemactions::rename_one_file("MsiAssem.idt", "old.MsiAssem.idt.$counter"); }
+ if ( -f "Componen.idt" ) { installer::systemactions::rename_one_file("Componen.idt", "old.Componen.idt.$counter"); }
+
+ # Extracting tables
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Before extracting tables");
+
+ my $workingtables = "File Media Directory FeatureComponents"; # required tables
+ # Optional tables can be added now
+ if ( $mergemodulehash->{'hasmsiassemblies'} ) { $workingtables = $workingtables . " MsiAssembly"; }
+ if ( ( $mergemodulehash->{'componentcondition'} ) || ( $mergemodulehash->{'attributes_add'} ) ) { $workingtables = $workingtables . " Component"; }
+
+ # Table "Feature" has to be exported, but it is not necessary to import it.
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ my $localmsifilename = $msifilename;
+ my $localworkdir = $workdir;
+ $localmsifilename =~ s/\//\\\\/g;
+ $localworkdir =~ s/\//\\\\/g;
+ $systemcall = $msidb . " -d " . $localmsifilename . " -f " . $localworkdir . " -e " . "Feature " . $workingtables;
+ }
+ else
+ {
+ $systemcall = $msidb . " -d " . $msifilename . " -f " . $workdir . " -e " . "Feature " . $workingtables;
+ }
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not exclude tables from msi database: $msifilename !", "merge_mergemodules_into_msi_database");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: After extracting tables");
+
+ # Using 8+3 table names, that are used, when tables are integrated into database. The export of tables
+ # creates idt-files, that have long names.
+
+ if ( -f "Directory.idt" ) { installer::systemactions::rename_one_file("Directory.idt", "Director.idt"); }
+ if ( -f "FeatureComponents.idt" ) { installer::systemactions::rename_one_file("FeatureComponents.idt", "FeatureC.idt"); }
+ if ( -f "MsiAssembly.idt" ) { installer::systemactions::rename_one_file("MsiAssembly.idt", "MsiAssem.idt"); }
+ if ( -f "Component.idt" ) { installer::systemactions::rename_one_file("Component.idt", "Componen.idt"); }
+
+ # Changing content of tables: File, Media, Directory, FeatureComponent, MsiAssembly, Component
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing Media table");
+ change_media_table($mergemodulehash, $workdir, $mergemodulegid, $allupdatelastsequences, $allupdatediskids);
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing File table");
+ $filesref = change_file_table($mergemodulehash, $workdir, $allupdatesequences, $includepatharrayref, $filesref, $mergemodulegid);
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing FeatureComponent table");
+ change_featurecomponent_table($mergemodulehash, $workdir);
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing Directory table");
+ change_directory_table($mergemodulehash, $workdir);
+ if ( $mergemodulehash->{'hasmsiassemblies'} )
+ {
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing MsiAssembly table");
+ change_msiassembly_table($mergemodulehash, $workdir);
+ }
+
+ if ( ( $mergemodulehash->{'componentcondition'} ) || ( $mergemodulehash->{'attributes_add'} ) )
+ {
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing Component table");
+ change_component_table($mergemodulehash, $workdir);
+ }
+
+ # msidb.exe does not merge InstallExecuteSequence, AdminExecuteSequence and AdvtExecuteSequence. Instead it creates
+ # new tables ModuleInstallExecuteSequence, ModuleAdminExecuteSequence and ModuleAdvtExecuteSequence that need to be
+ # merged into the three ExecuteSequences with the following process (also into InstallUISequence.idt).
+
+ # Saving original idt files
+ if ( -f "InstallE.idt" ) { installer::systemactions::rename_one_file("InstallE.idt", "old.InstallE.idt.$counter"); }
+ if ( -f "InstallU.idt" ) { installer::systemactions::rename_one_file("InstallU.idt", "old.InstallU.idt.$counter"); }
+ if ( -f "AdminExe.idt" ) { installer::systemactions::rename_one_file("AdminExe.idt", "old.AdminExe.idt.$counter"); }
+ if ( -f "AdvtExec.idt" ) { installer::systemactions::rename_one_file("AdvtExec.idt", "old.AdvtExec.idt.$counter"); }
+ if ( -f "ModuleInstallExecuteSequence.idt" ) { installer::systemactions::rename_one_file("ModuleInstallExecuteSequence.idt", "old.ModuleInstallExecuteSequence.idt.$counter"); }
+ if ( -f "ModuleAdminExecuteSequence.idt" ) { installer::systemactions::rename_one_file("ModuleAdminExecuteSequence.idt", "old.ModuleAdminExecuteSequence.idt.$counter"); }
+ if ( -f "ModuleAdvtExecuteSequence.idt" ) { installer::systemactions::rename_one_file("ModuleAdvtExecuteSequence.idt", "old.ModuleAdvtExecuteSequence.idt.$counter"); }
+
+ # Extracting tables
+ my $moduleexecutetables = "ModuleInstallExecuteSequence ModuleAdminExecuteSequence ModuleAdvtExecuteSequence"; # new tables
+ my $executetables = "InstallExecuteSequence InstallUISequence AdminExecuteSequence AdvtExecuteSequence"; # tables to be merged
+
+
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ my $localmsifilename = $msifilename;
+ my $localworkdir = $workdir;
+ $localmsifilename =~ s/\//\\\\/g;
+ $localworkdir =~ s/\//\\\\/g;
+ $systemcall = $msidb . " -d " . $localmsifilename . " -f " . $localworkdir . " -e " . "Feature " . $moduleexecutetables;
+ }
+ else
+ {
+ $systemcall = $msidb . " -d " . $msifilename . " -f " . $workdir . " -e " . "Feature " . $moduleexecutetables;
+ }
+ $returnvalue = system($systemcall);
+
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ my $localmsifilename = $msifilename;
+ my $localworkdir = $workdir;
+ $localmsifilename =~ s/\//\\\\/g;
+ $localworkdir =~ s/\//\\\\/g;
+ $systemcall = $msidb . " -d " . $localmsifilename . " -f " . $localworkdir . " -e " . "Feature " . $executetables;
+ }
+ else
+ {
+ $systemcall = $msidb . " -d " . $msifilename . " -f " . $workdir . " -e " . "Feature " . $executetables;
+ }
+ $returnvalue = system($systemcall);
+
+ # Using 8+3 table names, that are used, when tables are integrated into database. The export of tables
+ # creates idt-files, that have long names.
+
+ if ( -f "InstallExecuteSequence.idt" ) { installer::systemactions::rename_one_file("InstallExecuteSequence.idt", "InstallE.idt"); }
+ if ( -f "InstallUISequence.idt" ) { installer::systemactions::rename_one_file("InstallUISequence.idt", "InstallU.idt"); }
+ if ( -f "AdminExecuteSequence.idt" ) { installer::systemactions::rename_one_file("AdminExecuteSequence.idt", "AdminExe.idt"); }
+ if ( -f "AdvtExecuteSequence.idt" ) { installer::systemactions::rename_one_file("AdvtExecuteSequence.idt", "AdvtExec.idt"); }
+
+ # Merging content of tables ModuleInstallExecuteSequence, ModuleAdminExecuteSequence and ModuleAdvtExecuteSequence
+ # into tables InstallExecuteSequence, AdminExecuteSequence and AdvtExecuteSequence
+ if ( -f "ModuleInstallExecuteSequence.idt" )
+ {
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing InstallExecuteSequence table");
+ change_executesequence_table($mergemodulehash, $workdir, "InstallE.idt", "ModuleInstallExecuteSequence.idt");
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing InstallUISequence table");
+ change_executesequence_table($mergemodulehash, $workdir, "InstallU.idt", "ModuleInstallExecuteSequence.idt");
+ }
+
+ if ( -f "ModuleAdminExecuteSequence.idt" )
+ {
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing AdminExecuteSequence table");
+ change_executesequence_table($mergemodulehash, $workdir, "AdminExe.idt", "ModuleAdminExecuteSequence.idt");
+ }
+
+ if ( -f "ModuleAdvtExecuteSequence.idt" )
+ {
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Changing AdvtExecuteSequence table");
+ change_executesequence_table($mergemodulehash, $workdir, "AdvtExec.idt", "ModuleAdvtExecuteSequence.idt");
+ }
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: All tables edited");
+
+ # Including tables into msi database
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Before including tables");
+
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ my $localmsifilename = $msifilename;
+ my $localworkdir = $workdir;
+ $localmsifilename =~ s/\//\\\\/g;
+ $localworkdir =~ s/\//\\\\/g;
+ foreach $table (split / /, $workingtables . ' ' . $executetables) {
+ $systemcall = $msidb . " -d " . $localmsifilename . " -f " . $localworkdir . " -i " . $table;
+ my $retval = system($systemcall);
+ $infoline = "Systemcall returned $retval: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $returnvalue |= $retval;
+ }
+ }
+ else
+ {
+ $systemcall = $msidb . " -d " . $msifilename . " -f " . $workdir . " -i " . $workingtables. " " . $executetables;
+ $returnvalue = system($systemcall);
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ }
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not include tables into msi database: $msifilename !", "merge_mergemodules_into_msi_database");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: After including tables");
+
+ chdir($from);
+ }
+
+ if ( ! $installer::globals::mergefiles_added_into_collector ) { $installer::globals::mergefiles_added_into_collector = 1; } # Now all mergemodules are merged for one language.
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: MergeModule into msi database, stop");
+ }
+
+ return $filesref;
+}
+
+#########################################################################
+# Analyzing the content of the media table.
+#########################################################################
+
+sub analyze_media_file
+{
+ my ($filecontent, $workdir) = @_;
+
+ my %filehash = ();
+ my $linecount = 0;
+ my $counter = 0;
+ my $filename = "Media.idt";
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.+?)\t(.*?)\s*$/ )
+ {
+ my %line = ();
+ # Format: DiskId LastSequence DiskPrompt Cabinet VolumeLabel Source
+ $line{'DiskId'} = $1;
+ $line{'LastSequence'} = $2;
+ $line{'DiskPrompt'} = $3;
+ $line{'Cabinet'} = $4;
+ $line{'VolumeLabel'} = $5;
+ $line{'Source'} = $6;
+
+ $counter++;
+ $filehash{$counter} = \%line;
+ }
+ else
+ {
+ $linecount = $i + 1;
+ installer::exiter::exit_program("ERROR: Unknown line format in table \"$filename\" in \"$workdir\" (line $linecount) !", "analyze_media_file");
+ }
+ }
+
+ return \%filehash;
+}
+
+#########################################################################
+# Setting the DiskID for the new cabinet file
+#########################################################################
+
+sub get_diskid
+{
+ my ($mediafile, $allupdatediskids, $cabfilename) = @_;
+
+ my $diskid = 0;
+ my $line;
+
+ if (( $installer::globals::updatedatabase ) && ( exists($allupdatediskids->{$cabfilename}) ))
+ {
+ $diskid = $allupdatediskids->{$cabfilename};
+ }
+ else
+ {
+ foreach $line ( keys %{$mediafile} )
+ {
+ if ( $mediafile->{$line}->{'DiskId'} > $diskid ) { $diskid = $mediafile->{$line}->{'DiskId'}; }
+ }
+
+ $diskid++;
+ }
+
+ return $diskid;
+}
+
+#########################################################################
+# Setting the global LastSequence variable
+#########################################################################
+
+sub set_current_last_sequence
+{
+ my ($mediafile) = @_;
+
+ my $lastsequence = 0;
+ my $line;
+ foreach $line ( keys %{$mediafile} )
+ {
+ if ( $mediafile->{$line}->{'LastSequence'} > $lastsequence ) { $lastsequence = $mediafile->{$line}->{'LastSequence'}; }
+ }
+
+ $installer::globals::lastsequence_before_merge = $lastsequence;
+}
+
+#########################################################################
+# Setting the LastSequence for the new cabinet file
+#########################################################################
+
+sub get_lastsequence
+{
+ my ($mergemodulehash, $allupdatelastsequences) = @_;
+
+ my $lastsequence = 0;
+
+ if (( $installer::globals::updatedatabase ) && ( exists($allupdatelastsequences->{$mergemodulehash->{'cabfilename'}}) ))
+ {
+ $lastsequence = $allupdatelastsequences->{$mergemodulehash->{'cabfilename'}};
+ }
+ else
+ {
+ $lastsequence = $installer::globals::lastsequence_before_merge + $mergemodulehash->{'filenumber'};
+ }
+
+ return $lastsequence;
+}
+
+#########################################################################
+# Setting the DiskPrompt for the new cabinet file
+#########################################################################
+
+sub get_diskprompt
+{
+ my ($mediafile) = @_;
+
+ my $diskprompt = "";
+ my $line;
+ foreach $line ( keys %{$mediafile} )
+ {
+ if ( exists($mediafile->{$line}->{'DiskPrompt'}) )
+ {
+ $diskprompt = $mediafile->{$line}->{'DiskPrompt'};
+ last;
+ }
+ }
+
+ return $diskprompt;
+}
+
+#########################################################################
+# Setting the VolumeLabel for the new cabinet file
+#########################################################################
+
+sub get_volumelabel
+{
+ my ($mediafile) = @_;
+
+ my $volumelabel = "";
+ my $line;
+ foreach $line ( keys %{$mediafile} )
+ {
+ if ( exists($mediafile->{$line}->{'VolumeLabel'}) )
+ {
+ $volumelabel = $mediafile->{$line}->{'VolumeLabel'};
+ last;
+ }
+ }
+
+ return $volumelabel;
+}
+
+#########################################################################
+# Setting the Source for the new cabinet file
+#########################################################################
+
+sub get_source
+{
+ my ($mediafile) = @_;
+
+ my $source = "";
+ my $line;
+ foreach $line ( keys %{$mediafile} )
+ {
+ if ( exists($mediafile->{$line}->{'Source'}) )
+ {
+ $diskprompt = $mediafile->{$line}->{'Source'};
+ last;
+ }
+ }
+
+ return $source;
+}
+
+#########################################################################
+# For each Merge Module one new line has to be included into the
+# media table.
+#########################################################################
+
+sub create_new_media_line
+{
+ my ($mergemodulehash, $mediafile, $allupdatelastsequences, $allupdatediskids) = @_;
+
+ my $diskid = get_diskid($mediafile, $allupdatediskids, $mergemodulehash->{'cabfilename'});
+ my $lastsequence = get_lastsequence($mergemodulehash, $allupdatelastsequences);
+ my $diskprompt = get_diskprompt($mediafile);
+ my $cabinet = $mergemodulehash->{'cabfilename'};
+ my $volumelabel = get_volumelabel($mediafile);
+ my $source = get_source($mediafile);
+
+ if ( $installer::globals::include_cab_in_msi ) { $cabinet = "\#" . $cabinet; }
+
+ my $newline = "$diskid\t$lastsequence\t$diskprompt\t$cabinet\t$volumelabel\t$source\n";
+
+ return $newline;
+}
+
+#########################################################################
+# Setting the last diskid in media table.
+#########################################################################
+
+sub get_last_diskid
+{
+ my ($mediafile) = @_;
+
+ my $lastdiskid = 0;
+ my $line;
+ foreach $line ( keys %{$mediafile} )
+ {
+ if ( $mediafile->{$line}->{'DiskId'} > $lastdiskid ) { $lastdiskid = $mediafile->{$line}->{'DiskId'}; }
+ }
+
+ return $lastdiskid;
+}
+
+#########################################################################
+# Setting global variable for last cab file name.
+#########################################################################
+
+sub set_last_cabfile_name
+{
+ my ($mediafile, $lastdiskid) = @_;
+
+ my $line;
+ foreach $line ( keys %{$mediafile} )
+ {
+ if ( $mediafile->{$line}->{'DiskId'} == $lastdiskid ) { $installer::globals::lastcabfilename = $mediafile->{$line}->{'Cabinet'}; }
+ }
+ my $infoline = "Setting last cabinet file: $installer::globals::lastcabfilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+#########################################################################
+# In the media table the new cabinet file has to be added or the
+# number of the last cabinet file has to be increased.
+#########################################################################
+
+sub change_media_table
+{
+ my ( $mergemodulehash, $workdir, $mergemodulegid, $allupdatelastsequences, $allupdatediskids ) = @_;
+
+ my $infoline = "Changing content of table \"Media\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $filename = "Media.idt";
+ if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" in \"$workdir\" !", "change_media_table"); }
+
+ my $filecontent = installer::files::read_file($filename);
+ my $mediafile = analyze_media_file($filecontent, $workdir);
+ set_current_last_sequence($mediafile);
+
+ if ( $installer::globals::fix_number_of_cab_files )
+ {
+ # Determining the line with the highest sequencenumber. That file needs to be updated.
+ my $lastdiskid = get_last_diskid($mediafile);
+ if ( $installer::globals::lastcabfilename eq "" ) { set_last_cabfile_name($mediafile, $lastdiskid); }
+ my $newmaxsequencenumber = $installer::globals::lastsequence_before_merge + $mergemodulehash->{'filenumber'};
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ if ( ${$filecontent}[$i] =~ /^\s*(\Q$lastdiskid\E\t)\Q$installer::globals::lastsequence_before_merge\E(\t.*)$/ )
+ {
+ my $start = $1;
+ my $final = $2;
+ $infoline = "Merge: Old line in media table: ${$filecontent}[$i]\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ my $newline = $start . $newmaxsequencenumber . $final . "\n";
+ ${$filecontent}[$i] = $newline;
+ $infoline = "Merge: Changed line in media table: ${$filecontent}[$i]\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+ else
+ {
+ # the new line is identical for all localized databases, but has to be created for each MergeModule ($mergemodulegid)
+ if ( ! exists($installer::globals::merge_media_line{$mergemodulegid}) )
+ {
+ $installer::globals::merge_media_line{$mergemodulegid} = create_new_media_line($mergemodulehash, $mediafile, $allupdatelastsequences, $allupdatediskids);
+ }
+
+ $infoline = "Adding line: $installer::globals::merge_media_line{$mergemodulegid}\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # adding new line
+ push(@{$filecontent}, $installer::globals::merge_media_line{$mergemodulegid});
+ }
+
+ # saving file
+ installer::files::save_file($filename, $filecontent);
+}
+
+#########################################################################
+# Putting the directory table content into a hash.
+#########################################################################
+
+sub analyze_directorytable_file
+{
+ my ($filecontent, $idtfilename) = @_;
+
+ my %dirhash = ();
+ # Iterating over the file content
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my %line = ();
+ # Format: Directory Directory_Parent DefaultDir
+ $line{'Directory'} = $1;
+ $line{'Directory_Parent'} = $2;
+ $line{'DefaultDir'} = $3;
+ $line{'linenumber'} = $i; # saving also the line number for direct access
+
+ my $uniquekey = $line{'Directory'};
+ $dirhash{$uniquekey} = \%line;
+ }
+ else
+ {
+ my $linecount = $i + 1;
+ installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "analyze_directorytable_file");
+ }
+ }
+
+ return \%dirhash;
+}
+
+#########################################################################
+# Putting the msi assembly table content into a hash.
+#########################################################################
+
+sub analyze_msiassemblytable_file
+{
+ my ($filecontent, $idtfilename) = @_;
+
+ my %assemblyhash = ();
+ # Iterating over the file content
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.+?)\t(.+?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my %line = ();
+ # Format: Component_ Feature_ File_Manifest File_Application Attributes
+ $line{'Component'} = $1;
+ $line{'Feature'} = $2;
+ $line{'File_Manifest'} = $3;
+ $line{'File_Application'} = $4;
+ $line{'Attributes'} = $5;
+ $line{'linenumber'} = $i; # saving also the line number for direct access
+
+ my $uniquekey = $line{'Component'};
+ $assemblyhash{$uniquekey} = \%line;
+ }
+ else
+ {
+ my $linecount = $i + 1;
+ installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "analyze_msiassemblytable_file");
+ }
+ }
+
+ return \%assemblyhash;
+}
+
+#########################################################################
+# Putting the file table content into a hash.
+#########################################################################
+
+sub analyze_filetable_file
+{
+ my ( $filecontent, $idtfilename ) = @_;
+
+ my %filehash = ();
+ # Iterating over the file content
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.+?)\t(.+?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.+?)\s*$/ )
+ {
+ my %line = ();
+ # Format: File Component_ FileName FileSize Version Language Attributes Sequence
+ $line{'File'} = $1;
+ $line{'Component'} = $2;
+ $line{'FileName'} = $3;
+ $line{'FileSize'} = $4;
+ $line{'Version'} = $5;
+ $line{'Language'} = $6;
+ $line{'Attributes'} = $7;
+ $line{'Sequence'} = $8;
+ $line{'linenumber'} = $i; # saving also the line number for direct access
+
+ my $uniquekey = $line{'File'};
+ $filehash{$uniquekey} = \%line;
+ }
+ else
+ {
+ my $linecount = $i + 1;
+ installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "analyze_filetable_file");
+ }
+ }
+
+ return \%filehash;
+}
+
+#########################################################################
+# Creating a new line for the directory table.
+#########################################################################
+
+sub get_new_line_for_directory_table
+{
+ my ($dir) = @_;
+
+ my $newline = "$dir->{'Directory'}\t$dir->{'Directory_Parent'}\t$dir->{'DefaultDir'}\n";
+
+ return $newline;
+}
+
+#########################################################################
+# Creating a new line for the file table.
+#########################################################################
+
+sub get_new_line_for_file_table
+{
+ my ($file) = @_;
+
+ my $newline = "$file->{'File'}\t$file->{'Component'}\t$file->{'FileName'}\t$file->{'FileSize'}\t$file->{'Version'}\t$file->{'Language'}\t$file->{'Attributes'}\t$file->{'Sequence'}\n";
+
+ return $newline;
+}
+
+#########################################################################
+# Creating a new line for the msiassembly table.
+#########################################################################
+
+sub get_new_line_for_msiassembly_table
+{
+ my ($assembly) = @_;
+
+ my $newline = "$assembly->{'Component'}\t$assembly->{'Feature'}\t$assembly->{'File_Manifest'}\t$assembly->{'File_Application'}\t$assembly->{'Attributes'}\n";
+
+ return $newline;
+}
+
+#########################################################################
+# Sorting the files collector, if there are files, following
+# the merge module files.
+#########################################################################
+
+sub sort_files_collector_for_sequence
+{
+ my ($filesref) = @_;
+
+ my @sortarray = ();
+ my %helphash = ();
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+ if ( ! exists($onefile->{'sequencenumber'}) ) { installer::exiter::exit_program("ERROR: Could not find sequencenumber for file: $onefile->{'uniquename'} !", "sort_files_collector_for_sequence"); }
+ my $sequence = $onefile->{'sequencenumber'};
+ $helphash{$sequence} = $onefile;
+ }
+
+ foreach my $seq ( sort { $a <=> $b } keys %helphash ) { push(@sortarray, $helphash{$seq}); }
+
+ return \@sortarray;
+}
+
+#########################################################################
+# In the file table "Sequence" and "Attributes" have to be changed.
+#########################################################################
+
+sub change_file_table
+{
+ my ($mergemodulehash, $workdir, $allupdatesequenceshashref, $includepatharrayref, $filesref, $mergemodulegid) = @_;
+
+ my $infoline = "Changing content of table \"File\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $idtfilename = "File.idt";
+ if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_file_table"); }
+
+ my $filecontent = installer::files::read_file($idtfilename);
+
+ # If File.idt needed to be removed before the msm database was merged into the msi database,
+ # now it is time to add the content into File.idt
+ if ( $mergemodulehash->{'removefiletable'} )
+ {
+ for ( my $i = 0; $i <= $#{$mergemodulehash->{'fileidtcontent'}}; $i++ )
+ {
+ push(@{$filecontent}, ${$mergemodulehash->{'fileidtcontent'}}[$i]);
+ }
+ }
+
+ # Unpacking the MergeModule.CABinet (only once)
+ # Unpacking into temp directory. Warning: expand.exe has problems with very long unpack directories.
+
+ my $empty = "";
+ my $unpackdir = installer::systemactions::create_directories("cab", \$empty);
+ push(@installer::globals::removedirs, $unpackdir);
+ $unpackdir = $unpackdir . $installer::globals::separator . $mergemodulegid;
+
+ my %newfileshash = ();
+ if (( $installer::globals::fix_number_of_cab_files ) && ( ! $installer::globals::mergefiles_added_into_collector ))
+ {
+ if ( ! -d $unpackdir ) { installer::systemactions::create_directory($unpackdir); }
+
+ # changing directory
+ my $from = cwd();
+ my $to = $mergemodulehash->{'workdir'};
+ if ( $^O =~ /cygwin/i ) {
+ $to = qx(cygpath -u "$to");
+ chomp $to;
+ }
+
+ chdir($to) || die "Could not chdir to \"$to\"\n";
+
+ # Unpack the cab file, so that in can be included into the last office cabinet file.
+ # Not using cabarc.exe from cabsdk for unpacking cabinet files, but "expand.exe" that
+ # should be available on every Windows system.
+
+ $infoline = "Unpacking cabinet file: $mergemodulehash->{'cabinetfile'}\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # Avoid the Cygwin expand command
+ my $expandfile = "expand.exe"; # Has to be in the path
+ if ( $^O =~ /cygwin/i ) {
+ $expandfile = qx(cygpath -u "$ENV{WINDIR}"/System32/expand.exe);
+ chomp $expandfile;
+ }
+
+ my $cabfilename = "MergeModule.CABinet";
+
+ my $systemcall = "";
+ if ( $^O =~ /cygwin/i ) {
+ my $localunpackdir = qx(cygpath -m "$unpackdir");
+ chomp $localunpackdir;
+ $systemcall = $expandfile . " " . $cabfilename . " -F:\\\* " . $localunpackdir;
+ }
+ else
+ {
+ $systemcall = $expandfile . " " . $cabfilename . " -F:\* " . $unpackdir . " 2\>\&1";
+ }
+
+ my $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not extract cabinet file: $mergemodulehash->{'cabinetfile'} !", "change_file_table");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ chdir($from);
+ }
+
+ # For performance reasons creating a hash with file names and rows
+ # The content of File.idt is changed after every merge -> content cannot be saved in global hash
+ $merge_filetablehashref = analyze_filetable_file($filecontent, $idtfilename);
+
+ my $attributes = "16384"; # Always
+
+ my $filename;
+ foreach $filename (keys %{$mergemodulehash->{'mergefilesequence'}} )
+ {
+ my $mergefilesequence = $mergemodulehash->{'mergefilesequence'}->{$filename};
+
+ if ( ! exists($merge_filetablehashref->{$filename}) ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" in \"$idtfilename\" !", "change_file_table"); }
+ my $filehash = $merge_filetablehashref->{$filename};
+ my $linenumber = $filehash->{'linenumber'};
+
+ # <- this line has to be changed concerning "Sequence" and "Attributes"
+ $filehash->{'Attributes'} = $attributes;
+
+ # If this is an update process, the sequence numbers have to be reused.
+ if ( $installer::globals::updatedatabase )
+ {
+ if ( ! exists($allupdatesequenceshashref->{$filehash->{'File'}}) ) { installer::exiter::exit_program("ERROR: Sequence not defined for file \"$filehash->{'File'}\" !", "change_file_table"); }
+ $filehash->{'Sequence'} = $allupdatesequenceshashref->{$filehash->{'File'}};
+ # Saving all mergemodule sequence numbers. This is important for creating ddf files
+ $installer::globals::allmergemodulefilesequences{$filehash->{'Sequence'}} = 1;
+ }
+ else
+ {
+ # Important saved data: $installer::globals::lastsequence_before_merge.
+ # This mechanism keeps the correct order inside the new cabinet file.
+ $filehash->{'Sequence'} = $filehash->{'Sequence'} + $installer::globals::lastsequence_before_merge;
+ }
+
+ my $oldline = ${$filecontent}[$linenumber];
+ my $newline = get_new_line_for_file_table($filehash);
+ ${$filecontent}[$linenumber] = $newline;
+
+ $infoline = "Merge, replacing line:\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "Old: $oldline\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "New: $newline\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # Adding files to the files collector (but only once)
+ if (( $installer::globals::fix_number_of_cab_files ) && ( ! $installer::globals::mergefiles_added_into_collector ))
+ {
+ # If the number of cabinet files is kept constant,
+ # all files from the mergemodule cabinet files will
+ # be integrated into the last office cabinet file
+ # (installer::globals::lastcabfilename).
+ # Therefore the files must now be added to the filescollector,
+ # so that they will be integrated into the ddf files.
+
+ # Problem with very long filenames -> copying to shorter filenames
+ my $newfilename = "f" . $filehash->{'Sequence'};
+ my $completesource = $unpackdir . $installer::globals::separator . $filehash->{'File'};
+ my $completedest = $unpackdir . $installer::globals::separator . $newfilename;
+ installer::systemactions::copy_one_file($completesource, $completedest);
+
+ my $locallastcabfilename = $installer::globals::lastcabfilename;
+ if ( $locallastcabfilename =~ /^\s*\#/ ) { $locallastcabfilename =~ s/^\s*\#//; } # removing beginning hashes
+
+ # Create new file hash for file collector
+ my %newfile = ();
+ $newfile{'sequencenumber'} = $filehash->{'Sequence'};
+ $newfile{'assignedsequencenumber'} = $filehash->{'Sequence'};
+ $newfile{'cabinet'} = $locallastcabfilename;
+ $newfile{'sourcepath'} = $completedest;
+ $newfile{'componentname'} = $filehash->{'Component'};
+ $newfile{'uniquename'} = $filehash->{'File'};
+ $newfile{'Name'} = $filehash->{'File'};
+
+ # Saving in globals sequence hash
+ $installer::globals::uniquefilenamesequence{$filehash->{'File'}} = $filehash->{'Sequence'};
+
+ if ( ! -f $newfile{'sourcepath'} ) { installer::exiter::exit_program("ERROR: File \"$newfile{'sourcepath'}\" must exist!", "change_file_table"); }
+
+ # Collecting all new files. Attention: This files must be included into files collector in correct order!
+ $newfileshash{$filehash->{'Sequence'}} = \%newfile;
+ # push(@{$filesref}, \%newfile); -> this is not the correct order
+ }
+ }
+
+ # Now the files can be added to the files collector
+ # In the case of an update process, there can be new files, that have to be added after the merge module files.
+ # Warning: In multilingual installation sets, the files only have to be added once to the files collector!
+
+ if ( ! $installer::globals::mergefiles_added_into_collector )
+ {
+ foreach my $localsequence ( sort { $a <=> $b } keys %newfileshash ) { push(@{$filesref}, $newfileshash{$localsequence}); }
+ if ( $installer::globals::newfilesexist ) { $filesref = sort_files_collector_for_sequence($filesref); }
+ # $installer::globals::mergefiles_added_into_collector = 1; -> Not yet. Only if all mergemodules are merged for one language.
+ }
+
+ # Saving the idt file (for every language)
+ installer::files::save_file($idtfilename, $filecontent);
+
+ return $filesref;
+}
+
+#########################################################################
+# Reading the file "Director.idt". The Directory, that is defined in scp
+# has to be defined in this table.
+#########################################################################
+
+sub collect_directories
+{
+ my $idtfilename = "Director.idt";
+ my $filecontent = installer::files::read_file($idtfilename);
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ # Format: Directory Directory_Parent DefaultDir
+ if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ $installer::globals::merge_alldirectory_hash{$1} = 1;
+ }
+ else
+ {
+ my $linecount = $i + 1;
+ installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "collect_directories");
+ }
+ }
+}
+
+#########################################################################
+# Reading the file "Feature.idt". The Feature, that is defined in scp
+# has to be defined in this table.
+#########################################################################
+
+sub collect_feature
+{
+ my $idtfilename = "Feature.idt";
+ if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "collect_feature"); }
+ my $filecontent = installer::files::read_file($idtfilename);
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ # Format: Feature Feature_Parent Title Description Display Level Directory_ Attributes
+ if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ $installer::globals::merge_allfeature_hash{$1} = 1;
+ }
+ else
+ {
+ my $linecount = $i + 1;
+ installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "collect_feature");
+ }
+ }
+}
+
+#########################################################################
+# In the featurecomponent table, the new connections have to be added.
+#########################################################################
+
+sub change_featurecomponent_table
+{
+ my ($mergemodulehash, $workdir) = @_;
+
+ my $infoline = "Changing content of table \"FeatureComponents\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $idtfilename = "FeatureC.idt";
+ if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_featurecomponent_table"); }
+
+ my $filecontent = installer::files::read_file($idtfilename);
+
+ # Simply adding for each new component one line. The Feature has to be defined in scp project.
+ my $feature = $mergemodulehash->{'feature'};
+
+ if ( ! $installer::globals::mergefeaturecollected )
+ {
+ collect_feature(); # putting content into hash %installer::globals::merge_allfeature_hash
+ $installer::globals::mergefeaturecollected = 1;
+ }
+
+ if ( ! exists($installer::globals::merge_allfeature_hash{$feature}) )
+ {
+ installer::exiter::exit_program("ERROR: Unknown feature defined in scp: \"$feature\" . Not defined in table \"Feature\" !", "change_featurecomponent_table");
+ }
+
+ my $component;
+ foreach $component ( keys %{$mergemodulehash->{'componentnames'}} )
+ {
+ my $line = "$feature\t$component\n";
+ push(@{$filecontent}, $line);
+ $infoline = "Adding line: $line\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ # saving file
+ installer::files::save_file($idtfilename, $filecontent);
+}
+
+###############################################################################
+# In the components table, the conditions or attributes of merge modules should be updated
+###############################################################################
+
+sub change_component_table
+{
+ my ($mergemodulehash, $workdir) = @_;
+
+ my $infoline = "Changing content of table \"Component\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $idtfilename = "Componen.idt";
+ if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_component_table"); }
+
+ my $filecontent = installer::files::read_file($idtfilename);
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ my $component;
+ foreach $component ( keys %{$mergemodulehash->{'componentnames'}} )
+ {
+ if ( my ( $comp_, $compid_, $dir_, $attr_, $cond_, $keyp_ ) = ${$filecontent}[$i] =~ /^\s*($component)\t(.*?)\t(.+?)\t(.+?)\t(.*?)\t(.*?)\s*$/)
+ {
+ my $newattr_ = ( $attr_ =~ /^\s*0x/ ) ? hex($attr_) : $attr_;
+ if ( $mergemodulehash->{'attributes_add'} )
+ {
+ $infoline = "Adding attribute(s) ($mergemodulehash->{'attributes_add'}) from scp2 to component $comp_\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ if ( $mergemodulehash->{'attributes_add'} =~ /^\s*0x/ )
+ {
+ $newattr_ = $newattr_ | hex($mergemodulehash->{'attributes_add'});
+ }
+ else
+ {
+ $newattr_ = $newattr_ | $mergemodulehash->{'attributes_add'};
+ }
+ $infoline = "Old attribute(s): $attr_\nNew attribute(s): $newattr_\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ my $newcond_ = $cond_;
+ if ( $mergemodulehash->{'componentcondition'} )
+ {
+ $infoline = "Adding condition ($mergemodulehash->{'componentcondition'}) from scp2 to component $comp_\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ if ($cond_)
+ {
+ $newcond_ = "($cond_) AND ($mergemodulehash->{'componentcondition'})";
+ }
+ else
+ {
+ $newcond_ = "$mergemodulehash->{'componentcondition'}";
+ }
+ $infoline = "Old condition: $cond_\nNew condition: $newcond_\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ ${$filecontent}[$i] = "$comp_\t$compid_\t$dir_\t$newattr_\t$newcond_\t$keyp_\n";
+ }
+ }
+ }
+
+ # saving file
+ installer::files::save_file($idtfilename, $filecontent);
+}
+
+#########################################################################
+# In the directory table, the directory parent has to be changed,
+# if it is not TARGETDIR.
+#########################################################################
+
+sub change_directory_table
+{
+ my ($mergemodulehash, $workdir) = @_;
+
+ # directory for MergeModule has to be defined in scp project
+ my $scpdirectory = $mergemodulehash->{'rootdir'};
+
+ if ( $scpdirectory ne "TARGETDIR" ) # TARGETDIR works fine, when using msidb.exe
+ {
+ my $infoline = "Changing content of table \"Directory\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $idtfilename = "Director.idt";
+ if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_directory_table"); }
+
+ my $filecontent = installer::files::read_file($idtfilename);
+
+ if ( ! $installer::globals::mergedirectoriescollected )
+ {
+ collect_directories(); # putting content into %installer::globals::merge_alldirectory_hash, only first column!
+ $installer::globals::mergedirectoriescollected = 1;
+ }
+
+ if ( ! exists($installer::globals::merge_alldirectory_hash{$scpdirectory}) )
+ {
+ installer::exiter::exit_program("ERROR: Unknown directory defined in scp: \"$scpdirectory\" . Not defined in table \"Directory\" !", "change_directory_table");
+ }
+
+ # If the definition in scp is okay, now the complete content of "Director.idt" can be analyzed
+ my $merge_directorytablehashref = analyze_directorytable_file($filecontent, $idtfilename);
+
+ my $directory;
+ foreach $directory (keys %{$mergemodulehash->{'mergedirectories'}} )
+ {
+ if ( ! exists($merge_directorytablehashref->{$directory}) ) { installer::exiter::exit_program("ERROR: Could not find directory \"$directory\" in \"$idtfilename\" !", "change_directory_table"); }
+ my $dirhash = $merge_directorytablehashref->{$directory};
+ my $linenumber = $dirhash->{'linenumber'};
+
+ # <- this line has to be changed concerning "Directory_Parent",
+ # if the current value is "TARGETDIR", which is the default value from msidb.exe
+
+ if ( $dirhash->{'Directory_Parent'} eq "TARGETDIR" )
+ {
+ $dirhash->{'Directory_Parent'} = $scpdirectory;
+
+ my $oldline = ${$filecontent}[$linenumber];
+ my $newline = get_new_line_for_directory_table($dirhash);
+ ${$filecontent}[$linenumber] = $newline;
+
+ $infoline = "Merge, replacing line:\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "Old: $oldline\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "New: $newline\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ # saving file
+ installer::files::save_file($idtfilename, $filecontent);
+ }
+}
+
+#########################################################################
+# In the msiassembly table, the feature has to be changed.
+#########################################################################
+
+sub change_msiassembly_table
+{
+ my ($mergemodulehash, $workdir) = @_;
+
+ my $infoline = "Changing content of table \"MsiAssembly\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $idtfilename = "MsiAssem.idt";
+ if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_msiassembly_table"); }
+
+ my $filecontent = installer::files::read_file($idtfilename);
+
+ # feature has to be defined in scp project
+ my $feature = $mergemodulehash->{'feature'};
+
+ if ( ! $installer::globals::mergefeaturecollected )
+ {
+ collect_feature(); # putting content into hash %installer::globals::merge_allfeature_hash
+ $installer::globals::mergefeaturecollected = 1;
+ }
+
+ if ( ! exists($installer::globals::merge_allfeature_hash{$feature}) )
+ {
+ installer::exiter::exit_program("ERROR: Unknown feature defined in scp: \"$feature\" . Not defined in table \"Feature\" !", "change_msiassembly_table");
+ }
+
+ my $merge_msiassemblytablehashref = analyze_msiassemblytable_file($filecontent, $idtfilename);
+
+ my $component;
+ foreach $component (keys %{$mergemodulehash->{'mergeassemblies'}} )
+ {
+ if ( ! exists($merge_msiassemblytablehashref->{$component}) ) { installer::exiter::exit_program("ERROR: Could not find component \"$component\" in \"$idtfilename\" !", "change_msiassembly_table"); }
+ my $assemblyhash = $merge_msiassemblytablehashref->{$component};
+ my $linenumber = $assemblyhash->{'linenumber'};
+
+ # <- this line has to be changed concerning "Feature"
+ $assemblyhash->{'Feature'} = $feature;
+
+ my $oldline = ${$filecontent}[$linenumber];
+ my $newline = get_new_line_for_msiassembly_table($assemblyhash);
+ ${$filecontent}[$linenumber] = $newline;
+
+ $infoline = "Merge, replacing line:\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "Old: $oldline\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "New: $newline\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ # saving file
+ installer::files::save_file($idtfilename, $filecontent);
+}
+
+#########################################################################
+# Creating file content hash
+#########################################################################
+
+sub make_executeidtcontent_hash
+{
+ my ($filecontent, $idtfilename) = @_;
+
+ my %newhash = ();
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ # Format for all sequence tables: Action Condition Sequence
+ if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my %onehash = ();
+ $onehash{'Action'} = $1;
+ $onehash{'Condition'} = $2;
+ $onehash{'Sequence'} = $3;
+ $newhash{$onehash{'Action'}} = \%onehash;
+ }
+ else
+ {
+ my $linecount = $i + 1;
+ installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "make_executeidtcontent_hash");
+ }
+ }
+
+ return \%newhash;
+}
+
+#########################################################################
+# Creating file content hash
+#########################################################################
+
+sub make_moduleexecuteidtcontent_hash
+{
+ my ($filecontent, $idtfilename) = @_;
+
+ my %newhash = ();
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ # Format for all module sequence tables: Action Sequence BaseAction After Condition
+ if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my %onehash = ();
+ $onehash{'Action'} = $1;
+ $onehash{'Sequence'} = $2;
+ $onehash{'BaseAction'} = $3;
+ $onehash{'After'} = $4;
+ $onehash{'Condition'} = $5;
+ $newhash{$onehash{'Action'}} = \%onehash;
+ }
+ else
+ {
+ my $linecount = $i + 1;
+ installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "make_executeidtcontent_hash");
+ }
+ }
+
+ return \%newhash;
+}
+
+#########################################################################
+# ExecuteSequence tables need to be merged with
+# ModuleExecuteSequence tables created by msidb.exe.
+#########################################################################
+
+sub change_executesequence_table
+{
+ my ($mergemodulehash, $workdir, $idtfilename, $moduleidtfilename) = @_;
+
+ my $infoline = "Changing content of table \"$idtfilename\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ( ! -f $idtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$idtfilename\" in \"$workdir\" !", "change_executesequence_table"); }
+ if ( ! -f $moduleidtfilename ) { installer::exiter::exit_program("ERROR: Could not find file \"$moduleidtfilename\" in \"$workdir\" !", "change_executesequence_table"); }
+
+ # Reading file content
+ my $idtfilecontent = installer::files::read_file($idtfilename);
+ my $moduleidtfilecontent = installer::files::read_file($moduleidtfilename);
+
+ # Converting to hash
+ my $idtcontenthash = make_executeidtcontent_hash($idtfilecontent, $idtfilename);
+ my $moduleidtcontenthash = make_moduleexecuteidtcontent_hash($moduleidtfilecontent, $moduleidtfilename);
+
+ # Merging
+ foreach my $action ( keys %{$moduleidtcontenthash} )
+ {
+ if ( exists($idtcontenthash->{$action}) ) { next; } # Action already exists, can be ignored
+
+ if (( $idtfilename eq "InstallU.idt" ) && ( ! ( $action =~ /^\s*WindowsFolder\./ ))) { next; } # Only "WindowsFolder.*" CustomActions for UI Sequence table
+
+ my $actionhashref = $moduleidtcontenthash->{$action};
+ if ( $actionhashref->{'Sequence'} ne "" )
+ {
+ # Format for all sequence tables: Action Condition Sequence
+ my $newline = $actionhashref->{'Action'} . "\t" . $actionhashref->{'Condition'} . "\t" . $actionhashref->{'Sequence'} . "\n";
+ # Adding to table
+ push(@{$idtfilecontent}, $newline);
+ # Also adding to hash
+ my %idttablehash = ();
+ $idttablehash{'Action'} = $actionhashref->{'Action'};
+ $idttablehash{'Condition'} = $actionhashref->{'Condition'};
+ $idttablehash{'Sequence'} = $actionhashref->{'Sequence'};
+ $idtcontenthash->{$action} = \%idttablehash;
+
+ }
+ else # no sequence defined, using syntax "BaseAction" and "After"
+ {
+ my $baseactionname = $actionhashref->{'BaseAction'};
+ # If this baseactionname is not defined in execute idt file, it is not possible to merge
+ if ( ! exists($idtcontenthash->{$baseactionname}) ) { installer::exiter::exit_program("ERROR: Merge problem: Could not find action \"$baseactionname\" in file \"$idtfilename\" !", "change_executesequence_table"); }
+
+ my $baseaction = $idtcontenthash->{$baseactionname};
+ my $sequencenumber = $baseaction->{'Sequence'};
+ if ( $actionhashref->{'After'} == 1 ) { $sequencenumber = $sequencenumber + 1; }
+ else { $sequencenumber = $sequencenumber - 1; }
+
+ # Format for all sequence tables: Action Condition Sequence
+ my $newline = $actionhashref->{'Action'} . "\t" . $actionhashref->{'Condition'} . "\t" . $sequencenumber . "\n";
+ # Adding to table
+ push(@{$idtfilecontent}, $newline);
+ # Also adding to hash
+ my %idttablehash = ();
+ $idttablehash{'Action'} = $actionhashref->{'Action'};
+ $idttablehash{'Condition'} = $actionhashref->{'Condition'};
+ $idttablehash{'Sequence'} = $sequencenumber;
+ $idtcontenthash->{$action} = \%idttablehash;
+ }
+ }
+
+ # saving file
+ installer::files::save_file($idtfilename, $idtfilecontent);
+}
+
+
+1;
diff --git a/solenv/bin/modules/installer/windows/msiglobal.pm b/solenv/bin/modules/installer/windows/msiglobal.pm
new file mode 100644
index 000000000..f830c6eb0
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/msiglobal.pm
@@ -0,0 +1,1684 @@
+#
+# 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 .
+#
+
+package installer::windows::msiglobal;
+
+use Cwd;
+use Digest::MD5;
+use installer::converter;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::remover;
+use installer::scriptitems;
+use installer::systemactions;
+use installer::worker;
+use installer::windows::idtglobal;
+use installer::windows::language;
+
+###########################################################################
+# Generating the header of the ddf file.
+# The usage of ddf files is needed, because makecab.exe can only include
+# one sourcefile into a cab file
+###########################################################################
+
+sub write_ddf_file_header
+{
+ my ($ddffileref, $cabinetfile, $installdir) = @_;
+
+ my $oneline;
+
+ $oneline = ".Set CabinetName1=" . $cabinetfile . "\n";
+ push(@{$ddffileref} ,$oneline);
+ $oneline = ".Set ReservePerCabinetSize=128\n"; # This reserves space for a digital signature.
+ push(@{$ddffileref} ,$oneline);
+ $oneline = ".Set MaxDiskSize=2147483648\n"; # This allows the .cab file to get a size of 2 GB.
+ push(@{$ddffileref} ,$oneline);
+ $oneline = ".Set CompressionType=LZX\n";
+ push(@{$ddffileref} ,$oneline);
+ $oneline = ".Set Compress=ON\n";
+ push(@{$ddffileref} ,$oneline);
+# The window size for LZX compression
+# CompressionMemory=15 | 16 | ... | 21
+# Reference: http://msdn.microsoft.com/en-us/library/bb417343.aspx
+ $oneline = ".Set CompressionMemory=$installer::globals::cabfilecompressionlevel\n";
+ push(@{$ddffileref} ,$oneline);
+ $oneline = ".Set Cabinet=ON\n";
+ push(@{$ddffileref} ,$oneline);
+ $oneline = ".Set DiskDirectoryTemplate=" . $installdir . "\n";
+ push(@{$ddffileref} ,$oneline);
+}
+
+##########################################################################
+# Lines in ddf files must not contain more than 256 characters
+##########################################################################
+
+sub check_ddf_file
+{
+ my ( $ddffile, $ddffilename ) = @_;
+
+ my $maxlength = 0;
+ my $maxline = 0;
+ my $linelength = 0;
+ my $linenumber = 0;
+
+ for ( my $i = 0; $i <= $#{$ddffile}; $i++ )
+ {
+ my $oneline = ${$ddffile}[$i];
+
+ $linelength = length($oneline);
+ $linenumber = $i + 1;
+
+ if ( $linelength > 256 )
+ {
+ installer::exiter::exit_program("ERROR \"$ddffilename\" line $linenumber: Lines in ddf files must not contain more than 256 characters!", "check_ddf_file");
+ }
+
+ if ( $linelength > $maxlength )
+ {
+ $maxlength = $linelength;
+ $maxline = $linenumber;
+ }
+ }
+
+ my $infoline = "Check of ddf file \"$ddffilename\": Maximum length \"$maxlength\" in line \"$maxline\" (allowed line length: 256 characters)\n";
+ push(@installer::globals::logfileinfo, $infoline);
+}
+
+##########################################################################
+# Lines in ddf files must not be longer than 256 characters.
+# Therefore it can be useful to use relative paths. Then it is
+# necessary to change into temp directory before calling
+# makecab.exe.
+##########################################################################
+
+sub make_relative_ddf_path
+{
+ my ( $sourcepath ) = @_;
+
+ my $windowstemppath = $installer::globals::temppath;
+
+ if ( $^O =~ /cygwin/i )
+ {
+ $windowstemppath = $installer::globals::cyg_temppath;
+ }
+
+ $sourcepath =~ s/\Q$windowstemppath\E//;
+ $sourcepath =~ s/^[\\\/]//;
+
+ return $sourcepath;
+}
+
+##########################################################################
+# Returning the order of the sequences in the files array.
+##########################################################################
+
+sub get_sequenceorder
+{
+ my ($filesref) = @_;
+
+ my %order = ();
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+ if ( ! $onefile->{'assignedsequencenumber'} ) { installer::exiter::exit_program("ERROR: No sequence number assigned to $onefile->{'gid'} ($onefile->{'uniquename'})!", "get_sequenceorder"); }
+ $order{$onefile->{'assignedsequencenumber'}} = $i;
+ }
+
+ return \%order;
+}
+
+##########################################################################
+# Generation the list, in which the source of the files is connected
+# with the cabinet destination file. Because more than one file needs
+# to be included into a cab file, this has to be done via ddf files.
+##########################################################################
+
+sub generate_cab_file_list
+{
+ my ($filesref, $installdir, $ddfdir, $allvariables) = @_;
+
+ my @cabfilelist = ();
+
+ installer::logger::include_header_into_logfile("Generating ddf files");
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: ddf file generation start");
+
+ if ( $^O =~ /cygwin/i ) { installer::worker::generate_cygwin_paths($filesref); }
+
+ if (( $installer::globals::fix_number_of_cab_files ) && ( $installer::globals::updatedatabase ))
+ {
+ my $sequenceorder = get_sequenceorder($filesref);
+
+ my $counter = 1;
+
+ while ( ( exists($sequenceorder->{$counter}) ) || ( exists($installer::globals::allmergemodulefilesequences{$counter}) ) ) # Taking care of files from merge modules
+ {
+# if ( exists($installer::globals::allmergemodulefilesequences{$counter}) )
+# {
+# # Skipping this sequence, it is not included in $filesref, because it is assigned to a file from a merge module.\n";
+# $counter++;
+# next;
+# }
+
+ my $onefile = ${$filesref}[$sequenceorder->{$counter}];
+ $counter++;
+
+ my $cabinetfile = $onefile->{'cabinet'};
+ my $sourcepath = $onefile->{'sourcepath'};
+ if ( $^O =~ /cygwin/i ) { $sourcepath = $onefile->{'cyg_sourcepath'}; }
+ my $uniquename = $onefile->{'uniquename'};
+
+ my $styles = "";
+ my $doinclude = 1;
+ if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; };
+ if ( $styles =~ /\bDONT_PACK\b/ ) { $doinclude = 0; }
+
+ # to avoid lines with more than 256 characters, it can be useful to use relative paths
+ $sourcepath = make_relative_ddf_path($sourcepath);
+
+ my @ddffile = ();
+
+ write_ddf_file_header(\@ddffile, $cabinetfile, $installdir);
+
+ my $ddfline = "\"" . $sourcepath . "\" \"" . $uniquename . "\"\n";
+ if ( $doinclude ) { push(@ddffile, $ddfline); }
+
+ my $nextfile = "";
+ if ( ${$filesref}[$sequenceorder->{$counter}] ) { $nextfile = ${$filesref}[$sequenceorder->{$counter}]; }
+
+ my $nextcabinetfile = "";
+
+ if ( $nextfile->{'cabinet'} ) { $nextcabinetfile = $nextfile->{'cabinet'}; }
+
+ while ( $nextcabinetfile eq $cabinetfile )
+ {
+ $sourcepath = $nextfile->{'sourcepath'};
+ if ( $^O =~ /cygwin/i ) { $sourcepath = $nextfile->{'cyg_sourcepath'}; }
+ # to avoid lines with more than 256 characters, it can be useful to use relative paths
+ $sourcepath = make_relative_ddf_path($sourcepath);
+ $uniquename = $nextfile->{'uniquename'};
+ my $localdoinclude = 1;
+ my $nextfilestyles = "";
+ if ( $nextfile->{'Styles'} ) { $nextfilestyles = $nextfile->{'Styles'}; }
+ if ( $nextfilestyles =~ /\bDONT_PACK\b/ ) { $localdoinclude = 0; }
+ $ddfline = "\"" . $sourcepath . "\" \"" . $uniquename . "\"\n";
+ if ( $localdoinclude ) { push(@ddffile, $ddfline); }
+ $counter++;
+ $nextfile = "";
+ $nextcabinetfile = "_lastfile_";
+ if (( exists($sequenceorder->{$counter}) ) && ( ${$filesref}[$sequenceorder->{$counter}] ))
+ {
+ $nextfile = ${$filesref}[$sequenceorder->{$counter}];
+ $nextcabinetfile = $nextfile->{'cabinet'};
+ }
+ }
+
+ # creating the DDF file
+
+ my $ddffilename = $cabinetfile;
+ $ddffilename =~ s/.cab/.ddf/;
+ $ddfdir =~ s/\Q$installer::globals::separator\E\s*$//;
+ $ddffilename = $ddfdir . $installer::globals::separator . $ddffilename;
+
+ installer::files::save_file($ddffilename ,\@ddffile);
+ my $infoline = "Created ddf file: $ddffilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ # lines in ddf files must not be longer than 256 characters
+ check_ddf_file(\@ddffile, $ddffilename);
+
+ # Writing the makecab system call
+
+ my $oneline = "makecab.exe /V3 /F " . $ddffilename . " 2\>\&1 |" . "\n";
+
+ push(@cabfilelist, $oneline);
+
+ # collecting all ddf files
+ push(@installer::globals::allddffiles, $ddffilename);
+ }
+ }
+ elsif ( $installer::globals::fix_number_of_cab_files )
+ {
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+ my $cabinetfile = $onefile->{'cabinet'};
+ my $sourcepath = $onefile->{'sourcepath'};
+ if ( $^O =~ /cygwin/i ) { $sourcepath = $onefile->{'cyg_sourcepath'}; }
+ my $uniquename = $onefile->{'uniquename'};
+
+ my $styles = "";
+ my $doinclude = 1;
+ if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; };
+ if ( $styles =~ /\bDONT_PACK\b/ ) { $doinclude = 0; }
+
+
+ # to avoid lines with more than 256 characters, it can be useful to use relative paths
+ $sourcepath = make_relative_ddf_path($sourcepath);
+
+ # all files with the same cabinetfile are directly behind each other in the files collector
+
+ my @ddffile = ();
+
+ write_ddf_file_header(\@ddffile, $cabinetfile, $installdir);
+
+ my $ddfline = "\"" . $sourcepath . "\" \"" . $uniquename . "\"\n";
+ if ( $doinclude ) { push(@ddffile, $ddfline); }
+
+ my $nextfile = ${$filesref}[$i+1];
+ my $nextcabinetfile = "";
+
+ if ( $nextfile->{'cabinet'} ) { $nextcabinetfile = $nextfile->{'cabinet'}; }
+
+ while ( $nextcabinetfile eq $cabinetfile )
+ {
+ $sourcepath = $nextfile->{'sourcepath'};
+ if ( $^O =~ /cygwin/i ) { $sourcepath = $nextfile->{'cyg_sourcepath'}; }
+ # to avoid lines with more than 256 characters, it can be useful to use relative paths
+ $sourcepath = make_relative_ddf_path($sourcepath);
+ $uniquename = $nextfile->{'uniquename'};
+ my $localdoinclude = 1;
+ my $nextfilestyles = "";
+ if ( $nextfile->{'Styles'} ) { $nextfilestyles = $nextfile->{'Styles'}; }
+ if ( $nextfilestyles =~ /\bDONT_PACK\b/ ) { $localdoinclude = 0; }
+ $ddfline = "\"" . $sourcepath . "\" \"" . $uniquename . "\"\n";
+ if ( $localdoinclude ) { push(@ddffile, $ddfline); }
+ $i++; # increasing the counter!
+ $nextfile = ${$filesref}[$i+1];
+ if ( $nextfile ) { $nextcabinetfile = $nextfile->{'cabinet'}; }
+ else { $nextcabinetfile = "_lastfile_"; }
+ }
+
+ # creating the DDF file
+
+ my $ddffilename = $cabinetfile;
+ $ddffilename =~ s/.cab/.ddf/;
+ $ddfdir =~ s/\Q$installer::globals::separator\E\s*$//;
+ $ddffilename = $ddfdir . $installer::globals::separator . $ddffilename;
+
+ installer::files::save_file($ddffilename ,\@ddffile);
+ my $infoline = "Created ddf file: $ddffilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ # lines in ddf files must not be longer than 256 characters
+ check_ddf_file(\@ddffile, $ddffilename);
+
+ # Writing the makecab system call
+
+ my $oneline = "makecab.exe /V3 /F " . $ddffilename . " 2\>\&1 |" . "\n";
+
+ push(@cabfilelist, $oneline);
+
+ # collecting all ddf files
+ push(@installer::globals::allddffiles, $ddffilename);
+ }
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: No cab file specification in globals.pm !", "generate_cab_file_list");
+ }
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: ddf file generation end");
+
+ return \@cabfilelist; # contains all system calls for packaging process
+}
+
+########################################################################
+# For update and patch reasons the pack order needs to be saved.
+# The pack order is saved in the ddf files; the names and locations
+# of the ddf files are saved in @installer::globals::allddffiles.
+# The outputfile "packorder.txt" can be saved in
+# $installer::globals::infodirectory .
+########################################################################
+
+sub save_packorder
+{
+ installer::logger::include_header_into_logfile("Saving pack order");
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: saving pack order start");
+
+ my $packorderfilename = "packorder.txt";
+ $packorderfilename = $installer::globals::infodirectory . $installer::globals::separator . $packorderfilename;
+
+ my @packorder = ();
+
+ my $headerline = "\# Syntax\: Filetable_Sequence Cabinetfilename Physical_FileName Unique_FileName\n\n";
+ push(@packorder, $headerline);
+
+ for ( my $i = 0; $i <= $#installer::globals::allddffiles; $i++ )
+ {
+ my $ddffilename = $installer::globals::allddffiles[$i];
+ my $ddffile = installer::files::read_file($ddffilename);
+ my $cabinetfile = "";
+
+ for ( my $j = 0; $j <= $#{$ddffile}; $j++ )
+ {
+ my $oneline = ${$ddffile}[$j];
+
+ # Getting the Cabinet file name
+
+ if ( $oneline =~ /^\s*\.Set\s+CabinetName.*\=(.*?)\s*$/ ) { $cabinetfile = $1; }
+ if ( $oneline =~ /^\s*\.Set\s+/ ) { next; }
+
+ if ( $oneline =~ /^\s*\"(.*?)\"\s+\"(.*?)\"\s*$/ )
+ {
+ my $sourcefile = $1;
+ my $uniquefilename = $2;
+
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$sourcefile);
+
+ # Using the hash created in create_files_table for performance reasons to get the sequence number
+ my $filesequence = "";
+ if ( exists($installer::globals::uniquefilenamesequence{$uniquefilename}) ) { $filesequence = $installer::globals::uniquefilenamesequence{$uniquefilename}; }
+ else { installer::exiter::exit_program("ERROR: No sequence number value for $uniquefilename !", "save_packorder"); }
+
+ my $line = $filesequence . "\t" . $cabinetfile . "\t" . $sourcefile . "\t" . $uniquefilename . "\n";
+ push(@packorder, $line);
+ }
+ }
+ }
+
+ installer::files::save_file($packorderfilename ,\@packorder);
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: saving pack order end");
+}
+
+#################################################################
+# Returning the name of the msi database
+#################################################################
+
+sub get_msidatabasename
+{
+ my ($allvariableshashref, $language) = @_;
+
+ my $databasename = $allvariableshashref->{'PRODUCTNAME'} . $allvariableshashref->{'PRODUCTVERSION'};
+ $databasename = lc($databasename);
+ $databasename =~ s/\.//g;
+ $databasename =~ s/\-//g;
+ $databasename =~ s/\s//g;
+
+ # possibility to overwrite the name with variable DATABASENAME
+ if ( $allvariableshashref->{'DATABASENAME'} )
+ {
+ $databasename = $allvariableshashref->{'DATABASENAME'};
+ }
+
+ if ( $language )
+ {
+ if (!($language eq ""))
+ {
+ $databasename .= "_$language";
+ }
+ }
+
+ $databasename .= ".msi";
+
+ return $databasename;
+}
+
+#################################################################
+# Creating the msi database
+# This works only on Windows
+#################################################################
+
+sub create_msi_database
+{
+ my ($idtdirbase ,$msifilename) = @_;
+
+ # -f : path containing the idt files
+ # -d : msi database, including path
+ # -c : create database
+ # -i : include the following tables ("*" includes all available tables)
+
+ my $msidb = "msidb.exe"; # Has to be in the path
+ my $extraslash = ""; # Has to be set for non-ActiveState perl
+
+ installer::logger::include_header_into_logfile("Creating msi database");
+
+ $idtdirbase = installer::converter::make_path_conform($idtdirbase);
+
+ $msifilename = installer::converter::make_path_conform($msifilename);
+
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ $idtdirbase =~ s/\//\\\\/g;
+ $msifilename =~ s/\//\\\\/g;
+ $extraslash = "\\";
+ }
+ if ( $^O =~ /linux/i ) {
+ $extraslash = "\\";
+ }
+ my $systemcall = $msidb . " -f " . $idtdirbase . " -d " . $msifilename . " -c " . "-i " . $extraslash . "*";
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $msidb!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed $msidb successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+#################################################################
+# Returning the msi version for the Summary Information Stream
+#################################################################
+
+sub get_msiversion_for_sis
+{
+ my $msiversion = "200";
+ return $msiversion;
+}
+
+#################################################################
+# Returning the word count for the Summary Information Stream
+#################################################################
+
+sub get_wordcount_for_sis
+{
+ my $wordcount = "0";
+ return $wordcount;
+}
+
+#################################################################
+# Returning the template for the Summary Information Stream
+#################################################################
+
+sub get_template_for_sis
+{
+ my ( $language, $allvariables ) = @_;
+
+ my $windowslanguage = installer::windows::language::get_windows_language($language);
+
+ my $architecture = "Intel";
+
+ if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 )) { $architecture = "x64"; }
+
+ my $value = "\"" . $architecture . ";" . $windowslanguage; # adding the Windows language
+
+ $value = $value . "\""; # adding ending '"'
+
+ return $value ;
+}
+
+#################################################################
+# Returning the PackageCode for the Summary Information Stream
+#################################################################
+
+sub get_packagecode_for_sis
+{
+ # always generating a new package code for each package
+
+ my $guidref = get_guid_list(1, 1); # only one GUID shall be generated
+
+ ${$guidref}[0] =~ s/\s*$//; # removing ending spaces
+
+ my $guid = "\{" . ${$guidref}[0] . "\}";
+
+ my $infoline = "PackageCode: $guid\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ return $guid;
+}
+
+#################################################################
+# Returning the author for the Summary Information Stream
+#################################################################
+
+sub get_author_for_sis
+{
+ my $author = $installer::globals::longmanufacturer;
+
+ $author = "\"" . $author . "\"";
+
+ return $author;
+}
+
+#################################################################
+# Returning the subject for the Summary Information Stream
+#################################################################
+
+sub get_subject_for_sis
+{
+ my ( $allvariableshashref ) = @_;
+
+ my $subject = $allvariableshashref->{'PRODUCTNAME'} . " " . $allvariableshashref->{'PRODUCTVERSION'};
+
+ $subject = "\"" . $subject . "\"";
+
+ return $subject;
+}
+
+######################################################################
+# Returning the security for the Summary Information Stream
+######################################################################
+
+sub get_security_for_sis
+{
+ my $security = "0";
+ return $security;
+}
+
+#################################################################
+# Writing the Summary information stream into the msi database
+# This works only on Windows
+#################################################################
+
+sub write_summary_into_msi_database
+{
+ my ($msifilename, $language, $languagefile, $allvariableshashref) = @_;
+
+ # -g : required msi version
+ # -c : codepage
+ # -p : template
+
+ installer::logger::include_header_into_logfile("Writing summary information stream");
+
+ my $msiinfo = "msiinfo.exe"; # Has to be in the path
+
+ my $msiversion = get_msiversion_for_sis();
+ my $codepage = 0; # PID_CODEPAGE summary property in a signed short, therefore it is impossible to set 65001 here.
+ my $template = get_template_for_sis($language, $allvariableshashref);
+ my $guid = get_packagecode_for_sis();
+ my $title = "\"Installation database\"";
+ my $author = get_author_for_sis();
+ my $subject = get_subject_for_sis($allvariableshashref);
+ my $comment = "\"" . $allvariableshashref->{'PRODUCTNAME'} ."\"";
+ my $keywords = "\"Install,MSI\"";
+ my $appname = "\"Windows Installer\"";
+ my $security = get_security_for_sis();
+ my $wordcount = get_wordcount_for_sis();
+
+ $msifilename = installer::converter::make_path_conform($msifilename);
+
+ my $systemcall = $msiinfo . " " . $msifilename . " -g " . $msiversion . " -c " . $codepage
+ . " -p " . $template . " -v " . $guid . " -t " . $title . " -a " . $author
+ . " -j " . $subject . " -o " . $comment . " -k " . $keywords . " -n " . $appname
+ . " -u " . $security . " -w " . $wordcount;
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall (return $returnvalue)\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed $msiinfo successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+#########################################################################
+# For more than one language in the installation set:
+# Use one database and create Transformations for all other languages
+#########################################################################
+
+sub create_transforms
+{
+ my ($languagesarray, $defaultlanguage, $installdir, $allvariableshashref) = @_;
+
+ installer::logger::include_header_into_logfile("Creating Transforms");
+
+ my $cscript = "cscript.exe"; # Has to be in the path
+ my $msitran = "msitran.exe"; # Has to be in the path
+ my $msidb = "msidb.exe"; # Has to be in the path
+ my $wilangid = $ENV{WINDOWS_SDK_WILANGID};
+
+ my $from = cwd();
+
+ my $templatevalue = "1033";
+
+ $installdir = installer::converter::make_path_conform($installdir);
+
+ # Syntax for creating a transformation
+ # msitran.exe -g <baseDB> <referenceDB> <transformfile> [<errorhandling>}
+
+ my $basedbname = get_msidatabasename($allvariableshashref, $defaultlanguage);
+ $basedbname = $installdir . $installer::globals::separator . $basedbname;
+
+ my $errorhandling = "f"; # Suppress "change codepage" error
+
+ # Iterating over all files
+
+ foreach ( @{$languagesarray} )
+ {
+ my $onelanguage = $_;
+
+ if ( $onelanguage eq $defaultlanguage ) { next; }
+
+ my $referencedbname = get_msidatabasename($allvariableshashref, $onelanguage);
+ $referencedbname = $installdir . $installer::globals::separator . $referencedbname;
+
+ my $windowslanguage = installer::windows::language::get_windows_language($onelanguage);
+ my $transformfile = $installdir . $installer::globals::separator . $windowslanguage;
+
+ my $systemcall = $msitran . " " . " -g " . $basedbname . " " . $referencedbname . " " . $transformfile . " " . $errorhandling;
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # Problem: msitran.exe in version 4.0 always returns "1", even if no failure occurred.
+ # Therefore it has to be checked, if this is version 4.0. If yes, if the mst file
+ # exists and if it is larger than 0 bytes. If this is true, then no error occurred.
+ # File Version of msitran.exe: 4.0.6000.16384 has checksum: "b66190a70145a57773ec769e16777b29".
+ # Same for msitran.exe from wntmsci12: "aa25d3445b94ffde8ef0c1efb77a56b8"
+
+ if ($returnvalue)
+ {
+ $infoline = "WARNING: Returnvalue of $msitran is not 0. Checking version of $msitran!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ open(FILE, "<$installer::globals::msitranpath") or die "ERROR: Can't open $installer::globals::msitranpath for creating file hash";
+ binmode(FILE);
+ my $digest = Digest::MD5->new->addfile(*FILE)->hexdigest;
+ close(FILE);
+
+ my @problemchecksums = ("b66190a70145a57773ec769e16777b29", "aa25d3445b94ffde8ef0c1efb77a56b8", "748206e54fc93efe6a1aaa9d491f3ad1");
+ my $isproblemchecksum = 0;
+
+ foreach my $problemchecksum ( @problemchecksums )
+ {
+ $infoline = "Checksum of problematic MsiTran.exe: $problemchecksum\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "Checksum of used MsiTran.exe: $digest\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ if ( $digest eq $problemchecksum ) { $isproblemchecksum = 1; }
+ }
+
+ if ( $isproblemchecksum )
+ {
+ # Check existence of mst
+ if ( -f $transformfile )
+ {
+ $infoline = "File $transformfile exists.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ my $filesize = ( -s $transformfile );
+ $infoline = "Size of $transformfile: $filesize\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ( $filesize > 0 )
+ {
+ $infoline = "Info: Returnvalue $returnvalue of $msitran is no problem :-) .\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $returnvalue = 0; # reset the error
+ }
+ else
+ {
+ $infoline = "Filesize indicates that an error occurred.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ else
+ {
+ $infoline = "File $transformfile does not exist -> An error occurred.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ else
+ {
+ $infoline = "This is not a problematic version of msitran.exe. Therefore the error is not caused by problematic msitran.exe.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $msitran!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed $msitran successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ # The reference database can be deleted
+
+ my $result = unlink($referencedbname);
+ # $result contains the number of deleted files
+
+ if ( $result == 0 )
+ {
+ $infoline = "ERROR while processing language $onelanguage: Could not remove file $referencedbname!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program($infoline, "create_transforms");
+ }
+
+ chdir($installdir);
+ $systemcall = $msidb . " " . " -d " . $basedbname . " -r " . $windowslanguage;
+ system($systemcall);
+ # fdo#46181 - zh-HK and zh-MO should have fallen back to zh-TW not to zh-CN
+ # we need to hack zh-HK and zh-MO LCIDs directly into the MSI
+ if($windowslanguage eq '1028')
+ {
+ rename 1028,3076;
+ $systemcall = $msidb . " " . " -d " . $basedbname . " -r " . 3076;
+ system($systemcall);
+ rename 3076,5124;
+ $systemcall = $msidb . " " . " -d " . $basedbname . " -r " . 5124;
+ system($systemcall);
+ $templatevalue = $templatevalue . "," . 3076 . "," . 5124;
+ rename 5124,1028;
+ }
+ chdir($from);
+ unlink($transformfile);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ( $windowslanguage ne '1033')
+ {
+ $templatevalue = $templatevalue . "," . $windowslanguage;
+ }
+ }
+
+ $systemcall = "TEMP=$ENV{'TMPDIR'} $cscript \"$wilangid\" $basedbname Package $templatevalue";
+
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: $returnvalue from $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed WiLangId.vbs successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+#########################################################################
+# The default language msi database does not need to contain
+# the language in the database name. Therefore the file
+# is renamed. Example: "openofficeorg20_01.msi" to "openofficeorg20.msi"
+#########################################################################
+
+sub rename_msi_database_in_installset
+{
+ my ($defaultlanguage, $installdir, $allvariableshashref) = @_;
+
+ installer::logger::include_header_into_logfile("Renaming msi database");
+
+ my $olddatabasename = get_msidatabasename($allvariableshashref, $defaultlanguage);
+ $olddatabasename = $installdir . $installer::globals::separator . $olddatabasename;
+
+ my $newdatabasename = get_msidatabasename($allvariableshashref);
+
+ $installer::globals::shortmsidatabasename = $newdatabasename;
+
+ $newdatabasename = $installdir . $installer::globals::separator . $newdatabasename;
+
+ installer::systemactions::rename_one_file($olddatabasename, $newdatabasename);
+
+ $installer::globals::msidatabasename = $newdatabasename;
+}
+
+#################################################################
+# Copying MergeModules for the Windows installer into the
+# installation set. The list of MergeModules is located
+# in %installer::globals::copy_msm_files
+#################################################################
+
+sub copy_merge_modules_into_installset
+{
+ my ($installdir) = @_;
+
+ installer::logger::include_header_into_logfile("Copying Merge files into installation set");
+
+ my $cabfile;
+ foreach $cabfile ( keys %installer::globals::copy_msm_files )
+ {
+ my $sourcefile = $installer::globals::copy_msm_files{$cabfile};
+ my $destfile = $installdir . $installer::globals::separator . $cabfile;
+
+ installer::systemactions::copy_one_file($sourcefile, $destfile);
+ }
+}
+
+#################################################################
+# Getting a list of GUID using uuidgen.exe.
+# This works only on Windows
+#################################################################
+
+sub get_guid_list
+{
+ my ($number, $log) = @_;
+
+ if ( $log ) { installer::logger::include_header_into_logfile("Generating $number GUID"); }
+
+ my $uuidgen = $ENV{'UUIDGEN'}; # Has to be in the path
+
+ # "-c" for uppercase output
+
+ my $systemcall = "$uuidgen -n$number |";
+ open (UUIDGEN, "$systemcall" ) or die("uuidgen is missing.");
+ my @uuidlist = <UUIDGEN>;
+ close (UUIDGEN);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ if ( $log ) { push( @installer::globals::logfileinfo, $infoline); }
+
+ my $comparenumber = $#uuidlist + 1;
+
+ if ( $comparenumber == $number )
+ {
+ $infoline = "Success: Executed $uuidgen successfully!\n";
+ if ( $log ) { push( @installer::globals::logfileinfo, $infoline); }
+ }
+ else
+ {
+ $infoline = "ERROR: Could not execute $uuidgen successfully!\n";
+ if ( $log ) { push( @installer::globals::logfileinfo, $infoline); }
+ }
+
+ # uppercase, no longer "-c", because this is only supported in uuidgen.exe v.1.01
+ for ( my $i = 0; $i <= $#uuidlist; $i++ ) { $uuidlist[$i] = uc($uuidlist[$i]); }
+
+ return \@uuidlist;
+}
+
+#################################################################
+# Calculating a GUID with a string using md5.
+#################################################################
+
+sub calculate_guid
+{
+ my ( $string ) = @_;
+
+ my $guid = "";
+
+ my $md5 = Digest::MD5->new;
+ $md5->add($string);
+ my $digest = $md5->hexdigest;
+ $digest = uc($digest);
+
+ my ($first, $second, $third, $fourth, $fifth) = unpack ('A8 A4 A4 A4 A12', $digest);
+ $guid = "$first-$second-$third-$fourth-$fifth";
+
+ return $guid;
+}
+
+#################################################################
+# Calculating a ID with a string using md5 (very fast).
+#################################################################
+
+sub calculate_id
+{
+ my ( $string, $length ) = @_;
+
+ my $id = "";
+
+ my $md5 = Digest::MD5->new;
+ $md5->add($string);
+ my $digest = lc($md5->hexdigest);
+ $id = substr($digest, 0, $length);
+
+ return $id;
+}
+
+#################################################################
+# Filling real component GUID into the component table.
+# This works only on Windows
+#################################################################
+
+sub set_uuid_into_component_table
+{
+ my ($idtdirbase, $allvariables) = @_;
+
+ my $componenttablename = $idtdirbase . $installer::globals::separator . "Componen.idt";
+
+ my $componenttable = installer::files::read_file($componenttablename);
+
+ # For update and patch reasons (small update) the GUID of an existing component must not change!
+ # The collection of component GUIDs is saved in the directory $installer::globals::idttemplatepath in the file "components.txt"
+
+ my $infoline = "";
+ my $counter = 0;
+
+ for ( my $i = 3; $i <= $#{$componenttable}; $i++ ) # ignoring the first three lines
+ {
+ my $oneline = ${$componenttable}[$i];
+ my $componentname = "";
+ if ( $oneline =~ /^\s*(\S+?)\t/ ) { $componentname = $1; }
+
+ my $uuid = "";
+
+ if ( exists($installer::globals::calculated_component_guids{$componentname}))
+ {
+ $uuid = $installer::globals::calculated_component_guids{$componentname};
+ }
+ else
+ {
+ # Calculating new GUID with the help of the component name.
+
+ if ( ! exists($allvariables->{'PRODUCTVERSION'}) ) { installer::exiter::exit_program("ERROR: Could not find variable \"PRODUCTVERSION\" (required value for GUID creation)!", "set_uuid_into_component_table"); }
+ my $sourcestring = $componentname . "_" . $allvariables->{'PRODUCTVERSION'};
+ $uuid = calculate_guid($sourcestring);
+ $counter++;
+
+ # checking, if there is a conflict with an already created guid
+ if ( exists($installer::globals::allcalculated_guids{$uuid}) ) { installer::exiter::exit_program("ERROR: \"$uuid\" was already created before!", "set_uuid_into_component_table"); }
+ $installer::globals::allcalculated_guids{$uuid} = 1;
+ $installer::globals::calculated_component_guids{$componentname} = $uuid;
+ }
+
+ ${$componenttable}[$i] =~ s/COMPONENTGUID/$uuid/;
+ }
+
+ installer::files::save_file($componenttablename, $componenttable);
+}
+
+#########################################################################
+# Adding final 64 properties into msi database, if required.
+# RegLocator : +16 in type column to search in 64 bit registry.
+# All conditions: "VersionNT" -> "VersionNT64" (several tables).
+# DrLocator: "SystemFolder" -> "System64Folder"
+# Already done: "+256" in Attributes column of table "Component".
+# Still following: Setting "x64" instead of "Intel" in Summary
+# Information Stream of msi database in "get_template_for_sis".
+#########################################################################
+
+sub prepare_64bit_database
+{
+ my ($basedir, $allvariables) = @_;
+
+ my $infoline = "";
+
+ if (( $allvariables->{'64BITPRODUCT'} ) && ( $allvariables->{'64BITPRODUCT'} == 1 ))
+ {
+ # 1. Beginning with table "RegLocat.idt". Adding "16" to the type.
+
+ my $reglocatfile = "";
+ my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt";
+
+ if ( -f $reglocatfilename )
+ {
+ my $saving_required = 0;
+ $reglocatfile = installer::files::read_file($reglocatfilename);
+
+ for ( my $i = 3; $i <= $#{$reglocatfile}; $i++ ) # ignoring the first three lines
+ {
+ my $oneline = ${$reglocatfile}[$i];
+
+ if ( $oneline =~ /^\s*\#/ ) { next; } # this is a comment line
+ if ( $oneline =~ /^\s*$/ ) { next; }
+
+ if ( $oneline =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(\d+)\s*$/ )
+ {
+ # Syntax: Signature_ Root Key Name Type
+ my $sig = $1;
+ my $root = $2;
+ my $key = $3;
+ my $name = $4;
+ my $type = $5;
+
+ $type = $type + 16;
+
+ my $newline = $sig . "\t" . $root . "\t" . $key . "\t" . $name . "\t" . $type . "\n";
+ ${$reglocatfile}[$i] = $newline;
+
+ $saving_required = 1;
+ }
+ }
+
+ if ( $saving_required )
+ {
+ # Saving the files
+ installer::files::save_file($reglocatfilename ,$reglocatfile);
+ $infoline = "Making idt file 64 bit conform: $reglocatfilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ # 2. Replacing all occurrences of "VersionNT" by "VersionNT64"
+
+ my @versionnt_files = ("Componen.idt", "InstallE.idt", "InstallU.idt", "LaunchCo.idt");
+
+ foreach my $onefile ( @versionnt_files )
+ {
+ my $fullfilename = $basedir . $installer::globals::separator . $onefile;
+
+ if ( -f $fullfilename )
+ {
+ my $saving_required = 0;
+ $filecontent = installer::files::read_file($fullfilename);
+
+ for ( my $i = 3; $i <= $#{$filecontent}; $i++ ) # ignoring the first three lines
+ {
+ my $oneline = ${$filecontent}[$i];
+
+ if ( $oneline =~ /\bVersionNT\b/ )
+ {
+ ${$filecontent}[$i] =~ s/\bVersionNT\b/VersionNT64/g;
+ $saving_required = 1;
+ }
+ }
+
+ if ( $saving_required )
+ {
+ # Saving the files
+ installer::files::save_file($fullfilename ,$filecontent);
+ $infoline = "Making idt file 64 bit conform: $fullfilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+
+ # 3. Replacing all occurrences of "SystemFolder" by "System64Folder" in "DrLocato.idt"
+
+ my $drlocatofilename = $basedir . $installer::globals::separator . "DrLocato.idt";
+ if ( -f $drlocatofilename )
+ {
+ my $saving_required = 0;
+ my $drlocatofile = installer::files::read_file($drlocatofilename);
+
+ for ( my $i = 3; $i <= $#{$drlocatofile}; $i++ ) # ignoring the first three lines
+ {
+ my $oneline = ${$drlocatofile}[$i];
+
+ if ( $oneline =~ /\bSystemFolder\b/ )
+ {
+ ${$drlocatofile}[$i] =~ s/\bSystemFolder\b/System64Folder/g;
+ $saving_required = 1;
+ }
+ }
+
+ if ( $saving_required )
+ {
+ # Saving the files
+ installer::files::save_file($drlocatofilename ,$drlocatofile);
+ $infoline = "Making idt file 64 bit conform: $drlocatofilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+
+}
+
+#################################################################
+# Include all cab files into the msi database.
+# This works only on Windows
+#################################################################
+
+sub include_cabs_into_msi
+{
+ my ($installdir) = @_;
+
+ installer::logger::include_header_into_logfile("Including cabs into msi database");
+
+ my $from = cwd();
+ my $to = $installdir;
+
+ chdir($to);
+
+ my $infoline = "Changing into directory: $to";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $msidb = "msidb.exe"; # Has to be in the path
+ my $extraslash = ""; # Has to be set for non-ActiveState perl
+
+ my $msifilename = $installer::globals::msidatabasename;
+
+ $msifilename = installer::converter::make_path_conform($msifilename);
+
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ $msifilename =~ s/\//\\\\/g;
+ $extraslash = "\\";
+
+ my $allcabfiles = installer::systemactions::find_file_with_file_extension("cab", $installdir);
+
+ for ( my $i = 0; $i <= $#{$allcabfiles}; $i++ )
+ {
+ my $systemcall = $msidb . " -d " . $msifilename . " -a " . ${$allcabfiles}[$i];
+
+ my $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ # deleting the cab file
+
+ unlink(${$allcabfiles}[$i]);
+
+ $infoline = "Deleted cab file: ${$allcabfiles}[$i]\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ $infoline = "Changing back into directory: $from";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ chdir($from);
+}
+
+#################################################################
+# Executing the created batch file to pack all files.
+# This works only on Windows
+#################################################################
+
+sub execute_packaging
+{
+ my ($localpackjobref, $loggingdir, $allvariables) = @_;
+
+ installer::logger::include_header_into_logfile("Packaging process");
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: Execute packaging start");
+
+ my $infoline = "";
+ my $from = cwd();
+ my $to = $loggingdir;
+
+ chdir($to);
+ $infoline = "chdir: $to \n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # the ddf file contains relative paths, it is necessary to change into the temp directory
+ $to = $installer::globals::temppath;
+ chdir($to);
+ $infoline = "chdir: $to \n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $maxmakecabcalls = 3;
+ my $allmakecabcalls = $#{$localpackjobref} + 1;
+
+ for ( my $i = 0; $i <= $#{$localpackjobref}; $i++ )
+ {
+ my $systemcall = ${$localpackjobref}[$i];
+
+ my $callscounter = $i + 1;
+
+ installer::logger::print_message( "... makecab.exe ($callscounter/$allmakecabcalls) ... \n" );
+
+ for ( my $n = 1; $n <= $maxmakecabcalls; $n++ )
+ {
+ my @ddfoutput = ();
+
+ $infoline = "Systemcall: $systemcall";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ open (DDF, "$systemcall");
+ while (<DDF>) {push(@ddfoutput, $_); }
+ close (DDF);
+
+ my $returnvalue = $?; # $? contains the return value of the systemcall
+
+ if ($returnvalue)
+ {
+ if ( $n < $maxmakecabcalls )
+ {
+ installer::logger::print_message( "makecab_error (Try $n): Trying again \n" );
+ $infoline = "makecab_error (Try $n): $systemcall !";
+ }
+ else
+ {
+ installer::logger::print_message( "ERROR (Try $n): Abort packing \n" );
+ $infoline = "ERROR (Try $n): $systemcall !";
+ }
+
+ push( @installer::globals::logfileinfo, $infoline);
+
+ for ( my $m = 0; $m <= $#ddfoutput; $m++ )
+ {
+ if ( $ddfoutput[$m] =~ /(ERROR\:.*?)\s*$/ )
+ {
+ $infoline = $1 . "\n";
+ if ( $n < $maxmakecabcalls ) { $infoline =~ s/ERROR\:/makecab_error\:/i; }
+ installer::logger::print_message( $infoline );
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ if ( $n == $maxmakecabcalls ) { installer::exiter::exit_program("ERROR: \"$systemcall\"!", "execute_packaging"); }
+ }
+ else
+ {
+ $infoline = "Success (Try $n): $systemcall";
+ push( @installer::globals::logfileinfo, $infoline);
+ last;
+ }
+ }
+ }
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: Execute packaging end");
+
+ chdir($from);
+ $infoline = "chdir: $from \n";
+ push( @installer::globals::logfileinfo, $infoline);
+}
+
+###############################################################
+# Setting the global variables ProductCode and the UpgradeCode
+###############################################################
+
+sub set_global_code_variables
+{
+ my ( $languagesref, $languagestringref, $allvariableshashref, $alloldproperties ) = @_;
+
+ # In the msi template directory a files "codes.txt" has to exist, in which the ProductCode
+ # and the UpgradeCode for the product are defined.
+ # The name "codes.txt" can be overwritten in Product definition with CODEFILENAME .
+ # Default $installer::globals::codefilename is defined in parameter.pm.
+
+ if ( $allvariableshashref->{'CODEFILENAME'} )
+ {
+ $installer::globals::codefilename = $installer::globals::idttemplatepath . $installer::globals::separator . $allvariableshashref->{'CODEFILENAME'};
+ installer::files::check_file($installer::globals::codefilename);
+ }
+
+ my $infoline = "Using Codes file: $installer::globals::codefilename \n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $codefile = installer::files::read_file($installer::globals::codefilename);
+
+ my $onelanguage = "";
+
+ if ( $#{$languagesref} > 0 ) # more than one language
+ {
+ if (( $installer::globals::added_english ) && ( $#{$languagesref} == 1 )) # only multilingual because of added English
+ {
+ $onelanguage = ${$languagesref}[1]; # setting the first language, that is not english
+ }
+ else
+ {
+ if (( ${$languagesref}[1] =~ /jp/ ) ||
+ ( ${$languagesref}[1] =~ /ko/ ) ||
+ ( ${$languagesref}[1] =~ /zh/ ))
+ {
+ $onelanguage = "multiasia";
+ }
+ else
+ {
+ $onelanguage = "multiwestern";
+ }
+ }
+ }
+ else # only one language
+ {
+ $onelanguage = ${$languagesref}[0];
+ }
+
+ # ProductCode must not change, if Windows patches shall be applied
+ if ( $installer::globals::updatedatabase )
+ {
+ $installer::globals::productcode = $alloldproperties->{'ProductCode'};
+ }
+ elsif ( $installer::globals::prepare_winpatch )
+ {
+ # ProductCode has to be specified in each language
+ my $searchstring = "PRODUCTCODE";
+ my $codeblock = installer::windows::idtglobal::get_language_block_from_language_file($searchstring, $codefile);
+ $installer::globals::productcode = installer::windows::idtglobal::get_code_from_code_block($codeblock, $onelanguage);
+ } else {
+ my $guidref = get_guid_list(1, 1); # only one GUID shall be generated
+ ${$guidref}[0] =~ s/\s*$//; # removing ending spaces
+ $installer::globals::productcode = "\{" . ${$guidref}[0] . "\}";
+ }
+
+ # UpgradeCode can take english as default, if not defined in specified language
+
+ $searchstring = "UPGRADECODE"; # searching in the codes.txt file
+ $codeblock = installer::windows::idtglobal::get_language_block_from_language_file($searchstring, $codefile);
+ $installer::globals::upgradecode = installer::windows::idtglobal::get_language_string_from_language_block($codeblock, $onelanguage, "");
+
+ if ( $installer::globals::upgradecode eq "" ) { installer::exiter::exit_program("ERROR: UpgradeCode not defined in $installer::globals::codefilename !", "set_global_code_variables"); }
+
+ $infoline = "Setting ProductCode to: $installer::globals::productcode \n";
+ push( @installer::globals::logfileinfo, $infoline);
+ $infoline = "Setting UpgradeCode to: $installer::globals::upgradecode \n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # Adding both variables into the variables array
+
+ $allvariableshashref->{'PRODUCTCODE'} = $installer::globals::productcode;
+ $allvariableshashref->{'UPGRADECODE'} = $installer::globals::upgradecode;
+
+ $infoline = "Defined variable PRODUCTCODE: $installer::globals::productcode \n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ $infoline = "Defined variable UPGRADECODE: $installer::globals::upgradecode \n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+}
+
+###############################################################
+# Setting the product version used in property table and
+# upgrade table. Saving in global variable $msiproductversion
+###############################################################
+
+sub set_msiproductversion
+{
+ my ( $allvariables ) = @_;
+
+ my $productversion = $allvariables->{'PACKAGEVERSION'};
+
+ if ( $productversion =~ /^\s*(\d+)\.(\d+)\.(\d+)\s*$/ )
+ {
+ $productversion = $1 . "\." . $2 . "\." . $3 . "\." . $installer::globals::buildid;
+ }
+
+ $installer::globals::msiproductversion = $productversion;
+
+ # Setting $installer::globals::msimajorproductversion, to differ between old version in upgrade table
+
+ if ( $installer::globals::msiproductversion =~ /^\s*(\d+)\./ )
+ {
+ my $major = $1;
+ $installer::globals::msimajorproductversion = $major . "\.0\.0";
+ }
+}
+
+#################################################################################
+# Including the msi product version into the bootstrap.ini, Windows only
+#################################################################################
+
+sub put_msiproductversion_into_bootstrapfile
+{
+ my ($filesref) = @_;
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $onefile = ${$filesref}[$i];
+
+ if ( $onefile->{'gid'} eq "gid_Brand_Profile_Version_Ini" )
+ {
+ my $file = installer::files::read_file($onefile->{'sourcepath'});
+
+ for ( my $j = 0; $j <= $#{$file}; $j++ )
+ {
+ ${$file}[$j] =~ s/\<msiproductversion\>/$installer::globals::msiproductversion/;
+ }
+
+ installer::files::save_file($onefile->{'sourcepath'}, $file);
+
+ last;
+ }
+ }
+}
+
+####################################################################################
+# Updating the file Property.idt dynamically
+# Content:
+# Property Value
+####################################################################################
+
+sub update_reglocat_table
+{
+ my ($basedir, $allvariables) = @_;
+
+ my $reglocatfilename = $basedir . $installer::globals::separator . "RegLocat.idt";
+
+ # Only do something, if this file exists
+
+ if ( -f $reglocatfilename )
+ {
+ my $reglocatfile = installer::files::read_file($reglocatfilename);
+
+ my $layername = "";
+ if ( $allvariables->{'REGISTRYLAYERNAME'} )
+ {
+ $layername = $allvariables->{'REGISTRYLAYERNAME'};
+ }
+ else
+ {
+ for ( my $i = 0; $i <= $#{$reglocatfile}; $i++ )
+ {
+ if ( ${$reglocatfile}[$i] =~ /\bLAYERNAMETEMPLATE\b/ )
+ {
+ installer::exiter::exit_program("ERROR: Variable \"REGISTRYLAYERNAME\" has to be defined", "update_reglocat_table");
+ }
+ }
+ }
+
+ if ( $layername ne "" )
+ {
+ # Updating the layername in
+
+ for ( my $i = 0; $i <= $#{$reglocatfile}; $i++ )
+ {
+ ${$reglocatfile}[$i] =~ s/\bLAYERNAMETEMPLATE\b/$layername/;
+ }
+
+ # Saving the file
+ installer::files::save_file($reglocatfilename ,$reglocatfile);
+ my $infoline = "Updated idt file: $reglocatfilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+}
+
+
+
+####################################################################################
+# Updating the file RemoveRe.idt dynamically (RemoveRegistry.idt)
+# The name of the component has to be replaced.
+####################################################################################
+
+sub update_removere_table
+{
+ my ($basedir) = @_;
+
+ my $removeregistryfilename = $basedir . $installer::globals::separator . "RemoveRe.idt";
+
+ # Only do something, if this file exists
+
+ if ( -f $removeregistryfilename )
+ {
+ my $removeregistryfile = installer::files::read_file($removeregistryfilename);
+
+ for ( my $i = 0; $i <= $#{$removeregistryfile}; $i++ )
+ {
+ for ( my $i = 0; $i <= $#{$removeregistryfile}; $i++ )
+ {
+ ${$removeregistryfile}[$i] =~ s/\bREGISTRYROOTCOMPONENT\b/$installer::globals::registryrootcomponent/;
+ }
+ }
+
+ # Saving the file
+ installer::files::save_file($removeregistryfilename ,$removeregistryfile);
+ my $infoline = "Updated idt file: $removeregistryfilename \n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+}
+
+##########################################################################
+# Reading saved mappings in Files.idt and Director.idt.
+# This is required, if installation sets shall be created,
+# that can be used for creation of msp files.
+##########################################################################
+
+sub read_saved_mappings
+{
+ installer::logger::include_header_into_logfile("Reading saved mappings from older installation sets:");
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: Reading saved mappings start");
+
+ if ( $installer::globals::previous_idt_dir )
+ {
+ my @errorlines = ();
+ my $errorstring = "";
+ my $error_occurred = 0;
+ my $file_error_occurred = 0;
+ my $dir_error_occurred = 0;
+
+ my $idtdir = $installer::globals::previous_idt_dir;
+ $idtdir =~ s/\Q$installer::globals::separator\E\s*$//;
+
+ # Reading File.idt
+
+ my $idtfile = $idtdir . $installer::globals::separator . "File.idt";
+ push( @installer::globals::globallogfileinfo, "\nAnalyzing file: $idtfile\n" );
+ if ( ! -f $idtfile ) { push( @installer::globals::globallogfileinfo, "Warning: File $idtfile does not exist!\n" ); }
+
+ my $n = 0;
+ open (F, "<$idtfile") || installer::exiter::exit_program("ERROR: Cannot open file $idtfile for reading", "read_saved_mappings");
+ <F>; <F>; <F>;
+ while (<F>)
+ {
+ m/^([^\t]+)\t([^\t]+)\t((.*)\|)?([^\t]*)/;
+ print "OUT1: \$1: $1, \$2: $2, \$3: $3, \$4: $4, \$5: $5\n";
+ next if ("$1" eq "$5") && (!defined($3));
+ my $lc1 = lc($1);
+
+ if ( exists($installer::globals::savedmapping{"$2/$5"}))
+ {
+ if ( ! $file_error_occurred )
+ {
+ $errorstring = "\nErrors in $idtfile: \n";
+ push(@errorlines, $errorstring);
+ }
+ $errorstring = "Duplicate savedmapping{" . "$2/$5}\n";
+ push(@errorlines, $errorstring);
+ $error_occurred = 1;
+ $file_error_occurred = 1;
+ }
+
+ if ( exists($installer::globals::savedrevmapping{$lc1}))
+ {
+ if ( ! $file_error_occurred )
+ {
+ $errorstring = "\nErrors in $idtfile: \n";
+ push(@errorlines, $errorstring);
+ }
+ $errorstring = "Duplicate savedrevmapping{" . "$lc1}\n";
+ push(@errorlines, $errorstring);
+ $error_occurred = 1;
+ $file_error_occurred = 1;
+ }
+
+ my $shortname = $4 || '';
+
+ # Don't reuse illegal 8.3 mappings that we used to generate in 2.0.4
+ if (index($shortname, '.') > 8 ||
+ (index($shortname, '.') == -1 && length($shortname) > 8))
+ {
+ $shortname = '';
+ }
+
+ if (( $shortname ne '' ) && ( index($shortname, '~') > 0 ) && ( exists($installer::globals::savedrev83mapping{$shortname}) ))
+ {
+ if ( ! $file_error_occurred )
+ {
+ $errorstring = "\nErrors in $idtfile: \n";
+ push(@errorlines, $errorstring);
+ }
+ $errorstring = "Duplicate savedrev83mapping{" . "$shortname}\n";
+ push(@errorlines, $errorstring);
+ $error_occurred = 1;
+ $file_error_occurred = 1;
+ }
+
+ $installer::globals::savedmapping{"$2/$5"} = "$1;$shortname";
+ $installer::globals::savedrevmapping{lc($1)} = "$2/$5";
+ $installer::globals::savedrev83mapping{$shortname} = "$2/$5" if $shortname ne '';
+ $n++;
+ }
+
+ close (F);
+
+ push( @installer::globals::globallogfileinfo, "Read $n old file table key or 8.3 name mappings from $idtfile\n" );
+
+ # Reading Director.idt
+
+ $idtfile = $idtdir . $installer::globals::separator . "Director.idt";
+ push( @installer::globals::globallogfileinfo, "\nAnalyzing file $idtfile\n" );
+ if ( ! -f $idtfile ) { push( @installer::globals::globallogfileinfo, "Warning: File $idtfile does not exist!\n" ); }
+
+ $n = 0;
+ open (F, "<$idtfile") || installer::exiter::exit_program("ERROR: Cannot open file $idtfile for reading", "read_saved_mappings");
+ <F>; <F>; <F>;
+ while (<F>)
+ {
+ m/^([^\t]+)\t([^\t]+)\t(([^~]+~\d.*)\|)?([^\t]*)/;
+ next if (!defined($3));
+ my $lc1 = lc($1);
+
+ print "OUT2: \$1: $1, \$2: $2, \$3: $3\n";
+
+ if ( exists($installer::globals::saved83dirmapping{$1}) )
+ {
+ if ( ! $dir_error_occurred )
+ {
+ $errorstring = "\nErrors in $idtfile: \n";
+ push(@errorlines, $errorstring);
+ }
+ $errorstring = "Duplicate saved83dirmapping{" . "$1}\n";
+ push(@errorlines, $errorstring);
+ $error_occurred = 1;
+ $dir_error_occurred = 1;
+ }
+
+ $installer::globals::saved83dirmapping{$1} = $4;
+ $n++;
+ }
+ close (F);
+
+ push( @installer::globals::globallogfileinfo, "Read $n old directory 8.3 name mappings from $idtfile\n" );
+
+ # Analyzing errors
+
+ if ( $error_occurred )
+ {
+ for ( my $i = 0; $i <= $#errorlines; $i++ )
+ {
+ print "$errorlines[$i]";
+ push( @installer::globals::globallogfileinfo, "$errorlines[$i]");
+ }
+ installer::exiter::exit_program("ERROR: Duplicate entries in saved mappings!", "read_saved_mappings");
+ }
+ } else {
+ installer::exiter::exit_program("ERROR: Windows patch shall be prepared, but environment variable PREVIOUS_IDT_DIR is not set!", "read_saved_mappings");
+ }
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: Reading saved mappings end");
+}
+
+1;
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/bin/modules/installer/windows/msishortcutproperty.pm b/solenv/bin/modules/installer/windows/msishortcutproperty.pm
new file mode 100644
index 000000000..5436f2565
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/msishortcutproperty.pm
@@ -0,0 +1,143 @@
+#
+# 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 .
+#
+
+package installer::windows::msishortcutproperty;
+
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+
+##############################################################
+# Returning identifier for msishortcutproperty table.
+##############################################################
+
+sub get_msishortcutproperty_identifier
+{
+ my ($msishortcutproperty) = @_;
+
+ my $identifier = $msishortcutproperty->{'gid'};
+
+ return $identifier;
+}
+
+##############################################################
+# Returning shortcut for msishortcutproperty table.
+##############################################################
+
+sub get_msishorcutproperty_shortcut
+{
+ my ($msishortcutproperty, $filesref) = @_;
+
+ my $onefile;
+ my $shortcut = "";
+ my $found = 0;
+ my $msishortcutproperty_shortcutid = $msishortcutproperty->{'ShortcutID'};
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ $onefile = ${$filesref}[$i];
+ my $filegid = $onefile->{'gid'};
+
+ if ( $filegid eq $msishortcutproperty_shortcutid )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ installer::exiter::exit_program("ERROR: Did not find ShortcutID $msishortcutproperty_shortcutid in file collection for shortcut", "get_msishorcutproperty_shortcut");
+ }
+
+ $shortcut = $onefile->{'gid'};
+
+ return $shortcut;
+}
+
+##############################################################
+# Returning the propertykey for msishortcutproperty table.
+##############################################################
+
+sub get_msishortcutproperty_propertykey
+{
+ my ($msishortcutproperty) = @_;
+
+ my $propertykey = "";
+ if ( $msishortcutproperty->{'Key'} ) { $propertykey = $msishortcutproperty->{'Key'}; }
+
+ return $propertykey;
+}
+
+################################################################
+# Returning the propvariantvalue for msishortcutproperty table.
+################################################################
+
+sub get_msishortcutproperty_propvariantvalue
+{
+ my ($msishortcutproperty) = @_;
+
+ my $propvariantvalue = "";
+ if ( $msishortcutproperty->{'Value'} ) { $propvariantvalue = $msishortcutproperty->{'Value'}; }
+
+ return $propvariantvalue;
+}
+
+###################################################################
+# Creating the file MsiShortcutProperty.idt dynamically
+# Content:
+# MsiShortcutProperty Shortcut_ PropertyKey PropVariantValue
+###################################################################
+
+sub create_msishortcutproperty_table
+{
+ my ($folderitempropertiesref, $folderitemsref, $basedir) = @_;
+
+ my @msishortcutpropertytable = ();
+
+ installer::windows::idtglobal::write_idt_header(\@msishortcutpropertytable, "msishortcutproperty");
+
+ # The entries defined in scp as FolderItemProperties
+
+ for ( my $j = 0; $j <= $#{$folderitempropertiesref}; $j++ )
+ {
+ my $onelink = ${$folderitempropertiesref}[$j];
+ my %msishortcutproperty = ();
+
+ $msishortcutproperty{'MsiShortcutProperty'} = get_msishortcutproperty_identifier($onelink);
+ $msishortcutproperty{'Shortcut_'} = get_msishorcutproperty_shortcut($onelink, $folderitemsref);
+ $msishortcutproperty{'PropertyKey'} = get_msishortcutproperty_propertykey($onelink);
+ $msishortcutproperty{'PropVariantValue'} = get_msishortcutproperty_propvariantvalue($onelink);
+
+ my $oneline = $msishortcutproperty{'MsiShortcutProperty'} . "\t" . $msishortcutproperty{'Shortcut_'} . "\t"
+ . $msishortcutproperty{'PropertyKey'} . "\t" . $msishortcutproperty{'PropVariantValue'} . "\n";
+
+ push(@msishortcutpropertytable, $oneline);
+ }
+
+ # Saving the file
+
+ my $msishortcutpropertytablename = $basedir . $installer::globals::separator . "MsiShorP.idt";
+ installer::files::save_file($msishortcutpropertytablename ,\@msishortcutpropertytable);
+ my $infoline = "Created idt file: $msishortcutpropertytablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+}
+
+
+1;
diff --git a/solenv/bin/modules/installer/windows/msp.pm b/solenv/bin/modules/installer/windows/msp.pm
new file mode 100644
index 000000000..1bbeea8d2
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/msp.pm
@@ -0,0 +1,1264 @@
+#
+# 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 .
+#
+
+package installer::windows::msp;
+
+use File::Copy;
+use installer::control;
+use installer::converter;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::systemactions;
+use installer::windows::admin;
+use installer::windows::idtglobal;
+use installer::windows::update;
+
+#################################################################################
+# Making all required administrative installations
+#################################################################################
+
+sub install_installation_sets
+{
+ my ($installationdir) = @_;
+
+ # Finding the msi database in the new installation set, that is located in $installationdir
+
+ my $msifiles = installer::systemactions::find_file_with_file_extension("msi", $installationdir);
+
+ if ( $#{$msifiles} < 0 ) { installer::exiter::exit_program("ERROR: Did not find msi database in directory $installationdir", "create_msp_patch"); }
+ if ( $#{$msifiles} > 0 ) { installer::exiter::exit_program("ERROR: Did find more than one msi database in directory $installationdir", "create_msp_patch"); }
+
+ my $newinstallsetdatabasepath = $installationdir . $installer::globals::separator . ${$msifiles}[0];
+ my $oldinstallsetdatabasepath = $installer::globals::updatedatabasepath;
+
+ # Creating temp directory again
+ installer::systemactions::create_directory_structure($installer::globals::temppath);
+
+ # Creating old installation directory
+ my $dirname = "admin";
+ my $installpath = $installer::globals::temppath . $installer::globals::separator . $dirname;
+ if ( ! -d $installpath) { installer::systemactions::create_directory($installpath); }
+
+ my $oldinstallpath = $installpath . $installer::globals::separator . "old";
+ my $newinstallpath = $installpath . $installer::globals::separator . "new";
+
+ if ( ! -d $oldinstallpath) { installer::systemactions::create_directory($oldinstallpath); }
+ if ( ! -d $newinstallpath) { installer::systemactions::create_directory($newinstallpath); }
+
+ my $olddatabase = installer::windows::admin::make_admin_install($oldinstallsetdatabasepath, $oldinstallpath);
+ my $newdatabase = installer::windows::admin::make_admin_install($newinstallsetdatabasepath, $newinstallpath);
+
+ if ( $^O =~ /cygwin/i ) {
+ $olddatabase = qx{cygpath -w "$olddatabase"};
+ $olddatabase =~ s/\s*$//g;
+ $newdatabase = qx{cygpath -w "$newdatabase"};
+ $newdatabase =~ s/\s*$//g;
+ }
+
+ return ($olddatabase, $newdatabase);
+}
+
+#################################################################################
+# Extracting all tables from a pcp file
+#################################################################################
+
+sub extract_all_tables_from_pcpfile
+{
+ my ($fullpcpfilepath, $workdir) = @_;
+
+ my $msidb = "msidb.exe"; # Has to be in the path
+ my $infoline = "";
+ my $systemcall = "";
+ my $returnvalue = "";
+ my $extraslash = ""; # Has to be set for non-ActiveState perl
+
+ my $localfullpcpfile = $fullpcpfilepath;
+ my $localworkdir = $workdir;
+
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ $localfullpcpfile =~ s/\//\\\\/g;
+ $localworkdir =~ s/\//\\\\/g;
+ $extraslash = "\\";
+ }
+ if ( $^O =~ /linux/i ) {
+ $extraslash = "\\";
+ }
+
+ # Export of all tables by using "*"
+
+ $systemcall = $msidb . " -d " . $localfullpcpfile . " -f " . $localworkdir . " -e " . $extraslash . "*";
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not exclude tables from pcp file: $fullpcpfilepath !", "extract_all_tables_from_msidatabase");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+#################################################################################
+# Include tables into a pcp file
+#################################################################################
+
+sub include_tables_into_pcpfile
+{
+ my ($fullpcpfilepath, $workdir, $tables) = @_;
+
+ my $msidb = "msidb.exe"; # Has to be in the path
+ my $infoline = "";
+ my $systemcall = "";
+ my $returnvalue = "";
+
+ # Make all table 8+3 conform
+ my $alltables = installer::converter::convert_stringlist_into_array(\$tables, " ");
+
+ for ( my $i = 0; $i <= $#{$alltables}; $i++ )
+ {
+ my $tablename = ${$alltables}[$i];
+ $tablename =~ s/\s*$//;
+ my $namelength = length($tablename);
+ if ( $namelength > 8 )
+ {
+ my $newtablename = substr($tablename, 0, 8); # name, offset, length
+ my $oldfile = $workdir . $installer::globals::separator . $tablename . ".idt";
+ my $newfile = $workdir . $installer::globals::separator . $newtablename . ".idt";
+ if ( -f $newfile ) { unlink $newfile; }
+ installer::systemactions::copy_one_file($oldfile, $newfile);
+ }
+ }
+
+ # Import of tables
+
+ my $localworkdir = $workdir;
+ my $localfullpcpfilepath = $fullpcpfilepath;
+
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ $localfullpcpfilepath =~ s/\//\\\\/g;
+ $localworkdir =~ s/\//\\\\/g;
+ }
+
+ my @tables = split(' ', $tables); # I found that msidb from Windows SDK 7.1 did not accept more than one table.
+ foreach my $table (@tables)
+ {
+ $systemcall = $msidb . " -d " . $localfullpcpfilepath . " -f " . $localworkdir . " -i " . $table;
+
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not include tables into pcp file: $fullpcpfilepath !", "include_tables_into_pcpfile");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+}
+
+#################################################################################
+# Calling msimsp.exe
+#################################################################################
+
+sub execute_msimsp
+{
+ my ($fullpcpfilename, $mspfilename, $localmspdir) = @_;
+
+ my $msimsp = "msimsp.exe"; # Has to be in the path
+ my $infoline = "";
+ my $systemcall = "";
+ my $returnvalue = "";
+ my $logfilename = $localmspdir . $installer::globals::separator . "msimsp.log";
+
+ # Using a specific temp for each msimsp.exe process
+ # Creating temp directory again (should already have happened)
+ installer::systemactions::create_directory_structure($installer::globals::temppath);
+
+ # Creating old installation directory
+ my $dirname = "msimsptemp";
+ my $msimsptemppath = $installer::globals::temppath . $installer::globals::separator . $dirname;
+ if ( ! -d $msimsptemppath) { installer::systemactions::create_directory($msimsptemppath); }
+
+ # r:\msvc9p\PlatformSDK\v6.1\bin\msimsp.exe -s c:\patch\hotfix_qfe1.pcp -p c:\patch\patch_ooo3_m2_m3.msp -l c:\patch\patch_ooo3_m2_m3.log
+
+ if ( -f $logfilename ) { unlink $logfilename; }
+
+ my $localfullpcpfilename = $fullpcpfilename;
+ my $localmspfilename = $mspfilename;
+ my $locallogfilename = $logfilename;
+ my $localmsimsptemppath = $msimsptemppath;
+
+ if ( $^O =~ /cygwin/i ) {
+ # msimsp.exe really wants backslashes. (And double escaping because system() expands the string.)
+ $localfullpcpfilename =~ s/\//\\\\/g;
+ $locallogfilename =~ s/\//\\\\/g;
+
+ $localmspfilename =~ s/\\/\\\\/g; # path already contains backslash
+
+ $localmsimsptemppath = qx{cygpath -w "$localmsimsptemppath"};
+ $localmsimsptemppath =~ s/\\/\\\\/g;
+ $localmsimsptemppath =~ s/\s*$//g;
+ }
+
+ $systemcall = $msimsp . " -s " . $localfullpcpfilename . " -p " . $localmspfilename . " -l " . $locallogfilename . " -f " . $localmsimsptemppath;
+ installer::logger::print_message( "... $systemcall ...\n" );
+
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not execute $systemcall !", "execute_msimsp");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ return $logfilename;
+}
+
+####################################################################
+# Checking existence and saving all tables, that need to be edited
+####################################################################
+
+sub check_and_save_tables
+{
+ my ($tablelist, $workdir) = @_;
+
+ my $tables = installer::converter::convert_stringlist_into_array(\$tablelist, " ");
+
+ for ( my $i = 0; $i <= $#{$tables}; $i++ )
+ {
+ my $filename = ${$tables}[$i];
+ $filename =~ s/\s*$//;
+ my $fullfilename = $workdir . $installer::globals::separator . $filename . ".idt";
+
+ if ( ! -f $fullfilename ) { installer::exiter::exit_program("ERROR: Required idt file could not be found: \"$fullfilename\"!", "check_and_save_tables"); }
+
+ my $savfilename = $fullfilename . ".sav";
+ installer::systemactions::copy_one_file($fullfilename, $savfilename);
+ }
+}
+
+####################################################################
+# Setting the name of the msp database
+####################################################################
+
+sub set_mspfilename
+{
+ my ($allvariables, $mspdir, $languagesarrayref) = @_;
+
+ my $databasename = $allvariables->{'PRODUCTNAME'} . "-" . $allvariables->{'PRODUCTVERSION'} . "-" . $allvariables->{'WINDOWSPATCHLEVEL'} . ".msp";
+
+ my $fullmspname = $mspdir . $installer::globals::separator . $databasename;
+
+ if ( $^O =~ /cygwin/i ) { $fullmspname =~ s/\//\\/g; }
+
+ return $fullmspname;
+}
+
+####################################################################
+# Editing table Properties
+####################################################################
+
+sub change_properties_table
+{
+ my ($localmspdir, $mspfilename) = @_;
+
+ my $infoline = "Changing content of table \"Properties\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $filename = $localmspdir . $installer::globals::separator . "Properties.idt";
+ if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_properties_table"); }
+
+ my $filecontent = installer::files::read_file($filename);
+
+
+ my $guidref = installer::windows::msiglobal::get_guid_list(1, 1);
+ ${$guidref}[0] =~ s/\s*$//; # removing ending spaces
+ my $patchcode = "\{" . ${$guidref}[0] . "\}";
+
+ # Setting "PatchOutputPath"
+ my $found_patchoutputpath = 0;
+ my $found_patchguid = 0;
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( ${$filecontent}[$i] =~ /^\s*PatchOutputPath\t(.*?)\s*$/ )
+ {
+ my $oldvalue = $1;
+ ${$filecontent}[$i] =~ s/\Q$oldvalue\E/$mspfilename/;
+ $found_patchoutputpath = 1;
+ }
+
+ if ( ${$filecontent}[$i] =~ /^\s*PatchGUID\t(.*?)\s*$/ )
+ {
+ my $oldvalue = $1;
+ ${$filecontent}[$i] =~ s/\Q$oldvalue\E/$patchcode/;
+ $found_patchguid = 1;
+ }
+ }
+
+ if ( ! $found_patchoutputpath )
+ {
+ my $newline = "PatchOutputPath\t$mspfilename\n";
+ push(@{$filecontent}, $newline);
+ }
+
+ if ( ! $found_patchguid )
+ {
+ my $newline = "PatchGUID\t$patchcode\n";
+ push(@{$filecontent}, $newline);
+ }
+
+ # saving file
+ installer::files::save_file($filename, $filecontent);
+}
+
+####################################################################
+# Editing table TargetImages
+####################################################################
+
+sub change_targetimages_table
+{
+ my ($localmspdir, $olddatabase) = @_;
+
+ my $infoline = "Changing content of table \"TargetImages\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $filename = $localmspdir . $installer::globals::separator . "TargetImages.idt";
+ if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_targetimages_table"); }
+
+ my $filecontent = installer::files::read_file($filename);
+ my @newcontent = ();
+
+ # Copying the header
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) { if ( $i < 3 ) { push(@newcontent, ${$filecontent}[$i]); } }
+
+ #Adding all targets
+ my $newline = "T1\t$olddatabase\t\tU1\t1\t0x00000922\t1\n";
+ push(@newcontent, $newline);
+
+ # saving file
+ installer::files::save_file($filename, \@newcontent);
+}
+
+####################################################################
+# Editing table UpgradedImages
+####################################################################
+
+sub change_upgradedimages_table
+{
+ my ($localmspdir, $newdatabase) = @_;
+
+ my $infoline = "Changing content of table \"UpgradedImages\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $filename = $localmspdir . $installer::globals::separator . "UpgradedImages.idt";
+ if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_upgradedimages_table"); }
+
+ my $filecontent = installer::files::read_file($filename);
+ my @newcontent = ();
+
+ # Copying the header
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) { if ( $i < 3 ) { push(@newcontent, ${$filecontent}[$i]); } }
+
+ # Syntax: Upgraded MsiPath PatchMsiPath SymbolPaths Family
+
+ # default values
+ my $upgraded = "U1";
+ my $msipath = $newdatabase;
+ my $patchmsipath = "";
+ my $symbolpaths = "";
+ my $family = "22334455";
+
+ if ( $#{$filecontent} >= 3 )
+ {
+ my $line = ${$filecontent}[3];
+ if ( $line =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ $upgraded = $1;
+ $patchmsipath = $3;
+ $symbolpaths = $4;
+ $family = $5;
+ }
+ }
+
+ #Adding sequence line, saving PatchFamily
+ my $newline = "$upgraded\t$msipath\t$patchmsipath\t$symbolpaths\t$family\n";
+ push(@newcontent, $newline);
+
+ # saving file
+ installer::files::save_file($filename, \@newcontent);
+}
+
+####################################################################
+# Editing table ImageFamilies
+####################################################################
+
+sub change_imagefamilies_table
+{
+ my ($localmspdir) = @_;
+
+ my $infoline = "Changing content of table \"ImageFamilies\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $filename = $localmspdir . $installer::globals::separator . "ImageFamilies.idt";
+ if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_imagefamilies_table"); }
+
+ my $filecontent = installer::files::read_file($filename);
+ my @newcontent = ();
+
+ # Copying the header
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) { if ( $i < 3 ) { push(@newcontent, ${$filecontent}[$i]); } }
+
+ # Syntax: Family MediaSrcPropName MediaDiskId FileSequenceStart DiskPrompt VolumeLabel
+ # "FileSequenceStart has to be set
+
+ # Default values:
+
+ my $family = "22334455";
+ my $mediasrcpropname = "MediaSrcPropName";
+ my $mediadiskid = "2";
+ my $filesequencestart = get_filesequencestart();
+ my $diskprompt = "";
+ my $volumelabel = "";
+
+ if ( $#{$filecontent} >= 3 )
+ {
+ my $line = ${$filecontent}[3];
+ if ( $line =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ $family = $1;
+ $mediasrcpropname = $2;
+ $mediadiskid = $3;
+ $diskprompt = $5;
+ $volumelabel = $6;
+ }
+ }
+
+ #Adding sequence line
+ my $newline = "$family\t$mediasrcpropname\t$mediadiskid\t$filesequencestart\t$diskprompt\t$volumelabel\n";
+ push(@newcontent, $newline);
+
+ # saving file
+ installer::files::save_file($filename, \@newcontent);
+}
+
+####################################################################
+# Setting start sequence for patch
+####################################################################
+
+sub get_filesequencestart
+{
+ my $sequence = 1000; # default
+
+ if ( $installer::globals::updatelastsequence ) { $sequence = $installer::globals::updatelastsequence + 500; }
+
+ return $sequence;
+}
+
+####################################################################
+# Setting time value into pcp file
+# Format mm/dd/yyyy hh:mm
+####################################################################
+
+sub get_patchtime_value
+{
+ # Syntax: 8/8/2008 11:55
+ my $minute = (localtime())[1];
+ my $hour = (localtime())[2];
+ my $day = (localtime())[3];
+ my $month = (localtime())[4];
+ my $year = 1900 + (localtime())[5];
+
+ $month++; # zero based month
+ if ( $minute < 10 ) { $minute = "0" . $minute; }
+ if ( $hour < 10 ) { $hour = "0" . $hour; }
+
+ my $timestring = $month . "/" . $day . "/" . $year . " " . $hour . ":" . $minute;
+
+ return $timestring;
+}
+
+#################################################################################
+# Checking, if this is the correct database.
+#################################################################################
+
+sub correct_langs
+{
+ my ($langs, $languagestringref) = @_;
+
+ my $correct_langs = 0;
+
+ # Comparing $langs with $languagestringref
+
+ my $langlisthash = installer::converter::convert_stringlist_into_hash(\$langs, ",");
+ my $langstringhash = installer::converter::convert_stringlist_into_hash($languagestringref, "_");
+
+ my $not_included = 0;
+ foreach my $onelang ( keys %{$langlisthash} )
+ {
+ if ( ! exists($langstringhash->{$onelang}) )
+ {
+ $not_included = 1;
+ last;
+ }
+ }
+
+ if ( ! $not_included )
+ {
+ foreach my $onelanguage ( keys %{$langstringhash} )
+ {
+ if ( ! exists($langlisthash->{$onelanguage}) )
+ {
+ $not_included = 1;
+ last;
+ }
+ }
+
+ if ( ! $not_included ) { $correct_langs = 1; }
+ }
+
+ return $correct_langs;
+}
+
+#################################################################################
+# Searching for the path to the reference database for this special product.
+#################################################################################
+
+sub get_patchid_from_list
+{
+ my ($filecontent, $languagestringref, $filename) = @_;
+
+ my $patchid = "";
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ my $line = ${$filecontent}[$i];
+ if ( $line =~ /^\s*$/ ) { next; } # empty line
+ if ( $line =~ /^\s*\#/ ) { next; } # comment line
+
+ if ( $line =~ /^\s*(.+?)\s*=\s*(.+?)\s*$/ )
+ {
+ my $langs = $1;
+ my $localpatchid = $2;
+
+ if ( correct_langs($langs, $languagestringref) )
+ {
+ $patchid = $localpatchid;
+ last;
+ }
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Wrong syntax in file: $filename! Line: \"$line\"", "get_patchid_from_list");
+ }
+ }
+
+ return $patchid;
+}
+
+####################################################################
+# Editing table PatchMetadata
+####################################################################
+
+sub change_patchmetadata_table
+{
+ my ($localmspdir, $allvariables, $languagestringref) = @_;
+
+ my $infoline = "Changing content of table \"PatchMetadata\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $filename = $localmspdir . $installer::globals::separator . "PatchMetadata.idt";
+ if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_patchmetadata_table"); }
+
+ my $filecontent = installer::files::read_file($filename);
+ my @newcontent = ();
+
+ # Syntax: Company Property Value
+ # Interesting properties: "Classification" and "CreationTimeUTC"
+
+ my $classification_set = 0;
+ my $creationtime_set = 0;
+ my $targetproductname_set = 0;
+ my $manufacturer_set = 0;
+ my $displayname_set = 0;
+ my $description_set = 0;
+ my $allowremoval_set = 0;
+
+ my $defaultcompany = "";
+
+ my $classificationstring = "Classification";
+ my $classificationvalue = "Hotfix";
+ if (( $allvariables->{'SERVICEPACK'} ) && ( $allvariables->{'SERVICEPACK'} == 1 )) { $classificationvalue = "ServicePack"; }
+
+ my $allowremovalstring = "AllowRemoval";
+ my $allowremovalvalue = "1";
+ if (( exists($allvariables->{'MSPALLOWREMOVAL'}) ) && ( $allvariables->{'MSPALLOWREMOVAL'} == 0 )) { $allowremovalvalue = 0; }
+
+ my $timestring = "CreationTimeUTC";
+ # Syntax: 8/8/2008 11:55
+ my $timevalue = get_patchtime_value();
+
+ my $targetproductnamestring = "TargetProductName";
+ my $targetproductnamevalue = $allvariables->{'PRODUCTNAME'};
+ if ( $allvariables->{'PROPERTYTABLEPRODUCTNAME'} ) { $targetproductnamevalue = $allvariables->{'PROPERTYTABLEPRODUCTNAME'}; }
+
+ my $manufacturerstring = "ManufacturerName";
+ my $manufacturervalue = $ENV{'OOO_VENDOR'};
+ if ( $installer::globals::longmanufacturer ) { $manufacturervalue = $installer::globals::longmanufacturer; }
+
+ my $displaynamestring = "DisplayName";
+ my $descriptionstring = "Description";
+ my $displaynamevalue = "";
+ my $descriptionvalue = "";
+
+ my $base = $allvariables->{'PRODUCTNAME'} . " " . $allvariables->{'PRODUCTVERSION'};
+ if ( $installer::globals::languagepack || $installer::globals::helppack ) { $base = $targetproductnamevalue; }
+
+ my $windowspatchlevel = 0;
+ if ( $allvariables->{'WINDOWSPATCHLEVEL'} ) { $windowspatchlevel = $allvariables->{'WINDOWSPATCHLEVEL'}; }
+
+ my $displayaddon = "";
+ if ( $allvariables->{'PATCHDISPLAYADDON'} ) { $displayaddon = $allvariables->{'PATCHDISPLAYADDON'}; }
+
+ my $patchsequence = get_patchsequence($allvariables);
+
+ if (( $allvariables->{'SERVICEPACK'} ) && ( $allvariables->{'SERVICEPACK'} == 1 ))
+ {
+ $displaynamevalue = $base . " ServicePack " . $windowspatchlevel . " " . $patchsequence . " Build: " . $installer::globals::buildid;
+ $descriptionvalue = $base . " ServicePack " . $windowspatchlevel . " " . $patchsequence . " Build: " . $installer::globals::buildid;
+ }
+ else
+ {
+ $displaynamevalue = $base . " Hotfix " . $displayaddon . " " . $patchsequence . " Build: " . $installer::globals::buildid;
+ $descriptionvalue = $base . " Hotfix " . $displayaddon . " " . $patchsequence . " Build: " . $installer::globals::buildid;
+ $displaynamevalue =~ s/ / /g;
+ $descriptionvalue =~ s/ / /g;
+ $displaynamevalue =~ s/ / /g;
+ $descriptionvalue =~ s/ / /g;
+ $displaynamevalue =~ s/ / /g;
+ $descriptionvalue =~ s/ / /g;
+ }
+
+ if ( $allvariables->{'MSPPATCHNAMELIST'} )
+ {
+ my $patchnamelistfile = $allvariables->{'MSPPATCHNAMELIST'};
+ $patchnamelistfile = $installer::globals::idttemplatepath . $installer::globals::separator . $patchnamelistfile;
+ if ( ! -f $patchnamelistfile ) { installer::exiter::exit_program("ERROR: Could not find file \"$patchnamelistfile\".", "change_patchmetadata_table"); }
+ my $filecontent = installer::files::read_file($patchnamelistfile);
+
+ # Get name and path of reference database
+ my $patchid = get_patchid_from_list($filecontent, $languagestringref, $patchnamelistfile);
+
+ if ( $patchid eq "" ) { installer::exiter::exit_program("ERROR: Could not find file patchid in file \"$patchnamelistfile\" for language(s) \"$$languagestringref\".", "change_patchmetadata_table"); }
+
+ # Setting language specific patch id
+ }
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( ${$filecontent}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ my $company = $1;
+ my $property = $2;
+ my $value = $3;
+
+ if ( $property eq $classificationstring )
+ {
+ ${$filecontent}[$i] = "$company\t$property\t$classificationvalue\n";
+ $classification_set = 1;
+ }
+
+ if ( $property eq $allowremovalstring )
+ {
+ ${$filecontent}[$i] = "$company\t$property\t$allowremovalvalue\n";
+ $allowremoval_set = 1;
+ }
+
+ if ( $property eq $timestring )
+ {
+ ${$filecontent}[$i] = "$company\t$property\t$timevalue\n";
+ $creationtime_set = 1;
+ }
+
+ if ( $property eq $targetproductnamestring )
+ {
+ ${$filecontent}[$i] = "$company\t$property\t$targetproductnamevalue\n";
+ $targetproductname_set = 1;
+ }
+
+ if ( $property eq $manufacturerstring )
+ {
+ ${$filecontent}[$i] = "$company\t$property\t$manufacturervalue\n";
+ $manufacturer_set = 1;
+ }
+
+ if ( $property eq $displaynamestring )
+ {
+ ${$filecontent}[$i] = "$company\t$property\t$displaynamevalue\n";
+ $displayname_set = 1;
+ }
+
+ if ( $property eq $descriptionstring )
+ {
+ ${$filecontent}[$i] = "$company\t$property\t$descriptionvalue\n";
+ $description_set = 1;
+ }
+ }
+
+ push(@newcontent, ${$filecontent}[$i]);
+ }
+
+ if ( ! $classification_set )
+ {
+ my $line = "$defaultcompany\t$classificationstring\t$classificationvalue\n";
+ push(@newcontent, $line);
+ }
+
+ if ( ! $allowremoval_set )
+ {
+ my $line = "$defaultcompany\t$classificationstring\t$allowremovalvalue\n";
+ push(@newcontent, $line);
+ }
+
+ if ( ! $allowremoval_set )
+ {
+ my $line = "$defaultcompany\t$classificationstring\t$allowremovalvalue\n";
+ push(@newcontent, $line);
+ }
+
+ if ( ! $creationtime_set )
+ {
+ my $line = "$defaultcompany\t$timestring\t$timevalue\n";
+ push(@newcontent, $line);
+ }
+
+ if ( ! $targetproductname_set )
+ {
+ my $line = "$defaultcompany\t$targetproductnamestring\t$targetproductnamevalue\n";
+ push(@newcontent, $line);
+ }
+
+ if ( ! $manufacturer_set )
+ {
+ my $line = "$defaultcompany\t$manufacturerstring\t$manufacturervalue\n";
+ push(@newcontent, $line);
+ }
+
+ if ( ! $displayname_set )
+ {
+ my $line = "$defaultcompany\t$displaynamestring\t$displaynamevalue\n";
+ push(@newcontent, $line);
+ }
+
+ if ( ! $description_set )
+ {
+ my $line = "$defaultcompany\t$descriptionstring\t$descriptionvalue\n";
+ push(@newcontent, $line);
+ }
+
+ # saving file
+ installer::files::save_file($filename, \@newcontent);
+}
+
+####################################################################
+# Editing table PatchSequence
+####################################################################
+
+sub change_patchsequence_table
+{
+ my ($localmspdir, $allvariables) = @_;
+
+ my $infoline = "Changing content of table \"PatchSequence\"\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $filename = $localmspdir . $installer::globals::separator . "PatchSequence.idt";
+ if ( ! -f $filename ) { installer::exiter::exit_program("ERROR: Could not find file \"$filename\" !", "change_patchsequence_table"); }
+
+ my $filecontent = installer::files::read_file($filename);
+ my @newcontent = ();
+
+ # Copying the header
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ ) { if ( $i < 3 ) { push(@newcontent, ${$filecontent}[$i]); } }
+
+ # Syntax: PatchFamily Target Sequence Supersede
+
+ my $patchfamily = "SO";
+ my $target = "";
+ my $patchsequence = get_patchsequence($allvariables);
+ my $supersede = get_supersede($allvariables);
+
+ if ( $#{$filecontent} >= 3 )
+ {
+ my $line = ${$filecontent}[3];
+ if ( $line =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\s$/ )
+ {
+ $patchfamily = $1;
+ $target = $2;
+ }
+ }
+
+ #Adding sequence line, saving PatchFamily
+ my $newline = "$patchfamily\t$target\t$patchsequence\t$supersede\n";
+ push(@newcontent, $newline);
+
+ # saving file
+ installer::files::save_file($filename, \@newcontent);
+}
+
+####################################################################
+# Setting supersede, "0" for Hotfixes, "1" for ServicePack
+####################################################################
+
+sub get_supersede
+{
+ my ( $allvariables ) = @_;
+
+ my $supersede = 0; # if not defined, this is a Hotfix
+
+ if (( $allvariables->{'SERVICEPACK'} ) && ( $allvariables->{'SERVICEPACK'} == 1 )) { $supersede = 1; }
+
+ return $supersede;
+}
+
+####################################################################
+# Setting the sequence of the patch
+####################################################################
+
+sub get_patchsequence
+{
+ my ( $allvariables ) = @_;
+
+ my $patchsequence = "1.0";
+
+ if ( ! $allvariables->{'PACKAGEVERSION'} ) { installer::exiter::exit_program("ERROR: PACKAGEVERSION must be set for msp patch creation!", "get_patchsequence"); }
+
+ my $packageversion = $allvariables->{'PACKAGEVERSION'};
+
+ if ( $packageversion =~ /^\s*(\d+)\.(\d+)\.(\d+)\.(\d+)\s*$/ )
+ {
+ my $major = $1;
+ my $minor = $2;
+ my $micro = $3;
+ my $patch = $4;
+ $patchsequence = $major . "\." . $minor . "\." . $micro . "\." . $patch;
+ }
+
+ return $patchsequence;
+}
+
+####################################################################
+# Editing all tables from pcp file, that need to be edited
+####################################################################
+
+sub edit_tables
+{
+ my ($tablelist, $localmspdir, $olddatabase, $newdatabase, $mspfilename, $allvariables, $languagestringref) = @_;
+
+ # table list contains: my $tablelist = "Properties TargetImages UpgradedImages ImageFamilies PatchMetadata PatchSequence";
+
+ change_properties_table($localmspdir, $mspfilename);
+ change_targetimages_table($localmspdir, $olddatabase);
+ change_upgradedimages_table($localmspdir, $newdatabase);
+ change_imagefamilies_table($localmspdir);
+ change_patchmetadata_table($localmspdir, $allvariables, $languagestringref);
+ change_patchsequence_table($localmspdir, $allvariables);
+}
+
+#################################################################################
+# Checking, if this is the correct database.
+#################################################################################
+
+sub correct_patch
+{
+ my ($product, $pro, $langs, $languagestringref) = @_;
+
+ my $correct_patch = 0;
+
+ # Comparing $product with $installer::globals::product and
+ # $pro with $installer::globals::pro and
+ # $langs with $languagestringref
+
+ my $product_is_good = 0;
+
+ my $localproduct = $installer::globals::product;
+ if ( $installer::globals::languagepack ) { $localproduct = $localproduct . "LanguagePack"; }
+ elsif ( $installer::globals::helppack ) { $localproduct = $localproduct . "HelpPack"; }
+
+ if ( $product eq $localproduct ) { $product_is_good = 1; }
+
+ if ( $product_is_good )
+ {
+ my $pro_is_good = 0;
+
+ if ((( $pro eq "pro" ) && ( $installer::globals::pro )) || (( $pro eq "nonpro" ) && ( ! $installer::globals::pro ))) { $pro_is_good = 1; }
+
+ if ( $pro_is_good )
+ {
+ my $langlisthash = installer::converter::convert_stringlist_into_hash(\$langs, ",");
+ my $langstringhash = installer::converter::convert_stringlist_into_hash($languagestringref, "_");
+
+ my $not_included = 0;
+ foreach my $onelang ( keys %{$langlisthash} )
+ {
+ if ( ! exists($langstringhash->{$onelang}) )
+ {
+ $not_included = 1;
+ last;
+ }
+ }
+
+ if ( ! $not_included )
+ {
+ foreach my $onelanguage ( keys %{$langstringhash} )
+ {
+ if ( ! exists($langlisthash->{$onelanguage}) )
+ {
+ $not_included = 1;
+ last;
+ }
+ }
+
+ if ( ! $not_included ) { $correct_patch = 1; }
+ }
+ }
+ }
+
+ return $correct_patch;
+}
+
+#################################################################################
+# Searching for the path to the required patch for this special product.
+#################################################################################
+
+sub get_requiredpatchfile_from_list
+{
+ my ($filecontent, $languagestringref, $filename) = @_;
+
+ my $patchpath = "";
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ my $line = ${$filecontent}[$i];
+ if ( $line =~ /^\s*$/ ) { next; } # empty line
+ if ( $line =~ /^\s*\#/ ) { next; } # comment line
+
+ if ( $line =~ /^\s*(.+?)\s*\t+\s*(.+?)\s*\t+\s*(.+?)\s*\t+\s*(.+?)\s*$/ )
+ {
+ my $product = $1;
+ my $pro = $2;
+ my $langs = $3;
+ my $path = $4;
+
+ if (( $pro ne "pro" ) && ( $pro ne "nonpro" )) { installer::exiter::exit_program("ERROR: Wrong syntax in file: $filename. Only \"pro\" or \"nonpro\" allowed in column 1! Line: \"$line\"", "get_databasename_from_list"); }
+
+ if ( correct_patch($product, $pro, $langs, $languagestringref) )
+ {
+ $patchpath = $path;
+ last;
+ }
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Wrong syntax in file: $filename! Line: \"$line\"", "get_requiredpatchfile_from_list");
+ }
+ }
+
+ return $patchpath;
+}
+
+##################################################################
+# Converting unicode file to ascii
+# to be more precise: uft-16 little endian to ascii
+##################################################################
+
+sub convert_unicode_to_ascii
+{
+ my ( $filename ) = @_;
+
+ my @localfile = ();
+
+ my $savfilename = $filename . "_before.unicode";
+ installer::systemactions::copy_one_file($filename, $savfilename);
+
+ open( IN, "<:encoding(UTF16-LE)", $filename ) || installer::exiter::exit_program("ERROR: Cannot open file $filename for reading", "convert_unicode_to_ascii");
+ while ( $line = <IN> ) {
+ push @localfile, $line;
+ }
+ close( IN );
+
+ if ( open( OUT, ">", $filename ) )
+ {
+ print OUT @localfile;
+ close(OUT);
+ }
+}
+
+####################################################################
+# Analyzing the log file created by msimsp.exe to find all
+# files included into the patch.
+####################################################################
+
+sub analyze_msimsp_logfile
+{
+ my ($logfile, $filesarray) = @_;
+
+ # Reading log file after converting from utf-16 (LE) to ascii
+ convert_unicode_to_ascii($logfile);
+ my $logfilecontent = installer::files::read_file($logfile);
+
+ # Creating hash from $filesarray: unique file name -> destination of file
+ my %filehash = ();
+ my %destinationcollector = ();
+
+ for ( my $i = 0; $i <= $#{$filesarray}; $i++ )
+ {
+ my $onefile = ${$filesarray}[$i];
+
+ # Only collecting files with "uniquename" and "destination"
+ if (( exists($onefile->{'uniquename'}) ) && ( exists($onefile->{'uniquename'}) ))
+ {
+ my $uniquefilename = $onefile->{'uniquename'};
+ my $destpath = $onefile->{'destination'};
+ $filehash{$uniquefilename} = $destpath;
+ }
+ }
+
+ # Analyzing log file of msimsp.exe, finding all changed files
+ # and searching all destinations of unique file names.
+ # Content in log file: "INFO File Key: <file key> is modified"
+ # Collecting content in @installer::globals::patchfilecollector
+
+ for ( my $i = 0; $i <= $#{$logfilecontent}; $i++ )
+ {
+ if ( ${$logfilecontent}[$i] =~ /Key\:\s*(.*?) is modified\s*$/ )
+ {
+ my $filekey = $1;
+ if ( exists($filehash{$filekey}) ) { $destinationcollector{$filehash{$filekey}} = 1; }
+ else { installer::exiter::exit_program("ERROR: Could not find file key \"$filekey\" in file collector.", "analyze_msimsp_logfile"); }
+ }
+ }
+
+ foreach my $onedest ( sort keys %destinationcollector ) { push(@installer::globals::patchfilecollector, "$onedest\n"); }
+
+}
+
+####################################################################
+# Creating msp patch files for Windows
+####################################################################
+
+sub create_msp_patch
+{
+ my ($installationdir, $includepatharrayref, $allvariables, $languagestringref, $languagesarrayref, $filesarray) = @_;
+
+ my $force = 1; # print this message even in 'quiet' mode
+ installer::logger::print_message( "\n******************************************\n" );
+ installer::logger::print_message( "... creating msp installation set ...\n", $force );
+ installer::logger::print_message( "******************************************\n" );
+
+ $installer::globals::creating_windows_installer_patch = 1;
+
+ my @needed_files = ("msimsp.exe"); # only required for patch creation process
+ installer::control::check_needed_files_in_path(\@needed_files);
+
+ installer::logger::include_header_into_logfile("Creating msp installation sets:");
+
+ my $firstdir = $installationdir;
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$firstdir);
+
+ my $lastdir = $installationdir;
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$lastdir);
+
+ if ( $lastdir =~ /\./ ) { $lastdir =~ s/\./_msp_inprogress\./ }
+ else { $lastdir = $lastdir . "_msp_inprogress"; }
+
+ # Removing existing directory "_native_packed_inprogress" and "_native_packed_witherror" and "_native_packed"
+
+ my $mspdir = $firstdir . $lastdir;
+ if ( -d $mspdir ) { installer::systemactions::remove_complete_directory($mspdir); }
+
+ my $olddir = $mspdir;
+ $olddir =~ s/_inprogress/_witherror/;
+ if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); }
+
+ $olddir = $mspdir;
+ $olddir =~ s/_inprogress//;
+ if ( -d $olddir ) { installer::systemactions::remove_complete_directory($olddir); }
+
+ # Creating the new directory for new installation set
+ installer::systemactions::create_directory($mspdir);
+
+ $installer::globals::saveinstalldir = $mspdir;
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Starting product installation");
+
+ # Installing both installation sets
+ installer::logger::print_message( "... installing products ...\n" );
+ my ($olddatabase, $newdatabase) = install_installation_sets($installationdir);
+
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Starting pcp file creation");
+
+ # Create pcp file
+ installer::logger::print_message( "... creating pcp file ...\n" );
+
+ my $localmspdir = installer::systemactions::create_directories("msp", $languagestringref);
+
+ if ( ! $allvariables->{'PCPFILENAME'} ) { installer::exiter::exit_program("ERROR: Property \"PCPFILENAME\" has to be defined.", "create_msp_patch"); }
+ my $pcpfilename = $allvariables->{'PCPFILENAME'};
+
+ if ( $installer::globals::languagepack ) { $pcpfilename =~ s/.pcp\s*$/languagepack.pcp/; }
+ elsif ( $installer::globals::helppack ) { $pcpfilename =~ s/.pcp\s*$/helppack.pcp/; }
+
+ # Searching the pcp file in the include paths
+ my $fullpcpfilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$pcpfilename, $includepatharrayref, 1);
+ if ( $$fullpcpfilenameref eq "" ) { installer::exiter::exit_program("ERROR: pcp file not found: $pcpfilename !", "create_msp_patch"); }
+ my $fullpcpfilenamesource = $$fullpcpfilenameref;
+
+ # Copying pcp file
+ my $fullpcpfilename = $localmspdir . $installer::globals::separator . $pcpfilename;
+ installer::systemactions::copy_one_file($fullpcpfilenamesource, $fullpcpfilename);
+
+ # a. Extracting tables from msi database: msidb.exe -d <msifile> -f <directory> -e File Media, ...
+ # b. Changing content of msi database in tables: File, Media, Directory, FeatureComponent
+ # c. Including tables into msi database: msidb.exe -d <msifile> -f <directory> -i File Media, ...
+
+ # Unpacking tables from pcp file
+ extract_all_tables_from_pcpfile($fullpcpfilename, $localmspdir);
+
+ # Tables, that need to be edited
+ my $tablelist = "Properties TargetImages UpgradedImages ImageFamilies PatchMetadata PatchSequence"; # required tables
+
+ # Saving all tables
+ check_and_save_tables($tablelist, $localmspdir);
+
+ # Setting the name of the new msp file
+ my $mspfilename = set_mspfilename($allvariables, $mspdir, $languagesarrayref);
+
+ # Editing tables
+ edit_tables($tablelist, $localmspdir, $olddatabase, $newdatabase, $mspfilename, $allvariables, $languagestringref);
+
+ # Adding edited tables into pcp file
+ include_tables_into_pcpfile($fullpcpfilename, $localmspdir, $tablelist);
+
+ # Start msimsp.exe
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Starting msimsp.exe");
+ my $msimsplogfile = execute_msimsp($fullpcpfilename, $mspfilename, $localmspdir);
+
+ # Sign .msp file
+ if ( defined($ENV{'WINDOWS_BUILD_SIGNING'}) && ($ENV{'WINDOWS_BUILD_SIGNING'} eq 'TRUE') )
+ {
+ my $localmspfilename = $mspfilename;
+ $localmspfilename =~ s/\\/\\\\/g;
+ my $systemcall = "signtool.exe sign ";
+ if ( defined($ENV{'PFXFILE'}) ) { $systemcall .= "-f $ENV{'PFXFILE'} "; }
+ if ( defined($ENV{'PFXPASSWORD'}) ) { $systemcall .= "-p $ENV{'PFXPASSWORD'} "; }
+ if ( defined($ENV{'TIMESTAMPURL'}) ) { $systemcall .= "-t $ENV{'TIMESTAMPURL'} "; } else { $systemcall .= "-t http://timestamp.globalsign.com/scripts/timestamp.dll "; }
+ $systemcall .= "-d \"" . $allvariables->{'PRODUCTNAME'} . " " . $allvariables->{'PRODUCTVERSION'} . " Patch " . $allvariables->{'WINDOWSPATCHLEVEL'} . "\" ";
+ $systemcall .= $localmspfilename;
+ installer::logger::print_message( "... code signing and timestamping with signtool.exe ...\n" );
+
+ my $returnvalue = system($systemcall);
+
+ # do not print password to log
+ if ( defined($ENV{'PFXPASSWORD'}) ) { $systemcall =~ s/$ENV{'PFXPASSWORD'}/********/; }
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute \"$systemcall\"!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Success: Executed \"$systemcall\" successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+
+ # Copy final installation set next to msp file
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: Copying installation set");
+ installer::logger::print_message( "... copying installation set ...\n" );
+
+ my $oldinstallationsetpath = $installer::globals::updatedatabasepath;
+
+ if ( $^O =~ /cygwin/i ) { $oldinstallationsetpath =~ s/\\/\//g; }
+
+ installer::pathanalyzer::get_path_from_fullqualifiedname(\$oldinstallationsetpath);
+ installer::systemactions::copy_complete_directory($oldinstallationsetpath, $mspdir);
+
+ # Copying additional patches into the installation set, if required
+ if (( $allvariables->{'ADDITIONALREQUIREDPATCHES'} ) && ( $allvariables->{'ADDITIONALREQUIREDPATCHES'} ne "" ) && ( ! $installer::globals::languagepack ) && ( ! $installer::globals::helppack ))
+ {
+ my $filename = $allvariables->{'ADDITIONALREQUIREDPATCHES'};
+
+ my $fullfilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$filename, $includepatharrayref, 1);
+ if ( $$fullfilenameref eq "" ) { installer::exiter::exit_program("ERROR: Could not find file with required patches, although it is defined: $filename !", "create_msp_patch"); }
+ my $fullfilename = $$fullfilenameref;
+
+ # Reading list file
+ my $listfile = installer::files::read_file($fullfilename);
+
+ # Get name and path of reference database
+ my $requiredpatchfile = get_requiredpatchfile_from_list($listfile, $languagestringref, $fullfilename);
+ if ( $requiredpatchfile eq "" ) { installer::exiter::exit_program("ERROR: Could not find path to required patch in file $fullfilename for language(s) $$languagestringref!", "create_msp_patch"); }
+
+ # Copying patch file
+ installer::systemactions::copy_one_file($requiredpatchfile, $mspdir);
+ # my $infoline = "Copy $requiredpatchfile to $mspdir\n";
+ # push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ # Find all files included into the patch
+ # Analyzing the msimsp log file $msimsplogfile
+ analyze_msimsp_logfile($msimsplogfile, $filesarray);
+
+ # Done
+ installer::logger::include_timestamp_into_logfile("\nPerformance Info: msp creation done");
+
+ return $mspdir;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/property.pm b/solenv/bin/modules/installer/windows/property.pm
new file mode 100644
index 000000000..a385e59a8
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/property.pm
@@ -0,0 +1,566 @@
+#
+# 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 .
+#
+
+package installer::windows::property;
+
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+use installer::windows::language;
+
+#############################################
+# Setting the properties dynamically
+# for the table Property.idt
+#############################################
+
+sub get_arpcomments_for_property_table
+{
+ my ( $allvariables, $languagestringref ) = @_;
+
+ my $name = $allvariables->{'PRODUCTNAME'};
+ my $version = $allvariables->{'PRODUCTVERSION'};
+ my $comment = $name . " " . $version;
+
+ my $postversionextension = "";
+ if ( $allvariables->{'POSTVERSIONEXTENSION'} )
+ {
+ $postversionextension = $allvariables->{'POSTVERSIONEXTENSION'};
+ $comment = $comment . " " . $postversionextension;
+ }
+
+ if ( $installer::globals::languagepack ) { $comment = $comment . " " . "Language Pack"; }
+ elsif ( $installer::globals::helppack ) { $comment = $comment . " " . "Help Pack"; }
+
+ my $languagestring = $$languagestringref;
+ $languagestring =~ s/\_/\,/g;
+ if ( length($languagestring) > 30 ) { $languagestring = "multilanguage"; } # fdo#64053
+
+ $comment = $comment . " ($languagestring)";
+
+ return $comment;
+}
+
+sub get_installlevel_for_property_table
+{
+ my $installlevel = "100";
+ return $installlevel;
+}
+
+sub get_ischeckforproductupdates_for_property_table
+{
+ my $ischeckforproductupdates = "1";
+ return $ischeckforproductupdates;
+}
+
+sub get_manufacturer_for_property_table
+{
+ return $installer::globals::manufacturer;
+}
+
+sub get_productlanguage_for_property_table
+{
+ my ($language) = @_;
+ my $windowslanguage = installer::windows::language::get_windows_language($language);
+ return $windowslanguage;
+}
+
+sub get_language_string
+{
+ my $langstring = "";
+
+ for ( my $i = 0; $i <= $#installer::globals::languagenames; $i++ )
+ {
+ $langstring = $langstring . $installer::globals::languagenames[$i] . ", ";
+ }
+
+ $langstring =~ s/\,\s*$//;
+ $langstring = "(" . $langstring . ")";
+
+ return $langstring;
+}
+
+sub get_english_language_string
+{
+ my $langstring = "";
+
+ # Sorting value not keys, therefore collecting all values
+ my %helper = ();
+ foreach my $lang ( keys %installer::globals::all_required_english_languagestrings )
+ {
+ $helper{$installer::globals::all_required_english_languagestrings{$lang}} = 1;
+ }
+
+ foreach my $lang ( sort keys %helper )
+ {
+ $langstring = $langstring . $lang . ", ";
+ }
+
+ $langstring =~ s/\,\s*$//;
+ $langstring = "(" . $langstring . ")";
+
+ return $langstring;
+}
+
+sub get_productname($$)
+{
+ my ( $language, $allvariables ) = @_;
+
+ my $name = $allvariables->{'PRODUCTNAME'};
+
+ return $name;
+}
+
+sub get_productname_for_property_table($$)
+{
+ my ( $language, $allvariables ) = @_;
+
+ my $name = get_productname ($language, $allvariables);
+ my $version = $allvariables->{'PRODUCTVERSION'};
+ my $productname = $name . " " . $version;
+
+ my $productextension = "";
+ if ( $allvariables->{'PRODUCTEXTENSION'} )
+ {
+ $productextension = $allvariables->{'PRODUCTEXTENSION'};
+ $productname = $productname . $productextension;
+ }
+
+ my $postversionextension = "";
+ if ( $allvariables->{'POSTVERSIONEXTENSION'} )
+ {
+ $postversionextension = $allvariables->{'POSTVERSIONEXTENSION'};
+ $productname = $productname . " " . $postversionextension;
+ }
+
+ if ( $installer::globals::languagepack )
+ {
+ my $langstring = get_english_language_string(); # Example: (English, German)
+ $productname = $name . " " . $version . " Language Pack" . " " . $langstring;
+ }
+ elsif ( $installer::globals::helppack )
+ {
+ my $langstring = get_english_language_string(); # New: (English, German)
+ $productname = $name . " " . $version . " Help Pack" . " " . $langstring;
+ }
+
+ # Saving this name in hash $allvariables for further usage
+ $allvariables->{'PROPERTYTABLEPRODUCTNAME'} = $productname;
+ my $infoline = "Defined variable PROPERTYTABLEPRODUCTNAME: $productname\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ return $productname;
+}
+
+sub get_quickstarterlinkname_for_property_table($$)
+{
+ my ( $language, $allvariables ) = @_;
+
+ # no usage of POSTVERSIONEXTENSION for Quickstarter link name!
+ my $name = get_productname ($language, $allvariables);
+ my $version = $allvariables->{'PRODUCTVERSION'};
+ my $quickstartername = $name . " " . $version;
+
+ my $infoline = "Defined Quickstarter Link name: $quickstartername\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+ return $quickstartername;
+}
+
+sub get_productversion_for_property_table
+{
+ return $installer::globals::msiproductversion;
+}
+
+#######################################################
+# Setting some important properties
+# (for finding the product in deinstallation process)
+#######################################################
+
+sub set_important_properties
+{
+ my ($propertyfile, $allvariables, $languagestringref) = @_;
+
+ # Setting new variables with the content of %PRODUCTNAME and %PRODUCTVERSION
+ if ( $allvariables->{'PRODUCTNAME'} )
+ {
+ my $onepropertyline = "DEFINEDPRODUCT" . "\t" . $allvariables->{'PRODUCTNAME'} . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ if ( $allvariables->{'PRODUCTVERSION'} )
+ {
+ my $onepropertyline = "DEFINEDVERSION" . "\t" . $allvariables->{'PRODUCTVERSION'} . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ if (( $allvariables->{'PRODUCTNAME'} ) && ( $allvariables->{'PRODUCTVERSION'} ) && ( $allvariables->{'REGISTRYLAYERNAME'} ))
+ {
+ my $onepropertyline = "FINDPRODUCT" . "\t" . "Software\\LibreOffice" . "\\" . $allvariables->{'REGISTRYLAYERNAME'} . "\\" . $allvariables->{'PRODUCTNAME'} . "\\" . $allvariables->{'PRODUCTVERSION'} . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ if ( $allvariables->{'PRODUCTMAJOR'} )
+ {
+ my $onepropertyline = "PRODUCTMAJOR" . "\t" . $allvariables->{'PRODUCTMAJOR'} . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ if ( $allvariables->{'PRODUCTBUILDID'} )
+ {
+ my $onepropertyline = "PRODUCTBUILDID" . "\t" . $allvariables->{'PRODUCTBUILDID'} . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ if ( $allvariables->{'URELAYERVERSION'} )
+ {
+ my $onepropertyline = "URELAYERVERSION" . "\t" . $allvariables->{'URELAYERVERSION'} . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ if ( $allvariables->{'BRANDPACKAGEVERSION'} )
+ {
+ my $onepropertyline = "BRANDPACKAGEVERSION" . "\t" . $allvariables->{'BRANDPACKAGEVERSION'} . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ if ( $allvariables->{'EXCLUDE_FROM_REBASE'} )
+ {
+ my $onepropertyline = "EXCLUDE_FROM_REBASE" . "\t" . $allvariables->{'EXCLUDE_FROM_REBASE'} . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ if ( $allvariables->{'PREREQUIREDPATCH'} )
+ {
+ my $onepropertyline = "PREREQUIREDPATCH" . "\t" . $allvariables->{'PREREQUIREDPATCH'} . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ my $onepropertyline = "IGNOREPREREQUIREDPATCH" . "\t" . "1" . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+
+ $onepropertyline = "DONTOPTIMIZELIBS" . "\t" . "0" . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+
+ if ( $installer::globals::officedirhostname )
+ {
+ my $onepropertyline = "OFFICEDIRHOSTNAME" . "\t" . $installer::globals::officedirhostname . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+
+ my $localofficedirhostname = $installer::globals::officedirhostname;
+ $localofficedirhostname =~ s/\//\\/g;
+ $onepropertyline = "OFFICEDIRHOSTNAME_" . "\t" . $localofficedirhostname . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ if ( $installer::globals::desktoplinkexists )
+ {
+ my $onepropertyline = "DESKTOPLINKEXISTS" . "\t" . "1" . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+
+ $onepropertyline = "CREATEDESKTOPLINK" . "\t" . "1" . "\n"; # Setting the default
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ if ( $installer::globals::languagepack )
+ {
+ my $onepropertyline = "ISLANGUAGEPACK" . "\t" . "1" . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+ elsif ( $installer::globals::helppack )
+ {
+ my $onepropertyline = "ISHELPPACK" . "\t" . "1" . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ my $languagesline = "PRODUCTALLLANGUAGES" . "\t" . $$languagestringref . "\n";
+ push(@{$propertyfile}, $languagesline);
+
+ if (( $allvariables->{'PRODUCTEXTENSION'} ) && ( $allvariables->{'PRODUCTEXTENSION'} eq "Beta" ))
+ {
+ # my $registryline = "WRITE_REGISTRY" . "\t" . "0" . "\n";
+ # push(@{$propertyfile}, $registryline);
+ my $betainfoline = "BETAPRODUCT" . "\t" . "1" . "\n";
+ push(@{$propertyfile}, $betainfoline);
+ }
+ elsif ( $allvariables->{'DEVELOPMENTPRODUCT'} )
+ {
+ my $registryline = "WRITE_REGISTRY" . "\t" . "0" . "\n";
+ push(@{$propertyfile}, $registryline);
+ }
+ else
+ {
+ my $registryline = "WRITE_REGISTRY" . "\t" . "1" . "\n"; # Default: Write complete registry
+ push(@{$propertyfile}, $registryline);
+ }
+
+ # Adding also used tree conditions for multilayer products.
+ # These are saved in %installer::globals::usedtreeconditions
+ foreach my $treecondition (keys %installer::globals::usedtreeconditions)
+ {
+ my $onepropertyline = $treecondition . "\t" . "1" . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ # No more license dialog for selected products
+ if ( $allvariables->{'HIDELICENSEDIALOG'} )
+ {
+ my $onepropertyline = "HIDEEULA" . "\t" . "1" . "\n";
+
+ my $already_defined = 0;
+
+ for ( my $i = 0; $i <= $#{$propertyfile}; $i++ )
+ {
+ if ( ${$propertyfile}[$i] =~ /^\s*HIDEEULA\t/ )
+ {
+ ${$propertyfile}[$i] = $onepropertyline;
+ $already_defined = 1;
+ last;
+ }
+ }
+
+ if ( ! $already_defined )
+ {
+ push(@{$propertyfile}, $onepropertyline);
+ }
+ }
+}
+
+#######################################################
+# Setting properties needed for ms file type registration
+#######################################################
+
+sub set_ms_file_types_properties
+{
+ my ($propertyfile) = @_;
+
+# we do not register PPSM, PPAM, and XLAM file types in
+# setup_native\source\win32\customactions\reg4allmsdoc\reg4allmsi.cxx
+# (probably because LibreOffice can't deal with them properly (?)
+
+ push(@{$propertyfile}, "REGISTER_PPS" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_PPSX" . "\t" . "0" . "\n");
+# push(@{$propertyfile}, "REGISTER_PPSM" . "\t" . "0" . "\n");
+# push(@{$propertyfile}, "REGISTER_PPAM" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_PPT" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_PPTX" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_PPTM" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_POT" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_POTX" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_POTM" . "\t" . "0" . "\n");
+
+ push(@{$propertyfile}, "REGISTER_DOC" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_DOCX" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_DOCM" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_DOT" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_DOTX" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_DOTM" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_RTF" . "\t" . "0" . "\n");
+
+ push(@{$propertyfile}, "REGISTER_XLS" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_XLSX" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_XLSM" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_XLSB" . "\t" . "0" . "\n");
+# push(@{$propertyfile}, "REGISTER_XLAM" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_XLT" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_XLTX" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_XLTM" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_IQY" . "\t" . "0" . "\n");
+
+ push(@{$propertyfile}, "REGISTER_NO_MSO_TYPES" . "\t" . "0" . "\n");
+ push(@{$propertyfile}, "REGISTER_ALL_MSO_TYPES" . "\t" . "0" . "\n");
+}
+
+####################################################################################
+# Updating the file Property.idt dynamically
+# Content:
+# Property Value
+####################################################################################
+
+sub update_property_table
+{
+ my ($basedir, $language, $allvariables, $languagestringref) = @_;
+
+ my $properyfilename = $basedir . $installer::globals::separator . "Property.idt";
+
+ my $propertyfile = installer::files::read_file($properyfilename);
+
+ my $hasarpnomodify = 0;
+
+ # Getting the new values
+ # Some values (arpcomments, arpcontacts, ...) are inserted from the Property.mlf
+
+ my $arpcomments = get_arpcomments_for_property_table($allvariables, $languagestringref);
+ my $installlevel = get_installlevel_for_property_table();
+ my $ischeckforproductupdates = get_ischeckforproductupdates_for_property_table();
+ my $manufacturer = get_manufacturer_for_property_table();
+ my $productlanguage = get_productlanguage_for_property_table($language);
+ my $productname = get_productname_for_property_table($language, $allvariables);
+ my $productversion = get_productversion_for_property_table();
+ my $quickstarterlinkname = get_quickstarterlinkname_for_property_table($language, $allvariables);
+ my $windowsminversiontext = "Windows 7 SP1";
+ my $windowsminversionnumber = "601";
+ my $windowsminspnumber = "1";
+
+ # Updating the values
+
+ for ( my $i = 0; $i <= $#{$propertyfile}; $i++ )
+ {
+ ${$propertyfile}[$i] =~ s/\bARPCOMMENTSTEMPLATE\b/$arpcomments/;
+ ${$propertyfile}[$i] =~ s/\bINSTALLLEVELTEMPLATE\b/$installlevel/;
+ ${$propertyfile}[$i] =~ s/\bISCHECKFORPRODUCTUPDATESTEMPLATE\b/$ischeckforproductupdates/;
+ ${$propertyfile}[$i] =~ s/\bMANUFACTURERTEMPLATE\b/$manufacturer/;
+ ${$propertyfile}[$i] =~ s/\bPRODUCTLANGUAGETEMPLATE\b/$productlanguage/;
+ ${$propertyfile}[$i] =~ s/\bPRODUCTNAMETEMPLATE\b/$productname/;
+ ${$propertyfile}[$i] =~ s/\bPRODUCTVERSIONTEMPLATE\b/$productversion/;
+ ${$propertyfile}[$i] =~ s/\bQUICKSTARTERLINKNAMETEMPLATE\b/$quickstarterlinkname/;
+ ${$propertyfile}[$i] =~ s/\bWINDOWSMINVERSIONTEXTTEMPLATE\b/$windowsminversiontext/;
+ ${$propertyfile}[$i] =~ s/\bWINDOWSMINVERSIONNUMBERTEMPLATE\b/$windowsminversionnumber/;
+ ${$propertyfile}[$i] =~ s/\bWINDOWSMINSPNUMBERTEMPLATE\b/$windowsminspnumber/;
+ if ( ${$propertyfile}[$i] =~ m/\bARPNOMODIFY\b/ ) { $hasarpnomodify = 1; }
+ }
+
+ # Check if are building silent MSI
+ if ( $ENV{ENABLE_SILENT_MSI} eq "TRUE" )
+ {
+ push(@{$propertyfile}, "LIMITUI" . "\t" . "1" . "\n");
+ if ( !($hasarpnomodify) )
+ {
+ push(@{$propertyfile}, "ARPNOMODIFY" . "\t" . "1" . "\n");
+ }
+ }
+
+ # Setting variables into propertytable
+ set_important_properties($propertyfile, $allvariables, $languagestringref);
+
+ # Setting variables for register for ms file types
+ set_ms_file_types_properties($propertyfile);
+
+ # Saving the file
+
+ installer::files::save_file($properyfilename ,$propertyfile);
+ my $infoline = "Updated idt file: $properyfilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+####################################################################################
+# Setting language specific Properties in file Property.idt dynamically
+# Adding:
+# isMulti = 1
+####################################################################################
+
+sub set_languages_in_property_table
+{
+ my ($basedir, $languagesarrayref) = @_;
+
+ my $properyfilename = $basedir . $installer::globals::separator . "Property.idt";
+ my $propertyfile = installer::files::read_file($properyfilename);
+
+ # Setting the info about multilingual installation in property "isMulti"
+
+ my $propertyname = "isMulti";
+ my $ismultivalue = 0;
+
+ if ( $installer::globals::ismultilingual ) { $ismultivalue = 1; }
+
+ my $onepropertyline = $propertyname . "\t" . $ismultivalue . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+
+ # setting the ARPPRODUCTICON
+
+ if ($installer::globals::sofficeiconadded) # set in shortcut.pm
+ {
+ $onepropertyline = "ARPPRODUCTICON" . "\t" . "soffice.ico" . "\n";
+ push(@{$propertyfile}, $onepropertyline);
+ }
+
+ # Saving the file
+
+ installer::files::save_file($properyfilename ,$propertyfile);
+ my $infoline = "Added language content into idt file: $properyfilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+############################################################
+# Setting the ProductCode and the UpgradeCode
+# into the Property table. Both have to be stored
+# in the global file $installer::globals::codefilename
+############################################################
+
+sub set_codes_in_property_table
+{
+ my ($basedir) = @_;
+
+ # Reading the property file
+
+ my $properyfilename = $basedir . $installer::globals::separator . "Property.idt";
+ my $propertyfile = installer::files::read_file($properyfilename);
+
+ # Updating the values
+
+ for ( my $i = 0; $i <= $#{$propertyfile}; $i++ )
+ {
+ ${$propertyfile}[$i] =~ s/\bPRODUCTCODETEMPLATE\b/$installer::globals::productcode/;
+ ${$propertyfile}[$i] =~ s/\bUPGRADECODETEMPLATE\b/$installer::globals::upgradecode/;
+ }
+
+ # Saving the property file
+
+ installer::files::save_file($properyfilename ,$propertyfile);
+ my $infoline = "Added language content into idt file: $properyfilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+############################################################
+# Changing default for MS file type registration
+# in Beta products.
+############################################################
+
+sub update_checkbox_table
+{
+ my ($basedir, $allvariables) = @_;
+
+ if (( $allvariables->{'PRODUCTEXTENSION'} ) && ( $allvariables->{'PRODUCTEXTENSION'} eq "Beta" ))
+ {
+ my $checkboxfilename = $basedir . $installer::globals::separator . "CheckBox.idt";
+
+ if ( -f $checkboxfilename )
+ {
+ my $checkboxfile = installer::files::read_file($checkboxfilename);
+
+ my $checkboxline = "SELECT_WORD" . "\t" . "0" . "\n";
+ push(@{$checkboxfile}, $checkboxline);
+ $checkboxline = "SELECT_EXCEL" . "\t" . "0" . "\n";
+ push(@{$checkboxfile}, $checkboxline);
+ $checkboxline = "SELECT_POWERPOINT" . "\t" . "0" . "\n";
+ push(@{$checkboxfile}, $checkboxline);
+ $checkboxline = "SELECT_VISIO" . "\t" . "0" . "\n";
+ push(@{$checkboxfile}, $checkboxline);
+
+ # Saving the property file
+ installer::files::save_file($checkboxfilename ,$checkboxfile);
+ my $infoline = "Added ms file type defaults into idt file: $checkboxfilename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/registry.pm b/solenv/bin/modules/installer/windows/registry.pm
new file mode 100644
index 000000000..f7136b887
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/registry.pm
@@ -0,0 +1,407 @@
+#
+# 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 .
+#
+
+package installer::windows::registry;
+
+use installer::files;
+use installer::globals;
+use installer::worker;
+use installer::windows::msiglobal;
+use installer::windows::idtglobal;
+
+#####################################################
+# Generating the component name from a registryitem
+#####################################################
+
+sub get_registry_component_name
+{
+ my ($registryref, $allvariables) = @_;
+
+ # In this function exists the rule to create components from registryitems
+ # Rule:
+ # The componentname can be directly taken from the ModuleID.
+ # All registryitems belonging to one module can get the same component.
+
+ my $componentname = "";
+ my $isrootmodule = 0;
+
+ if ( $registryref->{'ModuleID'} ) { $componentname = $registryref->{'ModuleID'}; }
+
+ $componentname =~ s/\\/\_/g;
+ $componentname =~ s/\//\_/g;
+ $componentname =~ s/\-/\_/g;
+ $componentname =~ s/\_\s*$//g;
+
+ $componentname = lc($componentname); # componentnames always lowercase
+
+ if ( $componentname eq "gid_module_root" ) { $isrootmodule = 1; }
+
+ # Attention: Maximum length for the componentname is 72
+
+ # identifying this component as registryitem component
+ $componentname = "registry_" . $componentname;
+
+ $componentname =~ s/gid_module_/g_m_/g;
+ $componentname =~ s/_optional_/_o_/g;
+
+ # This componentname must be more specific
+ my $addon = "_";
+ if ( $allvariables->{'PRODUCTNAME'} ) { $addon = $addon . $allvariables->{'PRODUCTNAME'}; }
+ if ( $allvariables->{'PRODUCTVERSION'} ) { $addon = $addon . $allvariables->{'PRODUCTVERSION'}; }
+ $addon = lc($addon);
+ $addon =~ s/ //g;
+ $addon =~ s/-//g;
+ $addon =~ s/\.//g;
+
+ my $styles = "";
+ if ( $registryref->{'Styles'} ) { $styles = $registryref->{'Styles'}; }
+
+ # Layer links must have unique Component GUID for all products. This is necessary, because only the
+ # uninstallation of the last product has to delete registry keys.
+ if ( $styles =~ /\bLAYER_REGISTRY\b/ )
+ {
+ $componentname = "g_m_root_registry_layer_ooo_reglayer";
+ # Styles USE_URELAYERVERSION, USE_PRODUCTVERSION
+ if ( $styles =~ /\bUSE_URELAYERVERSION\b/ ) { $addon = "_ure_" . $allvariables->{'URELAYERVERSION'}; }
+ if ( $styles =~ /\bUSE_PRODUCTVERSION\b/ ) { $addon = "_basis_" . $allvariables->{'PRODUCTVERSION'}; }
+ $addon =~ s/\.//g;
+ }
+
+ $componentname = $componentname . $addon;
+
+ if (( $styles =~ /\bLANGUAGEPACK\b/ ) && ( $installer::globals::languagepack )) { $componentname = $componentname . "_lang"; }
+ elsif (( $styles =~ /\bHELPPACK\b/ ) && ( $installer::globals::helppack )) { $componentname = $componentname . "_help"; }
+ if ( $styles =~ /\bALWAYS_REQUIRED\b/ ) { $componentname = $componentname . "_forced"; }
+
+ # Attention: Maximum length for the componentname is 72
+ # %installer::globals::allregistrycomponents_in_this_database_ : resetted for each database
+ # %installer::globals::allregistrycomponents_ : not resetted for each database
+ # Component strings must be unique for the complete product, because they are used for
+ # the creation of the globally unique identifier.
+
+ my $fullname = $componentname; # This can be longer than 72
+
+ if (( exists($installer::globals::allregistrycomponents_{$fullname}) ) && ( ! exists($installer::globals::allregistrycomponents_in_this_database_{$fullname}) ))
+ {
+ # This is not allowed: One component cannot be installed with different packages.
+ installer::exiter::exit_program("ERROR: Windows registry component \"$fullname\" is already included into another package. This is not allowed.", "get_registry_component_name");
+ }
+
+ if ( exists($installer::globals::allregistrycomponents_{$fullname}) )
+ {
+ $componentname = $installer::globals::allregistrycomponents_{$fullname};
+ }
+ else
+ {
+ if ( length($componentname) > 70 )
+ {
+ $componentname = generate_new_short_registrycomponentname($componentname); # This has to be unique for the complete product, not only one package
+ }
+
+ $installer::globals::allregistrycomponents_{$fullname} = $componentname;
+ $installer::globals::allregistrycomponents_in_this_database_{$fullname} = 1;
+ }
+
+ if ( $isrootmodule ) { $installer::globals::registryrootcomponent = $componentname; }
+
+ return $componentname;
+}
+
+#########################################################
+# Create a shorter version of a long component name,
+# because maximum length in msi database is 72.
+# Attention: In multi msi installation sets, the short
+# names have to be unique over all packages, because
+# this string is used to create the globally unique id
+# -> no resetting of
+# %installer::globals::allshortregistrycomponents
+# after a package was created.
+#########################################################
+
+sub generate_new_short_registrycomponentname
+{
+ my ($componentname) = @_;
+
+ my $startversion = substr($componentname, 0, 60); # taking only the first 60 characters
+ my $subid = installer::windows::msiglobal::calculate_id($componentname, 9); # taking only the first 9 digits
+ my $shortcomponentname = $startversion . "_" . $subid;
+
+ if ( exists($installer::globals::allshortregistrycomponents{$shortcomponentname}) ) { installer::exiter::exit_program("Failed to create unique component name: \"$shortcomponentname\"", "generate_new_short_registrycomponentname"); }
+
+ $installer::globals::allshortregistrycomponents{$shortcomponentname} = 1;
+
+ return $shortcomponentname;
+}
+
+##############################################################
+# Returning identifier for registry table.
+##############################################################
+
+sub get_registry_identifier
+{
+ my ($registry) = @_;
+
+ my $identifier = "";
+
+ if ( $registry->{'gid'} ) { $identifier = $registry->{'gid'}; }
+
+ $identifier = lc($identifier); # always lower case
+
+ # Attention: Maximum length is 72
+
+ $identifier =~ s/gid_regitem_/g_r_/;
+ $identifier =~ s/_soffice_/_s_/;
+ $identifier =~ s/_clsid_/_c_/;
+ $identifier =~ s/_currentversion_/_cv_/;
+ $identifier =~ s/_microsoft_/_ms_/;
+ $identifier =~ s/_manufacturer_/_mf_/;
+ $identifier =~ s/_productname_/_pn_/;
+ $identifier =~ s/_productversion_/_pv_/;
+ $identifier =~ s/_staroffice_/_so_/;
+ $identifier =~ s/_software_/_sw_/;
+ $identifier =~ s/_capabilities_/_cap_/;
+ $identifier =~ s/_classpath_/_cp_/;
+ $identifier =~ s/_extension_/_ex_/;
+ $identifier =~ s/_fileassociations_/_fa_/;
+ $identifier =~ s/_propertysheethandlers_/_psh_/;
+ $identifier =~ s/__/_/g;
+
+ # Saving this in the registry collector
+
+ $registry->{'uniquename'} = $identifier;
+
+ return $identifier;
+}
+
+##################################################################
+# Returning root value for registry table.
+##################################################################
+
+sub get_registry_root
+{
+ my ($registry) = @_;
+
+ my $rootvalue = 0; # Default: Parent is KKEY_CLASSES_ROOT
+ my $scproot = "";
+
+ if ( $registry->{'ParentID'} ) { $scproot = $registry->{'ParentID'}; }
+
+ if ( $scproot eq "PREDEFINED_HKEY_LOCAL_MACHINE" ) { $rootvalue = -1; }
+
+ if ( $scproot eq "PREDEFINED_HKEY_CLASSES_ROOT" ) { $rootvalue = 0; }
+
+ if ( $scproot eq "PREDEFINED_HKEY_CURRENT_USER_ONLY" ) { $rootvalue = 1; }
+
+ if ( $scproot eq "PREDEFINED_HKEY_LOCAL_MACHINE_ONLY" ) { $rootvalue = 2; }
+
+ return $rootvalue;
+}
+
+##############################################################
+# Returning key for registry table.
+##############################################################
+
+sub get_registry_key
+{
+ my ($registry, $allvariableshashref) = @_;
+
+ my $key = "";
+
+ if ( $registry->{'Subkey'} ) { $key = $registry->{'Subkey'}; }
+
+ if ( $key =~ /\%/ ) { $key = installer::worker::replace_variables_in_string($key, $allvariableshashref); }
+
+ return $key;
+}
+
+##############################################################
+# Returning name for registry table.
+##############################################################
+
+sub get_registry_name
+{
+ my ($registry, $allvariableshashref) = @_;
+
+ my $name = "";
+
+ if ( $registry->{'Name'} ) { $name = $registry->{'Name'}; }
+
+ if ( $name =~ /\%/ ) { $name = installer::worker::replace_variables_in_string($name, $allvariableshashref); }
+
+ return $name;
+}
+
+##############################################################
+# Returning value for registry table.
+##############################################################
+
+sub get_registry_value
+{
+ my ($registry, $allvariableshashref) = @_;
+
+ my $value = "";
+
+ if ( $registry->{'Value'} ) { $value = $registry->{'Value'}; }
+
+ $value =~ s/\\\"/\"/g; # no more masquerading of '"'
+ $value =~ s/\\\\\s*$/\\/g; # making "\\" at end of value to "\"
+ $value =~ s/\<progpath\>/\[INSTALLLOCATION\]/;
+ $value =~ s/\[INSTALLLOCATION\]\\/\[INSTALLLOCATION\]/; # removing "\" after "[INSTALLLOCATION]"
+
+ if ( $value =~ /\%/ ) { $value = installer::worker::replace_variables_in_string($value, $allvariableshashref); }
+
+ return $value;
+}
+
+##############################################################
+# Returning component for registry table.
+##############################################################
+
+sub get_registry_component
+{
+ my ($registry, $allvariables) = @_;
+
+ # All registry items belonging to one module can
+ # be included into one component
+
+ my $componentname = get_registry_component_name($registry, $allvariables);
+
+ # saving componentname in the registryitem collector
+
+ $registry->{'componentname'} = $componentname;
+
+ return $componentname;
+}
+
+######################################################
+# Adding the content of
+# @installer::globals::userregistrycollector
+# to the registry table. The content was collected
+# in create_files_table() in file.pm.
+######################################################
+
+sub add_userregs_to_registry_table
+{
+ my ( $registrytable, $allvariables ) = @_;
+
+ for ( my $i = 0; $i <= $#installer::globals::userregistrycollector; $i++ )
+ {
+ my $onefile = $installer::globals::userregistrycollector[$i];
+
+ my %registry = ();
+
+ $registry{'Registry'} = $onefile->{'userregkeypath'};
+ $registry{'Root'} = "1"; # always HKCU
+ $registry{'Key'} = "Software\\$allvariables->{'MANUFACTURER'}\\$allvariables->{'PRODUCTNAME'} $allvariables->{'PRODUCTVERSION'}\\";
+ if ( $onefile->{'needs_user_registry_key'} ) { $registry{'Key'} = $registry{'Key'} . "StartMenu"; }
+ $registry{'Name'} = $onefile->{'Name'};
+ $registry{'Value'} = "1";
+ $registry{'Component_'} = $onefile->{'componentname'};
+
+ my $oneline = $registry{'Registry'} . "\t" . $registry{'Root'} . "\t" . $registry{'Key'} . "\t"
+ . $registry{'Name'} . "\t" . $registry{'Value'} . "\t" . $registry{'Component_'} . "\n";
+
+ push(@{$registrytable}, $oneline);
+ }
+}
+
+######################################################
+# Creating the file Registry.idt dynamically
+# Content:
+# Registry Root Key Name Value Component_
+######################################################
+
+sub create_registry_table
+{
+ my ($registryref, $allregistrycomponentsref, $basedir, $languagesarrayref, $allvariableshashref) = @_;
+
+ for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ )
+ {
+ my $onelanguage = ${$languagesarrayref}[$m];
+
+ my @registrytable = ();
+
+ installer::windows::idtglobal::write_idt_header(\@registrytable, "registry");
+
+ for ( my $i = 0; $i <= $#{$registryref}; $i++ )
+ {
+ my $oneregistry = ${$registryref}[$i];
+
+ # Controlling the language!
+ # Only language independent folderitems or folderitems with the correct language
+ # will be included into the table
+
+ if (! (!(( $oneregistry->{'ismultilingual'} )) || ( $oneregistry->{'specificlanguage'} eq $onelanguage )) ) { next; }
+
+ my %registry = ();
+
+ $registry{'Registry'} = get_registry_identifier($oneregistry);
+ $registry{'Root'} = get_registry_root($oneregistry);
+ $registry{'Key'} = get_registry_key($oneregistry, $allvariableshashref);
+ $registry{'Name'} = get_registry_name($oneregistry, $allvariableshashref);
+ $registry{'Value'} = get_registry_value($oneregistry, $allvariableshashref);
+ $registry{'Component_'} = get_registry_component($oneregistry, $allvariableshashref);
+
+ # Collecting all components
+ if (! grep {$_ eq $registry{'Component_'}} @{$allregistrycomponentsref})
+ {
+ push(@{$allregistrycomponentsref}, $registry{'Component_'});
+ }
+
+ my $style = "";
+ if ( $oneregistry->{'Styles'} ) { $style = $oneregistry->{'Styles'}; }
+ # Collecting all registry components with ALWAYS_REQUIRED style
+ if ( ! ( $style =~ /\bALWAYS_REQUIRED\b/ ))
+ {
+ # Setting a component condition for unforced registry components!
+ # Only write into registry, if WRITE_REGISTRY is set.
+ if ( $oneregistry->{'ComponentCondition'} ) { $oneregistry->{'ComponentCondition'} = "(" . $oneregistry->{'ComponentCondition'} . ") AND (WRITE_REGISTRY=1)"; }
+ else { $oneregistry->{'ComponentCondition'} = "WRITE_REGISTRY=1"; }
+ }
+
+ # Collecting all component conditions
+ if ( $oneregistry->{'ComponentCondition'} )
+ {
+ if ( ! exists($installer::globals::componentcondition{$registry{'Component_'}}))
+ {
+ $installer::globals::componentcondition{$registry{'Component_'}} = $oneregistry->{'ComponentCondition'};
+ }
+ }
+
+ my $oneline = $registry{'Registry'} . "\t" . $registry{'Root'} . "\t" . $registry{'Key'} . "\t"
+ . $registry{'Name'} . "\t" . $registry{'Value'} . "\t" . $registry{'Component_'} . "\n";
+
+ push(@registrytable, $oneline);
+ }
+
+ # If there are added user registry keys for files collected in
+ # @installer::globals::userregistrycollector (file.pm), then
+ # this registry keys have to be added now.
+
+ if ( $installer::globals::addeduserregitrykeys ) { add_userregs_to_registry_table(\@registrytable, $allvariableshashref); }
+
+ # Saving the file
+
+ my $registrytablename = $basedir . $installer::globals::separator . "Registry.idt" . "." . $onelanguage;
+ installer::files::save_file($registrytablename ,\@registrytable);
+ my $infoline = "Created idt file: $registrytablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/removefile.pm b/solenv/bin/modules/installer/windows/removefile.pm
new file mode 100644
index 000000000..21197f694
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/removefile.pm
@@ -0,0 +1,141 @@
+#
+# 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 .
+#
+
+package installer::windows::removefile;
+
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+
+########################################################################
+# Returning the FileKey for a folderitem for removefile table.
+########################################################################
+
+sub get_removefile_filekey
+{
+ my ($folderitem) = @_;
+
+ # returning the unique identifier
+
+ my $identifier = "remove_" . $folderitem->{'directory'};
+
+ $identifier = lc($identifier);
+
+ return $identifier;
+}
+
+########################################################################
+# Returning the Component for a folderitem for removefile table.
+########################################################################
+
+sub get_removefile_component
+{
+ my ($folderitem) = @_;
+
+ return $folderitem->{'component'};
+}
+
+########################################################################
+# Returning the FileName for a folderitem for removefile table.
+########################################################################
+
+sub get_removefile_filename
+{
+ my ($folderitem) = @_;
+
+ # return nothing: The assigned directory will be removed
+
+ return "";
+}
+
+########################################################################
+# Returning the DirProperty for a folderitem for removefile table.
+########################################################################
+
+sub get_removefile_dirproperty
+{
+ my ($folderitem) = @_;
+
+ return $folderitem->{'directory'};
+}
+
+########################################################################
+# Returning the InstallMode for a folderitem for removefile table.
+########################################################################
+
+sub get_removefile_installmode
+{
+ my ($folderitem) = @_;
+
+ # always returning "2": The file is only removed, if the assigned
+ # component is removed. Name: msidbRemoveFileInstallModeOnRemove
+
+ return 2;
+}
+
+###########################################################################################################
+# Creating the file RemoveFi.idt dynamically
+# Content:
+# FileKey Component_ FileName DirProperty InstallMode
+###########################################################################################################
+
+sub create_removefile_table
+{
+ my ($folderitemsref, $basedir) = @_;
+
+ # Only the directories created for the FolderItems have to be deleted
+ # with the information in the table RemoveFile
+
+ my @directorycollector = ();
+
+ for ( my $i = 0; $i <= $#{$folderitemsref}; $i++ )
+ {
+ my $onelink = ${$folderitemsref}[$i];
+
+ if ( $onelink->{'used'} == 0 ) { next; }
+
+ next if grep {$_ eq $onelink->{'directory'}} @directorycollector;
+
+ push(@directorycollector, $onelink->{'directory'});
+
+ my %removefile = ();
+
+ $removefile{'FileKey'} = get_removefile_filekey($onelink);
+ $removefile{'Component_'} = get_removefile_component($onelink);
+ $removefile{'FileName'} = get_removefile_filename($onelink);
+ $removefile{'DirProperty'} = get_removefile_dirproperty($onelink);
+ # fdo#44565 do not remove empty Desktop folder
+ if ( $removefile{'DirProperty'} eq $installer::globals::desktopfolder ) { next; }
+ $removefile{'InstallMode'} = get_removefile_installmode($onelink);
+
+ my $oneline = $removefile{'FileKey'} . "\t" . $removefile{'Component_'} . "\t" . $removefile{'FileName'} . "\t"
+ . $removefile{'DirProperty'} . "\t" . $removefile{'InstallMode'} . "\n";
+
+ push(@installer::globals::removefiletable, $oneline);
+ }
+
+ # Saving the file
+
+ my $removefiletablename = $basedir . $installer::globals::separator . "RemoveFi.idt";
+ installer::files::save_file($removefiletablename ,\@installer::globals::removefiletable);
+ my $infoline = "Created idt file: $removefiletablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/shortcut.pm b/solenv/bin/modules/installer/windows/shortcut.pm
new file mode 100644
index 000000000..c3469085c
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/shortcut.pm
@@ -0,0 +1,659 @@
+#
+# 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 .
+#
+
+package installer::windows::shortcut;
+
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+
+##############################################################
+# Returning identifier for shortcut table.
+##############################################################
+
+sub get_shortcut_identifier
+{
+ my ($shortcut) = @_;
+
+ my $identifier = $shortcut->{'gid'};
+
+ return $identifier;
+}
+
+##############################################################
+# Returning directory for shortcut table.
+##############################################################
+
+sub get_shortcut_directory
+{
+ my ($shortcut, $dirref) = @_;
+
+ # For shortcuts it is easy to convert the gid_Dir_Abc into the unique name in
+ # the directory table, for instance help_en_simpressidx.
+ # For files (components) this is not so easy, because files can be included
+ # in zip files with subdirectories that are not defined in scp.
+
+ my $onedir;
+ my $shortcutdirectory = $shortcut->{'Dir'};
+ my $directory = "";
+ my $found = 0;
+
+ for ( my $i = 0; $i <= $#{$dirref}; $i++ )
+ {
+ $onedir = ${$dirref}[$i];
+ my $directorygid = $onedir->{'Dir'};
+
+ if ( $directorygid eq $shortcutdirectory )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ installer::exiter::exit_program("ERROR: Did not find DirectoryID $shortcutdirectory in directory collection for shortcut", "get_shortcut_directory");
+ }
+
+ $directory = $onedir->{'uniquename'};
+
+ if ($directory eq "") { $directory = "INSTALLLOCATION"; } # Shortcuts in the root directory
+
+ return $directory;
+}
+
+##############################################################
+# Returning name for shortcut table.
+##############################################################
+
+sub get_shortcut_name
+{
+ my ($shortcut, $shortnamesref, $onelanguage) = @_;
+
+ my $returnstring;
+
+ my $name = $shortcut->{'Name'};
+
+ my $shortstring = installer::windows::idtglobal::make_eight_three_conform($name, "shortcut", $shortnamesref);
+ $shortstring =~ s/\s/\_/g; # replacing white spaces with underline
+
+ if ( $shortstring eq $name ) { $returnstring = $name; } # nothing changed
+ else {$returnstring = $shortstring . "\|" . $name; }
+
+ return $returnstring;
+}
+
+##############################################################
+# Returning component for shortcut table.
+##############################################################
+
+sub get_shortcut_component
+{
+ my ($shortcut, $filesref) = @_;
+
+ my $onefile;
+ my $component = "";
+ my $found = 0;
+ my $shortcut_fileid = $shortcut->{'FileID'};
+
+ my $absolute_filename = 0;
+ if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; }
+ if ( $styles =~ /\bABSOLUTE_FILENAME\b/ ) { $absolute_filename = 1; } # FileID contains an absolute filename
+ if ( $styles =~ /\bUSE_HELPER_FILENAME\b/ ) { $absolute_filename = 1; } # ComponentIDFile contains id of a helper file
+
+ # if the FileID contains an absolute filename, therefore the entry for "ComponentIDFile" has to be used.
+ if ( $absolute_filename ) { $shortcut_fileid = $shortcut->{'ComponentIDFile'}; }
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ $onefile = ${$filesref}[$i];
+ my $filegid = $onefile->{'gid'};
+
+ if ( $filegid eq $shortcut_fileid )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ installer::exiter::exit_program("ERROR: Did not find FileID $shortcut_fileid in file collection for shortcut", "get_shortcut_component");
+ }
+
+ $component = $onefile->{'componentname'};
+
+ # finally saving the componentname in the folderitem collector
+
+ $shortcut->{'component'} = $component;
+
+ return $component;
+}
+
+##############################################################
+# Returning target for shortcut table.
+##############################################################
+
+sub get_shortcut_target
+{
+ my ($shortcut, $filesref) = @_;
+
+ my $target = "";
+ my $found = 0;
+ my $shortcut_fileid = $shortcut->{'FileID'};
+ my $onefile;
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ $onefile = ${$filesref}[$i];
+ my $filegid = $onefile->{'gid'};
+
+ if ( $filegid eq $shortcut_fileid )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ installer::exiter::exit_program("ERROR: Did not find FileID $shortcut_fileid in file collection for shortcut", "get_shortcut_target");
+ }
+
+ if ( $onefile->{'Name'} )
+ {
+ $target = $onefile->{'Name'};
+ }
+
+ $target = "\[\#" . $target . "\]"; # format for Non-Advertised shortcuts
+
+ return $target;
+}
+
+##############################################################
+# Returning arguments for shortcut table.
+##############################################################
+
+sub get_shortcut_arguments
+{
+ my ($shortcut) = @_;
+
+ return "";
+}
+
+##############################################################
+# Returning the localized description for shortcut table.
+##############################################################
+
+sub get_shortcut_description
+{
+ my ($shortcut, $onelanguage) = @_;
+
+ my $description = "";
+ if ( $shortcut->{'Tooltip'} ) { $description = $shortcut->{'Tooltip'}; }
+ $description =~ s/\\\"/\"/g; # no more masquerading of '"'
+
+ return $description;
+}
+
+##############################################################
+# Returning hotkey for shortcut table.
+##############################################################
+
+sub get_shortcut_hotkey
+{
+ my ($shortcut) = @_;
+
+ return "";
+}
+
+##############################################################
+# Returning icon for shortcut table.
+##############################################################
+
+sub get_shortcut_icon
+{
+ my ($shortcut) = @_;
+
+ return "";
+}
+
+##############################################################
+# Returning iconindex for shortcut table.
+##############################################################
+
+sub get_shortcut_iconindex
+{
+ my ($shortcut) = @_;
+
+ return "";
+}
+
+##############################################################
+# Returning show command for shortcut table.
+##############################################################
+
+sub get_shortcut_showcmd
+{
+ my ($shortcut) = @_;
+
+ return "";
+}
+
+##############################################################
+# Returning working directory for shortcut table.
+##############################################################
+
+sub get_shortcut_wkdir
+{
+ my ($shortcut) = @_;
+
+ return "";
+}
+
+####################################################################
+# Returning working directory for shortcut table for FolderItems.
+####################################################################
+
+sub get_folderitem_wkdir
+{
+ my ($onelink, $dirref) = @_;
+
+ # For shortcuts it is easy to convert the gid_Dir_Abc into the unique name in
+ # the directory table, for instance help_en_simpressidx.
+
+ my $onedir;
+ my $workingdirectory = "";
+ if ( $onelink->{'WkDir'} ) { $workingdirectory = $onelink->{'WkDir'}; }
+ my $directory = "";
+
+ if ( $workingdirectory )
+ {
+ my $found = 0;
+
+ for ( my $i = 0; $i <= $#{$dirref}; $i++ )
+ {
+ $onedir = ${$dirref}[$i];
+ my $directorygid = $onedir->{'Dir'};
+
+ if ( $directorygid eq $workingdirectory )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ installer::exiter::exit_program("ERROR: Did not find DirectoryID $workingdirectory in directory collection for FolderItem", "get_folderitem_wkdir");
+ }
+
+ $directory = $onedir->{'uniquename'};
+
+ if ($directory eq "") { $directory = "INSTALLLOCATION"; }
+ }
+
+ return $directory;
+}
+
+###################################################################
+# Returning the directory for a folderitem for shortcut table.
+###################################################################
+
+sub get_folderitem_directory
+{
+ my ($shortcut) = @_;
+
+ my $directory = "$installer::globals::officemenufolder"; # default
+
+ # The default is not correct for the
+ # PREDEFINED folders, like PREDEFINED_AUTOSTART
+
+ if ( $shortcut->{'FolderID'} eq "PREDEFINED_AUTOSTART" )
+ {
+ $directory = $installer::globals::startupfolder;
+ }
+
+ if ( $shortcut->{'FolderID'} eq "PREDEFINED_DESKTOP" )
+ {
+ $directory = $installer::globals::desktopfolder;
+ $installer::globals::desktoplinkexists = 1;
+ }
+
+ if ( $shortcut->{'FolderID'} eq "PREDEFINED_STARTMENU" )
+ {
+ $directory = $installer::globals::programmenufolder;
+ }
+
+ # saving the directory in the folderitems collector
+
+ $shortcut->{'directory'} = $directory;
+
+ return $directory;
+}
+
+########################################################################
+# Returning the target (feature) for a folderitem for shortcut table.
+# For non-advertised shortcuts this is a formatted string.
+########################################################################
+
+sub get_folderitem_target
+{
+ my ($shortcut, $filesref) = @_;
+
+ my $onefile;
+ my $target = "";
+ my $found = 0;
+ my $shortcut_fileid = $shortcut->{'FileID'};
+
+ my $styles = "";
+ my $nonadvertised = 0;
+ my $absolute_filename = 0;
+ if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; }
+ if ( $styles =~ /\bNON_ADVERTISED\b/ ) { $nonadvertised = 1; } # this is a non-advertised shortcut
+ if ( $styles =~ /\bABSOLUTE_FILENAME\b/ ) { $absolute_filename = 1; } # FileID contains an absolute filename
+
+ # if the FileID contains an absolute filename this can simply be returned as target for the shortcut table.
+ if ( $absolute_filename )
+ {
+ $shortcut->{'target'} = $shortcut_fileid;
+ return $shortcut_fileid;
+ }
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ $onefile = ${$filesref}[$i];
+ my $filegid = $onefile->{'gid'};
+
+ if ( $filegid eq $shortcut_fileid )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ installer::exiter::exit_program("ERROR: Did not find FileID $shortcut_fileid in file collection for folderitem", "get_folderitem_target");
+ }
+
+ # Non advertised shortcuts do not return the feature, but the path to the file
+ if ( $nonadvertised )
+ {
+ $target = "\[" . $onefile->{'uniquedirname'} . "\]" . "\\" . $onefile->{'Name'};
+ $shortcut->{'target'} = $target;
+ return $target;
+ }
+
+ # the rest only for advertised shortcuts, which contain the feature in the shortcut table.
+
+ if ( $onefile->{'modules'} ) { $target = $onefile->{'modules'}; }
+
+ # If modules contains a list of modules, only taking the first one.
+ # But this should never be needed
+
+ if ( $target =~ /^\s*(.*?)\,/ ) { $target = $1; }
+
+ # Attention: Maximum feature length is 38!
+ installer::windows::idtglobal::shorten_feature_gid(\$target);
+
+ # and finally saving the target in the folderitems collector
+
+ $shortcut->{'target'} = $target;
+
+ return $target;
+}
+
+########################################################################
+# Returning the arguments for a folderitem for shortcut table.
+########################################################################
+
+sub get_folderitem_arguments
+{
+ my ($shortcut) = @_;
+
+ my $parameter = "";
+
+ if ( $shortcut->{'Parameter'} ) { $parameter = $shortcut->{'Parameter'}; }
+
+ return $parameter;
+}
+
+########################################################################
+# Returning the icon for a folderitem for shortcut table.
+# The returned value has to be defined in the icon table.
+########################################################################
+
+sub get_folderitem_icon
+{
+ my ($shortcut, $filesref, $iconfilecollector) = @_;
+
+ my $styles = "";
+ if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; }
+ if ( $styles =~ /\bNON_ADVERTISED\b/ ) { return ""; } # no icon for non-advertised shortcuts
+
+ my $iconfilegid = "";
+
+ if ( $shortcut->{'IconFile'} ) { $iconfilegid = $shortcut->{'IconFile'}; }
+ else { $iconfilegid = $shortcut->{'FileID'}; }
+
+ my $onefile;
+ my $found = 0;
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ $onefile = ${$filesref}[$i];
+ my $filegid = $onefile->{'gid'};
+
+ if ( $filegid eq $iconfilegid )
+ {
+ $found = 1;
+ last;
+ }
+ }
+
+ if (!($found))
+ {
+ installer::exiter::exit_program("ERROR: Did not find FileID $iconfilegid in file collection", "get_folderitem_icon");
+ }
+
+ $iconfile = $onefile->{'Name'};
+
+ # collecting all icon files to copy them into the icon directory
+
+ my $sourcepath = $onefile->{'sourcepath'};
+
+ if (! grep {$_ eq $sourcepath} @{$iconfilecollector})
+ {
+ push(@{$iconfilecollector}, $sourcepath);
+ }
+
+ return $iconfile;
+}
+
+########################################################################
+# Returning the iconindex for a folderitem for shortcut table.
+########################################################################
+
+sub get_folderitem_iconindex
+{
+ my ($shortcut) = @_;
+
+ my $styles = "";
+ if ( $shortcut->{'Styles'} ) { $styles = $shortcut->{'Styles'}; }
+ if ( $styles =~ /\bNON_ADVERTISED\b/ ) { return ""; } # no iconindex for non-advertised shortcuts
+
+ my $iconid = 0;
+
+ if ( $shortcut->{'IconID'} ) { $iconid = $shortcut->{'IconID'}; }
+
+ return $iconid;
+}
+
+########################################################################
+# Returning the show command for a folderitem for shortcut table.
+########################################################################
+
+sub get_folderitem_showcmd
+{
+ my ($shortcut) = @_;
+
+ return "1";
+}
+
+###########################################################################################################
+# Creating the file Shortcut.idt dynamically
+# Content:
+# Shortcut Directory_ Name Component_ Target Arguments Description Hotkey Icon_ IconIndex ShowCmd WkDir
+###########################################################################################################
+
+sub create_shortcut_table
+{
+ my ($filesref, $linksref, $folderref, $folderitemsref, $dirref, $basedir, $languagesarrayref, $includepatharrayref, $iconfilecollector) = @_;
+
+ for ( my $m = 0; $m <= $#{$languagesarrayref}; $m++ )
+ {
+ my $onelanguage = ${$languagesarrayref}[$m];
+
+ my @shortcuttable = ();
+
+ my @shortnames = (); # to collect all short names
+
+ installer::windows::idtglobal::write_idt_header(\@shortcuttable, "shortcut");
+
+ # First the links, defined in scp as ShortCut
+
+ for ( my $i = 0; $i <= $#{$linksref}; $i++ )
+ {
+ my $onelink = ${$linksref}[$i];
+
+ # Controlling the language!
+ # Only language independent folderitems or folderitems with the correct language
+ # will be included into the table
+
+ if (! (!(( $onelink->{'ismultilingual'} )) || ( $onelink->{'specificlanguage'} eq $onelanguage )) ) { next; }
+
+ my %shortcut = ();
+
+ $shortcut{'Shortcut'} = get_shortcut_identifier($onelink);
+ $shortcut{'Directory_'} = get_shortcut_directory($onelink, $dirref);
+ $shortcut{'Name'} = get_shortcut_name($onelink, \@shortnames, $onelanguage); # localized name
+ $shortcut{'Component_'} = get_shortcut_component($onelink, $filesref);
+ $shortcut{'Target'} = get_shortcut_target($onelink, $filesref);
+ $shortcut{'Arguments'} = get_shortcut_arguments($onelink);
+ $shortcut{'Description'} = get_shortcut_description($onelink, $onelanguage); # localized description
+ $shortcut{'Hotkey'} = get_shortcut_hotkey($onelink);
+ $shortcut{'Icon_'} = get_shortcut_icon($onelink);
+ $shortcut{'IconIndex'} = get_shortcut_iconindex($onelink);
+ $shortcut{'ShowCmd'} = get_shortcut_showcmd($onelink);
+ $shortcut{'WkDir'} = get_shortcut_wkdir($onelink);
+
+ my $oneline = $shortcut{'Shortcut'} . "\t" . $shortcut{'Directory_'} . "\t" . $shortcut{'Name'} . "\t"
+ . $shortcut{'Component_'} . "\t" . $shortcut{'Target'} . "\t" . $shortcut{'Arguments'} . "\t"
+ . $shortcut{'Description'} . "\t" . $shortcut{'Hotkey'} . "\t" . $shortcut{'Icon_'} . "\t"
+ . $shortcut{'IconIndex'} . "\t" . $shortcut{'ShowCmd'} . "\t" . $shortcut{'WkDir'} . "\n";
+
+ push(@shortcuttable, $oneline);
+ }
+
+ # Second the entries into the start menu, defined in scp as Folder and Folderitem
+ # These shortcuts will fill the icons table.
+
+ for ( my $i = 0; $i <= $#{$folderref}; $i++ )
+ {
+ my $foldergid = ${$folderref}[$i]->{'gid'};
+
+ # iterating over all folderitems for this folder
+
+ for ( my $j = 0; $j <= $#{$folderitemsref}; $j++ )
+ {
+ my $onelink = ${$folderitemsref}[$j];
+
+ # Controlling the language!
+ # Only language independent folderitems or folderitems with the correct language
+ # will be included into the table
+
+ if (! (!(( $onelink->{'ismultilingual'} )) || ( $onelink->{'specificlanguage'} eq $onelanguage )) ) { next; }
+
+ # controlling the folder
+
+ my $localused = 0;
+
+ if ( $onelink->{'used'} ) { $localused = $onelink->{'used'}; }
+
+ if (!($localused == 1)) { $onelink->{'used'} = "0"; } # no resetting
+
+ if (!( $onelink->{'FolderID'} eq $foldergid )) { next; }
+
+ $onelink->{'used'} = "1";
+
+ my %shortcut = ();
+
+ $shortcut{'Shortcut'} = get_shortcut_identifier($onelink);
+ $shortcut{'Directory_'} = get_folderitem_directory($onelink);
+ $shortcut{'Name'} = get_shortcut_name($onelink, \@shortnames, $onelanguage); # localized name
+ $shortcut{'Component_'} = get_shortcut_component($onelink, $filesref);
+ $shortcut{'Target'} = get_folderitem_target($onelink, $filesref);
+ $shortcut{'Arguments'} = get_folderitem_arguments($onelink);
+ $shortcut{'Description'} = get_shortcut_description($onelink, $onelanguage); # localized description
+ $shortcut{'Hotkey'} = get_shortcut_hotkey($onelink);
+ $shortcut{'Icon_'} = get_folderitem_icon($onelink, $filesref, $iconfilecollector);
+ $shortcut{'IconIndex'} = get_folderitem_iconindex($onelink);
+ $shortcut{'ShowCmd'} = get_folderitem_showcmd($onelink);
+ $shortcut{'WkDir'} = get_folderitem_wkdir($onelink, $dirref);
+
+ my $oneline = $shortcut{'Shortcut'} . "\t" . $shortcut{'Directory_'} . "\t" . $shortcut{'Name'} . "\t"
+ . $shortcut{'Component_'} . "\t" . $shortcut{'Target'} . "\t" . $shortcut{'Arguments'} . "\t"
+ . $shortcut{'Description'} . "\t" . $shortcut{'Hotkey'} . "\t" . $shortcut{'Icon_'} . "\t"
+ . $shortcut{'IconIndex'} . "\t" . $shortcut{'ShowCmd'} . "\t" . $shortcut{'WkDir'} . "\n";
+
+ push(@shortcuttable, $oneline);
+ }
+ }
+
+ # The soffice.ico has to be included into the icon table
+ # as icon for the ARP applet
+
+ my $onefile = "";
+ my $sofficefile = "soffice.ico";
+
+ my $sourcepathref = $ENV{'SRCDIR'} . "/sysui/desktop/icons/" . $sofficefile;
+
+ if (! -f $sourcepathref) { installer::exiter::exit_program("ERROR: Could not find $sofficefile ($sourcepathref) as icon!", "create_shortcut_table"); }
+
+ if (! grep {$_ eq $sourcepathref} @{$iconfilecollector})
+ {
+ unshift(@{$iconfilecollector}, $sourcepathref);
+ $installer::globals::sofficeiconadded = 1;
+ }
+
+ my $localinfoline = "Added icon file $sourcepathref for language pack into icon file collector.\n";
+ push(@installer::globals::logfileinfo, $localinfoline);
+
+ # Saving the file
+
+ my $shortcuttablename = $basedir . $installer::globals::separator . "Shortcut.idt" . "." . $onelanguage;
+ installer::files::save_file($shortcuttablename ,\@shortcuttable);
+ my $infoline = "Created idt file: $shortcuttablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+ }
+}
+
+
+1;
diff --git a/solenv/bin/modules/installer/windows/strip.pm b/solenv/bin/modules/installer/windows/strip.pm
new file mode 100644
index 000000000..d7f95499d
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/strip.pm
@@ -0,0 +1,149 @@
+#
+# 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 .
+#
+
+package installer::windows::strip;
+
+use File::Temp qw(tmpnam);
+use installer::converter;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::systemactions;
+
+#####################################################################
+# Checking whether a file has to be stripped
+#####################################################################
+
+sub need_to_strip
+{
+ my ( $filename ) = @_;
+
+ my $strip = 0;
+
+ # Check using the "nm" command
+
+ $filename =~ s/\\/\\\\/g;
+
+ open (FILE, "nm $filename 2>&1 |");
+ my $nmoutput = <FILE>;
+ close (FILE);
+
+ if ( $nmoutput && !( $nmoutput =~ /no symbols/i || $nmoutput =~ /not recognized/i )) { $strip = 1; }
+
+ return $strip
+}
+
+#####################################################################
+# Checking whether a file has to be stripped
+#####################################################################
+
+sub do_strip
+{
+ my ( $filename ) = @_;
+
+ my $systemcall = "strip" . " " . $filename;
+
+ my $returnvalue = system($systemcall);
+
+ my $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not strip $filename!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "SUCCESS: Stripped library $filename!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+#####################################################################
+# Resolving all variables in the packagename.
+#####################################################################
+
+sub strip_binaries
+{
+ my ( $filelist, $languagestringref ) = @_;
+
+ installer::logger::include_header_into_logfile("Stripping files:");
+
+ my $strippeddirbase = installer::systemactions::create_directories("stripped", $languagestringref);
+
+ if (! grep {$_ eq $strippeddirbase} @installer::globals::removedirs)
+ {
+ push(@installer::globals::removedirs, $strippeddirbase);
+ }
+
+ my ($tmpfilehandle, $tmpfilename) = tmpnam();
+ open SOURCEPATHLIST, ">$tmpfilename" or die "oops...\n";
+ for ( my $i = 0; $i <= $#{$filelist}; $i++ )
+ {
+ print SOURCEPATHLIST "${$filelist}[$i]->{'sourcepath'}\n";
+ }
+ close SOURCEPATHLIST;
+ my @filetypelist = qx{file -f "$tmpfilename"};
+ chomp @filetypelist;
+ unlink "$tmpfilename" or die "oops\n";
+ for ( my $i = 0; $i <= $#{$filelist}; $i++ )
+ {
+ ${$filelist}[$i]->{'is_executable'} = ( $filetypelist[$i] =~ /:.*PE executable/ );
+ }
+
+ if ( $^O =~ /cygwin/i ) { installer::worker::generate_cygwin_paths($filelist); }
+
+ for ( my $i = 0; $i <= $#{$filelist}; $i++ )
+ {
+ my $sourcefilename = ${$filelist}[$i]->{'cyg_sourcepath'};
+
+ if ( ${$filelist}[$i]->{'is_executable'} && need_to_strip($sourcefilename) )
+ {
+ my $shortfilename = $sourcefilename;
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$shortfilename);
+
+ $infoline = "Strip: $shortfilename\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ # copy file into directory for stripped libraries
+
+ my $onelanguage = ${$filelist}[$i]->{'specificlanguage'};
+
+ # files without language into directory "00"
+
+ if ($onelanguage eq "") { $onelanguage = "00"; }
+
+ my $strippeddir = $strippeddirbase . $installer::globals::separator . $onelanguage;
+ installer::systemactions::create_directory($strippeddir); # creating language specific subdirectories
+
+ my $destfilename = $strippeddir . $installer::globals::separator . $shortfilename;
+ installer::systemactions::copy_one_file($sourcefilename, $destfilename);
+
+ # change sourcepath in files collector
+
+ ${$filelist}[$i]->{'sourcepath'} = $destfilename;
+
+ # strip file
+
+ do_strip($destfilename);
+ }
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/installer/windows/update.pm b/solenv/bin/modules/installer/windows/update.pm
new file mode 100644
index 000000000..45c47ed7a
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/update.pm
@@ -0,0 +1,620 @@
+#
+# 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 .
+#
+
+package installer::windows::update;
+
+use installer::converter;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::pathanalyzer;
+use installer::systemactions;
+
+#################################################################################
+# Extracting all tables from an msi database
+#################################################################################
+
+sub extract_all_tables_from_msidatabase
+{
+ my ($fulldatabasepath, $workdir) = @_;
+
+ my $msidb = "msidb.exe"; # Has to be in the path
+ my $infoline = "";
+ my $systemcall = "";
+ my $returnvalue = "";
+ my $extraslash = ""; # Has to be set for non-ActiveState perl
+
+ # Export of all tables by using "*"
+
+ if ( $^O =~ /cygwin/i ) {
+ # msidb.exe really wants backslashes. (And double escaping because system() expands the string.)
+ $fulldatabasepath =~ s/\//\\\\/g;
+ $workdir =~ s/\//\\\\/g;
+ $extraslash = "\\";
+ }
+ if ( $^O =~ /linux/i) {
+ $extraslash = "\\";
+ }
+
+ $systemcall = $msidb . " -d " . $fulldatabasepath . " -f " . $workdir . " -e " . $extraslash . "*";
+ $returnvalue = system($systemcall);
+
+ $infoline = "Systemcall: $systemcall\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ($returnvalue)
+ {
+ $infoline = "ERROR: Could not execute $systemcall !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Could not exclude tables from msi database: $fulldatabasepath !", "extract_all_tables_from_msidatabase");
+ }
+ else
+ {
+ $infoline = "Success: Executed $systemcall successfully!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+}
+
+#################################################################################
+# Collecting the keys from the first line of the idt file
+#################################################################################
+
+sub collect_all_keys
+{
+ my ($line) = @_;
+
+ my @allkeys = ();
+ my $rownumber = 0;
+ my $onekey = "";
+
+ while ( $line =~ /^\s*(\S+?)\t(.*)$/ )
+ {
+ $onekey = $1;
+ $line = $2;
+ $rownumber++;
+ push(@allkeys, $onekey);
+ }
+
+ # and the last key
+
+ $onekey = $line;
+ $onekey =~ s/^\s*//g;
+ $onekey =~ s/\s*$//g;
+
+ $rownumber++;
+ push(@allkeys, $onekey);
+
+ return (\@allkeys, $rownumber);
+}
+
+#################################################################################
+# Analyzing the content of one line of an idt file
+#################################################################################
+
+sub get_oneline_hash
+{
+ my ($line, $allkeys, $rownumber) = @_;
+
+ my $counter = 0;
+ my %linehash = ();
+
+ $line =~ s/^\s*//;
+ $line =~ s/\s*$//;
+
+ my $value = "";
+ my $onekey = "";
+
+ while ( $line =~ /^(.*?)\t(.*)$/ )
+ {
+ $value = $1;
+ $line = $2;
+ $onekey = ${$allkeys}[$counter];
+ $linehash{$onekey} = $value;
+ $counter++;
+ }
+
+ # the last column
+
+ $value = $line;
+ $onekey = ${$allkeys}[$counter];
+
+ $linehash{$onekey} = $value;
+
+ return \%linehash;
+}
+
+#################################################################################
+# Analyzing the content of an idt file
+#################################################################################
+
+sub analyze_idt_file
+{
+ my ($filecontent) = @_;
+
+ my %table = ();
+ # keys are written in first line
+ my ($allkeys, $rownumber) = collect_all_keys(${$filecontent}[0]);
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if (( $i == 0 ) || ( $i == 1 ) || ( $i == 2 )) { next; }
+
+ my $onelinehash = get_oneline_hash(${$filecontent}[$i], $allkeys, $rownumber);
+ my $linekey = $i - 2; # ! : The linenumber is the unique key !? Always decrease by two, because of removed first three lines.
+ $table{$linekey} = $onelinehash;
+ }
+
+ return \%table;
+}
+
+#################################################################################
+# Reading all idt files in a specified directory
+#################################################################################
+
+sub read_all_tables_from_msidatabase
+{
+ my ($workdir) = @_;
+
+ my %database = ();
+
+ my $ext = "idt";
+
+ my $allidtfiles = installer::systemactions::find_file_with_file_extension($ext, $workdir);
+
+ for ( my $i = 0; $i <= $#{$allidtfiles}; $i++ )
+ {
+ my $onefilename = ${$allidtfiles}[$i];
+ my $longonefilename = $workdir . $installer::globals::separator . $onefilename;
+ if ( ! -f $longonefilename ) { installer::exiter::exit_program("ERROR: Could not find idt file: $longonefilename!", "read_all_tables_from_msidatabase"); }
+ my $filecontent = installer::files::read_file($longonefilename);
+ my $idtcontent = analyze_idt_file($filecontent);
+ if ($onefilename eq "Directory.idt") {
+ collect_directories($filecontent);
+ }
+ my $key = $onefilename;
+ $key =~ s/\.idt\s*$//;
+ $database{$key} = $idtcontent;
+ }
+
+ return \%database;
+}
+
+#################################################################################
+# Checking, if this is the correct database.
+#################################################################################
+
+sub correct_database
+{
+ my ($product, $pro, $langs, $languagestringref) = @_;
+
+ my $correct_database = 0;
+
+ # Comparing $product with $installer::globals::product and
+ # $pro with $installer::globals::pro and
+ # $langs with $languagestringref
+
+ my $product_is_good = 0;
+
+ my $localproduct = $installer::globals::product;
+ if ( $installer::globals::languagepack ) { $localproduct = $localproduct . "LanguagePack"; }
+ elsif ( $installer::globals::helppack ) { $localproduct = $localproduct . "HelpPack"; }
+
+ if ( $product eq $localproduct ) { $product_is_good = 1; }
+
+ if ( $product_is_good )
+ {
+ my $pro_is_good = 0;
+
+ if ((( $pro eq "pro" ) && ( $installer::globals::pro )) || (( $pro eq "nonpro" ) && ( ! $installer::globals::pro ))) { $pro_is_good = 1; }
+
+ if ( $pro_is_good )
+ {
+ my $langlisthash = installer::converter::convert_stringlist_into_hash(\$langs, ",");
+ my $langstringhash = installer::converter::convert_stringlist_into_hash($languagestringref, "_");
+
+ my $not_included = 0;
+ foreach my $onelang ( keys %{$langlisthash} )
+ {
+ if ( ! exists($langstringhash->{$onelang}) )
+ {
+ $not_included = 1;
+ last;
+ }
+ }
+
+ if ( ! $not_included )
+ {
+ foreach my $onelanguage ( keys %{$langstringhash} )
+ {
+ if ( ! exists($langlisthash->{$onelanguage}) )
+ {
+ $not_included = 1;
+ last;
+ }
+ }
+
+ if ( ! $not_included ) { $correct_database = 1; }
+ }
+ }
+ }
+
+ return $correct_database;
+}
+
+#################################################################################
+# Searching for the path to the reference database for this special product.
+#################################################################################
+
+sub get_databasename_from_list
+{
+ my ($filecontent, $languagestringref, $filename) = @_;
+
+ my $databasepath = "";
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ my $line = ${$filecontent}[$i];
+ if ( $line =~ /^\s*$/ ) { next; } # empty line
+ if ( $line =~ /^\s*\#/ ) { next; } # comment line
+
+ if ( $line =~ /^\s*(.+?)\s*\t+\s*(.+?)\s*\t+\s*(.+?)\s*\t+\s*(.+?)\s*$/ )
+ {
+ my $product = $1;
+ my $pro = $2;
+ my $langs = $3;
+ my $path = $4;
+
+ if (( $pro ne "pro" ) && ( $pro ne "nonpro" )) { installer::exiter::exit_program("ERROR: Wrong syntax in file: $filename. Only \"pro\" or \"nonpro\" allowed in column 1! Line: \"$line\"", "get_databasename_from_list"); }
+
+ if ( correct_database($product, $pro, $langs, $languagestringref) )
+ {
+ $databasepath = $path;
+ last;
+ }
+ }
+ else
+ {
+ installer::exiter::exit_program("ERROR: Wrong syntax in file: $filename! Line: \"$line\"", "get_databasename_from_list");
+ }
+ }
+
+ return $databasepath;
+}
+
+#################################################################################
+# Reading an existing database completely
+#################################################################################
+
+sub readdatabase
+{
+ my ($allvariables, $languagestringref, $includepatharrayref) = @_;
+
+ my $database = "";
+ my $infoline = "";
+
+ if ( ! $allvariables->{'UPDATE_DATABASE_LISTNAME'} ) { installer::exiter::exit_program("ERROR: If \"UPDATE_DATABASE\" is set, \"UPDATE_DATABASE_LISTNAME\" is required.", "Main"); }
+ my $listfilename = $allvariables->{'UPDATE_DATABASE_LISTNAME'};
+
+ # Searching the list in the include paths
+ my $listname = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$listfilename, $includepatharrayref, 1);
+ if ( $$listname eq "" ) { installer::exiter::exit_program("ERROR: List file not found: $listfilename !", "readdatabase"); }
+ my $completelistname = $$listname;
+
+ # Reading list file
+ my $listfile = installer::files::read_file($completelistname);
+
+ # Get name and path of reference database
+ my $databasename = get_databasename_from_list($listfile, $languagestringref, $completelistname);
+
+ # If the correct database was not found, this is not necessarily an error. But in this case, this is not an update packaging process!
+ if (( $databasename ) && ( $databasename ne "" )) # This is an update packaging process!
+ {
+ $installer::globals::updatedatabase = 1;
+ installer::logger::print_message( "... update process, using database $databasename ...\n" );
+ $infoline = "\nDatabase found in $completelistname: \"$databasename\"\n\n";
+ # Saving in global variable
+ $installer::globals::updatedatabasepath = $databasename;
+ }
+ else
+ {
+ $infoline = "\nNo database found in $completelistname. This is no update process!\n\n";
+ }
+ push( @installer::globals::logfileinfo, $infoline);
+
+ if ( $installer::globals::updatedatabase )
+ {
+ if ( ! -f $databasename ) { installer::exiter::exit_program("ERROR: Could not find reference database: $databasename!", "readdatabase"); }
+
+ my $msifilename = $databasename;
+ installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$msifilename);
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: readdatabase start");
+
+ # create directory for unpacking
+ my $databasedir = installer::systemactions::create_directories("database", $languagestringref);
+
+ # copy database
+ my $fulldatabasepath = $databasedir . $installer::globals::separator . $msifilename;
+ installer::systemactions::copy_one_file($databasename, $fulldatabasepath);
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: readdatabase: before extracting tables");
+
+ # extract all tables from database
+ extract_all_tables_from_msidatabase($fulldatabasepath, $databasedir);
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: readdatabase: before reading tables");
+
+ # read all tables
+ $database = read_all_tables_from_msidatabase($databasedir);
+
+ # Test output:
+
+ # foreach my $key1 ( keys %{$database} )
+ # {
+ # print "Test1: $key1\n";
+ # foreach my $key2 ( keys %{$database->{$key1}} )
+ # {
+ # print "\tTest2: $key2\n";
+ # foreach my $key3 ( keys %{$database->{$key1}->{$key2}} )
+ # {
+ # print "\t\tTest3: $key3: $database->{$key1}->{$key2}->{$key3}\n";
+ # }
+ # }
+ # }
+
+ # Example: File table
+
+ # my $filetable = $database->{'File'};
+ # foreach my $linenumber ( keys %{$filetable} )
+ # {
+ # print "Test Filenumber: $linenumber\n";
+ # foreach my $key ( keys %{$filetable->{$linenumber}} )
+ # {
+ # print "\t\tTest: $key: $filetable->{$linenumber}->{$key}\n";
+ # }
+ # }
+
+ # Example: Searching for ProductCode in table Property
+
+ # my $column1 = "Property";
+ # my $column2 = "Value";
+ # my $searchkey = "ProductCode";
+ # my $propertytable = $database->{'Property'};
+ # foreach my $linenumber ( keys %{$propertytable} )
+ # {
+ # if ( $propertytable->{$linenumber}->{$column1} eq $searchkey )
+ # {
+ # print("Test: $searchkey : $propertytable->{$linenumber}->{$column2}\n");
+ # }
+ # }
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: readdatabase end");
+ }
+
+ return $database;
+}
+
+#########################################################################
+# Reading the file "Directory.idt".
+#########################################################################
+
+sub collect_directories
+{
+ my ($filecontent) = @_;
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ if ( $i <= 2 ) { next; } # ignoring first three lines
+ if ( ${$filecontent}[$i] =~ /^\s*$/ ) { next; } # ignoring empty lines
+ # Format: Directory Directory_Parent DefaultDir
+ if ( ${$filecontent}[$i] =~ /^\s*(.+?)\t(.*?)\t(.*?)\s*$/ )
+ {
+ $installer::globals::merge_directory_hash{$1} = 1;
+ }
+ else
+ {
+ my $linecount = $i + 1;
+ installer::exiter::exit_program("ERROR: Unknown line format in table \"$idtfilename\" (line $linecount) !", "collect_directories");
+ }
+ }
+}
+
+#################################################################################
+# Files can be included in merge modules. This is also important for update.
+#################################################################################
+
+sub readmergedatabase
+{
+ my ( $mergemodules, $languagestringref, $includepatharrayref ) = @_;
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: readmergedatabase start");
+
+ my $mergemoduledir = installer::systemactions::create_directories("mergedatabase", $languagestringref);
+
+ my %allmergefiles = ();
+
+ foreach my $mergemodule ( @{$mergemodules} )
+ {
+ my $filename = $mergemodule->{'Name'};
+ my $mergefile = $ENV{'MSM_PATH'} . $filename;
+
+ if ( ! -f $mergefile ) { installer::exiter::exit_program("ERROR: msm file not found: $filename !", "readmergedatabase"); }
+ my $completesource = $mergefile;
+
+ my $mergegid = $mergemodule->{'gid'};
+ my $workdir = $mergemoduledir . $installer::globals::separator . $mergegid;
+ if ( ! -d $workdir ) { installer::systemactions::create_directory($workdir); }
+
+ my $completedest = $workdir . $installer::globals::separator . $filename;
+ installer::systemactions::copy_one_file($completesource, $completedest);
+ if ( ! -f $completedest ) { installer::exiter::exit_program("ERROR: msm file not found: $completedest !", "readmergedatabase"); }
+
+ # extract all tables from database
+ extract_all_tables_from_msidatabase($completedest, $workdir);
+
+ # read all tables
+ my $onemergefile = read_all_tables_from_msidatabase($workdir);
+
+ $allmergefiles{$mergegid} = $onemergefile;
+ }
+
+ foreach my $mergefilegid ( keys %allmergefiles )
+ {
+ my $onemergefile = $allmergefiles{$mergefilegid};
+ my $filetable = $onemergefile->{'File'};
+
+ foreach my $linenumber ( keys %{$filetable} )
+ {
+ # Collecting all files from merge modules in global hash
+ $installer::globals::mergemodulefiles{$filetable->{$linenumber}->{'File'}} = 1;
+ }
+ }
+
+ installer::logger::include_timestamp_into_logfile("Performance Info: readmergedatabase end");
+}
+
+#################################################################################
+# Creating several useful hashes from old database
+#################################################################################
+
+sub create_database_hashes
+{
+ my ( $database ) = @_;
+
+ # 1. Hash ( Component -> UniqueFileName ), required in File table.
+ # Read from File table.
+
+ my %uniquefilename = ();
+ my %allupdatesequences = ();
+ my %allupdatecomponents = ();
+ my %allupdatefileorder = ();
+ my %allupdatecomponentorder = ();
+ my %revuniquefilename = ();
+ my %revshortfilename = ();
+ my %shortdirname = ();
+ my %componentid = ();
+ my %componentidkeypath = ();
+ my %alloldproperties = ();
+ my %allupdatelastsequences = ();
+ my %allupdatediskids = ();
+
+ my $filetable = $database->{'File'};
+
+ foreach my $linenumber ( keys %{$filetable} )
+ {
+ my $comp = $filetable->{$linenumber}->{'Component_'};
+ my $uniquename = $filetable->{$linenumber}->{'File'};
+ my $filename = $filetable->{$linenumber}->{'FileName'};
+ my $sequence = $filetable->{$linenumber}->{'Sequence'};
+
+ my $shortname = "";
+ if ( $filename =~ /^\s*(.*?)\|\s*(.*?)\s*$/ )
+ {
+ $shortname = $1;
+ $filename = $2;
+ }
+
+ # unique is the combination of $component and $filename
+ my $key = "$comp/$filename";
+
+ if ( exists($uniquefilename{$key}) ) { installer::exiter::exit_program("ERROR: Component/FileName \"$key\" is not unique in table \"File\" !", "create_database_hashes"); }
+
+ my $value = $uniquename;
+ if ( $shortname ne "" ) { $value = "$uniquename;$shortname"; }
+ $uniquefilename{$key} = $value; # saving the unique keys and short names in hash
+
+ # Saving reverse keys too
+ $revuniquefilename{$uniquename} = $key;
+ if ( $shortname ne "" ) { $revshortfilename{$shortname} = $key; }
+
+ # Saving Sequences for unique names (and also components)
+ $allupdatesequences{$uniquename} = $sequence;
+ $allupdatecomponents{$uniquename} = $comp;
+
+ # Saving unique names and components for sequences
+ $allupdatefileorder{$sequence} = $uniquename;
+ $allupdatecomponentorder{$sequence} = $comp;
+ }
+
+ # 2. Hash, required in Directory table.
+
+ my $dirtable = $database->{'Directory'};
+
+ foreach my $linenumber ( keys %{$dirtable} )
+ {
+ my $dir = $dirtable->{$linenumber}->{'Directory'}; # this is a unique name
+ my $defaultdir = $dirtable->{$linenumber}->{'DefaultDir'};
+
+ my $shortname = "";
+ if ( $defaultdir =~ /^\s*(.*?)\|\s*(.*?)\s*$/ )
+ {
+ $shortname = $1;
+ $shortdirname{$dir} = $shortname; # collecting only the short names
+ }
+ }
+
+ # 3. Hash, collecting info from Component table.
+ # ComponentID and KeyPath have to be reused.
+
+ my $comptable = $database->{'Component'};
+
+ foreach my $linenumber ( keys %{$comptable} )
+ {
+ my $comp = $comptable->{$linenumber}->{'Component'};
+ my $compid = $comptable->{$linenumber}->{'ComponentId'};
+ my $keypath = $comptable->{$linenumber}->{'KeyPath'};
+
+ $componentid{$comp} = $compid;
+ $componentidkeypath{$comp} = $keypath;
+ }
+
+ # 4. Hash, property table, required for ProductCode and Installlocation.
+
+ my $proptable = $database->{'Property'};
+
+ foreach my $linenumber ( keys %{$proptable} )
+ {
+ my $prop = $proptable->{$linenumber}->{'Property'};
+ my $value = $proptable->{$linenumber}->{'Value'};
+
+ $alloldproperties{$prop} = $value;
+ }
+
+ # 5. Media table, getting last sequence
+
+ my $mediatable = $database->{'Media'};
+ $installer::globals::updatelastsequence = 0;
+
+ foreach my $linenumber ( keys %{$mediatable} )
+ {
+ my $cabname = $mediatable->{$linenumber}->{'Cabinet'};
+ my $lastsequence = $mediatable->{$linenumber}->{'LastSequence'};
+ my $diskid = $mediatable->{$linenumber}->{'DiskId'};
+ $allupdatelastsequences{$cabname} = $lastsequence;
+ $allupdatediskids{$cabname} = $diskid;
+
+ if ( $lastsequence > $installer::globals::updatelastsequence ) { $installer::globals::updatelastsequence = $lastsequence; }
+ }
+
+ $installer::globals::updatesequencecounter = $installer::globals::updatelastsequence;
+
+ return (\%uniquefilename, \%revuniquefilename, \%revshortfilename, \%allupdatesequences, \%allupdatecomponents, \%allupdatefileorder, \%allupdatecomponentorder, \%shortdirname, \%componentid, \%componentidkeypath, \%alloldproperties, \%allupdatelastsequences, \%allupdatediskids);
+}
+
+
+1;
diff --git a/solenv/bin/modules/installer/windows/upgrade.pm b/solenv/bin/modules/installer/windows/upgrade.pm
new file mode 100644
index 000000000..548382124
--- /dev/null
+++ b/solenv/bin/modules/installer/windows/upgrade.pm
@@ -0,0 +1,80 @@
+#
+# 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 .
+#
+
+package installer::windows::upgrade;
+
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::windows::idtglobal;
+
+####################################################################################
+# Creating the file Upgrade.idt dynamically
+# Content:
+# UpgradeCode VersionMin VersionMax Language Attributes Remove ActionProperty
+####################################################################################
+
+sub create_upgrade_table
+{
+ my ($basedir, $allvariableshashref) = @_;
+
+ my @upgradetable = ();
+
+ installer::windows::idtglobal::write_idt_header(\@upgradetable, "upgrade");
+
+ # Setting all products, that must be removed.
+ my $newline = $installer::globals::upgradecode . "\t" . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "513" . "\t" . "\t" . "OLDPRODUCTS" . "\n";
+ push(@upgradetable, $newline);
+
+ # preventing downgrading
+ $newline = $installer::globals::upgradecode . "\t" . $installer::globals::msiproductversion . "\t" . "\t" . "\t" . "2" . "\t" . "\t" . "NEWPRODUCTS" . "\n";
+ push(@upgradetable, $newline);
+
+ # Saving the file
+
+ my $upgradetablename = $basedir . $installer::globals::separator . "Upgrade.idt";
+ installer::files::save_file($upgradetablename ,\@upgradetable);
+ my $infoline = "Created idt file: $upgradetablename\n";
+ push(@installer::globals::logfileinfo, $infoline);
+}
+
+##############################################################
+# Reading the file with UpgradeCodes of old products,
+# that can be removed, if the user wants to remove them.
+##############################################################
+
+sub analyze_file_for_upgrade_table
+{
+ my ($filecontent) = @_;
+
+ my @allnewlines = ();
+
+ for ( my $i = 0; $i <= $#{$filecontent}; $i++ )
+ {
+ my $line = ${$filecontent}[$i];
+ if ( $line =~ /^\s*$/ ) { next; } # empty lines can be ignored
+ if ( $line =~ /^\s*\#/ ) { next; } # comment lines starting with a hash
+
+ if ( $line =~ /^(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)\t(.*)$/ ) { push(@allnewlines, $line); }
+ else { installer::exiter::exit_program("ERROR: Wrong syntax in file for upgrade table", "analyze_file_for_upgrade_table"); }
+ }
+
+ return \@allnewlines;
+}
+
+1;
diff --git a/solenv/bin/modules/installer/worker.pm b/solenv/bin/modules/installer/worker.pm
new file mode 100644
index 000000000..fb2969f77
--- /dev/null
+++ b/solenv/bin/modules/installer/worker.pm
@@ -0,0 +1,921 @@
+#
+# 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 .
+#
+
+package installer::worker;
+
+use Cwd;
+use File::Copy;
+use File::stat;
+use File::Temp qw(tmpnam);
+use File::Path;
+use File::Basename;
+use installer::control;
+use installer::converter;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::pathanalyzer;
+use installer::scpzipfiles;
+use installer::scriptitems;
+use installer::systemactions;
+use installer::windows::language;
+
+#########################################
+# Saving the patchlist file
+#########################################
+
+sub _save_patchlist_file
+{
+ my ($installlogdir, $patchlistfilename) = @_;
+
+ my $installpatchlistdir = installer::systemactions::create_directory_next_to_directory($installlogdir, "patchlist");
+ $patchlistfilename =~ s/log\_/patchfiles\_/;
+ $patchlistfilename =~ s/\.log/\.txt/;
+ installer::files::save_file($installpatchlistdir . $installer::globals::separator . $patchlistfilename, \@installer::globals::patchfilecollector);
+ installer::logger::print_message( "... creating patchlist file $patchlistfilename \n" );
+
+}
+
+###############################################################
+# Removing all directories of a special language
+# in the directory $basedir
+###############################################################
+
+sub remove_old_installation_sets
+{
+ my ($basedir) = @_;
+
+ installer::logger::print_message( "... removing old installation directories ...\n" );
+
+ my $removedir = $basedir;
+
+ if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); }
+
+ # looking for non successful old installation sets
+
+ $removedir = $basedir . "_witherror";
+ if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); }
+
+ $removedir = $basedir . "_inprogress";
+ if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); }
+
+ # finally the $basedir can be created empty
+
+ if ( $installer::globals::localinstalldirset ) { installer::systemactions::create_directory_structure($basedir); }
+
+ installer::systemactions::create_directory($basedir);
+}
+
+###############################################################
+# Creating the installation directory structure
+###############################################################
+
+sub create_installation_directory
+{
+ my ($shipinstalldir, $languagestringref, $current_install_number_ref) = @_;
+
+ my $installdir = "";
+
+ my $languageref = $languagestringref;
+
+ $installdir = installer::systemactions::create_directories("install", $languageref);
+ installer::logger::print_message( "... creating installation set in $installdir ...\n" );
+ remove_old_installation_sets($installdir);
+ my $inprogressinstalldir = $installdir . "_inprogress";
+ installer::systemactions::rename_directory($installdir, $inprogressinstalldir);
+ $installdir = $inprogressinstalldir;
+
+ $installer::globals::saveinstalldir = $installdir; # saving directory globally, in case of exiting
+
+ return $installdir;
+}
+
+###############################################################
+# Analyzing and creating the log file
+###############################################################
+
+sub analyze_and_save_logfile
+{
+ my ($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number) = @_;
+
+ my $is_success = 1;
+ my $finalinstalldir = "";
+
+ installer::logger::print_message( "... checking log file " . $loggingdir . $installer::globals::logfilename . "\n" );
+
+ my $contains_error = installer::control::check_logfile(\@installer::globals::logfileinfo);
+
+ # Dependent from the success, the installation directory can be renamed.
+
+ if ( $contains_error )
+ {
+ my $errordir = installer::systemactions::rename_string_in_directory($installdir, "_inprogress", "_witherror");
+ # Error output to STDERR
+ for ( my $j = 0; $j <= $#installer::globals::errorlogfileinfo; $j++ )
+ {
+ my $line = $installer::globals::errorlogfileinfo[$j];
+ $line =~ s/\s*$//g;
+ installer::logger::print_error( $line );
+ }
+ $is_success = 0;
+
+ $finalinstalldir = $errordir;
+ }
+ else
+ {
+ my $destdir = "";
+
+ $destdir = installer::systemactions::rename_string_in_directory($installdir, "_inprogress", "");
+
+ $finalinstalldir = $destdir;
+ }
+
+ # Saving the logfile in the log file directory and additionally in a log directory in the install directory
+
+ my $numberedlogfilename = $installer::globals::logfilename;
+ installer::logger::print_message( "... creating log file $numberedlogfilename \n" );
+ installer::files::save_file($loggingdir . $numberedlogfilename, \@installer::globals::logfileinfo);
+ installer::files::save_file($installlogdir . $installer::globals::separator . $numberedlogfilename, \@installer::globals::logfileinfo);
+
+ # Saving the list of patchfiles in a patchlist directory in the install directory
+ if ( $installer::globals::creating_windows_installer_patch ) { _save_patchlist_file($installlogdir, $numberedlogfilename); }
+
+ if ( $installer::globals::creating_windows_installer_patch ) { $installer::globals::creating_windows_installer_patch = 0; }
+
+ # Exiting the packaging process, if an error occurred.
+ # This is important, to get an error code "-1", if an error was found in the log file,
+ # that did not break the packaging process
+
+ if ( ! $is_success) { installer::exiter::exit_program("ERROR: Found an error in the logfile " . $loggingdir . $installer::globals::logfilename . ". Packaging failed.", "analyze_and_save_logfile"); }
+
+ return ($is_success, $finalinstalldir);
+}
+
+###############################################################
+# Removing all directories that are saved in the
+# global directory @installer::globals::removedirs
+###############################################################
+
+sub clean_output_tree
+{
+ installer::logger::print_message( "... cleaning the output tree ...\n" );
+
+ for ( my $i = 0; $i <= $#installer::globals::removedirs; $i++ )
+ {
+ if ( -d $installer::globals::removedirs[$i] )
+ {
+ installer::logger::print_message( "... removing directory $installer::globals::removedirs[$i] ...\n" );
+ installer::systemactions::remove_complete_directory($installer::globals::removedirs[$i], 1);
+ }
+ }
+
+ # Last try to remove the ship test directory
+
+ if ( $installer::globals::shiptestdirectory )
+ {
+ if ( -d $installer::globals::shiptestdirectory )
+ {
+ my $infoline = "Last try to remove $installer::globals::shiptestdirectory . \n";
+ push(@installer::globals::logfileinfo, $infoline);
+ my $systemcall = "rmdir $installer::globals::shiptestdirectory";
+ my $returnvalue = system($systemcall);
+ }
+ }
+}
+
+###########################################################
+# Setting one language in the language independent
+# array of include paths with $(LANG)
+###########################################################
+
+sub get_language_specific_include_paths
+{
+ my ( $patharrayref, $onelanguage ) = @_;
+
+ my @patharray = ();
+
+ for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
+ {
+ my $line = ${$patharrayref}[$i];
+ $line =~ s/\$\(LANG\)/$onelanguage/g;
+ push(@patharray ,$line);
+ }
+
+ return \@patharray;
+}
+
+##############################################################
+# Collecting all items with a defined flag
+##############################################################
+
+sub collect_all_items_with_special_flag
+{
+ my ($itemsref, $flag) = @_;
+
+ my @allitems = ();
+
+ for ( my $i = 0; $i <= $#{$itemsref}; $i++ )
+ {
+ my $oneitem = ${$itemsref}[$i];
+ my $styles = "";
+ if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} };
+
+ if ( $styles =~ /\b$flag\b/ )
+ {
+ push( @allitems, $oneitem );
+ }
+ }
+
+ return \@allitems;
+}
+
+##############################################################
+# Removing all items with a defined flag from collector
+##############################################################
+
+sub remove_all_items_with_special_flag
+{
+ my ($itemsref, $flag) = @_;
+
+ my @allitems = ();
+
+ for ( my $i = 0; $i <= $#{$itemsref}; $i++ )
+ {
+ my $oneitem = ${$itemsref}[$i];
+ my $styles = "";
+ if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} };
+ if ( $styles =~ /\b$flag\b/ )
+ {
+ my $infoline = "Attention: Removing from collector: $oneitem->{'Name'} !\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ if ( $flag eq "BINARYTABLE_ONLY" ) { push(@installer::globals::binarytableonlyfiles, $oneitem); }
+ next;
+ }
+ push( @allitems, $oneitem );
+ }
+
+ return \@allitems;
+}
+
+###########################################################
+# Mechanism for simple installation without packing
+###########################################################
+
+sub install_simple ($$$$$$)
+{
+ my ($packagename, $languagestring, $directoriesarray, $filesarray, $linksarray, $unixlinksarray) = @_;
+
+ installer::logger::print_message( "... installing module $packagename ...\n" );
+
+ my $destdir = $installer::globals::destdir;
+ my @lines = ();
+
+ installer::logger::print_message( "DestDir: $destdir \n" );
+ installer::logger::print_message( "Rootpath: $installer::globals::rootpath \n" );
+
+ `mkdir -p $destdir` if $destdir ne "";
+ `mkdir -p $destdir$installer::globals::rootpath`;
+
+ # Create Directories
+ for ( my $i = 0; $i <= $#{$directoriesarray}; $i++ )
+ {
+ my $onedir = ${$directoriesarray}[$i];
+ my $dir = "";
+
+ if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; }
+
+ if ((!($dir =~ /\bPREDEFINED_/ )) || ( $dir =~ /\bPREDEFINED_PROGDIR\b/ ))
+ {
+ my $hostname = $onedir->{'HostName'};
+
+ # ignore '.' subdirectories
+ next if ( $hostname =~ m/\.$/ );
+ # remove './' from the path
+ $hostname =~ s/\.\///g;
+
+ # printf "mkdir $destdir$hostname\n";
+ mkdir $destdir . $hostname;
+ push @lines, "%dir " . $hostname . "\n";
+ }
+ }
+
+ for ( my $i = 0; $i <= $#{$filesarray}; $i++ )
+ {
+ my $onefile = ${$filesarray}[$i];
+ my $unixrights = $onefile->{'UnixRights'};
+ my $destination = $onefile->{'destination'};
+ my $sourcepath = $onefile->{'sourcepath'};
+
+ # This is necessary to install SDK that includes files with $ in its name
+ # Otherwise, the following shell commands does not work and the file list
+ # is not correct
+ $destination =~ s/\$\$/\$/;
+ $sourcepath =~ s/\$\$/\$/;
+
+ # remove './' from the path
+ $sourcepath =~ s/\.\///g;
+ $destination =~ s/\.\///g;
+
+ push @lines, "$destination\n";
+ if(-d "$destdir$destination"){
+ rmtree("$destdir$destination");
+ }
+ if(-e "$destdir$destination") {
+ unlink "$destdir$destination";
+ }
+
+ if ( -l "$sourcepath" ) {
+ symlink (readlink ("$sourcepath"), "$destdir$destination") || die "Can't symlink $destdir$destination -> " . readlink ("$sourcepath") . "$!";
+ }
+ elsif ( -d $sourcepath ) {
+ `mkdir -p "$destdir$destination"`;
+ }
+ else {
+ copy ("$sourcepath", "$destdir$destination") || die "Can't copy file: $sourcepath -> $destdir$destination $!";
+ my $sourcestat = stat($sourcepath);
+ utime ($sourcestat->atime, $sourcestat->mtime, "$destdir$destination");
+ chmod (oct($unixrights), "$destdir$destination") || die "Can't change permissions: $!";
+ }
+ push @lines, "$destination\n";
+ }
+
+ for ( my $i = 0; $i <= $#{$linksarray}; $i++ )
+ {
+ my $onelink = ${$linksarray}[$i];
+ my $destination = $onelink->{'destination'};
+ my $destinationfile = $onelink->{'destinationfile'};
+
+ if(-e "$destdir$destination") {
+ unlink "$destdir$destination";
+ }
+ symlink ("$destinationfile", "$destdir$destination") || die "Can't create symlink: $!";
+ push @lines, "$destination\n";
+ }
+
+ for ( my $i = 0; $i <= $#{$unixlinksarray}; $i++ )
+ {
+ my $onelink = ${$unixlinksarray}[$i];
+ my $target = $onelink->{'Target'};
+ my $destination = $onelink->{'destination'};
+ my $cmd = "mkdir -p '" . dirname($destdir . $destination) . "'";
+ system($cmd) && die "Failed to execute \"$cmd\"";
+ $cmd = "ln -sf '$target' '$destdir$destination'";
+
+ system($cmd) && die "Failed \"$cmd\"";
+ push @lines, "$destination\n";
+ }
+
+ if ( $destdir ne "" )
+ {
+ my $filelist;
+ my $fname = $installer::globals::destdir . "/$packagename";
+ open ($filelist, ">$fname") || die "Can't open $fname: $!";
+ print $filelist @lines;
+ close ($filelist);
+ }
+
+}
+
+###########################################################
+# Selecting langpack items
+###########################################################
+
+sub select_langpack_items
+{
+ my ( $itemsref, $itemname ) = @_;
+
+ installer::logger::include_header_into_logfile("Selecting RegistryItems for Language Packs");
+
+ my @itemsarray = ();
+
+ for ( my $i = 0; $i <= $#{$itemsref}; $i++ )
+ {
+ my $oneitem = ${$itemsref}[$i];
+
+ # Items with style "LANGUAGEPACK" have to be included into the patch
+ my $styles = "";
+ if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
+ if (( $styles =~ /\bLANGUAGEPACK\b/ ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ )) { push(@itemsarray, $oneitem); }
+ }
+
+ return \@itemsarray;
+}
+
+###########################################################
+# Selecting helppack items
+###########################################################
+
+sub select_helppack_items
+{
+ my ( $itemsref, $itemname ) = @_;
+
+ installer::logger::include_header_into_logfile("Selecting RegistryItems for Help Packs");
+
+ my @itemsarray = ();
+
+ for ( my $i = 0; $i <= $#{$itemsref}; $i++ )
+ {
+ my $oneitem = ${$itemsref}[$i];
+
+ # Items with style "HELPPACK" have to be included into the patch
+ my $styles = "";
+ if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; }
+ if (( $styles =~ /\bHELPPACK\b/ ) || ( $styles =~ /\bFORCEHELPPACK\b/ )) { push(@itemsarray, $oneitem); }
+ }
+
+ return \@itemsarray;
+}
+
+###########################################################
+# Replacing %-variables with the content
+# of $allvariableshashref
+###########################################################
+
+sub replace_variables_in_string
+{
+ my ( $string, $variableshashref ) = @_;
+
+ if ( $string =~ /^.*\%\w+.*$/ )
+ {
+ my $key;
+
+ # we want to substitute FOO_BR before FOO to avoid floating _BR suffixes
+ foreach $key (sort { length ($b) <=> length ($a) } keys %{$variableshashref})
+ {
+ my $value = $variableshashref->{$key};
+ $key = "\%" . $key;
+ $string =~ s/\Q$key\E/$value/g;
+ }
+ }
+
+ return $string;
+}
+
+#################################################################
+# Copying the files defined as ScpActions into the
+# installation set.
+#################################################################
+
+sub put_scpactions_into_installset
+{
+ my ($installdir) = @_;
+
+ installer::logger::include_header_into_logfile("Start: Copying scp action files into installation set");
+
+ for ( my $i = 0; $i <= $#installer::globals::allscpactions; $i++ )
+ {
+ my $onescpaction = $installer::globals::allscpactions[$i];
+
+ my $subdir = "";
+ if ( $onescpaction->{'Subdir'} ) { $subdir = $onescpaction->{'Subdir'}; }
+
+ if ( $onescpaction->{'Name'} eq "loader.exe" ) { next; } # do not copy this ScpAction loader
+
+ my $destdir = $installdir;
+ $destdir =~ s/\Q$installer::globals::separator\E\s*$//;
+ if ( $subdir ) { $destdir = $destdir . $installer::globals::separator . $subdir; }
+
+ my $sourcefile = $onescpaction->{'sourcepath'};
+ my $destfile = $destdir . $installer::globals::separator . $onescpaction->{'DestinationName'};
+
+ if (( $subdir =~ /\// ) || ( $subdir =~ /\\/ ))
+ {
+ installer::systemactions::create_directory_structure($destdir);
+ }
+ else
+ {
+ installer::systemactions::create_directory($destdir);
+ }
+
+ installer::systemactions::copy_one_file($sourcefile, $destfile);
+
+ if ( $onescpaction->{'UnixRights'} )
+ {
+ chmod oct($onescpaction->{'UnixRights'}), $destfile;
+ }
+
+ }
+
+ installer::logger::include_header_into_logfile("End: Copying scp action files into installation set");
+
+}
+
+#################################################################
+# Collecting scp actions for all languages
+#################################################################
+
+sub collect_scpactions
+{
+ my ($allscpactions) = @_;
+
+ for ( my $i = 0; $i <= $#{$allscpactions}; $i++ )
+ {
+ push(@installer::globals::allscpactions, ${$allscpactions}[$i]);
+ }
+}
+
+###########################################################
+# Adding additional variables into the variableshashref,
+# that are defined in include files in the source tree. The
+# names of the include files are stored in
+# ADD_INCLUDE_FILES (comma separated list).
+###########################################################
+
+sub add_variables_from_inc_to_hashref
+{
+ my ($allvariables, $includepatharrayref) = @_;
+
+ my $infoline = "";
+ my $includefilelist = $allvariables->{'ADD_INCLUDE_FILES'} || "";
+
+ for my $includefilename (split /,\s*/, $includefilelist)
+ {
+ $includefilename =~ s/^\s*//;
+ $includefilename =~ s/\s*$//;
+ $includefilenameref = $ENV{'SRCDIR'} . "/" . $includefilename;
+ if ( ! -f $includefilenameref ) { installer::exiter::exit_program("Include file $includefilename ($includefilenameref) not found!\nADD_INCLUDE_FILES = $allvariables->{'ADD_INCLUDE_FILES'}", "add_variables_from_inc_to_hashref"); }
+
+ $infoline = "Including inc file: $includefilenameref \n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ my $includefile = installer::files::read_file($includefilenameref);
+
+ for ( my $j = 0; $j <= $#{$includefile}; $j++ )
+ {
+ # Analyzing all "key=value" lines
+ my $oneline = ${$includefile}[$j];
+
+ if ( $oneline =~ /^\s*(\S+)\s*\=\s*(.*?)\s*$/ ) # no white space allowed in key
+ {
+ my $key = $1;
+ my $value = $2;
+ $allvariables->{$key} = $value;
+ $infoline = "Setting of variable: $key = $value\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ }
+ }
+ }
+}
+
+##############################################
+# Collecting all files from include paths
+##############################################
+
+sub collect_all_files_from_includepaths
+{
+ my ($patharrayref) = @_;
+
+ installer::logger::globallog("Reading all directories: Start");
+ installer::logger::print_message( "... reading include paths ...\n" );
+ # empty the global
+
+ @installer::globals::allincludepaths =();
+ my $infoline;
+
+ for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
+ {
+ $includepath = ${$patharrayref}[$i];
+ installer::remover::remove_leading_and_ending_whitespaces(\$includepath);
+
+ if ( ! -d $includepath )
+ {
+ $infoline = "$includepath does not exist. (Can be removed from include path list?)\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ next;
+ }
+
+ my @sourcefiles = ();
+ my $pathstring = "";
+ installer::systemactions::read_full_directory($includepath, $pathstring, \@sourcefiles);
+
+ if ( ! ( $#sourcefiles > -1 ))
+ {
+ $infoline = "$includepath is empty. (Can be removed from include path list?)\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+ }
+ else
+ {
+ my $number = $#sourcefiles + 1;
+ $infoline = "Directory $includepath contains $number files (including subdirs)\n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ my %allfileshash = ();
+ $allfileshash{'includepath'} = $includepath;
+
+ for ( my $j = 0; $j <= $#sourcefiles; $j++ )
+ {
+ $allfileshash{$sourcefiles[$j]} = 1;
+ }
+
+ push(@installer::globals::allincludepaths, \%allfileshash);
+ }
+ }
+
+ $installer::globals::include_paths_read = 1;
+
+ installer::logger::globallog("Reading all directories: End");
+ push( @installer::globals::globallogfileinfo, "\n");
+}
+
+##############################################
+# Searching for a file with the gid
+##############################################
+
+sub find_file_by_id
+{
+ my ( $filesref, $gid ) = @_;
+
+ my $foundfile = 0;
+ my $onefile;
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ $onefile = ${$filesref}[$i];
+ my $filegid = $onefile->{'gid'};
+
+ if ( $filegid eq $gid )
+ {
+ $foundfile = 1;
+ last;
+ }
+ }
+
+ if (! $foundfile ) { $onefile = ""; }
+
+ return $onefile;
+}
+
+#################################################
+# Generating paths for cygwin (second version)
+# This function generates smaller files for
+#################################################
+
+sub generate_cygwin_paths
+{
+ my ($filesref) = @_;
+
+ installer::logger::include_timestamp_into_logfile("Starting generating cygwin paths");
+
+ my $infoline = "Generating cygwin paths (generate_cygwin_paths)\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $max = 5000; # number of paths in one file
+
+ my @pathcollector = ();
+ my $startnumber = 0;
+ my $counter = 0;
+
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ my $line = ${$filesref}[$i]->{'sourcepath'} . "\n";
+ push(@pathcollector, $line);
+ $counter++;
+
+ if (( $i == $#{$filesref} ) || ((( $counter % $max ) == 0 ) && ( $i > 0 )))
+ {
+ my $tmpfilename = "cygwinhelper_" . $i . ".txt";
+ my $temppath = $installer::globals::temppath;
+ $temppath =~ s/\Q$installer::globals::separator\E\s*$//;
+ $tmpfilename = $temppath . $installer::globals::separator . $tmpfilename;
+ $infoline = "Creating temporary file for cygwin conversion: $tmpfilename (contains $counter paths)\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ if ( -f $tmpfilename ) { unlink $tmpfilename; }
+
+ installer::files::save_file($tmpfilename, \@pathcollector);
+
+ my $success = 0;
+ my @cyg_sourcepathlist = qx{cygpath -w -f "$tmpfilename"};
+ chomp @cyg_sourcepathlist;
+
+ # Validating the array, it has to contain the correct number of values
+ my $new_paths = $#cyg_sourcepathlist + 1;
+ if ( $new_paths == $counter ) { $success = 1; }
+
+ if ($success)
+ {
+ $infoline = "Success: Successfully converted to cygwin paths!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "ERROR: Failed to convert to cygwin paths!\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: Failed to convert to cygwin paths!", "generate_cygwin_paths");
+ }
+
+ for ( my $j = 0; $j <= $#cyg_sourcepathlist; $j++ )
+ {
+ my $number = $startnumber + $j;
+ ${$filesref}[$number]->{'cyg_sourcepath'} = $cyg_sourcepathlist[$j];
+ }
+
+ if ( -f $tmpfilename ) { unlink $tmpfilename; }
+
+ @pathcollector = ();
+ $startnumber = $startnumber + $max;
+ $counter = 0;
+ }
+ }
+
+ # Checking existence of cyg_sourcepath for every file
+ for ( my $i = 0; $i <= $#{$filesref}; $i++ )
+ {
+ if (( ! exists(${$filesref}[$i]->{'cyg_sourcepath'}) ) || ( ${$filesref}[$i]->{'cyg_sourcepath'} eq "" ))
+ {
+ $infoline = "ERROR: No cygwin sourcepath defined for file ${$filesref}[$i]->{'sourcepath'}\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ installer::exiter::exit_program("ERROR: No cygwin sourcepath defined for file ${$filesref}[$i]->{'sourcepath'}!", "generate_cygwin_paths");
+ }
+ }
+
+ installer::logger::include_timestamp_into_logfile("Ending generating cygwin paths");
+}
+
+######################################################
+# Getting the first entry from a list of languages
+######################################################
+
+sub get_first_from_list
+{
+ my ( $list ) = @_;
+
+ my $first = $list;
+
+ if ( $list =~ /^\s*(.+?),(.+)\s*$/) # "?" for minimal matching
+ {
+ $first = $1;
+ }
+
+ return $first;
+}
+
+################################################
+# Setting all spellchecker languages
+################################################
+
+sub set_spellcheckerlanguages
+{
+ my ( $productlanguagesarrayref, $allvariables ) = @_;
+
+ my %productlanguages = ();
+ for ( my $i = 0; $i <= $#{$productlanguagesarrayref}; $i++ ) { $productlanguages{${$productlanguagesarrayref}[$i]} = 1; }
+
+ my $spellcheckfilename = $allvariables->{'SPELLCHECKERFILE'};
+
+ my $spellcheckfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$spellcheckfilename, "", 1);
+
+ if ($$spellcheckfileref eq "") { installer::exiter::exit_program("ERROR: Could not find $spellcheckfilename!", "set_spellcheckerlanguages"); }
+
+ my $infoline = "Using spellchecker file: $$spellcheckfileref \n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+
+ my $spellcheckfile = installer::files::read_file($$spellcheckfileref);
+ my %spellcheckhash = ();
+
+ for ( my $j = 0; $j <= $#{$spellcheckfile}; $j++ )
+ {
+ # Analyzing all "key=value" lines
+ my $oneline = ${$spellcheckfile}[$j];
+
+ if ( $oneline =~ /^\s*(\S+)\s*\=\s*\"(.*?)\"\s*$/ ) # no white space allowed in key
+ {
+ my $onelang = $1;
+ my $languagelist = $2;
+
+ # Special handling for language packs. Only include the first language of the language list.
+ # If no spellchecker shall be included, the keyword "EMPTY" can be used.
+
+ if ( $installer::globals::languagepack )
+ {
+ my $first = get_first_from_list($languagelist);
+
+ if ( $first eq "EMPTY" ) # no spellchecker into language pack
+ {
+ $languagelist = "";
+ }
+ else
+ {
+ $languagelist = $first;
+ }
+ }
+ else # no language pack, so EMPTY is not required
+ {
+ $languagelist =~ s/^\s*EMPTY\s*,//; # removing the entry EMPTY
+ }
+
+ $spellcheckhash{$onelang} = $languagelist;
+ }
+ }
+
+ # Collecting all required languages in %installer::globals::spellcheckerlanguagehash
+
+ foreach my $lang (keys %productlanguages)
+ {
+ my $languagelist = "";
+ if ( exists($spellcheckhash{$lang}) ) { $languagelist = $spellcheckhash{$lang}; }
+ else { $languagelist = ""; } # no dictionary unless defined in SPELLCHECKERFILE
+
+ my $langlisthash = installer::converter::convert_stringlist_into_hash(\$languagelist, ",");
+ foreach my $onelang ( keys %{$langlisthash} ) { $installer::globals::spellcheckerlanguagehash{$onelang} = 1; }
+ }
+
+ $installer::globals::analyze_spellcheckerlanguage = 1;
+
+ # Logging
+
+ my $langstring = "";
+ foreach my $lang (sort keys %installer::globals::spellcheckerlanguagehash) { $langstring = $langstring . "," . $lang }
+ $langstring =~ s/^\s*,//;
+
+ $infoline = "Collected spellchecker languages for spellchecker: $langstring \n";
+ push( @installer::globals::globallogfileinfo, $infoline);
+}
+
+################################################
+# Including a license text into setup script
+################################################
+
+sub put_license_into_setup
+{
+ my ($installdir, $includepatharrayref) = @_;
+
+ # find and read the license file
+ my $licenselanguage = "en-US"; # always english !
+ my $licensefilename = "license";
+ # my $licensefilename = "LICENSE" . ".txt";
+ my $licenseincludepatharrayref = get_language_specific_include_paths($includepatharrayref, $licenselanguage);
+
+ my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $licenseincludepatharrayref, 0);
+ if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "put_license_into_setup"); }
+ my $licensefile = installer::files::read_file($$licenseref);
+
+ # Read setup
+ my $setupfilename = $installdir . $installer::globals::separator . "setup";
+ my $setupfile = installer::files::read_file($setupfilename);
+
+ # Replacement
+ my $infoline = "Adding licensefile into setup script\n";
+ push( @installer::globals::logfileinfo, $infoline);
+
+ my $includestring = "";
+ for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) { $includestring = $includestring . ${$licensefile}[$i]; }
+ for ( my $i = 0; $i <= $#{$setupfile}; $i++ ) { ${$setupfile}[$i] =~ s/LICENSEFILEPLACEHOLDER/$includestring/; }
+
+ # Write setup
+ installer::files::save_file($setupfilename, $setupfile);
+}
+
+#########################################################
+# Collecting all pkgmap files from an installation set
+#########################################################
+
+sub collectpackagemaps
+{
+ my ( $installdir, $languagestringref, $allvariables ) = @_;
+
+ installer::logger::include_header_into_logfile("Collecting all packagemaps (pkgmap):");
+
+ my $pkgmapdir = installer::systemactions::create_directories("pkgmap", $languagestringref);
+ my $subdirname = $allvariables->{'UNIXPRODUCTNAME'} . "_pkgmaps";
+ my $pkgmapsubdir = $pkgmapdir . $installer::globals::separator . $subdirname;
+ if ( -d $pkgmapsubdir ) { installer::systemactions::remove_complete_directory($pkgmapsubdir); }
+ if ( ! -d $pkgmapsubdir ) { installer::systemactions::create_directory($pkgmapsubdir); }
+
+ $installdir =~ s/\/\s*$//;
+ # Collecting all packages in $installdir and its sub package ("packages")
+ my $searchdir = $installdir . $installer::globals::separator . $installer::globals::epmoutpath;
+
+ my $allpackages = installer::systemactions::get_all_directories_without_path($searchdir);
+
+ for ( my $i = 0; $i <= $#{$allpackages}; $i++ )
+ {
+ my $pkgmapfile = $searchdir . $installer::globals::separator . ${$allpackages}[$i] . $installer::globals::separator . "pkgmap";
+ my $destfilename = $pkgmapsubdir . $installer::globals::separator . ${$allpackages}[$i] . "_pkgmap";
+ installer::systemactions::copy_one_file($pkgmapfile, $destfilename);
+ }
+
+ # Create a tar gz file with all package maps
+ my $tarfilename = $subdirname . ".tar";
+ my $targzname = $tarfilename . ".gz";
+ $systemcall = "cd $pkgmapdir; tar -cf - $subdirname | $installer::globals::packertool > $targzname";
+ installer::systemactions::make_systemcall($systemcall);
+ installer::systemactions::remove_complete_directory($pkgmapsubdir, 1);
+}
+
+1;
diff --git a/solenv/bin/modules/installer/ziplist.pm b/solenv/bin/modules/installer/ziplist.pm
new file mode 100644
index 000000000..b76c62fc7
--- /dev/null
+++ b/solenv/bin/modules/installer/ziplist.pm
@@ -0,0 +1,828 @@
+#
+# 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 .
+#
+
+package installer::ziplist;
+
+use base 'Exporter';
+
+use File::Spec::Functions qw(rel2abs);
+
+use installer::converter;
+use installer::exiter;
+use installer::files;
+use installer::globals;
+use installer::logger;
+use installer::remover;
+use installer::systemactions;
+
+our @EXPORT_OK = qw(read_ziplist);
+
+sub read_ziplist {
+ my $ziplistname = shift;
+
+ installer::logger::globallog("zip list file: $ziplistname");
+
+ my $ziplistref = installer::files::read_file($ziplistname);
+
+ installer::logger::print_message( "... analyzing $ziplistname ... \n" );
+
+ my ($productblockref, $parent) = getproductblock($ziplistref, $installer::globals::product, 1); # product block from zip.lst
+
+ my ($settingsblockref, undef) = getproductblock($productblockref, "Settings", 0); # settings block from zip.lst
+ $settingsblockref = analyze_settings_block($settingsblockref); # select data from settings block in zip.lst
+
+ my $allsettingsarrayref = get_settings_from_ziplist($settingsblockref);
+ my $allvariablesarrayref = get_variables_from_ziplist($settingsblockref);
+
+ my ($globalproductblockref, undef) = getproductblock($ziplistref, $installer::globals::globalblock, 0); # global product block from zip.lst
+
+ while (defined $parent) {
+ my $parentproductblockref;
+ ($parentproductblockref, $parent) = getproductblock($ziplistref, $parent, 1);
+ my ($parentsettingsblockref, undef) = getproductblock($parentproductblockref, "Settings", 0);
+ $parentsettingsblockref = analyze_settings_block($parentsettingsblockref);
+ my $allparentsettingsarrayref = get_settings_from_ziplist($parentsettingsblockref);
+ my $allparentvariablesarrayref = get_variables_from_ziplist($parentsettingsblockref);
+ $allsettingsarrayref =
+ installer::converter::combine_arrays_from_references_first_win(
+ $allsettingsarrayref, $allparentsettingsarrayref)
+ if $#{$allparentsettingsarrayref} > -1;
+ $allvariablesarrayref =
+ installer::converter::combine_arrays_from_references_first_win(
+ $allvariablesarrayref, $allparentvariablesarrayref)
+ if $#{$allparentvariablesarrayref} > -1;
+ }
+
+ if ( @{$globalproductblockref} ) {
+ my ($globalsettingsblockref, undef) = getproductblock($globalproductblockref, "Settings", 0); # settings block from zip.lst
+
+ $globalsettingsblockref = analyze_settings_block($globalsettingsblockref); # select data from settings block in zip.lst
+
+ my $allglobalsettingsarrayref = get_settings_from_ziplist($globalsettingsblockref);
+
+ my $allglobalvariablesarrayref = get_variables_from_ziplist($globalsettingsblockref);
+
+ if ( @{$allglobalsettingsarrayref} ) {
+ $allsettingsarrayref = installer::converter::combine_arrays_from_references_first_win($allsettingsarrayref, $allglobalsettingsarrayref);
+ }
+ if ( @{$allglobalvariablesarrayref} ) {
+ $allvariablesarrayref = installer::converter::combine_arrays_from_references_first_win($allvariablesarrayref, $allglobalvariablesarrayref);
+ }
+ }
+
+ $allsettingsarrayref = remove_multiples_from_ziplist($allsettingsarrayref);
+ $allvariablesarrayref = remove_multiples_from_ziplist($allvariablesarrayref);
+
+ replace_variables_in_ziplist_variables($allvariablesarrayref);
+
+ my $allvariableshashref = installer::converter::convert_array_to_hash($allvariablesarrayref);
+
+ set_default_productversion_if_required($allvariableshashref);
+ add_variables_to_allvariableshashref($allvariableshashref);
+ overwrite_branding( $allvariableshashref );
+
+ return $allsettingsarrayref, $allvariableshashref;
+}
+
+#################################################
+# Getting data from path file and zip list file
+#################################################
+
+sub getproductblock
+{
+ my ($fileref, $search, $inheritance) = @_;
+
+ my @searchblock = ();
+ my $searchexists = 0;
+ my $record = 0;
+ my $count = 0;
+ my $line;
+ my $inh = $inheritance ? '(?::\s*(\S+)\s*)?' : "";
+ my $parent;
+
+ for ( my $i = 0; $i <= $#{$fileref}; $i++ )
+ {
+ $line = ${$fileref}[$i];
+
+ if ( $line =~ /^\s*\Q$search\E\s*$inh$/i ) # case insensitive
+ {
+ $record = 1;
+ $searchexists = 1;
+ $parent = $1 if $inheritance;
+ }
+
+ if ($record)
+ {
+ push(@searchblock, $line);
+ }
+
+ if ( ($record) && ($line =~ /\{/) )
+ {
+ $count++;
+ }
+
+ if ( ($record) && ($line =~ /\}/) )
+ {
+ $count--;
+ }
+
+ if ( ($record) && ($line =~ /\}/) && ( $count == 0 ) )
+ {
+ $record = 0;
+ }
+ }
+
+ if (( ! $searchexists ) && ( $search ne $installer::globals::globalblock ))
+ {
+ if ($search eq $installer::globals::product )
+ {
+ installer::exiter::exit_program("ERROR: Product $installer::globals::product not defined in $installer::globals::ziplistname", "getproductblock");
+ }
+ else # this is not possible
+ {
+ installer::exiter::exit_program("ERROR: Unknown value for $search in getproductblock()", "getproductblock");
+ }
+ }
+
+ return (\@searchblock, $parent);
+}
+
+###############################################
+# Analyzing the settings in the zip list file
+###############################################
+
+sub analyze_settings_block
+{
+ my ($blockref) = @_;
+
+ my @newsettingsblock = ();
+ my $record = 1;
+ my $counter = 0;
+
+ # Allowed values in settings block:
+ # "Settings", "Variables", "unix" (for destination path and logfile)
+
+ # Comment line in settings block begin with "#" or ";"
+
+ for ( my $i = 0; $i <= $#{$blockref}; $i++ )
+ {
+ my $line = ${$blockref}[$i];
+ my $nextline = "";
+
+ if ( ${$blockref}[$i+1] ) { $nextline = ${$blockref}[$i+1]; }
+
+ # removing comment lines
+
+ if (($line =~ /^\s*\#/) || ($line =~ /^\s*\;/))
+ {
+ next;
+ }
+
+ # complete blocks of unknown strings are not recorded
+
+ if ((!($line =~ /^\s*\Q$installer::globals::build\E\s*$/i)) &&
+ (!($line =~ /^\s*\bSettings\b\s*$/i)) &&
+ (!($line =~ /^\s*\bVariables\b\s*$/i)) &&
+ (!($line =~ /^\s*\bunix\b\s*$/i)) &&
+ ($nextline =~ /^\s*\{\s*$/i))
+ {
+ $record = 0;
+ next; # continue with next $i
+ }
+
+ if (!( $record ))
+ {
+ if ($line =~ /^\s*\{\s*$/i)
+ {
+ $counter++;
+ }
+
+ if ($line =~ /^\s*\}\s*$/i)
+ {
+ $counter--;
+ }
+
+ if ($counter == 0)
+ {
+ $record = 1;
+ next; # continue with next $i
+ }
+ }
+
+ if ($record)
+ {
+ push(@newsettingsblock, $line);
+ }
+ }
+
+ return \@newsettingsblock;
+}
+
+########################################
+# Settings in zip list file
+########################################
+
+sub get_settings_from_ziplist
+{
+ my ($blockref) = @_;
+
+ my @allsettings = ();
+ my $isvariables = 0;
+ my $counter = 0;
+ my $variablescounter = 0;
+
+ # Take all settings from the settings block
+ # Do not take the variables from the settings block
+ # If a setting is defined more than once, take the
+ # setting with the largest counter (open brackets)
+
+ for ( my $i = 0; $i <= $#{$blockref}; $i++ )
+ {
+ my $line = ${$blockref}[$i];
+ my $nextline = "";
+
+ if ( ${$blockref}[$i+1] ) { $nextline = ${$blockref}[$i+1]; }
+
+ if (($line =~ /^\s*\S+\s*$/i) &&
+ ($nextline =~ /^\s*\{\s*$/i) &&
+ (!($line =~ /^\s*Variables\s*$/i)))
+ {
+ next;
+ }
+
+ if ($line =~ /^\s*Variables\s*$/i)
+ {
+ # This is a block of variables
+
+ $isvariables = 1;
+ next;
+ }
+
+ if ($line =~ /^\s*\{\s*$/i)
+ {
+ if ($isvariables)
+ {
+ $variablescounter++;
+ }
+ else
+ {
+ $counter++;
+ }
+
+ next;
+ }
+
+ if ($line =~ /^\s*\}\s*$/i)
+ {
+ if ($isvariables)
+ {
+ $variablescounter--;
+
+ if ($variablescounter == 0)
+ {
+ $isvariables = 0;
+ }
+ }
+ else
+ {
+ $counter--;
+ }
+
+ next;
+ }
+
+ if ($isvariables)
+ {
+ next;
+ }
+
+ installer::remover::remove_leading_and_ending_whitespaces(\$line);
+
+ $line .= "\t##$counter##\n";
+
+ push(@allsettings, $line);
+ }
+
+ return \@allsettings;
+}
+
+#######################################
+# Variables from zip list file
+#######################################
+
+sub get_variables_from_ziplist
+{
+ my ($blockref) = @_;
+
+ my @allvariables = ();
+ my $isvariables = 0;
+ my $counter = 0;
+ my $variablescounter = 0;
+ my $countersum = 0;
+
+ # Take all variables from the settings block
+ # Do not take the other settings from the settings block
+ # If a variable is defined more than once, take the
+ # variable with the largest counter (open brackets)
+
+ for ( my $i = 0; $i <= $#{$blockref}; $i++ )
+ {
+ my $line = ${$blockref}[$i];
+ my $nextline = ${$blockref}[$i+1];
+
+ if ($line =~ /^\s*Variables\s*$/i)
+ {
+ # This is a block of variables
+
+ $isvariables = 1;
+ next;
+ }
+
+ if ($line =~ /^\s*\{\s*$/i)
+ {
+ if ($isvariables)
+ {
+ $variablescounter++;
+ }
+ else
+ {
+ $counter++;
+ }
+
+ next;
+ }
+
+ if ($line =~ /^\s*\}\s*$/i)
+ {
+ if ($isvariables)
+ {
+ $variablescounter--;
+
+ if ($variablescounter == 0)
+ {
+ $isvariables = 0;
+ }
+ }
+ else
+ {
+ $counter--;
+ }
+
+ next;
+ }
+
+ if (!($isvariables))
+ {
+ next;
+ }
+
+ $countersum = $counter + $variablescounter;
+
+ installer::remover::remove_leading_and_ending_whitespaces(\$line);
+
+ $line .= "\t##$countersum##\n";
+
+ push(@allvariables, $line);
+ }
+
+ return \@allvariables;
+}
+
+#######################################################################
+# Removing multiple variables and settings, defined in zip list file
+#######################################################################
+
+sub remove_multiples_from_ziplist
+{
+ my ($blockref) = @_;
+
+ # remove all definitions of settings and variables
+ # that occur more than once in the zip list file.
+ # Take the one with the most open brackets. This
+ # number is stored at the end of the string.
+
+ my @newarray = ();
+ my @itemarray = ();
+ my ($line, $itemname, $itemnumber);
+
+ # first collecting all variables and settings names
+
+ for ( my $i = 0; $i <= $#{$blockref}; $i++ )
+ {
+ $line = ${$blockref}[$i];
+
+ if ($line =~ /^\s*\b(\S*)\b\s+.*\#\#\d+\#\#\s*$/i)
+ {
+ $itemname = $1;
+ }
+
+ if (! grep {$_ eq $itemname} @itemarray)
+ {
+ push(@itemarray, $itemname);
+ }
+ }
+
+ # and now all $items can be selected with the highest number
+
+ for ( my $i = 0; $i <= $#itemarray; $i++ )
+ {
+ $itemname = $itemarray[$i];
+
+ my $itemnumbermax = 0;
+ my $printline = "";
+
+ for ( my $j = 0; $j <= $#{$blockref}; $j++ )
+ {
+ $line = ${$blockref}[$j];
+
+ if ($line =~ /^\s*\Q$itemname\E\s+.*\#\#(\d+)\#\#\s*$/)
+ {
+ $itemnumber = $1;
+
+ if ($itemnumber >= $itemnumbermax)
+ {
+ $printline = $line;
+ $itemnumbermax = $itemnumber;
+ }
+ }
+ }
+
+ # removing the ending number from the printline
+ # and putting it into the array
+
+ $printline =~ s/\#\#\d+\#\#//;
+ installer::remover::remove_leading_and_ending_whitespaces(\$line);
+ push(@newarray, $printline);
+ }
+
+ return \@newarray;
+}
+
+#########################################################
+# Reading one variable defined in the zip list file
+#########################################################
+
+sub getinfofromziplist
+{
+ my ($blockref, $variable) = @_;
+
+ my $searchstring = "";
+ my $line;
+
+ for ( my $i = 0; $i <= $#{$blockref}; $i++ )
+ {
+ $line = ${$blockref}[$i];
+
+ if ( $line =~ /^\s*\Q$variable\E\s+(.+?)\s*$/ ) # "?" for minimal matching
+ {
+ $searchstring = $1;
+ last;
+ }
+ }
+
+ return \$searchstring;
+}
+
+####################################################
+# Replacing variables in include path
+####################################################
+
+sub replace_all_variables_in_paths
+{
+ my ( $patharrayref, $variableshashref ) = @_;
+
+ for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
+ {
+ my $line = ${$patharrayref}[$i];
+
+ my $key;
+
+ foreach $key (sort { length ($b) <=> length ($a) } keys %{$variableshashref})
+ {
+ my $value = $variableshashref->{$key};
+
+ if (( $line =~ /\{$key\}/ ) && ( $value eq "" )) { $line = ".\n"; }
+
+ $line =~ s/\{\Q$key\E\}/$value/g;
+ }
+
+ ${$patharrayref}[$i] = $line;
+ }
+}
+
+####################################################
+# Replacing minor in include path
+####################################################
+
+sub replace_minor_in_paths
+{
+ my ( $patharrayref ) = @_;
+
+ for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
+ {
+ my $line = ${$patharrayref}[$i];
+
+ $line =~ s/\.\{minor\}//g;
+ $line =~ s/\.\{minornonpre\}//g;
+
+ ${$patharrayref}[$i] = $line;
+ }
+}
+
+####################################################
+# Replacing packagetype in include path
+####################################################
+
+sub replace_packagetype_in_paths
+{
+ my ( $patharrayref ) = @_;
+
+ for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
+ {
+ my $line = ${$patharrayref}[$i];
+
+ if (( $installer::globals::installertypedir ) && ( $line =~ /\{pkgtype\}/ ))
+ {
+ $line =~ s/\{pkgtype\}/$installer::globals::installertypedir/g;
+ }
+
+ ${$patharrayref}[$i] = $line;
+ }
+}
+
+####################################################
+# Removing ending separators in paths
+####################################################
+
+sub remove_ending_separator
+{
+ my ( $patharrayref ) = @_;
+
+ for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
+ {
+ my $line = ${$patharrayref}[$i];
+
+ installer::remover::remove_ending_pathseparator(\$line);
+
+ $line =~ s/\s*$//;
+ $line = $line . "\n";
+
+ ${$patharrayref}[$i] = $line;
+ }
+}
+
+####################################################
+# Replacing languages in include path
+####################################################
+
+sub replace_languages_in_paths
+{
+ my ( $patharrayref, $languagesref ) = @_;
+
+ installer::logger::include_header_into_logfile("Replacing languages in include paths:");
+
+ my @patharray = ();
+ my $infoline = "";
+
+ for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
+ {
+ my $line = ${$patharrayref}[$i];
+
+ if ( $line =~ /\$\(LANG\)/ )
+ {
+ my $originalline = $line;
+ my $newline = "";
+
+ for ( my $j = 0; $j <= $#{$languagesref}; $j++ )
+ {
+ my $language = ${$languagesref}[$j];
+ $line =~ s/\$\(LANG\)/$language/g;
+ push(@patharray ,$line);
+ $newdir = $line;
+ $line = $originalline;
+
+ installer::remover::remove_leading_and_ending_whitespaces(\$newline);
+
+ # Is it necessary to refresh the global array, containing all files of all include paths?
+ if ( -d $newdir )
+ {
+ # Checking if $newdir is empty
+ if ( ! installer::systemactions::is_empty_dir($newdir) )
+ {
+ $installer::globals::refresh_includepaths = 1;
+ $infoline = "Directory $newdir exists and is not empty. Refreshing global file array is required.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ else
+ {
+ $infoline = "Directory $newdir is empty. No refresh of global file array required.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ else
+ {
+ $infoline = "Directory $newdir does not exist. No refresh of global file array required.\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+ else # not language dependent include path
+ {
+ push(@patharray ,$line);
+ }
+ }
+
+ return \@patharray;
+}
+
+#####################################################
+# Collecting all files from all include paths
+#####################################################
+
+sub list_all_files_from_include_path
+{
+ my ( $patharrayref) = @_;
+
+ installer::logger::include_header_into_logfile("Include paths:");
+
+ for ( my $i = 0; $i <= $#{$patharrayref}; $i++ )
+ {
+ my $path = ${$patharrayref}[$i];
+ installer::remover::remove_leading_and_ending_whitespaces(\$path);
+ my $infoline = "$path\n";
+ push( @installer::globals::logfileinfo, $infoline);
+ }
+
+ push( @installer::globals::logfileinfo, "\n");
+
+ return \@filesarray;
+}
+
+#####################################################
+# Collecting all files from all include paths
+#####################################################
+
+sub set_manufacturer
+{
+ my ($allvariables) = @_;
+ my $manufacturer;
+
+ if( defined $ENV{'OOO_VENDOR'} && $ENV{'OOO_VENDOR'} ne "" )
+ {
+ $manufacturer = $ENV{'OOO_VENDOR'};
+ }
+ elsif( defined $ENV{'USERNAME'} && $ENV{'USERNAME'} ne "" )
+ {
+ $manufacturer = $ENV{'USERNAME'};
+ }
+ elsif( defined $ENV{'USER'} && $ENV{'USER'} ne "" )
+ {
+ $manufacturer = $ENV{'USER'};
+ }
+ else
+ {
+ $manufacturer = "default";
+ }
+
+ $installer::globals::manufacturer = $manufacturer;
+ $installer::globals::longmanufacturer = $manufacturer;
+
+ $allvariables->{'MANUFACTURER'} = $installer::globals::manufacturer;
+}
+
+##############################################################
+# A ProductVersion has to be defined. If it is not set in
+# zip.lst, it is set now to "1"
+##############################################################
+
+sub set_default_productversion_if_required
+{
+ my ($allvariables) = @_;
+
+ if (!($allvariables->{'PRODUCTVERSION'}))
+ {
+ $allvariables->{'PRODUCTVERSION'} = 1; # FAKE
+ }
+}
+
+####################################################
+# Removing .. in paths
+####################################################
+
+sub simplify_path
+{
+ my ( $pathref ) = @_;
+
+ my $oldpath = $$pathref;
+
+ my $change = 0;
+
+ while ( $oldpath =~ /(^.*)(\Q$installer::globals::separator\E.*\w+?)(\Q$installer::globals::separator\E\.\.)(\Q$installer::globals::separator\E.*$)/ )
+ {
+ my $part1 = $1;
+ my $part2 = $4;
+ $oldpath = $part1 . $part2;
+ $change = 1;
+ }
+
+ if ( $change ) { $$pathref = $oldpath . "\n"; }
+}
+
+####################################################
+# Removing ending separators in paths
+####################################################
+
+sub resolve_relative_paths
+{
+ my ( $patharrayref ) = @_;
+
+ for my $path ( @{$patharrayref} )
+ {
+ $path = rel2abs($path);
+ simplify_path(\$path);
+ }
+}
+
+####################################################
+# Replacing variables inside zip list variables
+# Example: {milestone} to be replaced by
+# $installer::globals::lastminor
+####################################################
+
+sub replace_variables_in_ziplist_variables
+{
+ my ($blockref) = @_;
+
+ for ( my $i = 0; $i <= $#{$blockref}; $i++ )
+ {
+ ${$blockref}[$i] =~ s/\{milestone\}//;
+ ${$blockref}[$i] =~ s/\{minor\}//;
+ if ( $installer::globals::buildid ) { ${$blockref}[$i] =~ s/\{buildid\}/$installer::globals::buildid/; }
+ else { ${$blockref}[$i] =~ s/\{buildid\}//; }
+ if ( $installer::globals::build ) { ${$blockref}[$i] =~ s/\{buildsource\}/$installer::globals::build/; }
+ else { ${$blockref}[$i] =~ s/\{build\}//; }
+ }
+}
+
+###########################################################
+# Overwrite branding data in openoffice.lst that is defined in configure
+###########################################################
+
+sub overwrite_branding
+{
+ my ($variableshashref) = @_;
+ $variableshashref->{'PROGRESSBARCOLOR'} = $ENV{'PROGRESSBARCOLOR'} , if( defined $ENV{'PROGRESSBARCOLOR'} && $ENV{'PROGRESSBARCOLOR'} ne "" );
+ $variableshashref->{'PROGRESSSIZE'} = $ENV{'PROGRESSSIZE'} , if( defined $ENV{'PROGRESSSIZE'} && $ENV{'PROGRESSSIZE'} ne "" );
+ $variableshashref->{'PROGRESSPOSITION'} = $ENV{'PROGRESSPOSITION'} , if( defined $ENV{'PROGRESSPOSITION'} && $ENV{'PROGRESSPOSITION'} ne "" );
+ $variableshashref->{'PROGRESSFRAMECOLOR'} = $ENV{'PROGRESSFRAMECOLOR'} , if( defined $ENV{'PROGRESSFRAMECOLOR'} && $ENV{'PROGRESSFRAMECOLOR'} ne "" );
+ $variableshashref->{'PROGRESSTEXTCOLOR'} = $ENV{'PROGRESSTEXTCOLOR'} , if( defined $ENV{'PROGRESSTEXTCOLOR'} && $ENV{'PROGRESSTEXTCOLOR'} ne "" );
+ $variableshashref->{'PROGRESSTEXTBASELINE'} = $ENV{'PROGRESSTEXTBASELINE'} , if( defined $ENV{'PROGRESSTEXTBASELINE'} && $ENV{'PROGRESSTEXTBASELINE'} ne "" );
+}
+
+###########################################################
+# Adding the lowercase variables into the variableshashref
+###########################################################
+
+sub add_variables_to_allvariableshashref
+{
+ my ($variableshashref) = @_;
+
+ my $lcvariable = lc($variableshashref->{'PRODUCTNAME'});
+ $variableshashref->{'LCPRODUCTNAME'} = $lcvariable;
+
+ if ($variableshashref->{'PRODUCTEXTENSION'})
+ {
+ $variableshashref->{'LCPRODUCTEXTENSION'} = "\-" . lc($variableshashref->{'PRODUCTEXTENSION'}); # including the "-" !
+ }
+ else
+ {
+ $variableshashref->{'LCPRODUCTEXTENSION'} = "";
+ }
+
+ if ( $installer::globals::languagepack ) { $variableshashref->{'PRODUCTADDON'} = $installer::globals::languagepackaddon; }
+ elsif ( $installer::globals::helppack ) { $variableshashref->{'PRODUCTADDON'} = $installer::globals::helppackaddon; }
+ else { $variableshashref->{'PRODUCTADDON'} = ""; }
+
+ my $localbuild = $installer::globals::build;
+ if ( $localbuild =~ /^\s*(\w+?)(\d+)\s*$/ ) { $localbuild = $2; } # using "680" instead of "src680"
+ $variableshashref->{'PRODUCTMAJOR'} = $localbuild;
+
+ $variableshashref->{'PRODUCTBUILDID'} = $installer::globals::buildid;
+}
+
+1;
diff --git a/solenv/bin/modules/par2script/check.pm b/solenv/bin/modules/par2script/check.pm
new file mode 100644
index 000000000..727cd7c83
--- /dev/null
+++ b/solenv/bin/modules/par2script/check.pm
@@ -0,0 +1,337 @@
+#
+# 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 .
+#
+
+package par2script::check;
+
+use par2script::globals;
+
+################################
+# Checks of the setup script
+################################
+
+########################################################
+# Checking if all defined directories are needed
+########################################################
+
+sub check_needed_directories
+{
+ my $allfiles = $par2script::globals::definitions{'File'};
+ my $alldirs = $par2script::globals::definitions{'Directory'};
+
+ # checking if all defined directories are needed
+
+ my $dir;
+ foreach $dir ( keys %{$alldirs} )
+ {
+ # I. directory has create flag
+ if (( exists($alldirs->{$dir}->{'Styles'}) ) && ( $alldirs->{$dir}->{'Styles'} =~ /\bCREATE\b/ )) { next; }
+
+ # II. there is at least one file in the directory
+ my $fileinside = 0;
+ my $file;
+ foreach $file ( keys %{$allfiles} )
+ {
+ if (( $allfiles->{$file}->{'Dir'} eq $dir ) || ( $allfiles->{$file}->{'NetDir'} eq $dir ))
+ {
+ $fileinside = 1;
+ last;
+ }
+ }
+ if ( $fileinside ) { next; }
+
+ # III. the directory is parent for another directory
+ my $isparent = 0;
+ my $onedir;
+ foreach $onedir ( keys %{$alldirs} )
+ {
+ if ( $alldirs->{$onedir}->{'ParentID'} eq $dir )
+ {
+ $isparent = 1;
+ last;
+ }
+ }
+ if ( $isparent ) { next; }
+
+ # no condition is true -> directory definition is superfluous
+ my $infoline = "\tINFO: Directory definition $dir is superfluous\n";
+ # print $infoline;
+ push(@par2script::globals::logfileinfo, $infoline);
+ }
+}
+
+##################################################
+# Checking if the directories in the item
+# definitions are defined.
+##################################################
+
+sub check_directories_in_item_definitions
+{
+ my $item;
+ foreach $item ( @par2script::globals::items_with_directories )
+ {
+ my $allitems = $par2script::globals::definitions{$item};
+
+ my $onegid;
+ foreach $onegid ( keys %{$allitems} )
+ {
+ if ( ! exists($allitems->{$onegid}->{'Dir'}) ) { die "\nERROR: No directory defined for item: $onegid!\n\n"; }
+ my $dir = $allitems->{$onegid}->{'Dir'};
+ if (( $dir eq "PD_PROGDIR" ) || ( $dir =~ /PREDEFINED_/ )) { next; }
+
+ # checking if this directoryid is defined
+ if ( ! exists($par2script::globals::definitions{'Directory'}->{$dir}) )
+ {
+ die "\nERROR: Directory $dir in item $onegid not defined!\n\n";
+ }
+ }
+ }
+}
+
+########################################################
+# Checking for all Items, that know their modules,
+# whether these modules exist.
+########################################################
+
+sub check_module_existence
+{
+ my $item;
+ foreach $item ( @par2script::globals::items_with_moduleid )
+ {
+ my $allitems = $par2script::globals::definitions{$item};
+
+ my $onegid;
+ foreach $onegid ( keys %{$allitems} )
+ {
+ if ( ! exists($allitems->{$onegid}->{'ModuleID'}) ) { die "\nERROR: No ModuleID defined for item: $onegid!\n\n"; }
+ my $moduleid = $allitems->{$onegid}->{'ModuleID'};
+
+ # checking if this directoryid is defined
+ if ( ! exists($par2script::globals::definitions{'Module'}->{$moduleid}) )
+ {
+ die "\nERROR: ModuleID $moduleid in item $onegid not defined!\n\n";
+ }
+ }
+ }
+}
+
+########################################################
+# Every script has to contain exactly one root module.
+# This module has no ParentID or an empty ParentID.
+########################################################
+
+sub check_rootmodule
+{
+ my $rootgid = "";
+ my $foundroot = 0;
+
+ my $allmodules = $par2script::globals::definitions{'Module'};
+
+ my $modulegid = "";
+ foreach $modulegid (keys %{$allmodules} )
+ {
+ if (( ! exists($allmodules->{$modulegid}->{'ParentID'}) ) || ( $allmodules->{$modulegid}->{'ParentID'} eq "" ))
+ {
+ if ( $foundroot )
+ {
+ die "\nERROR: More than one Root module. Only one module without ParentID or with empty ParentID allowed ($rootgid and $modulegid).\n";
+ }
+ $rootgid = $modulegid;
+ $foundroot = 1;
+ }
+ }
+
+ if ( ! $foundroot )
+ {
+ die "\nERROR: Could not find Root module. Did not find module without ParentID or with empty ParentID.\n";
+ }
+
+ print " $rootgid\n" if $par2script::globals::verbose;
+
+}
+
+########################################################
+# File, Shortcut, Directory, Unixlink must not
+# contain a ModuleID
+########################################################
+
+sub check_moduleid_at_items
+{
+ my $item;
+ foreach $item ( @par2script::globals::items_without_moduleid )
+ {
+ my $allitems = $par2script::globals::definitions{$item};
+
+ my $onegid;
+ foreach $onegid ( keys %{$allitems} )
+ {
+ if ( exists($allitems->{$onegid}->{'ModuleID'}) )
+ {
+ die "\nERROR: ModuleID assigned to $onegid! No module assignment to $item!\n\n";
+ }
+ }
+ }
+}
+
+########################################################
+# Controlling existence of multi assignments
+########################################################
+
+sub check_multiple_assignments
+{
+ my @multiassignments = ();
+ my $error;
+
+ my $topitem;
+ foreach $topitem ( keys %par2script::globals::assignedgids )
+ {
+ my $item;
+ foreach $item ( keys %{$par2script::globals::assignedgids{$topitem}} )
+ {
+ if ( $par2script::globals::assignedgids{$topitem}->{$item} > 1 )
+ {
+ $error = 1;
+ my $string = "\tGID: $item Assignments: $par2script::globals::assignedgids{$topitem}->{$item}";
+ push(@multiassignments, $string);
+ }
+ }
+ }
+
+ if ( $error ) { par2script::exiter::multiassignmenterror(\@multiassignments); }
+}
+
+########################################################
+# Check, if a defined directory has a flag CREATE
+########################################################
+
+sub contains_create_flag
+{
+ my ($gid) = @_;
+
+ my $createflag = 0;
+
+ if (( exists($par2script::globals::definitions{'Directory'}->{$gid}->{'Styles'}) ) &&
+ ( $par2script::globals::definitions{'Directory'}->{$gid}->{'Styles'} =~ /\bCREATE\b/ ))
+ {
+ $createflag = 1;
+ }
+
+ return $createflag;
+}
+
+########################################################
+# Controlling existence of definitions without
+# any assignment
+########################################################
+
+sub check_missing_assignments
+{
+ # If defined gids for "File", "Directory" or "Unixlink" are not assigned,
+ # this causes an error.
+ # Directories only have to be assigned, if they have the flag "CREATE".
+
+ my @missingassignments = ();
+ $error = 0;
+
+ my $item;
+ foreach $item ( @par2script::globals::items_assigned_at_modules )
+ {
+ my $assignedgids = $par2script::globals::assignedgids{$item};
+ my $definedgids = $par2script::globals::definitions{$item};
+
+ my $gid;
+ foreach $gid ( keys %{$definedgids} )
+ {
+ if ( $item eq "Directory" ) { if ( ! contains_create_flag($gid) ) { next; } }
+
+ if ( ! exists( $assignedgids->{$gid} ))
+ {
+ $error = 1;
+ push(@missingassignments, $gid);
+ }
+ }
+ }
+
+ if ( $error ) { par2script::exiter::missingassignmenterror(\@missingassignments); }
+}
+
+#############################################################
+# Controlling if for all shortcuts with file assignment
+# the file is defined. And for all shortcuts with
+# shortcut assignment the shortcut has to be defined.
+#############################################################
+
+sub check_shortcut_assignments
+{
+ my $allshortcuts = $par2script::globals::definitions{'Shortcut'};
+ my $allfiles = $par2script::globals::definitions{'File'};
+
+ my $shortcut;
+ foreach $shortcut ( keys %{$allshortcuts} )
+ {
+ if (( exists($allshortcuts->{$shortcut}->{'FileID'}) ) &&
+ ( ! exists($allfiles->{$allshortcuts->{$shortcut}->{'FileID'}}) ))
+ {
+ die "\nERROR: FileID $allshortcuts->{$shortcut}->{'FileID'} has no definition at shortcut $shortcut !\n";
+ }
+
+ if (( exists($allshortcuts->{$shortcut}->{'ShortcutID'}) ) &&
+ ( ! exists($allshortcuts->{$allshortcuts->{$shortcut}->{'ShortcutID'}}) ))
+ {
+ die "\nERROR: ShortcutID $allshortcuts->{$shortcut}->{'ShortcutID'} has no definition at shortcut $shortcut !\n";
+ }
+
+ if (( ! exists($allshortcuts->{$shortcut}->{'ShortcutID'}) ) &&
+ ( ! exists($allshortcuts->{$shortcut}->{'FileID'}) ))
+ {
+ die "\nERROR: Shortcut requires assignment to \"ShortcutID\" or \"FileID\". Missing at shortcut $shortcut !\n";
+ }
+ }
+}
+
+#############################################################
+# Controlling if for Modules and Directories, the parents
+# are defined. If not, this can lead to a problem during
+# script creation, because only recursively added
+# Modules or Directories are added to the script.
+#############################################################
+
+sub check_missing_parents
+{
+ my @parentitems = ("Module", "Directory");
+ my %rootparents = ("PREDEFINED_PROGDIR" => "1");
+
+ my $oneitem;
+ foreach $oneitem ( @parentitems )
+ {
+ my $alldefinitions = $par2script::globals::definitions{$oneitem};
+
+ my $onegid;
+ foreach $onegid ( keys %{$alldefinitions} )
+ {
+ # If there is a ParentID used, it must be defined
+ if (( exists($alldefinitions->{$onegid}->{'ParentID'}) ) &&
+ ( ! exists($alldefinitions->{$alldefinitions->{$onegid}->{'ParentID'}}) ) &&
+ ( ! exists($rootparents{$alldefinitions->{$onegid}->{'ParentID'}}) ))
+ {
+ die "\nERROR: Parent \"$alldefinitions->{$onegid}->{'ParentID'}\" at $oneitem \"$onegid\" is not defined!\n";
+ }
+ }
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/par2script/converter.pm b/solenv/bin/modules/par2script/converter.pm
new file mode 100644
index 000000000..43c3a751f
--- /dev/null
+++ b/solenv/bin/modules/par2script/converter.pm
@@ -0,0 +1,52 @@
+#
+# 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 .
+#
+
+
+package par2script::converter;
+
+use par2script::remover;
+
+#############################
+# Converter
+#############################
+
+sub convert_stringlist_into_array_2
+{
+ my ( $input, $separator ) = @_;
+
+ my @newarray = ();
+ my $first = "";
+ my $last = "";
+
+ $last = $input;
+
+ while ( $last =~ /^\s*(.+?)\s*\Q$separator\E\s*(.+)\s*$/) # "$" for minimal matching
+ {
+ $first = $1;
+ $last = $2;
+ par2script::remover::remove_leading_and_ending_whitespaces(\$first);
+ if ( $first ) { push(@newarray, $first); }
+ }
+
+ par2script::remover::remove_leading_and_ending_whitespaces(\$last);
+ if ( $last ) { push(@newarray, $last); }
+
+ return \@newarray;
+}
+
+1;
diff --git a/solenv/bin/modules/par2script/exiter.pm b/solenv/bin/modules/par2script/exiter.pm
new file mode 100644
index 000000000..f2d2ec649
--- /dev/null
+++ b/solenv/bin/modules/par2script/exiter.pm
@@ -0,0 +1,112 @@
+#
+# 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 .
+#
+
+
+package par2script::exiter;
+
+use par2script::files;
+use par2script::globals;
+
+############################################
+# Exiting the program with an error
+# This function is used instead of "die"
+############################################
+
+sub exit_program
+{
+ my ($message, $function) = @_;
+
+ my $infoline;
+
+ $infoline = "\n***************************************************************\n";
+ push(@par2script::globals::logfileinfo, $infoline);
+ print("$infoline");
+
+ $infoline = "$message\n";
+ push(@par2script::globals::logfileinfo, $infoline);
+ print("$infoline");
+
+ $infoline = "in function: $function\n";
+ push(@par2script::globals::logfileinfo, $infoline);
+ print("$infoline");
+
+ $infoline = "***************************************************************\n";
+ push(@par2script::globals::logfileinfo, $infoline);
+
+ if ($par2script::globals::logging)
+ {
+ par2script::files::save_file($par2script::globals::logfilename, \@par2script::globals::logfileinfo);
+ print("Saved logfile: $par2script::globals::logfilename\n");
+ }
+
+ print("$infoline");
+
+ exit(-1);
+}
+
+#####################################
+# Error, because a gid is defined
+# more than once
+#####################################
+
+sub multidefinitionerror
+{
+ my ( $multidefinitiongids ) = @_;
+ print "************************************************\n";
+ print "ERROR: multiple definition of gids:\n";
+ print "************************************************\n";
+
+ my $gid;
+ foreach $gid ( @{$multidefinitiongids} ) { print "\t$gid\n"; }
+ exit(-1);
+}
+
+#####################################
+# Error, because a gid is assigned
+# more than once
+#####################################
+
+sub multiassignmenterror
+{
+ my ( $multiassignmentgids ) = @_;
+ print "************************************************\n";
+ print "WARNING: multiple assignments of gids:\n";
+ print "************************************************\n";
+
+ my $line;
+ foreach $line ( @{$multiassignmentgids} ) { print "\t$line\n"; }
+}
+
+#####################################
+# Error, because a defined gid
+# is not assigned
+#####################################
+
+sub missingassignmenterror
+{
+ my ( $missingassignmentgids ) = @_;
+ print "********************************************************\n";
+ print "ERROR: Missing assignments for the following GIDs:\n";
+ print "********************************************************\n";
+
+ my $gid;
+ foreach $gid ( @{$missingassignmentgids} ) { print "\t$gid\n"; }
+ exit(-1);
+}
+
+1;
diff --git a/solenv/bin/modules/par2script/files.pm b/solenv/bin/modules/par2script/files.pm
new file mode 100644
index 000000000..1e0aa6c44
--- /dev/null
+++ b/solenv/bin/modules/par2script/files.pm
@@ -0,0 +1,64 @@
+#
+# 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 .
+#
+
+
+package par2script::files;
+
+use par2script::exiter;
+
+############################################
+# File Operations
+############################################
+
+sub check_file
+{
+ my ($arg) = @_;
+
+ if(!( -f $arg ))
+ {
+ par2script::exiter::exit_program("ERROR: Cannot find file $arg", "check_file");
+ }
+}
+
+sub read_file
+{
+ my ($localfile) = @_;
+
+ my @localfile = ();
+
+ open( IN, "<$localfile" ) || par2script::exiter::exit_program("ERROR: Cannot open file: $localfile", "read_file");
+ while ( <IN> ) { push(@localfile, $_); }
+ close( IN );
+
+ return \@localfile;
+}
+
+###########################################
+# Saving files
+###########################################
+
+sub save_file
+{
+ my ($savefile, $savecontent) = @_;
+ open( OUT, ">$savefile" );
+ print OUT @{$savecontent};
+ close( OUT);
+ if (! -f $savefile) { pre2par::exiter::exit_program("ERROR: Cannot write file: $savefile", "save_file"); }
+}
+
+1;
diff --git a/solenv/bin/modules/par2script/globals.pm b/solenv/bin/modules/par2script/globals.pm
new file mode 100644
index 000000000..02a399767
--- /dev/null
+++ b/solenv/bin/modules/par2script/globals.pm
@@ -0,0 +1,67 @@
+#
+# 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 .
+#
+
+
+package par2script::globals;
+
+############################################
+# Global settings
+############################################
+
+BEGIN
+{
+ $prog="par2script";
+
+ $includepathlist = "";
+ $scriptname = "";
+ $parfilelistorig = "";
+ $parfilelist = "";
+
+ @allitems = ("Installation", "ScpAction", "Directory", "File",
+ "Shortcut", "Unixlink", "Module", "Profile", "ProfileItem",
+ "Folder", "FolderItem", "FolderItemProperty", "RegistryItem",
+ "WindowsCustomAction", "MergeModule");
+
+ @items_assigned_at_modules = ("File", "Directory", "Unixlink");
+ @items_with_directories = ("File", "Profile", "Shortcut", "Unixlink");
+ @items_with_moduleid = ("Profile", "ProfileItem", "FolderItem", "RegistryItem");
+ @items_without_moduleid = ("File", "FolderItemProperty", "Directory", "Shortcut", "Unixlink");
+
+ %searchkeys = ("File" => "Files", "Directory" => "Dirs", "Unixlink" => "Unixlinks");
+
+ $logging = 0;
+ $logfilename = "logfile.log"; # the default logfile name for global errors
+ @logfileinfo = ();
+
+ $verbose = 1;
+
+ $multidefinitionerror = 0;
+ $multiassignmenterror = 0;
+
+ %definitions;
+ %assignedgids;
+
+ $plat = $^O;
+
+ $separator = "/";
+ $pathseparator = "\:";
+ $isunix = 1;
+ $iswin = 0;
+}
+
+1;
diff --git a/solenv/bin/modules/par2script/module.pm b/solenv/bin/modules/par2script/module.pm
new file mode 100644
index 000000000..ef916650b
--- /dev/null
+++ b/solenv/bin/modules/par2script/module.pm
@@ -0,0 +1,255 @@
+#
+# 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 .
+#
+
+package par2script::module;
+
+use par2script::converter;
+use par2script::exiter;
+
+###########################################
+# Removing undefined gids
+# from modules
+###########################################
+
+sub remove_from_modules
+{
+ my ($gid, $item) = @_;
+
+ my $counter = 0;
+
+ if ( ! exists($par2script::globals::searchkeys{$item}) ) { par2script::exiter::exit_program("ERROR: Unknown type \"$item\" at modules.", "remove_from_modules"); }
+ my $searchkey = $par2script::globals::searchkeys{$item};
+
+ my $allmodules = $par2script::globals::definitions{'Module'};
+
+ my $onemodule;
+ foreach $onemodule (keys %{$allmodules})
+ {
+ if (( exists($allmodules->{$onemodule}->{$searchkey}) ) && ( $allmodules->{$onemodule}->{$searchkey} =~ /\b$gid\b/ ))
+ {
+ my $infoline = "WARNING: Removing $gid because of missing definition\n";
+ # print $infoline;
+ push(@par2script::globals::logfileinfo, $infoline);
+
+ $allmodules->{$onemodule}->{$searchkey} =~ s/\b$gid\b//;
+ $allmodules->{$onemodule}->{$searchkey} =~ s/\,\s*\,/\,/;
+ $allmodules->{$onemodule}->{$searchkey} =~ s/\(\s*\,\s*/\(/;
+ $allmodules->{$onemodule}->{$searchkey} =~ s/\s*\,\s*\)/\)/;
+
+ if (( $allmodules->{$onemodule}->{$searchkey} =~ /\(\s*\,\s*\)/ ) ||
+ ( $allmodules->{$onemodule}->{$searchkey} =~ /\(\s*\)/ ))
+ {
+ delete($allmodules->{$onemodule}->{$searchkey});
+ }
+
+ $counter++;
+ }
+ }
+
+ return $counter;
+}
+
+###########################################
+# Removing undefined gids automatically
+# from modules
+###########################################
+
+sub remove_undefined_gids_from_modules
+{
+ # If assigned gids for "File", "Directory" or "Unixlink" are not defined,
+ # they are automatically removed from the module
+
+ foreach $item ( @par2script::globals::items_assigned_at_modules )
+ {
+ my $assignedgids = $par2script::globals::assignedgids{$item};
+ my $definedgids = $par2script::globals::definitions{$item};
+
+ my $gid;
+ foreach $gid ( keys %{$assignedgids} )
+ {
+ if ( ! exists( $definedgids->{$gid} ))
+ {
+ # deleting entry in module definition
+ my $number_of_removals = remove_from_modules($gid, $item);
+ # decreasing counter in assignments
+ if ( $assignedgids->{$gid} > $number_of_removals ) { $assignedgids->{$gid} = $assignedgids->{$gid} - $number_of_removals; }
+ else { delete($assignedgids->{$gid}); }
+ }
+ }
+ }
+}
+
+############################################
+# Getting the gid of the root module. The
+# root module has no ParentID or an empty
+# ParentID.
+############################################
+
+sub get_rootmodule_gid
+{
+ my $rootgid = "";
+ my $foundroot = 0;
+
+ my $allmodules = $par2script::globals::definitions{'Module'};
+
+ my $modulegid = "";
+ foreach $modulegid (keys %{$allmodules} )
+ {
+ # print "Module $modulegid\n";
+ # my $content = "";
+ # foreach $content (sort keys %{$allmodules->{$modulegid}}) { print "\t$content = $allmodules->{$modulegid}->{$content};\n"; }
+ # print "End\n";
+ # print "\n";
+
+ if (( ! exists($allmodules->{$modulegid}->{'ParentID'})) || ( $allmodules->{$modulegid}->{'ParentID'} eq "" ))
+ {
+ if ( $foundroot ) { par2script::exiter::exit_program("ERROR: More than one Root module. Only one module without ParentID or with empty ParentID allowed ($rootgid and $modulegid).", "get_rootmodule_gid"); }
+ $rootgid = $modulegid;
+ $foundroot = 1;
+ }
+ }
+
+ if ( ! $foundroot ) { par2script::exiter::exit_program("ERROR: Could not find Root module. Did not find module without ParentID or with empty ParentID.", "get_rootmodule_gid"); }
+
+ return $rootgid;
+}
+
+####################################
+# Adding defined items without
+# assignment to the root module.
+####################################
+
+sub add_to_root_module
+{
+ # If defined gids for "File", "Directory" or "Unixlink" are not assigned,
+ # they are automatically assigned to the root module
+
+ my $rootmodulegid = get_rootmodule_gid();
+
+ my $item;
+ foreach $item ( @par2script::globals::items_assigned_at_modules )
+ {
+ my $assignedgids = $par2script::globals::assignedgids{$item};
+ my $definedgids = $par2script::globals::definitions{$item};
+
+ my $gidstring = "";
+
+ # Perhaps there are already items assigned to the root
+ if ( ! exists($par2script::globals::searchkeys{$item}) ) { par2script::exiter::exit_program("ERROR: Unknown type \"$item\" at modules.", "remove_from_modules"); }
+ my $modulekey = $par2script::globals::searchkeys{$item};
+ if ( exists($par2script::globals::definitions{'Module'}->{$rootmodulegid}->{$modulekey}) )
+ {
+ $gidstring = $par2script::globals::definitions{'Module'}->{$rootmodulegid}->{$modulekey};
+ $gidstring =~ s/\(//;
+ $gidstring =~ s/\)//;
+ }
+
+ my $gid;
+ foreach $gid ( keys %{$definedgids} )
+ {
+ if ( ! exists( $assignedgids->{$gid} ))
+ {
+ if ( $gidstring eq "" )
+ {
+ $gidstring = $gid;
+ }
+ else
+ {
+ $gidstring = "$gidstring,$gid";
+ }
+
+ $assignedgids->{$gid} = 1;
+ }
+ }
+
+ if ( $gidstring ne "" )
+ {
+ $gidstring = "\($gidstring\)";
+ $par2script::globals::definitions{'Module'}->{$rootmodulegid}->{$modulekey} = $gidstring;
+ }
+ }
+}
+
+###################################################
+# Including \n in a very long string
+###################################################
+
+sub include_linebreaks
+{
+ my ($allgidstring) = @_;
+
+ my $newline = "";
+ my $newlength = 0;
+
+ $allgidstring =~ s/\(//;
+ $allgidstring =~ s/\)//;
+
+ my $allgids = par2script::converter::convert_stringlist_into_array_2($allgidstring, ",");
+
+ if ( $#{$allgids} > -1 )
+ {
+ my $onegid;
+ foreach $onegid ( @{$allgids} )
+ {
+ $newline = "$newline$onegid,";
+ $newlength = $newlength + length($onegid) + 1; # +1 for the comma
+
+ if ( $newlength > 80 )
+ {
+ $newline = $newline . "\n\t\t\t\t";
+ $newlength = 0;
+ }
+ }
+ }
+
+ $newline =~ s/,\s*$//;
+ $newline = "($newline)";
+
+ return $newline;
+}
+
+###################################################
+# Shorten the lines that belong to modules, if
+# the length of the line is greater 100
+###################################################
+
+sub shorten_lines_at_modules
+{
+ my $item;
+ foreach $item ( @par2script::globals::items_assigned_at_modules )
+ {
+ if ( ! exists($par2script::globals::searchkeys{$item}) ) { par2script::exiter::exit_program("ERROR: Unknown type \"$item\" at modules.", "shorten_lines_at_modules"); }
+ my $searchkey = $par2script::globals::searchkeys{$item};
+
+ my $allmodules = $par2script::globals::definitions{'Module'};
+
+ my $onemodule;
+ foreach $onemodule (keys %{$allmodules})
+ {
+ if (( exists($allmodules->{$onemodule}->{$searchkey}) ) &&
+ ( length($allmodules->{$onemodule}->{$searchkey}) > 100 ))
+ {
+ # including "\n\t\t\t\t"
+ my $newstring = include_linebreaks($allmodules->{$onemodule}->{$searchkey});
+ $allmodules->{$onemodule}->{$searchkey} = $newstring;
+ }
+ }
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/par2script/parameter.pm b/solenv/bin/modules/par2script/parameter.pm
new file mode 100644
index 000000000..86416cd9e
--- /dev/null
+++ b/solenv/bin/modules/par2script/parameter.pm
@@ -0,0 +1,145 @@
+#
+# 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 .
+#
+
+
+package par2script::parameter;
+
+use Cwd;
+use par2script::files;
+use par2script::globals;
+
+############################################
+# Parameter Operations
+############################################
+
+###############################################################################
+# Usage:
+# perl par2script.pl -i ..\wntmsci8.pro\par,o:\SRX645\wntmsci8.pro\par.m24
+# @@C:\DOCUMEN~1\is\LOCALS~1\Temp\mk6pd
+# -o ..\wntmsci8.pro\bin\osl\setup_osl.inf
+###############################################################################
+
+sub usage
+{
+ print <<End;
+
+--------------------------------------------------------------
+$par2script::globals::prog
+The following parameter are needed:
+-i: include paths, comma separated list
+-o: setup script file name
+-v: writing logfile.txt (optional)
+\@\@list: list of all par files
+
+Example:
+ perl par2script.pl -i ..\\wntmsci8\\par\,o\:\\SRX645\\wntmsci8\\par.m24
+ \@\@C\:\\DOCUMEN\~1\\is\\LOCALS\~1\\Temp\\mk6pd
+ -o ..\\wntmsci8.pro\\bin\\osl\\setup_osl.inf \[-v\]
+
+--------------------------------------------------------------
+End
+ exit(-1);
+}
+
+#####################################
+# Reading parameter
+#####################################
+
+sub getparameter
+{
+ while ( $#ARGV >= 0 )
+ {
+ my $param = shift(@ARGV);
+
+ if ($param eq "-o") { $par2script::globals::scriptname = shift(@ARGV); }
+ elsif ($param eq "-q") { $par2script::globals::verbose = 0; }
+ elsif ($param eq "-v") { $par2script::globals::logging = 1; }
+ elsif ($param =~ /\@\@/) { $par2script::globals::parfilelistorig = $param; }
+ elsif ($param eq "-i") { $par2script::globals::includepathlist = shift(@ARGV); }
+ elsif (($param =~ /\//) || ($param =~ /\\/)) # another include parameter!
+ {
+ $par2script::globals::includepathlist = $par2script::globals::includepathlist . "," . $param;
+ }
+ else
+ {
+ print("\n*************************************\n");
+ print("Sorry, unknown parameter: $param");
+ print("\n*************************************\n");
+ usage();
+ exit(-1);
+ }
+ }
+}
+
+############################################
+# Controlling the fundamental parameter
+# (required for every process)
+############################################
+
+sub control_parameter
+{
+ if ($par2script::globals::includepathlist eq "")
+ {
+ print "\n************************************************\n";
+ print "Error: Include paths not set not set (-i)!";
+ print "\n************************************************\n";
+ usage();
+ exit(-1);
+ }
+
+ if ($par2script::globals::scriptname eq "")
+ {
+ print "\n************************************************\n";
+ print "Error: Name of the setup script not set (-o)!";
+ print "\n************************************************\n";
+ usage();
+ exit(-1);
+ }
+
+ if ($par2script::globals::parfilelistorig eq "")
+ {
+ print "\n************************************************\n";
+ print "Error: List of par files not set!";
+ print "\n************************************************\n";
+ usage();
+ exit(-1);
+ }
+
+ # The par file list has to exist
+
+ $par2script::globals::parfilelist = $par2script::globals::parfilelistorig;
+ $par2script::globals::parfilelist =~ s/\@\@//;
+ par2script::files::check_file($par2script::globals::parfilelist);
+}
+
+#####################################
+# Writing parameter to shell
+#####################################
+
+sub outputparameter
+{
+ my $outputline = "\n$par2script::globals::prog -i $par2script::globals::includepathlist $par2script::globals::parfilelistorig -o $par2script::globals::scriptname";
+
+ if ($par2script::globals::logging) { $outputline .= " -v"; }
+
+ $outputline .= "\n";
+
+ print $outputline;
+}
+
+1;
diff --git a/solenv/bin/modules/par2script/remover.pm b/solenv/bin/modules/par2script/remover.pm
new file mode 100644
index 000000000..8b40a8ff4
--- /dev/null
+++ b/solenv/bin/modules/par2script/remover.pm
@@ -0,0 +1,42 @@
+#
+# 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 .
+#
+
+
+package par2script::remover;
+
+############################################
+# Remover
+############################################
+
+sub remove_leading_and_ending_whitespaces
+{
+ my ( $stringref ) = @_;
+
+ $$stringref =~ s/^\s*//g;
+ $$stringref =~ s/\s*$//g;
+}
+
+sub remove_leading_and_ending_comma
+{
+ my ( $stringref ) = @_;
+
+ $$stringref =~ s/^\s*\,//g;
+ $$stringref =~ s/\,\s*$//g;
+}
+
+1;
diff --git a/solenv/bin/modules/par2script/undefine.pm b/solenv/bin/modules/par2script/undefine.pm
new file mode 100644
index 000000000..43cbe2619
--- /dev/null
+++ b/solenv/bin/modules/par2script/undefine.pm
@@ -0,0 +1,135 @@
+#
+# 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 .
+#
+
+package par2script::undefine;
+
+use par2script::globals;
+
+##########################################################
+# Removing in the script all the gids, that are listed
+# in undefine scp files
+##########################################################
+
+sub undefine_gids
+{
+ my ($parfilecontent) = @_;
+
+ my $item;
+ foreach $item ( @par2script::globals::allitems )
+ {
+ my $unitem = "Un$item";
+
+ for ( my $i = 0; $i <= $#{$parfilecontent}; $i++ )
+ {
+ if ( ${$parfilecontent}[$i] =~ /^\s*$unitem\s*(\w+?)\s*$/ )
+ {
+ my $gid = $1;
+ delete($par2script::globals::definitions{$item}->{$gid});
+ }
+ }
+ }
+}
+
+##########################################################
+# Collecting all subdirectories of a specified directory
+##########################################################
+
+sub collect_children_dirs
+{
+ my ($gid, $collector) = @_;
+
+ my $diritem = "Directory";
+ my $parentkey = "ParentID";
+
+ if ( exists($par2script::globals::definitions{$diritem}) )
+ {
+ my $onedefinition;
+
+ foreach $onedefinition (keys %{$par2script::globals::definitions{$diritem}})
+ {
+ if ( $par2script::globals::definitions{$diritem}->{$onedefinition}->{$parentkey} eq $gid )
+ {
+ push(@{$collector}, $onedefinition);
+ collect_children_dirs($onedefinition, $collector);
+ }
+ }
+ }
+}
+
+##########################################################
+# Removing in the script complete profiles.
+# This includes the Profile and its ProfileItems.
+##########################################################
+
+sub remove_complete_item
+{
+ my ($item, $parfilecontent) = @_;
+
+ my $removeitem = "Remove$item";
+ my $dependentkey = "";
+ my $collect_children = 0;
+ my @gidcollector = ();
+ my @dependentitems = ();
+
+ if ( $item eq "Profile" )
+ {
+ @dependentitems = ("ProfileItem");
+ $dependentkey = "ProfileID";
+ }
+ elsif ( $item eq "Directory" )
+ {
+ @dependentitems = ("File", "Shortcut", "Unixlink");
+ $dependentkey = "Dir";
+ $collect_children = 1;
+ }
+
+ for ( my $i = 0; $i <= $#{$parfilecontent}; $i++ )
+ {
+ if ( ${$parfilecontent}[$i] =~ /^\s*$removeitem\s*(\w+?)\s*$/ )
+ {
+ my $onegid = $1;
+ push(@gidcollector, $onegid);
+ if ( $collect_children ) { collect_children_dirs($onegid, \@gidcollector); }
+
+ my $gid;
+ foreach $gid (@gidcollector)
+ {
+ delete($par2script::globals::definitions{$item}->{$gid});
+
+ # also deleting all dependent items, for example "ProfileItems" whose "ProfileID" is this "Profile"
+ my $depitem;
+ foreach $depitem ( @dependentitems )
+ {
+ if ( exists($par2script::globals::definitions{$depitem}) )
+ {
+ my $onedefinition;
+ foreach $onedefinition (keys %{$par2script::globals::definitions{$depitem}})
+ {
+ if ( $par2script::globals::definitions{$depitem}->{$onedefinition}->{$dependentkey} eq $gid )
+ {
+ delete($par2script::globals::definitions{$depitem}->{$onedefinition});
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/par2script/work.pm b/solenv/bin/modules/par2script/work.pm
new file mode 100644
index 000000000..cc1f1e4d5
--- /dev/null
+++ b/solenv/bin/modules/par2script/work.pm
@@ -0,0 +1,414 @@
+#
+# 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 .
+#
+
+
+package par2script::work;
+
+use par2script::globals;
+use par2script::remover;
+
+############################################
+# par2script working module
+############################################
+
+sub analyze_comma_separated_list
+{
+ my ($list, $listref) = @_; # second parameter is optional
+
+ my @list = ();
+ my $locallistref;
+
+ if (!( $listref )) { $locallistref = \@list; }
+ else { $locallistref = $listref; }
+
+ par2script::remover::remove_leading_and_ending_comma(\$list);
+ par2script::remover::remove_leading_and_ending_whitespaces(\$list);
+
+ while ( $list =~ /^\s*(.*?)\s*\,\s*(.*)\s*$/ )
+ {
+ my $oneentry = $1;
+ $list = $2;
+ par2script::remover::remove_leading_and_ending_whitespaces(\$oneentry);
+ push(@{$locallistref}, $oneentry);
+ }
+
+ # the last entry
+
+ par2script::remover::remove_leading_and_ending_whitespaces(\$list);
+ push(@{$locallistref}, $list);
+
+ return $locallistref;
+}
+
+############################################
+# setting list of include paths
+############################################
+
+sub setincludes
+{
+ my ($list) = @_;
+
+ # input is the comma separated list of include paths
+
+ my $includes = analyze_comma_separated_list($list);
+
+ return $includes;
+}
+
+############################################
+# setting list of all par files
+############################################
+
+sub setparfiles
+{
+ my ($filename) = @_;
+
+ # input is the name of the list file
+ my $filecontent = par2script::files::read_file($filename);
+
+ my @parfiles = ();
+ my $parfilesref = \@parfiles;
+
+ foreach ( @{$filecontent} ) { $parfilesref = analyze_comma_separated_list($_, $parfilesref); }
+
+ return $parfilesref;
+}
+
+############################################
+# finding the correct include path
+# for the par files
+############################################
+
+sub make_complete_paths_for_parfiles
+{
+ my ($parfiles, $includes) = @_;
+
+ my $oneparfile;
+
+ foreach $oneparfile ( @{$parfiles} )
+ {
+ my $foundparfile = 0;
+ my $includepath;
+
+ foreach $includepath ( @{$includes} )
+ {
+ my $parfile = "$includepath/$oneparfile";
+
+ if ( -f $parfile )
+ {
+ $foundparfile = 1;
+ $oneparfile = $parfile;
+ last;
+ }
+ }
+
+ if ( ! $foundparfile )
+ {
+ die "ERROR: Could not find parfile ${$parfiles}[$i] in includes paths: $par2script::globals::includepathlist !\n";
+ }
+ }
+}
+
+######################################################
+# collecting one special item in the par files and
+# including it into the "definitions" hash
+######################################################
+
+sub collect_definitions
+{
+ my ($parfilecontent) = @_;
+
+ my $multidefinitionerror = 0;
+ my @multidefinitiongids = ();
+
+ my %itemhash;
+
+ # create empty item hashes
+ foreach $oneitem ( @par2script::globals::allitems ) {
+ my %items;
+ $par2script::globals::definitions{$oneitem} = \%items;
+ }
+
+ for ( my $i = 0; $i <= $#{$parfilecontent}; $i++ )
+ {
+ my $line = ${$parfilecontent}[$i];
+ my $oneitem, $gid;
+
+ $line =~ /^\s*$/ && next; # skip blank lines
+
+ # lines should be well formed:
+ if ($line =~ m/^\s*(\w+)\s+(\w+)\s*$/)
+ {
+ $oneitem = $1;
+ $gid = $2;
+ } else {
+ chomp ($line);
+ my $invalid = $line;
+ $invalid =~ s/[\s\w]*//g;
+ par2script::exiter::exit_program("ERROR: malformed par file, invalid character '$invalid', expecting <token> <gid> but saw '$line'", "test_par_syntax");
+ }
+# print STDERR "line '$line' -> '$oneitem' '$gid'\n";
+
+ # hunt badness variously
+ if ( ! defined $par2script::globals::definitions{$oneitem} )
+ {
+ par2script::exiter::exit_program("ERROR: invalid scp2 fragment item type '$oneitem' in line: '$line'", "test_par_syntax");
+ }
+
+ # no hyphen allowed in gids -> cannot happen here because (\w+) is required for gids
+ if ( $gid =~ /-/ ) { par2script::exiter::exit_program("ERROR: No hyphen allowed in global id: $gid", "test_of_hyphen"); }
+
+ my %oneitemhash;
+
+ while (! ( ${$parfilecontent}[$i] =~ /^\s*End\s*$/i ) )
+ {
+ if ( ${$parfilecontent}[$i] =~ /^\s*(.+?)\s*\=\s*(.+?)\s*\;\s*$/ ) # only oneliner!
+ {
+ $itemkey = $1;
+ $itemvalue = $2;
+
+ if ( $oneitem eq "Directory" ) { if ( $itemkey =~ "DosName" ) { $itemkey =~ s/DosName/HostName/; } }
+ if (( $oneitem eq "Directory" ) || ( $oneitem eq "File" ) || ( $oneitem eq "Unixlink" )) { if ( $itemvalue eq "PD_PROGDIR" ) { $itemvalue = "PREDEFINED_PROGDIR"; }}
+ if (( $itemkey eq "Styles" ) && ( $itemvalue =~ /^\s*(\w+)(\s*\;\s*)$/ )) { $itemvalue = "($1)$2"; }
+ elsif ( $itemkey eq "Files" ) # filter out empty file records, as they mess up assignment to modules
+ {
+ $itemvalue =~ /^\(([^)]*)\)$/;
+ $itemvalue = '(' . join( ',', grep( !/^$/, split( ',', $1 ) ) ) . ')';
+ }
+
+ $oneitemhash{$itemkey} = $itemvalue;
+ }
+ $i++;
+ }
+
+ # test of uniqueness
+ if ( defined ($par2script::globals::definitions{$oneitem}->{$gid}) )
+ {
+ $multidefinitionerror = 1;
+ push(@multidefinitiongids, $gid);
+ }
+
+ $par2script::globals::definitions{$oneitem}->{$gid} = \%oneitemhash;
+ }
+
+ if ( $multidefinitionerror ) { par2script::exiter::multidefinitionerror(\@multidefinitiongids); }
+
+ # foreach $key (keys %par2script::globals::definitions)
+ # {
+ # print "Key: $key \n";
+ #
+ # foreach $key (keys %{$par2script::globals::definitions{$key}})
+ # {
+ # print "\t$key \n";
+ # }
+ # }
+}
+
+######################################################
+# Filling content into the script
+######################################################
+
+sub put_oneitem_into_script
+{
+ my ( $script, $item, $itemhash, $itemkey ) = @_;
+
+ push(@{$script}, "$item $itemkey\n" );
+ my $content = "";
+ foreach $content (sort keys %{$itemhash->{$itemkey}}) { push(@{$script}, "\t$content = $itemhash->{$itemkey}->{$content};\n" ); }
+ push(@{$script}, "End\n" );
+ push(@{$script}, "\n" );
+}
+
+######################################################
+# Creating the script
+######################################################
+
+sub create_script
+{
+ my @script = ();
+ my $oneitem;
+
+ foreach $oneitem ( @par2script::globals::allitems )
+ {
+ if ( exists($par2script::globals::definitions{$oneitem}) )
+ {
+ if ( $oneitem eq "Shortcut" ) { next; } # "Shortcuts" after "Files"
+
+ if (( $oneitem eq "Module" ) || ( $oneitem eq "Directory" )) { write_sorted_items(\@script, $oneitem); }
+ else { write_unsorted_items(\@script, $oneitem); }
+ }
+ }
+
+ return \@script;
+}
+
+######################################################
+# Adding script content for the unsorted items
+######################################################
+
+sub write_unsorted_items
+{
+ my ( $script, $oneitem ) = @_;
+
+ my $itemhash = $par2script::globals::definitions{$oneitem};
+
+ my $itemkey = "";
+ foreach $itemkey (sort keys %{$itemhash})
+ {
+ put_oneitem_into_script($script, $oneitem, $itemhash, $itemkey);
+
+ # special handling for Shortcuts after Files
+ if (( $oneitem eq "File" ) && ( exists($par2script::globals::definitions{"Shortcut"}) ))
+ {
+ my $shortcutkey;
+ foreach $shortcutkey ( keys %{$par2script::globals::definitions{"Shortcut"}} )
+ {
+ if ( $par2script::globals::definitions{"Shortcut"}->{$shortcutkey}->{'FileID'} eq $itemkey )
+ {
+ put_oneitem_into_script($script, "Shortcut", $par2script::globals::definitions{"Shortcut"}, $shortcutkey);
+
+ # and Shortcut to Shortcut also
+ my $internshortcutkey;
+ foreach $internshortcutkey ( keys %{$par2script::globals::definitions{"Shortcut"}} )
+ {
+ if ( $par2script::globals::definitions{"Shortcut"}->{$internshortcutkey}->{'ShortcutID'} eq $shortcutkey )
+ {
+ put_oneitem_into_script($script, "Shortcut", $par2script::globals::definitions{"Shortcut"}, $internshortcutkey);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+######################################################
+# Collecting all children of a specified parent
+######################################################
+
+sub collect_children
+{
+ my ( $itemhash, $parent, $order ) = @_;
+
+ my $item;
+ foreach $item ( sort keys %{$itemhash} )
+ {
+ if ( $itemhash->{$item}->{'ParentID'} eq $parent )
+ {
+ push(@{$order}, $item);
+ my $newparent = $item;
+ collect_children($itemhash, $newparent, $order);
+ }
+ }
+}
+
+######################################################
+# Adding script content for the sorted items
+######################################################
+
+sub write_sorted_items
+{
+ my ( $script, $oneitem ) = @_;
+
+ my $itemhash = $par2script::globals::definitions{$oneitem};
+
+ my @itemorder = ();
+ my @startparents = ();
+
+ if ( $oneitem eq "Module" ) { push(@startparents, ""); }
+ elsif ( $oneitem eq "Directory" ) { push(@startparents, "PREDEFINED_PROGDIR"); }
+ else { die "ERROR: No root parent defined for item type $oneitem !\n"; }
+
+ # supporting more than one toplevel item
+ my $parent;
+ foreach $parent ( @startparents ) { collect_children($itemhash, $parent, \@itemorder); }
+
+ my $itemkey;
+ foreach $itemkey ( @itemorder ) { put_oneitem_into_script($script, $oneitem, $itemhash, $itemkey); }
+}
+
+#######################################################################
+# Collecting all assigned gids of the type "item" from the modules
+# in the par files. Using a hash!
+#######################################################################
+
+sub collect_assigned_gids
+{
+ my $allmodules = $par2script::globals::definitions{'Module'};
+
+ my $item;
+ foreach $item ( @par2script::globals::items_assigned_at_modules )
+ {
+ if ( ! exists($par2script::globals::searchkeys{$item}) ) { par2script::exiter::exit_program("ERROR: Unknown type \"$item\" at modules.", "collect_assigned_gids"); }
+
+ my $searchkey = $par2script::globals::searchkeys{$item};
+
+ my %assignitems = ();
+ my $modulegid = "";
+
+ foreach $modulegid (keys %{$allmodules} )
+ {
+ # print "Module $modulegid\n";
+ # my $content = "";
+ # foreach $content (sort keys %{$allmodules->{$modulegid}}) { print "\t$content = $allmodules->{$modulegid}->{$content};\n"; }
+ # print "End\n";
+ # print "\n";
+
+ if ( exists($allmodules->{$modulegid}->{$searchkey}) )
+ {
+ my $list = $allmodules->{$modulegid}->{$searchkey};
+ if ( $list =~ /^\s*\((.*?)\)\s*(.*?)\s*$/ ) { $list = $1; }
+ else { par2script::exiter::exit_program("ERROR: Invalid module list: $list", "collect_assigned_gids"); }
+ my $allassigneditems = par2script::converter::convert_stringlist_into_array_2($list, ",");
+
+ my $gid;
+ foreach $gid ( @{$allassigneditems} )
+ {
+ if ( exists($assignitems{$gid}) ) { $assignitems{$gid} = $assignitems{$gid} + 1; }
+ else { $assignitems{$gid} = 1; }
+ }
+ }
+ }
+
+ $par2script::globals::assignedgids{$item} = \%assignitems;
+ }
+}
+
+##################################################
+# Collecting the content of all par files.
+# Then the files do not need to be opened twice.
+##################################################
+
+sub read_all_parfiles
+{
+ my ($parfiles) = @_;
+
+ my @parfilecontent = ();
+ my $parfilename;
+
+ foreach $parfilename ( @{$parfiles} )
+ {
+ my $parfile = par2script::files::read_file($parfilename);
+ foreach ( @{$parfile} ) { push(@parfilecontent, $_); }
+ push(@parfilecontent, "\n");
+ }
+
+ return \@parfilecontent;
+}
+
+1;
diff --git a/solenv/bin/modules/pre2par/directory.pm b/solenv/bin/modules/pre2par/directory.pm
new file mode 100644
index 000000000..02cfed6f9
--- /dev/null
+++ b/solenv/bin/modules/pre2par/directory.pm
@@ -0,0 +1,45 @@
+#
+# 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 .
+#
+
+package pre2par::directory;
+
+use pre2par::pathanalyzer;
+use pre2par::systemactions;
+
+############################################
+# Checking, whether the output directories
+# exist. If not, they are created.
+############################################
+
+sub check_directory
+{
+ my ($parfilename) = @_;
+
+ my $productdirectory = $parfilename;
+ pre2par::pathanalyzer::get_path_from_fullqualifiedname(\$productdirectory);
+ $productdirectory =~ s/\Q$pre2par::globals::separator\E\s*$//;
+
+ my $pardirectory = $productdirectory;
+ pre2par::pathanalyzer::get_path_from_fullqualifiedname(\$pardirectory);
+ $pardirectory =~ s/\Q$pre2par::globals::separator\E\s*$//;
+
+ if ( ! -d $pardirectory ) { pre2par::systemactions::create_directory($pardirectory); }
+ if ( ! -d $productdirectory ) { pre2par::systemactions::create_directory($productdirectory); }
+}
+
+1; \ No newline at end of file
diff --git a/solenv/bin/modules/pre2par/exiter.pm b/solenv/bin/modules/pre2par/exiter.pm
new file mode 100644
index 000000000..d07675ac4
--- /dev/null
+++ b/solenv/bin/modules/pre2par/exiter.pm
@@ -0,0 +1,61 @@
+#
+# 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 .
+#
+
+package pre2par::exiter;
+
+use pre2par::files;
+use pre2par::globals;
+
+############################################
+# Exiting the program with an error
+# This function is used instead of "die"
+############################################
+
+sub exit_program
+{
+ my ($message, $function) = @_;
+
+ my $infoline;
+
+ $infoline = "\n***************************************************************\n";
+ push(@pre2par::globals::logfileinfo, $infoline);
+ print("$infoline");
+
+ $infoline = "$message\n";
+ push(@pre2par::globals::logfileinfo, $infoline);
+ print("$infoline");
+
+ $infoline = "in function: $function\n";
+ push(@pre2par::globals::logfileinfo, $infoline);
+ print("$infoline");
+
+ $infoline = "***************************************************************\n";
+ push(@pre2par::globals::logfileinfo, $infoline);
+
+ if ($pre2par::globals::logging)
+ {
+ pre2par::files::save_file($pre2par::globals::logfilename ,\@pre2par::globals::logfileinfo);
+ print("Saved logfile: $pre2par::globals::logfilename\n");
+ }
+
+ print("$infoline");
+
+ exit(-1);
+}
+
+1;
diff --git a/solenv/bin/modules/pre2par/files.pm b/solenv/bin/modules/pre2par/files.pm
new file mode 100644
index 000000000..ddc8d9157
--- /dev/null
+++ b/solenv/bin/modules/pre2par/files.pm
@@ -0,0 +1,55 @@
+#
+# 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 .
+#
+
+package pre2par::files;
+
+use pre2par::exiter;
+
+############################################
+# File Operations
+############################################
+
+sub read_file
+{
+ my ($localfile) = @_;
+
+ my @localfile = ();
+
+ open( IN, "<$localfile" ) || pre2par::exiter::exit_program("ERROR: Cannot open file: $localfile", "read_file");
+ while ( <IN> ) { push(@localfile, $_); }
+ close( IN );
+
+ return \@localfile;
+}
+
+###########################################
+# Saving files
+###########################################
+
+sub save_file
+{
+ my ($savefile, $savecontent) = @_;
+ if (-f $savefile) { unlink $savefile };
+ if (-f $savefile) { pre2par::exiter::exit_program("ERROR: Cannot delete existing file: $savefile", "save_file"); };
+ open( OUT, ">$savefile" );
+ print OUT @{$savecontent};
+ close( OUT);
+ if (! -f $savefile) { pre2par::exiter::exit_program("ERROR: Cannot write file: $savefile", "save_file"); }
+}
+
+1;
diff --git a/solenv/bin/modules/pre2par/globals.pm b/solenv/bin/modules/pre2par/globals.pm
new file mode 100644
index 000000000..08d79b06b
--- /dev/null
+++ b/solenv/bin/modules/pre2par/globals.pm
@@ -0,0 +1,51 @@
+#
+# 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 .
+#
+
+
+package pre2par::globals;
+
+############################################
+# Global settings
+############################################
+
+BEGIN
+{
+ $prog="pre2par";
+
+ $prefilename = "";
+ $parfilename = "";
+ $langfilename = "";
+
+ @allitems = ("Installation", "ScpAction", "HelpText", "Directory", "DataCarrier", "StarRegistry", "File",
+ "Shortcut", "Custom", "Unixlink", "Procedure", "Module", "Profile", "ProfileItem",
+ "Folder", "FolderItem", "FolderItemProperty", "RegistryItem", "StarRegistryItem",
+ "WindowsCustomAction", "MergeModule");
+
+ $logging = 0;
+ $logfilename = "logfile.log"; # the default logfile name for global errors
+ @logfileinfo = ();
+
+ $plat = $^O;
+
+ $separator = "/";
+ $pathseparator = "\:";
+ $isunix = 1;
+ $iswin = 0;
+}
+
+1;
diff --git a/solenv/bin/modules/pre2par/language.pm b/solenv/bin/modules/pre2par/language.pm
new file mode 100644
index 000000000..332bb985f
--- /dev/null
+++ b/solenv/bin/modules/pre2par/language.pm
@@ -0,0 +1,135 @@
+#
+# 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 .
+#
+
+package pre2par::language;
+
+use strict;
+
+##############################################################
+# Returning a specific language string from the block
+# of all translations
+##############################################################
+
+sub get_language_string_from_language_block
+{
+ my ($language_block, $language) = @_;
+
+ my $newstring = "";
+
+ for ( my $i = 0; $i <= $#{$language_block}; $i++ )
+ {
+
+ if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ )
+ {
+ $newstring = $1;
+ $newstring = "\"" . $newstring . "\"";
+ last;
+ }
+ }
+
+ # defaulting to english!
+
+ if ( $newstring eq "" )
+ {
+ $language = "en-US"; # defaulting to english
+
+ for ( my $i = 0; $i <= $#{$language_block}; $i++ )
+ {
+ if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*(\".*\")\s*$/ )
+ {
+ $newstring = $1;
+ last;
+ }
+ }
+ }
+
+ return $newstring;
+}
+
+############################################
+# collecting all replace variables
+# in a language file
+############################################
+
+sub get_all_replace_variables
+{
+ my ($langfile) = @_;
+
+ my %allvars = ();
+
+ for ( my $i = 0; $i <= $#{$langfile}; $i++ )
+ {
+ if ( ${$langfile}[$i] =~ /^\s*\[\s*(.*?)\s*\]\s*$/ )
+ {
+ my $variable = $1;
+# print "lang block '$variable'\n";
+ my @lang_block = ();
+ my $counter;
+
+ # Store the complete block in all languages for a specified variable
+ for ( $counter = $i + 1; $counter <= $#{$langfile}; $counter++ ) {
+ my $line = ${$langfile}[$counter];
+ last if ($line =~ /^s*\[/); # next decl.
+ push @lang_block, $line;
+ }
+# print "$variable = '@lang_block'\n";
+ $allvars{$variable} = \@lang_block;
+ $i = $counter - 1;
+ }
+ }
+
+ return \%allvars;
+}
+
+############################################
+# localizing the par file with the
+# corresponding language file
+############################################
+
+sub localize
+{
+ my ($parfile, $langfile) = @_;
+
+ my $replace_hash = get_all_replace_variables($langfile);
+
+ # parse lines of the form Name (st) = STR_NAME_MODULE_HELPPACK_OC;
+ # for variable substitution
+ my $langlinere = qr/^\s*\w+\s*\(([\w-]+)\)\s*\=\s*([\w-]+)\s*;/;
+ for ( my $i = 0; $i <= $#{$parfile}; $i++ )
+ {
+ my $oneline = ${$parfile}[$i];
+
+ if ( $oneline =~ $langlinere) {
+ my $language = $1; # can be "01" or "en" or "en-US" or ...
+ my $variable = $2;
+
+# print "line '$oneline' split to '$language' '$variable'\n";
+
+ if (defined $replace_hash->{$variable}) {
+ my $newstring = get_language_string_from_language_block($replace_hash->{$variable}, $language);
+ if ( $newstring eq "" ) { $newstring = "\"" . $variable . "\""; }
+
+ $oneline =~ s/$variable/$newstring/g;
+
+ ${$parfile}[$i] = $oneline;
+ }
+ }
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/pre2par/parameter.pm b/solenv/bin/modules/pre2par/parameter.pm
new file mode 100644
index 000000000..aa9fe3399
--- /dev/null
+++ b/solenv/bin/modules/pre2par/parameter.pm
@@ -0,0 +1,144 @@
+#
+# 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 .
+#
+
+
+package pre2par::parameter;
+
+use Cwd;
+use pre2par::globals;
+use pre2par::systemactions;
+
+############################################
+# Parameter Operations
+############################################
+
+sub usage
+{
+ print <<End;
+---------------------------------------------------------
+$pre2par::globals::prog
+The following parameter are needed:
+-s: path to the pre file
+-o: path to the par file
+-l: path to the ulf file (mlf or jlf file)
+-v: log process (optional)
+
+Example:
+
+perl pre2par.pl -l test.mlf -s readme.pre -o readme.par -v
+
+---------------------------------------------------------
+End
+ exit(-1);
+}
+
+#####################################
+# Reading parameter
+#####################################
+
+sub getparameter
+{
+ while ( $#ARGV >= 0 )
+ {
+ my $param = shift(@ARGV);
+
+ if ($param eq "-s") { $pre2par::globals::prefilename = shift(@ARGV); }
+ elsif ($param eq "-o") { $pre2par::globals::parfilename = shift(@ARGV); }
+ elsif ($param eq "-l") { $pre2par::globals::langfilename = shift(@ARGV); }
+ elsif ($param eq "-v") { $pre2par::globals::logging = 1; }
+ else
+ {
+ print("\n*************************************\n");
+ print("Sorry, unknown parameter: $param");
+ print("\n*************************************\n");
+ usage();
+ exit(-1);
+ }
+ }
+}
+
+############################################
+# Controlling the fundamental parameter
+# (required for every process)
+############################################
+
+sub control_parameter
+{
+ if ($pre2par::globals::prefilename eq "")
+ {
+ print "\n************************************************\n";
+ print "Error: Name of the input file not set (-s)!";
+ print "\n************************************************\n";
+ usage();
+ exit(-1);
+ }
+
+ if (!(-f $pre2par::globals::prefilename))
+ {
+ print "\n************************************************\n";
+ print "Error: Input file does not exist!";
+ print "\n************************************************\n";
+ usage();
+ exit(-1);
+ }
+
+ if ($pre2par::globals::parfilename eq "")
+ {
+ print "\n************************************************\n";
+ print "Error: Name of the output file not set (-o)!";
+ print "\n************************************************\n";
+ usage();
+ exit(-1);
+ }
+
+ if (!($pre2par::globals::prefilename =~ /\.pre\s*$/))
+ {
+ print "\n************************************************\n";
+ print "Error: Input file is no .pre file!";
+ print "\n************************************************\n";
+ usage();
+ exit(-1);
+ }
+
+ if (!($pre2par::globals::parfilename =~ /\.par\s*$/))
+ {
+ print "\n************************************************\n";
+ print "Error: Output file is no .par file!";
+ print "\n************************************************\n";
+ usage();
+ exit(-1);
+ }
+}
+
+#####################################
+# Writing parameter to shell
+#####################################
+
+sub outputparameter
+{
+ $pre2par::globals::logging ? ($logoption = " -v") : ($logoption = "");
+ print "\n$pre2par::globals::prog -l $pre2par::globals::langfilename -s $pre2par::globals::prefilename -o $pre2par::globals::parfilename$logoption\n";
+
+# print "\n********************************************************\n";
+# print "This is $pre2par::globals::prog, version 1.0\n";
+# print "Input file: $pre2par::globals::prefilename\n";
+# print "Output file: $pre2par::globals::parfilename\n";
+# print "********************************************************\n";
+}
+
+1;
diff --git a/solenv/bin/modules/pre2par/pathanalyzer.pm b/solenv/bin/modules/pre2par/pathanalyzer.pm
new file mode 100644
index 000000000..4d2eb31ae
--- /dev/null
+++ b/solenv/bin/modules/pre2par/pathanalyzer.pm
@@ -0,0 +1,67 @@
+#
+# 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 .
+#
+
+
+package pre2par::pathanalyzer;
+
+use pre2par::globals;
+
+###########################################
+# Path analyzer
+###########################################
+
+sub get_path_from_fullqualifiedname
+{
+ my ($longfilenameref) = @_;
+
+ if ( $$longfilenameref =~ /\Q$pre2par::globals::separator\E/ ) # Is there a separator in the path? Otherwise the path is empty.
+ {
+ if ( $$longfilenameref =~ /^\s*(\S.*\S\Q$pre2par::globals::separator\E)(\S.+?\S)/ )
+ {
+ $$longfilenameref = $1;
+ }
+ }
+ else
+ {
+ $$longfilenameref = ""; # there is no path
+ }
+}
+
+sub make_absolute_filename_to_relative_filename
+{
+ my ($longfilenameref) = @_;
+
+ if ( $pre2par::globals::isunix )
+ {
+ if ( $$longfilenameref =~ /^.*\/(?=\S)([^\/]+)(?<=\S)/ )
+ {
+ $$longfilenameref = $1;
+ }
+ }
+
+ if ( $pre2par::globals::iswin )
+ {
+ # Either '/' or '\'.
+ if ( $$longfilenameref =~ /^.*[\/\\](?=\S)([^\/\\]+)(?<=\S)/ )
+ {
+ $$longfilenameref = $1;
+ }
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/pre2par/remover.pm b/solenv/bin/modules/pre2par/remover.pm
new file mode 100644
index 000000000..029d09a4e
--- /dev/null
+++ b/solenv/bin/modules/pre2par/remover.pm
@@ -0,0 +1,34 @@
+#
+# 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 .
+#
+
+
+package pre2par::remover;
+
+############################################
+# Remover
+############################################
+
+sub remove_leading_and_ending_whitespaces
+{
+ my ( $stringref ) = @_;
+
+ $$stringref =~ s/^\s*//g;
+ $$stringref =~ s/\s*$//g;
+}
+
+1;
diff --git a/solenv/bin/modules/pre2par/systemactions.pm b/solenv/bin/modules/pre2par/systemactions.pm
new file mode 100644
index 000000000..7848b6495
--- /dev/null
+++ b/solenv/bin/modules/pre2par/systemactions.pm
@@ -0,0 +1,81 @@
+#
+# 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 .
+#
+
+
+package pre2par::systemactions;
+
+use File::Copy;
+use pre2par::exiter;
+use pre2par::globals;
+
+######################################################
+# Creating a new directory
+######################################################
+
+sub create_directory
+{
+ my ($directory) = @_;
+
+ my $returnvalue = 1;
+ my $infoline = "";
+
+ if ($directory eq "" )
+ {
+ return 0;
+ }
+
+ if (!(-d $directory))
+ {
+ $returnvalue = mkdir($directory, 0775);
+
+ if ($returnvalue)
+ {
+ $infoline = "Created directory: $directory\n";
+ push(@pre2par::globals::logfileinfo, $infoline);
+
+ if ($pre2par::globals::isunix)
+ {
+ my $localcall = "chmod 775 $directory \>\/dev\/null 2\>\&1";
+ system($localcall);
+ }
+ }
+ else
+ {
+ # New solution in parallel packing: It is possible, that the directory now exists, although it
+ # was not created in this process. There is only an important error, if the directory does not
+ # exist now.
+
+ if (!(-d $directory))
+ {
+ pre2par::exiter::exit_program("Error: Could not create directory: $directory", "create_directory");
+ }
+ else
+ {
+ $infoline = "\nAnother process created this directory in exactly this moment :-) : $directory\n";
+ push(@pre2par::globals::logfileinfo, $infoline);
+ }
+ }
+ }
+ else
+ {
+ $infoline = "\nAlready existing directory, did not create: $directory\n";
+ push(@pre2par::globals::logfileinfo, $infoline);
+ }
+}
+
+1;
diff --git a/solenv/bin/modules/pre2par/work.pm b/solenv/bin/modules/pre2par/work.pm
new file mode 100644
index 000000000..6ee87ec37
--- /dev/null
+++ b/solenv/bin/modules/pre2par/work.pm
@@ -0,0 +1,297 @@
+#
+# 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 .
+#
+
+
+package pre2par::work;
+
+use pre2par::exiter;
+use pre2par::remover;
+use pre2par::pathanalyzer;
+
+############################################
+# pre2par working module
+############################################
+
+############################################
+# procedure to split a line, that contains
+# more than one par file lines
+############################################
+
+sub split_line
+{
+ my ($line, $parfile) = @_;
+
+ while ( $line =~ /^((?:[^"]|\"(?:[^"\\]|\\.)*\")*?\;\s+)\s*(.*)$/ )
+ {
+ my $oneline = $1;
+ $line = $2;
+ pre2par::remover::remove_leading_and_ending_whitespaces(\$oneline);
+ $oneline = $oneline . "\n";
+ push(@{$parfile}, $oneline);
+
+ if ( $line =~ /^\s*End\s+(\w+.*$)/i )
+ {
+ $line = $1;
+ push(@{$parfile}, "End\n\n");
+ }
+ }
+
+ # the last line
+
+ pre2par::remover::remove_leading_and_ending_whitespaces(\$line);
+ $line = $line . "\n";
+ push(@{$parfile}, $line);
+
+ if ( $line =~ /^\s*End\s*$/i ) { push(@{$parfile}, "\n"); }
+}
+
+###################################################################
+# Preprocessing the pre file to split all lines with semicolon
+###################################################################
+
+sub preprocess_macros
+{
+ my ($prefile) = @_;
+
+ my @newprefile = ();
+
+ for ( my $i = 0; $i <= $#{$prefile}; $i++ )
+ {
+ my $oneline = ${$prefile}[$i];
+ if ( $oneline =~ /\;\s*\w+/ )
+ {
+ split_line($oneline, \@newprefile);
+ }
+ else
+ {
+ push(@newprefile, $oneline);
+ }
+ }
+
+ return \@newprefile;
+}
+
+############################################
+# main working procedure
+############################################
+
+sub convert
+{
+ my ($prefile) = @_;
+
+ my @parfile = ();
+
+ my $iscodesection = 0;
+ my $ismultiliner = 0;
+ my $globalline = "";
+
+ # Preprocessing the pre file to split all lines with semicolon
+ $prefile = preprocess_macros($prefile);
+
+ for ( my $i = 0; $i <= $#{$prefile}; $i++ )
+ {
+ my $oneline = ${$prefile}[$i];
+
+ if ($iscodesection)
+ {
+ if ( $oneline =~ /^\s*\}\;\s*$/ )
+ {
+ $iscodesection = 0;
+ }
+ else # nothing to do for code inside a code section
+ {
+ push(@parfile, $oneline);
+ next;
+ }
+ }
+
+ if ( $oneline =~ /^\s*$/ ) { next; }
+
+ if ( $oneline =~ /^\s*Code\s+\=\s+\{/ )
+ {
+ $iscodesection = 1;
+ }
+
+ pre2par::remover::remove_leading_and_ending_whitespaces(\$oneline);
+
+ my $insertemptyline = 0;
+
+ if ( $oneline =~ /^\s*End\s*$/i ) { $insertemptyline = 1; }
+
+ # Sometimes the complete file is in one line, then the gid line has to be separated
+
+ if ( $oneline =~ /^\s*(\w+\s+\w+)\s+(\w+\s+\=.*$)/ ) # three words before the equal sign
+ {
+ my $gidline = $1;
+ $oneline = $2;
+ $gidline = $gidline . "\n";
+
+ push(@parfile, $gidline);
+ }
+
+ if ( $oneline =~ /\;\s*\w+/ )
+ {
+ split_line($oneline, \@parfile);
+ next;
+ }
+
+ # searching for lines with brackets, like Customs = { ..., which can be parted above several lines
+
+ if ( $oneline =~ /^\s*\w+\s+\=\s*\(.*\)\s*\;\s*$/ ) # only one line
+ {
+ if (( ! ( $oneline =~ /^\s*Assignment\d+\s*\=/ )) && ( ! ( $oneline =~ /^\s*PatchAssignment\d+\s*\=/ )))
+ {
+ $oneline =~ s/\s//g; # removing whitespaces in lists
+ $oneline =~ s/\=/\ \=\ /; # adding whitespace around equals sign
+ }
+ }
+
+ if ( $oneline =~ /^\s*\w+\s+\=\s*$/ )
+ {
+ $oneline =~ s/\s*$//;
+ pre2par::exiter::exit_program("Error: Illegal syntax, no line break after eqals sign allowed. Line: \"$oneline\"", "convert");
+ }
+
+ if (( $oneline =~ /^\s*\w+\s+\=\s*\(/ ) && (!( $oneline =~ /\)\s*\;\s*$/ ))) # several lines
+ {
+ $ismultiliner = 1;
+ $oneline =~ s/\s//g;
+ $globalline .= $oneline;
+ next; # not including yet
+ }
+
+ if ( $ismultiliner )
+ {
+ $oneline =~ s/\s//g;
+ $globalline .= $oneline;
+
+ if ( $oneline =~ /\)\s*\;\s*$/ ) { $ismultiliner = 0; }
+
+ if (! ( $ismultiliner ))
+ {
+ $globalline =~ s/\=/\ \=\ /; # adding whitespace around equals sign
+ $globalline .= "\n";
+ push(@parfile, $globalline);
+ $globalline = "";
+ }
+
+ next;
+ }
+
+ $oneline = $oneline . "\n";
+
+ $oneline =~ s/\s*\=\s*/ \= /; # nice, to have only one whitespace around equal signs
+
+ # Concatenate adjacent string literals:
+ while ($oneline =~
+ s/^((?:[^"]*
+ \"(?:[^\\"]|\\.)*\"
+ (?:[^"]*[^[:blank:]"][^"]*\"(?:[^\\"]|\\.)*\")*)*
+ [^"]*
+ \"(?:[^\\"]|\\.)*)
+ \"[[:blank:]]*\"
+ ((?:[^\\"]|\\.)*\")
+ /\1\2/x)
+ {}
+
+ push(@parfile, $oneline);
+
+ if ($insertemptyline) { push(@parfile, "\n"); }
+
+ }
+
+ return \@parfile;
+}
+
+############################################
+# formatting the par file
+############################################
+
+sub formatter
+{
+ my ($parfile) = @_;
+
+ my $iscodesection = 0;
+
+ my $tabcounter = 0;
+ my $isinsideitem = 0;
+ my $currentitem;
+
+ for ( my $i = 0; $i <= $#{$parfile}; $i++ )
+ {
+ my $oneline = ${$parfile}[$i];
+ my $isitemline = 0;
+
+ if (! $isinsideitem )
+ {
+ for ( my $j = 0; $j <= $#pre2par::globals::allitems; $j++ )
+ {
+ if ( $oneline =~ /^\s*$pre2par::globals::allitems[$j]\s+\w+\s*$/ )
+ {
+ $currentitem = $pre2par::globals::allitems[$j];
+ $isitemline = 1;
+ $isinsideitem = 1;
+ $tabcounter = 0;
+ last;
+ }
+ }
+ }
+
+ if ( $isitemline )
+ {
+ next; # nothing to do
+ }
+
+ if ( $oneline =~ /^\s*end\s*$/i )
+ {
+ $isinsideitem = 0;
+ $tabcounter--;
+ }
+
+ if ( $isinsideitem )
+ {
+ $oneline = "\t" . $oneline;
+ ${$parfile}[$i] = $oneline;
+ }
+ }
+}
+
+############################################
+# Checking that the pre file has content
+############################################
+
+sub check_content
+{
+ my ($filecontent, $filename) = @_;
+
+ if ( $#{$filecontent} < 0 ) { pre2par::exiter::exit_program("Error: $filename has no content!", "check_content"); }
+}
+
+############################################
+# Checking content of par files.
+# Currently only size.
+############################################
+
+sub diff_content
+{
+ my ($content1, $content2, $filename) = @_;
+
+ if ( $#{$content1} != $#{$content2} ) { pre2par::exiter::exit_program("Error: $filename was not saved correctly!", "diff_content"); }
+}
+
+1;
diff --git a/solenv/bin/modules/t/installer-packagelist.t b/solenv/bin/modules/t/installer-packagelist.t
new file mode 100644
index 000000000..c51683b14
--- /dev/null
+++ b/solenv/bin/modules/t/installer-packagelist.t
@@ -0,0 +1,40 @@
+#
+# 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/.
+#
+
+use strict;
+use warnings;
+
+use lib '.';
+
+use Test::More;
+
+BEGIN {
+ use_ok('installer::packagelist');
+}
+
+my @packagemodules = (
+ { allmodules => [qw(a b c d)] },
+ { allmodules => [qw(a b c)] },
+ { allmodules => [qw(e f g)] },
+ { allmodules => [qw(h)] },
+ { allmodules => [qw(a b g)] },
+);
+
+my @expected_packagemodules = (
+ { allmodules => [qw(d)] },
+ { allmodules => [qw(c)] },
+ { allmodules => [qw(e f)] },
+ { allmodules => [qw(h)] },
+ { allmodules => [qw(a b g)] },
+);
+
+installer::packagelist::remove_multiple_modules_packages(\@packagemodules);
+
+is_deeply(\@packagemodules, \@expected_packagemodules);
+
+done_testing();
diff --git a/solenv/bin/modules/t/installer-profiles.t b/solenv/bin/modules/t/installer-profiles.t
new file mode 100644
index 000000000..781792598
--- /dev/null
+++ b/solenv/bin/modules/t/installer-profiles.t
@@ -0,0 +1,43 @@
+#
+# 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/.
+#
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use lib '.';
+
+use installer::profiles;
+
+my @input = map { "$_\n" } split "\n", <<'END';
+ [foo]
+1
+NOT SEEN
+ [bar]
+3
+ [foo]
+2
+[bar]
+4
+END
+
+my @expected = map { "$_\n" } split "\n", <<'END';
+[foo]
+1
+2
+[bar]
+3
+4
+END
+
+my $result = installer::profiles::sorting_profile(\@input);
+
+is_deeply($result, \@expected);
+
+done_testing();
diff --git a/solenv/bin/modules/t/installer-scpzipfiles.t b/solenv/bin/modules/t/installer-scpzipfiles.t
new file mode 100644
index 000000000..656e15f65
--- /dev/null
+++ b/solenv/bin/modules/t/installer-scpzipfiles.t
@@ -0,0 +1,54 @@
+#
+# 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/.
+#
+
+use strict;
+use warnings;
+
+use lib '.';
+
+use Test::More;
+
+use installer::scpzipfiles;
+
+my $vars = { foo => "bar" };
+
+my %lines;
+my $i = 0;
+while (<DATA>) {
+ push @{ $lines{$i++ % 3} }, $_;
+}
+
+my @file1 = @{ $lines{0} };
+my @file2 = @{ $lines{0} };
+
+# FIXME - Some of the files acted on by these methods contain variables
+# of the form "${foo}" which are currently ignored - but if "foo" was ever
+# added to the product list variables, they would suddenly start to be
+# replaced.
+#
+# We ought to come up with a better escaping mechanism, and change those
+# files to use it...
+
+installer::scpzipfiles::replace_all_ziplistvariables_in_file(\@file1, $vars);
+installer::scpzipfiles::replace_all_ziplistvariables_in_rtffile(\@file2, $vars);
+
+is_deeply(\@file1, $lines{1}, 'replace_all_ziplistvariables_in_file works');
+is_deeply(\@file2, $lines{2}, 'replace_all_ziplistvariables_in_rtffile works');
+
+done_testing();
+
+__DATA__
+This is a test
+This is a test
+This is a test
+A test of ${foo} replacement ${foo} but not ${bar}.
+A test of bar replacement bar but not ${bar}.
+A test of ${foo} replacement ${foo} but not ${bar}.
+A test of RTF $\{foo\} replacement $\{foo\} but not $\{bar\} or ${bar}.
+A test of RTF $\{foo\} replacement $\{foo\} but not $\{bar\} or ${bar}.
+A test of RTF bar replacement bar but not $\{bar\} or ${bar}.
diff --git a/solenv/bin/modules/t/installer-setupscript.t b/solenv/bin/modules/t/installer-setupscript.t
new file mode 100644
index 000000000..2994288e2
--- /dev/null
+++ b/solenv/bin/modules/t/installer-setupscript.t
@@ -0,0 +1,58 @@
+#
+# 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/.
+#
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use lib '.';
+
+BEGIN {
+ use_ok('installer::setupscript', qw(
+ add_installationobject_to_variables
+ add_lowercase_productname_setupscriptvariable
+ add_predefined_folder
+ get_all_items_from_script
+ get_all_scriptvariables_from_installation_object
+ prepare_non_advertised_files
+ replace_all_setupscriptvariables_in_script
+ replace_preset_properties
+ resolve_lowercase_productname_setupscriptvariable
+ set_setupscript_name
+ ));
+}
+
+my @folders = (
+ { gid => '123' },
+ { gid => 'PREDEFINED_FOO' },
+ { gid => 'PREDEFINED_BAR' },
+);
+
+my @folderitems = (
+ { FolderID => 'PREDEFINED_AUTOSTART' },
+ { FolderID => 'PREDEFINED_BAR' },
+ { FolderID => '456' },
+);
+
+my @expected_folders = (
+ { gid => '123' },
+ { gid => 'PREDEFINED_FOO' },
+ { gid => 'PREDEFINED_BAR' },
+ {
+ ismultilingual => 0,
+ Name => "",
+ gid => 'PREDEFINED_AUTOSTART'
+ },
+);
+
+add_predefined_folder(\@folderitems, \@folders);
+
+is_deeply(\@folders, \@expected_folders);
+
+done_testing();
diff --git a/solenv/bin/native-code.py b/solenv/bin/native-code.py
new file mode 100755
index 000000000..b59186185
--- /dev/null
+++ b/solenv/bin/native-code.py
@@ -0,0 +1,981 @@
+#!/usr/bin/env python3
+# 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/.
+
+from optparse import OptionParser
+
+import re
+import sys
+import xml.etree.ElementTree as ET
+
+# foo_component_getFactory functions are split into groups, so that you could
+# choose e.g. 'core' and 'writer' functionality and through factory_map,
+# relevant function sections will be referenced in lo_get_factory_map().
+# That prevents garbage collector to ignore them as unused.
+
+# The same groups are used for constructor based implementations
+# referenced in lo_get_constructor_map().
+
+core_factory_list = [
+ ("libi18npoollo.a", "i18npool_component_getFactory"),
+ ("libvcllo.a", "vcl_component_getFactory"),
+ ("libsvtlo.a", "svt_component_getFactory"),
+ ]
+
+core_constructor_list = [
+# animations/source/animcore/animcore.component
+ "com_sun_star_animations_AnimatePhysics_get_implementation",
+# basic/util/sb.component
+ ("com_sun_star_comp_sfx2_DialogLibraryContainer_get_implementation","#if HAVE_FEATURE_SCRIPTING"),
+ ("com_sun_star_comp_sfx2_ScriptLibraryContainer_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+# UnoControls/util/ctl.component
+ "stardiv_UnoControls_FrameControl_get_implementation",
+ "stardiv_UnoControls_ProgressBar_get_implementation",
+ "stardiv_UnoControls_ProgressMonitor_get_implementation",
+ "stardiv_UnoControls_StatusIndicator_get_implementation",
+# canvas/source/factory/canvasfactory.component
+ "com_sun_star_comp_rendering_CanvasFactory_get_implementation",
+# canvas/source/vcl/vclcanvas.component
+ "com_sun_star_comp_rendering_Canvas_VCL_get_implementation",
+ "com_sun_star_comp_rendering_SpriteCanvas_VCL_get_implementation",
+# chart2/source/chartcore.component
+ "com_sun_star_chart2_ExponentialScaling_get_implementation",
+ "com_sun_star_chart2_LinearScaling_get_implementation",
+ "com_sun_star_chart2_LogarithmicScaling_get_implementation",
+ "com_sun_star_chart2_PowerScaling_get_implementation",
+ "com_sun_star_comp_chart_AreaChartType_get_implementation",
+ "com_sun_star_comp_chart_BarChartType_get_implementation",
+ "com_sun_star_comp_chart_BubbleChartType_get_implementation",
+ "com_sun_star_comp_chart_CachedDataSequence_get_implementation",
+ "com_sun_star_comp_chart_CandleStickChartType_get_implementation",
+ "com_sun_star_comp_chart_ChartTypeManager_get_implementation",
+ "com_sun_star_comp_chart_ColumnChartType_get_implementation",
+ "com_sun_star_comp_chart_DataSeries_get_implementation",
+ "com_sun_star_comp_chart_DataSource_get_implementation",
+ "com_sun_star_comp_chart_FilledNetChartType_get_implementation",
+ "com_sun_star_comp_chart_FormattedString_get_implementation",
+ "com_sun_star_comp_chart_InternalDataProvider_get_implementation",
+ "com_sun_star_comp_chart_LineChartType_get_implementation",
+ "com_sun_star_comp_chart_NetChartType_get_implementation",
+ "com_sun_star_comp_chart_PieChartType_get_implementation",
+ "com_sun_star_comp_chart_ScatterChartType_get_implementation",
+ "com_sun_star_comp_chart2_Axis_get_implementation",
+ "com_sun_star_comp_chart2_CartesianCoordinateSystem2d_get_implementation",
+ "com_sun_star_comp_chart2_CartesianCoordinateSystem3d_get_implementation",
+ "com_sun_star_comp_chart2_ChartController_get_implementation",
+ "com_sun_star_comp_chart2_ChartDocumentWrapper_get_implementation",
+ "com_sun_star_comp_chart2_ChartModel_get_implementation",
+ "com_sun_star_comp_chart2_ChartView_get_implementation",
+ "com_sun_star_comp_chart2_ConfigDefaultColorScheme_get_implementation",
+ "com_sun_star_comp_chart2_Diagram_get_implementation",
+ "com_sun_star_comp_chart2_ErrorBar_get_implementation",
+ "com_sun_star_comp_chart2_ExponentialRegressionCurve_get_implementation",
+ "com_sun_star_comp_chart2_GridProperties_get_implementation",
+ "com_sun_star_comp_chart2_LabeledDataSequence_get_implementation",
+ "com_sun_star_comp_chart2_Legend_get_implementation",
+ "com_sun_star_comp_chart2_LinearRegressionCurve_get_implementation",
+ "com_sun_star_comp_chart2_LogarithmicRegressionCurve_get_implementation",
+ "com_sun_star_comp_chart2_MeanValueRegressionCurve_get_implementation",
+ "com_sun_star_comp_chart2_MovingAverageRegressionCurve_get_implementation",
+ "com_sun_star_comp_chart2_PageBackground_get_implementation",
+ "com_sun_star_comp_chart2_PolarCoordinateSystem2d_get_implementation",
+ "com_sun_star_comp_chart2_PolarCoordinateSystem3d_get_implementation",
+ "com_sun_star_comp_chart2_PolynomialRegressionCurve_get_implementation",
+ "com_sun_star_comp_chart2_PotentialRegressionCurve_get_implementation",
+ "com_sun_star_comp_chart2_RegressionEquation_get_implementation",
+ "com_sun_star_comp_chart2_Title_get_implementation",
+ "com_sun_star_comp_chart2_XMLFilter_get_implementation",
+# chart2/source/controller/chartcontroller.component
+ "com_sun_star_comp_chart2_ChartDocumentWrapper_get_implementation",
+ "com_sun_star_comp_chart2_ChartFrameLoader_get_implementation",
+ "com_sun_star_comp_chart2_WizardDialog_get_implementation",
+ "org_libreoffice_chart2_Chart2ToolboxController",
+ "org_libreoffice_comp_chart2_sidebar_ChartPanelFactory",
+# comphelper/util/comphelp.component
+ "com_sun_star_comp_MemoryStream",
+ "com_sun_star_comp_task_OfficeRestartManager",
+ "AnyCompareFactory_get_implementation",
+ "IndexedPropertyValuesContainer_get_implementation",
+ "NamedPropertyValuesContainer_get_implementation",
+ "com_sun_star_comp_comphelper_OPropertyBag",
+ "com_sun_star_comp_SequenceInputStreamService",
+ "com_sun_star_comp_SequenceOutputStreamService",
+ "com_sun_star_comp_util_OfficeInstallationDirectories",
+ "org_openoffice_comp_comphelper_EnumerableMap",
+# configmgr/source/configmgr.component
+ "com_sun_star_comp_configuration_ConfigurationProvider_get_implementation",
+ "com_sun_star_comp_configuration_ConfigurationRegistry_get_implementation",
+ "com_sun_star_comp_configuration_DefaultProvider_get_implementation",
+ "com_sun_star_comp_configuration_ReadOnlyAccess_get_implementation",
+ "com_sun_star_comp_configuration_ReadWriteAccess_get_implementation",
+ "com_sun_star_comp_configuration_Update_get_implementation",
+# connectivity/source/manager/sdbc2.component
+ ("connectivity_OSDBCDriverManager_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY"),
+# connectivity/source/drivers/dbase/dbase.component
+ ("connectivity_dbase_ODriver", "#if HAVE_FEATURE_DBCONNECTIVITY"),
+# cppcanvas/source/uno/mtfrenderer.component
+ "com_sun_star_comp_rendering_MtfRenderer_get_implementation",
+# cui/util/cui.component
+ "com_sun_star_cui_ColorPicker_get_implementation",
+# dbaccess/util/dba.component
+ "com_sun_star_comp_dba_DataAccessDescriptorFactory",
+ "com_sun_star_comp_dba_OCommandDefinition",
+ "com_sun_star_comp_dba_OComponentDefinition",
+ "com_sun_star_comp_dba_ODatabaseContext_get_implementation",
+ "com_sun_star_comp_dba_ODatabaseDocument",
+ "com_sun_star_comp_dba_ODatabaseSource",
+ "com_sun_star_comp_dba_ORowSet_get_implementation",
+# drawinglayer/drawinglayer.component
+ "drawinglayer_XPrimitive2DRenderer",
+# embeddedobj/util/embobj.component
+ "embeddedobj_UNOEmbeddedObjectCreator_get_implementation",
+ "embeddedobj_OOoEmbeddedObjectFactory_get_implementation",
+ "embeddedobj_OOoSpecialEmbeddedObjectFactory_get_implementation",
+# emfio/emfio.component
+ "emfio_emfreader_XEmfParser_get_implementation",
+# eventattacher/source/evtatt.component
+ "eventattacher_EventAttacher",
+# extensions/source/logging/log.component
+ ("com_sun_star_comp_extensions_FileHandler", "#ifdef ANDROID"),
+ ("com_sun_star_comp_extensions_LoggerPool", "#ifdef ANDROID"),
+ ("com_sun_star_comp_extensions_PlainTextFormatter", "#ifdef ANDROID"),
+ ("com_sun_star_comp_extensions_SimpleTextFormatter", "#ifdef ANDROID"),
+# extensions/source/bibliography/bib.component
+ "extensions_BibliographyLoader_get_implementation",
+# filter/source/config/cache/filterconfig1.component
+ "filter_ConfigFlush_get_implementation",
+ "filter_TypeDetection_get_implementation",
+ "filter_FrameLoaderFactory_get_implementation",
+ "filter_FilterFactory_get_implementation",
+ "filter_ContentHandlerFactory_get_implementation",
+# filter/source/odfflatxml/odfflatxml.component
+ "filter_OdfFlatXml_get_implementation",
+# filter/source/pdf/pdffilter.component
+ "filter_PdfDecomposer_get_implementation",
+ "filter_PDFExportInteractionHandler_get_implementation",
+ "filter_PDFFilter_get_implementation",
+ "filter_PDFDialog_get_implementation",
+# filter/source/xmlfilterdetect/xmlfd.component
+ "filter_XMLFilterDetect_get_implementation",
+# filter/source/xmlfilteradaptor/xmlfa.component
+ "filter_XmlFilterAdaptor_get_implementation",
+# filter/source/storagefilterdetect/storagefd.component
+ "filter_StorageFilterDetect_get_implementation",
+# forms/util/frm.component
+ ("com_sun_star_comp_forms_FormOperations_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_comp_forms_ODatabaseForm_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_comp_forms_OFormattedFieldWrapper_ForcedFormatted_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_comp_form_ORichTextControl_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_comp_forms_ORichTextModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_comp_forms_OScrollBarModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_comp_forms_OSpinButtonModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_Model_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OButtonControl_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OButtonModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OCheckBoxControl_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OCheckBoxModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OComboBoxControl_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OComboBoxModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_ODateControl_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_ODateModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OEditControl_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OEditModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OFixedTextModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OFormsCollection_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OGridControlModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OGroupBoxModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OListBoxControl_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_OListBoxModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_ONumericModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_ONumericControl_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_ORadioButtonControl_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_ORadioButtonModel_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+ ("com_sun_star_form_XForms_get_implementation", "#if HAVE_FEATURE_DBCONNECTIVITY && !ENABLE_FUZZERS"),
+# framework/util/fwk.component
+ "com_sun_star_comp_framework_AutoRecovery_get_implementation",
+ "com_sun_star_comp_framework_Desktop_get_implementation",
+ "com_sun_star_comp_framework_DocumentAcceleratorConfiguration_get_implementation",
+ "com_sun_star_comp_framework_Frame_get_implementation",
+ "com_sun_star_comp_framework_GlobalAcceleratorConfiguration_get_implementation",
+ "com_sun_star_comp_framework_JobExecutor_get_implementation",
+ "com_sun_star_comp_framework_jobs_JobDispatch_get_implementation",
+ "com_sun_star_comp_framework_LayoutManager_get_implementation",
+ "com_sun_star_comp_framework_ModuleManager_get_implementation",
+ "com_sun_star_comp_framework_ModuleUIConfigurationManager_get_implementation",
+ "com_sun_star_comp_framework_ModuleUIConfigurationManagerSupplier_get_implementation",
+ "com_sun_star_comp_framework_PathSettings_get_implementation",
+ "com_sun_star_comp_framework_PathSubstitution_get_implementation",
+ "com_sun_star_comp_framework_ObjectMenuController_get_implementation",
+ "com_sun_star_comp_framework_PopupMenuControllerFactory_get_implementation",
+ "com_sun_star_comp_framework_ControlMenuController_get_implementation",
+ "com_sun_star_comp_framework_ThesaurusMenuController_get_implementation",
+ "com_sun_star_comp_framework_ToolbarAsMenuController_get_implementation",
+ "com_sun_star_comp_framework_ResourceMenuController_get_implementation",
+ "com_sun_star_comp_framework_StatusIndicatorFactory_get_implementation",
+ "com_sun_star_comp_framework_TaskCreator_get_implementation",
+ "com_sun_star_comp_framework_ToolBarControllerFactory_get_implementation",
+ "com_sun_star_comp_framework_UIConfigurationManager_get_implementation",
+ "com_sun_star_comp_framework_UIElementFactoryManager_get_implementation",
+ "com_sun_star_comp_framework_URLTransformer_get_implementation",
+ "com_sun_star_comp_framework_WindowStateConfiguration_get_implementation",
+ "com_sun_star_comp_framework_ModuleAcceleratorConfiguration_get_implementation",
+ "org_apache_openoffice_comp_framework_ContextChangeEventMultiplexer_get_implementation",
+# i18npool/util/i18npool.component
+ "com_sun_star_i18n_BreakIterator_get_implementation",
+ "com_sun_star_i18n_BreakIterator_Unicode_get_implementation",
+ "com_sun_star_i18n_CharacterClassification_get_implementation",
+ "com_sun_star_i18n_CharacterClassification_Unicode_get_implementation",
+ "com_sun_star_i18n_Collator_get_implementation",
+ "com_sun_star_i18n_LocaleDataImpl_get_implementation",
+ "com_sun_star_i18n_NativeNumberSupplier_get_implementation",
+ "com_sun_star_i18n_NumberFormatCodeMapper_get_implementation",
+ "com_sun_star_i18n_Transliteration_get_implementation",
+ "com_sun_star_i18n_Transliteration_IGNORE_CASE_get_implementation",
+ "com_sun_star_i18n_Transliteration_IGNORE_KANA_get_implementation",
+ "com_sun_star_i18n_Transliteration_IGNORE_WIDTH_get_implementation",
+ "com_sun_star_text_DefaultNumberingProvider_get_implementation",
+ ("i18npool_BreakIterator_ja_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ja"),
+ ("i18npool_BreakIterator_ko_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ko"),
+ ("i18npool_BreakIterator_th_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_th"),
+ ("i18npool_BreakIterator_zh_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_zh"),
+ ("i18npool_BreakIterator_zh_TW_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_zh"),
+ "i18npool_CalendarImpl_get_implementation",
+ "i18npool_Calendar_ROC_get_implementation",
+ "i18npool_Calendar_dangi_get_implementation",
+ "i18npool_Calendar_buddhist_get_implementation",
+ "i18npool_Calendar_gengou_get_implementation",
+ "i18npool_Calendar_gregorian_get_implementation",
+ "i18npool_Calendar_hanja_get_implementation",
+ "i18npool_Calendar_hanja_yoil_get_implementation",
+ "i18npool_Calendar_hijri_get_implementation",
+ "i18npool_Calendar_jewish_get_implementation",
+ "i18npool_ChapterCollator_get_implementation",
+ "i18npool_Collator_Unicode_get_implementation",
+ "i18npool_IndexEntrySupplier_get_implementation",
+ "i18npool_IndexEntrySupplier_Unicode_get_implementation",
+ "i18npool_IndexEntrySupplier_asian_get_implementation",
+ ("i18npool_IndexEntrySupplier_ja_phonetic_alphanumeric_first_by_syllable_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ja"),
+ ("i18npool_IndexEntrySupplier_ja_phonetic_alphanumeric_first_by_consonant_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ja"),
+ ("i18npool_IndexEntrySupplier_ja_phonetic_alphanumeric_last_by_syllable_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ja"),
+ ("i18npool_IndexEntrySupplier_ja_phonetic_alphanumeric_last_by_consonant_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ja"),
+ ("i18npool_InputSequenceChecker_hi_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_hi"),
+ ("i18npool_InputSequenceChecker_th_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_th"),
+ ("i18npool_TextConversion_ko_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ko"),
+ ("i18npool_TextConversion_zh_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_zh"),
+ "i18npool_CharToNumEastIndic_ar_get_implementation",
+ ("i18npool_CharToNumFullwidth_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ja"),
+ ("i18npool_CharToNumHangul_ko_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ko"),
+ "i18npool_CharToNumIndic_ar_get_implementation",
+ ("i18npool_CharToNumIndic_hi_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_hi"),
+ ("i18npool_CharToNumKanjiShort_ja_JP_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ja"),
+ ("i18npool_CharToNumKanjiTraditional_ja_JP_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ja"),
+ ("i18npool_CharToNumLower_ko_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ko"),
+ ("i18npool_CharToNumUpper_ko_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_ko"),
+ ("i18npool_CharToNum_th_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_th"),
+ ("i18npool_NumToTextFullwidth_zh_CN_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_zh"),
+ ("i18npool_NumToTextFullwidth_zh_TW_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_zh"),
+ ("i18npool_NumToTextLower_zh_CN_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_zh"),
+ ("i18npool_NumToTextLower_zh_TW_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_zh"),
+ ("i18npool_NumToTextUpper_zh_CN_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_zh"),
+ ("i18npool_NumToTextUpper_zh_TW_get_implementation", "#if WITH_LOCALE_ALL || WITH_LOCALE_zh"),
+# i18nsearch/sourceh/search/i18nsearch.component
+ "i18npool_TextSearch_get_implementation",
+# io/source/io.component
+ "io_Pump_get_implementation",
+ "io_ODataInputStream_get_implementation",
+ "io_ODataOutputStream_get_implementation",
+ "io_OMarkableInputStream_get_implementation",
+ "io_OMarkableOutputStream_get_implementation",
+ "io_OObjectInputStream_get_implementation",
+ "io_OObjectOutputStream_get_implementation",
+ "io_OPipeImpl_get_implementation",
+ "io_OAcceptor_get_implementation",
+ "io_OConnector_get_implementation",
+ "io_OTextInputStream_get_implementation",
+ "io_OTextOutputStream_get_implementation",
+# linguistic/source/lng.component
+ "linguistic_ConvDicList_get_implementation",
+ "linguistic_DicList_get_implementation",
+ "linguistic_LinguProps_get_implementation",
+ "linguistic_LngSvcMgr_get_implementation",
+ "linguistic_GrammarCheckingIterator_get_implementation",
+# linguistic/source/spellcheck/MacOSXSpellMacOSXSpell.component
+ ("lingucomponent_MacSpellChecker_get_implementation", "#ifdef IOS"),
+# lingucomponent/source/spellcheck/languagetool/LanguageTool.component
+ "lingucomponent_LanguageToolGrammarChecker_get_implementation",
+# lingucomponent/source/thesaurus/libnth/lnth.component
+ "lingucomponent_Thesaurus_get_implementation",
+ "lingucomponent_SpellChecker_get_implementation",
+ "lingucomponent_LangGuess_get_implementation",
+ "lingucomponent_Hyphenator_get_implementation",
+# package/source/xstor/xstor.component
+ "package_OStorageFactory_get_implementation",
+# package/util/package2.component
+ "package_OZipFileAccess_get_implementation",
+ "package_ZipPackage_get_implementation",
+ "package_ManifestReader_get_implementation",
+ "package_ManifestWriter_get_implementation",
+# sax/source/expatwrap/expwrap.component
+ "com_sun_star_comp_extensions_xml_sax_FastParser_get_implementation",
+ "com_sun_star_comp_extensions_xml_sax_ParserExpat_get_implementation",
+ "com_sun_star_extensions_xml_sax_Writer_get_implementation",
+# scripting/util/scriptframe.component
+ ("scripting_BrowseNodeFactoryImpl_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("scripting_MasterScriptProvider_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("scripting_MasterScriptProviderFactory_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("scripting_ScriptingFrameworkURIHelper_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+# scripting/source/basprov/basprov.component
+ ("scripting_BasicProviderImpl_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+# sfx2/util/sfx.component
+ "SfxDocumentMetaData_get_implementation",
+ "com_sun_star_comp_office_FrameLoader_get_implementation",
+ "com_sun_star_comp_sfx2_AppDispatchProvider_get_implementation",
+ "com_sun_star_comp_sfx2_DocumentTemplates_get_implementation",
+ "com_sun_star_comp_sfx2_GlobalEventBroadcaster_get_implementation",
+# shell/source/backends/localebe/localebe1.component
+ "shell_LocaleBackend_get_implementation",
+# sot/util/sot.component
+ "com_sun_star_comp_embed_OLESimpleStorage",
+# stoc/source/inspect/introspection.component
+ "com_sun_star_comp_stoc_Introspection_get_implementation",
+# stoc/source/invocation_adapter/invocadapt.component
+ "stoc_invocation_adapter_get_implementation",
+# stoc/source/corereflection/reflection.component
+ "com_sun_star_comp_stoc_CoreReflection_get_implementation",
+# stoc/source/proxy_factory/proxyfac.component
+ "stoc_FactoryImpl_get_implementation",
+# stoc/util/stocservices.component
+ "com_sun_star_comp_stoc_OServiceManagerWrapper_get_implementation",
+ "com_sun_star_comp_stoc_TypeConverter_get_implementation",
+ "com_sun_star_comp_uri_ExternalUriReferenceTranslator_get_implementation",
+ "com_sun_star_comp_uri_UriReferenceFactory_get_implementation",
+ "com_sun_star_comp_uri_UriSchemeParser_vndDOTsunDOTstarDOTexpand_get_implementation",
+ "com_sun_star_comp_uri_UriSchemeParser_vndDOTsunDOTstarDOTscript_get_implementation",
+# starmath/util/sm.component
+ "Math_FormulaDocument_get_implementation",
+ "Math_XMLContentExporter_get_implementation",
+ "Math_XMLExporter_get_implementation",
+ "Math_XMLImporter_get_implementation",
+ "Math_XMLMetaExporter_get_implementation",
+ "Math_XMLOasisMetaExporter_get_implementation",
+ "Math_XMLOasisMetaImporter_get_implementation",
+ "Math_XMLOasisSettingsExporter_get_implementation",
+ "Math_XMLOasisSettingsImporter_get_implementation",
+ "Math_XMLSettingsExporter_get_implementation",
+ "com_sun_star_comp_Math_MathTypeFilter_get_implementation",
+# svl/source/fsstor/fsstorage.component
+ "svl_FSStorageFactory_get_implementation",
+# vcl/vcl.android.component
+ "com_sun_star_graphic_GraphicObject_get_implementation",
+ "com_sun_star_comp_graphic_GraphicMapper_get_implementation",
+ "com_sun_star_comp_graphic_GraphicProvider_get_implementation",
+ "com_sun_star_frame_VCLSessionManagerClient_get_implementation",
+ "vcl_FontIdentificator_get_implementation",
+# svgio/svgio.component
+ "svgio_XSvgParser_get_implementation",
+# svx/util/svx.component
+ "com_sun_star_comp_svx_CharacterSpacingToolBoxControl_get_implementation",
+ "com_sun_star_comp_svx_CTLToolBoxControl_get_implementation",
+ "com_sun_star_comp_svx_LineSpacingToolBoxControl_get_implementation",
+ "com_sun_star_comp_svx_NumberingToolBoxControl_get_implementation",
+ "com_sun_star_comp_svx_SmartTagMenuController_get_implementation",
+ "com_sun_star_comp_svx_UnderlineToolBoxControl_get_implementation",
+ "com_sun_star_drawing_EnhancedCustomShapeEngine_get_implementation",
+ "com_sun_star_drawing_SvxShapeCollection_get_implementation",
+ "com_sun_star_svx_FontHeightToolBoxController_get_implementation",
+ "org_apache_openoffice_comp_svx_sidebar_PanelFactory_get_implementation",
+# svx/util/svxcore.component
+ "com_sun_star_comp_graphic_PrimitiveFactory2D_get_implementation",
+ "com_sun_star_comp_Draw_GraphicExporter_get_implementation",
+ "com_sun_star_comp_svx_ColorToolBoxControl_get_implementation",
+ "com_sun_star_comp_svx_FontNameToolBoxControl_get_implementation",
+ "com_sun_star_comp_svx_FrameToolBoxControl_get_implementation",
+ "com_sun_star_comp_Svx_GraphicExportHelper_get_implementation",
+ "com_sun_star_comp_Svx_GraphicImportHelper_get_implementation",
+ "com_sun_star_comp_svx_LineEndToolBoxControl_get_implementation",
+ "com_sun_star_comp_svx_LineStyleToolBoxControl_get_implementation",
+ "com_sun_star_comp_svx_StyleToolBoxControl_get_implementation",
+ "com_sun_star_comp_svx_StylesPreviewToolBoxControl_get_implementation",
+# toolkit/util/tk.component
+ "com_sun_star_comp_embed_HatchWindowFactory_get_implementation",
+ "stardiv_Toolkit_StdTabController_get_implementation",
+ "stardiv_Toolkit_UnoButtonControl_get_implementation",
+ "stardiv_Toolkit_UnoCheckBoxControl_get_implementation",
+ "stardiv_Toolkit_UnoComboBoxControl_get_implementation",
+ "stardiv_Toolkit_UnoControlButtonModel_get_implementation",
+ "stardiv_Toolkit_UnoControlCheckBoxModel_get_implementation",
+ "stardiv_Toolkit_UnoControlComboBoxModel_get_implementation",
+ "stardiv_Toolkit_UnoControlContainer_get_implementation",
+ "stardiv_Toolkit_UnoControlContainerModel_get_implementation",
+ "stardiv_Toolkit_UnoControlDateFieldModel_get_implementation",
+ "stardiv_Toolkit_UnoControlDialogModel_get_implementation",
+ "stardiv_Toolkit_UnoControlFixedTextModel_get_implementation",
+ "stardiv_Toolkit_UnoControlFormattedFieldModel_get_implementation",
+ "stardiv_Toolkit_UnoControlGroupBoxModel_get_implementation",
+ "stardiv_Toolkit_UnoControlListBoxModel_get_implementation",
+ "stardiv_Toolkit_UnoControlNumericFieldModel_get_implementation",
+ "stardiv_Toolkit_UnoControlRadioButtonModel_get_implementation",
+ "stardiv_Toolkit_UnoControlScrollBarModel_get_implementation",
+ "stardiv_Toolkit_UnoDateFieldControl_get_implementation",
+ "stardiv_Toolkit_UnoGroupBoxControl_get_implementation",
+ "stardiv_Toolkit_UnoListBoxControl_get_implementation",
+ "stardiv_Toolkit_UnoNumericFieldControl_get_implementation",
+ "stardiv_Toolkit_UnoRadioButtonControl_get_implementation",
+ "stardiv_Toolkit_UnoSpinButtonModel_get_implementation",
+ "stardiv_Toolkit_VCLXPointer_get_implementation",
+ "stardiv_Toolkit_VCLXPopupMenu_get_implementation",
+ "stardiv_Toolkit_VCLXToolkit_get_implementation",
+# ucb/source/core/ucb1.component
+ "ucb_UcbCommandEnvironment_get_implementation",
+ "ucb_UcbContentProviderProxyFactory_get_implementation",
+ "ucb_UcbPropertiesManager_get_implementation",
+ "ucb_UcbStore_get_implementation",
+ "ucb_UniversalContentBroker_get_implementation",
+ "ucb_OFileAccess_get_implementation",
+# ucb/source/ucp/file/ucpfile1.component
+ "ucb_file_FileProvider_get_implementation",
+# ucb/source/ucp/expand/ucpexpand1.component
+ ("ucb_expand_ExpandContentProviderImpl_get_implementation", "#ifdef ANDROID"),
+# ucb/source/sorter/srtrs1.component
+ "ucb_SortedDynamicResultSetFactory_get_implementation",
+# ucb/source/tdoc/ucptdoc1.component
+ "ucb_tdoc_ContentProvider_get_implementation",
+ "ucb_tdoc_DocumentContentFactory_get_implementation",
+# ucb/source/ucp/ucphier1.component
+ "ucb_HierarchyContentProvider_get_implementation",
+ "ucb_HierarchyDataSource_get_implementation",
+# ucb/source/ucp/package/ucppkg1
+ "ucb_package_ContentProvider_get_implementation",
+# unotools/util/utl.component
+ "unotools_ServiceDocument_get_implementation",
+ "unotools_OTempFileService_get_implementation",
+# unoxml/source/rdf/unordf.component
+ "unoxml_rdfRepository_get_implementation",
+ "unoxml_CURI_get_implementation",
+ "unoxml_CLiteral_get_implementation",
+ "unoxml_CBlankNode_get_implementation",
+# unoxml/source/service/unoxml.component
+ "unoxml_CXPathAPI_get_implementation",
+ "unoxml_CSAXDocumentBuilder_get_implementation",
+ "unoxml_CDocumentBuilder_get_implementation",
+# uui/util/uui.component
+ "com_sun_star_comp_uui_UUIInteractionHandler_get_implementation",
+ "com_sun_star_comp_uui_UUIInteractionRequestStringResolver_get_implementation",
+# vcl/*.component
+ "dtrans_CMimeContentTypeFactory_get_implementation",
+ "vcl_SystemClipboard_get_implementation",
+# xmloff/source/transform/xof.component
+ "xmloff_XMLCalcContentImportOOO_get_implementation",
+ "xmloff_XMLCalcImportOOO_get_implementation",
+ "xmloff_XMLCalcMetaImportOOO_get_implementation",
+ "xmloff_XMLCalcSettingsImportOOO_get_implementation",
+ "xmloff_XMLCalcStylesImportOOO_get_implementation",
+ "xmloff_XMLChartContentImportOOO_get_implementation",
+ "xmloff_XMLChartImportOOO_get_implementation",
+ "xmloff_XMLChartStylesImportOOO_get_implementation",
+ "xmloff_XMLDrawContentImportOOO_get_implementation",
+ "xmloff_XMLDrawImportOOO_get_implementation",
+ "xmloff_XMLDrawMetaImportOOO_get_implementation",
+ "xmloff_XMLDrawSettingsImportOOO_get_implementation",
+ "xmloff_XMLDrawStylesImportOOO_get_implementation",
+ "xmloff_XMLImpressContentImportOOO_get_implementation",
+ "xmloff_XMLImpressImportOOO_get_implementation",
+ "xmloff_XMLImpressMetaImportOOO_get_implementation",
+ "xmloff_XMLImpressSettingsImportOOO_get_implementation",
+ "xmloff_XMLImpressStylesImportOOO_get_implementation",
+ "xmloff_XMLMathMetaImportOOO_get_implementation",
+ "xmloff_XMLMathSettingsImportOOO_get_implementation",
+ "xmloff_OOo2OasisTransformer_get_implementation",
+ "xmloff_Oasis2OOoTransformer_get_implementation",
+ "xmloff_XMLAutoTextEventImportOOO_get_implementation",
+ "xmloff_XMLWriterContentImportOOO_get_implementation",
+ "xmloff_XMLWriterImportOOO_get_implementation",
+ "xmloff_XMLWriterMetaImportOOO_get_implementation",
+ "xmloff_XMLWriterSettingsImportOOO_get_implementation",
+ "xmloff_XMLWriterStylesImportOOO_get_implementation",
+ "xmloff_XMLMetaImportOOO_get_implementation",
+# xmloff/util/xo.component
+ "XMLMetaExportComponent_get_implementation",
+ "XMLMetaExportOOo_get_implementation",
+ "XMLMetaImportComponent_get_implementation",
+ "XMLVersionListPersistence_get_implementation",
+ "com_sun_star_comp_Impress_XMLOasisImporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLOasisExporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLOasisStylesExporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLOasisContentExporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLOasisMetaExporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLOasisMetaImporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLOasisContentImporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLOasisStylesImporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLOasisSettingsExporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLOasisSettingsImporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLExporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLExporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLOasisSettingsExporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLOasisMetaExporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLOasisContentExporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLOasisStylesExporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLOasisExporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLOasisImporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLOasisStylesImporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLOasisContentImporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLOasisMetaImporter_get_implementation",
+ "com_sun_star_comp_Draw_XMLOasisSettingsImporter_get_implementation",
+ "com_sun_star_comp_Xmloff_AnimationsImport",
+ "com_sun_star_comp_DrawingLayer_XMLExporter_get_implementation",
+ "com_sun_star_comp_Impress_XMLClipboardExporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLOasisImporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLOasisMetaImporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLOasisMetaExporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLOasisStylesExporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLOasisContentExporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLExporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLStylesExporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLContentExporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLOasisStylesImporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLOasisContentImporter_get_implementation",
+ "com_sun_star_comp_Chart_XMLOasisExporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisAutotextEventsExporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLAutotextEventsExporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisAutotextEventsImporter_get_implementation",
+# xmlscript/util/xmlscript.component
+ "com_sun_star_comp_xml_input_SaxDocumentHandler_get_implementation",
+ "com_sun_star_comp_xmlscript_XMLBasicExporter",
+ "com_sun_star_comp_xmlscript_XMLOasisBasicExporter",
+# xmlsecurity/util/xmlsecurity.component
+ ("com_sun_star_security_CertificateContainer_get_implementation", "#if HAVE_FEATURE_NSS"),
+ ("com_sun_star_security_DocumentDigitalSignatures_get_implementation", "#if HAVE_FEATURE_NSS"),
+# xmlsecurity/util/xsec_xmlsec.component
+ ("com_sun_star_xml_crypto_NSSInitializer_get_implementation", "#if HAVE_FEATURE_NSS"),
+ ("com_sun_star_xml_crypto_SEInitializer_get_implementation", "#if HAVE_FEATURE_NSS"),
+ ("com_sun_star_xml_security_SEInitializer_Gpg_get_implementation", "#if HAVE_FEATURE_GPGME"),
+ ("com_sun_star_xml_crypto_SecurityEnvironment_get_implementation", "#if HAVE_FEATURE_NSS"),
+ ("com_sun_star_xml_wrapper_XMLDocumentWrapper_get_implementation", "#if HAVE_FEATURE_NSS"),
+ ("com_sun_star_xml_wrapper_XMLElementWrapper_get_implementation", "#if HAVE_FEATURE_NSS"),
+ ("com_sun_star_xml_crypto_XMLSecurityContext_get_implementation", "#if HAVE_FEATURE_NSS"),
+ ("com_sun_star_xml_crypto_XMLSignature_get_implementation", "#if HAVE_FEATURE_NSS"),
+# oox/util/oox.component
+ "com_sun_star_comp_oox_core_FastTokenHandler_get_implementation",
+ "com_sun_star_comp_oox_FormatDetector_get_implementation",
+ "com_sun_star_comp_oox_docprop_DocumentPropertiesImporter_get_implementation",
+ "com_sun_star_comp_oox_ppt_PowerPointImport_get_implementation",
+ "com_sun_star_comp_oox_crypto_StrongEncryptionDataSpace_get_implementation",
+ ]
+
+# edit group for apps, where you can edit documents
+edit_factory_list = [
+ ]
+
+edit_constructor_list = [
+# framework/util/fwk.component
+ "com_sun_star_comp_framework_GlobalAcceleratorConfiguration_get_implementation",
+ "com_sun_star_comp_framework_UICommandDescription_get_implementation",
+# i18npool/util/i18npool.component
+ "com_sun_star_i18n_InputSequenceChecker_get_implementation",
+ "com_sun_star_i18n_OrdinalSuffix_get_implementation",
+# sc/util/sc.component
+ "Calc_XMLOasisContentExporter_get_implementation",
+ "Calc_XMLOasisExporter_get_implementation",
+ "Calc_XMLOasisMetaExporter_get_implementation",
+ "Calc_XMLOasisSettingsExporter_get_implementation",
+ "Calc_XMLOasisStylesExporter_get_implementation",
+ "Calc_FilterOptionsDialog_get_implementation",
+# starmath/util/sm.component
+ "Math_XMLContentExporter_get_implementation",
+ "Math_XMLOasisMetaExporter_get_implementation",
+ "Math_XMLOasisSettingsExporter_get_implementation",
+ "Math_XMLImporter_get_implementation",
+ "Math_XMLOasisMetaImporter_get_implementation",
+ "Math_XMLOasisSettingsImporter_get_implementation",
+# starmath/util/smd.component
+ "math_FormatDetector_get_implementation",
+# sw/util/sw.component
+ "com_sun_star_comp_Writer_XMLOasisContentExporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisExporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisMetaExporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisSettingsExporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisStylesExporter_get_implementation",
+ "com_sun_star_comp_Writer_WriterModule_get_implementation",
+ "org_apache_openoffice_comp_sw_sidebar_SwPanelFactory_get_implementation",
+ ]
+
+# math
+math_factory_list = [
+ ]
+
+math_constructor_list = [
+# starmath/util/sm.component
+ "Math_XMLOasisMetaExporter_get_implementation",
+ "Math_XMLOasisSettingsExporter_get_implementation",
+ ]
+
+calc_factory_list = [
+ ]
+
+calc_constructor_list = [
+# avmedia/util/avmedia.component
+ ("com_sun_star_comp_framework_SoundHandler_get_implementation", "#if HAVE_FEATURE_AVMEDIA"),
+# sc/util/sc.component
+ "ScPanelFactory_get_implementation",
+ "Calc_SpreadsheetDocument_get_implementation",
+ "Calc_XMLOasisContentImporter_get_implementation",
+ "Calc_XMLOasisImporter_get_implementation",
+ "Calc_XMLOasisMetaImporter_get_implementation",
+ "Calc_XMLOasisSettingsImporter_get_implementation",
+ "Calc_XMLOasisStylesImporter_get_implementation",
+ "Calc_ScSpreadsheetSettings_get_implementation",
+# sc/util/scd.component
+ "com_sun_star_comp_calc_ExcelBiffFormatDetector_get_implementation",
+ "com_sun_star_comp_calc_FormatDetector_get_implementation",
+# sc/util/scfilt.component
+ "com_sun_star_comp_oox_xls_ExcelFilter_get_implementation",
+ "com_sun_star_comp_oox_xls_FormulaParser_get_implementation",
+# sc/util/vbaobj.component
+ ("Calc_ScVbaApplication_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("ScVbaEventsHelper_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("ScVbaGlobals_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("Calc_ScVbaHyperlink_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("ScVbaTextFrame_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("Calc_ScVbaWindow_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("Calc_ScVbaWorkbook_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("Calc_ScVbaWorksheet_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("Calc_ScVbaRange_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+# scaddins/source/analysis/analysis.component
+ "scaddins_AnalysisAddIn_get_implementation",
+# scaddins/source/datefunc/date.component
+ "scaddins_ScaDateAddIn_get_implementation",
+# scaddins/source/pricing/pricing.component
+ "scaddins_ScaPricingAddIn_get_implementation",
+# scripting/source/vbaevents/vbaevents.component
+ ("ooo_vba_VBAToOOEventDesc_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+# svl/util/svl.component
+ "com_sun_star_uno_util_numbers_SvNumberFormatsSupplierServiceObject_get_implementation",
+ "com_sun_star_uno_util_numbers_SvNumberFormatterServiceObject_get_implementation",
+# scripting/source/vbaevents/vbaevents.component
+ ("ooo_vba_VBAToOOEventDesc_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ("ooo_vba_EventListener_get_implementation", "#if HAVE_FEATURE_SCRIPTING"),
+ ]
+
+draw_factory_list = [
+ ]
+
+draw_constructor_list = [
+# animations/source/animcore/animcore.component
+ "com_sun_star_animations_AnimateColor_get_implementation",
+ "com_sun_star_animations_AnimateMotion_get_implementation",
+ "com_sun_star_animations_AnimateSet_get_implementation",
+ "com_sun_star_animations_AnimateTransform_get_implementation",
+ "com_sun_star_animations_Animate_get_implementation",
+ "com_sun_star_animations_Audio_get_implementation",
+ "com_sun_star_animations_Command_get_implementation",
+ "com_sun_star_animations_IterateContainer_get_implementation",
+ "com_sun_star_animations_ParallelTimeContainer_get_implementation",
+ "com_sun_star_animations_SequenceTimeContainer_get_implementation",
+ "com_sun_star_animations_TransitionFilter_get_implementation",
+# desktop/source/deployment/deployment.component
+ "com_sun_star_comp_deployment_ExtensionManager_get_implementation",
+ "com_sun_star_comp_deployment_PackageInformationProvider_get_implementation",
+ "com_sun_star_comp_deployment_PackageManagerFactory_get_implementation",
+ "com_sun_star_comp_deployment_ProgressLog_get_implementation",
+ "com_sun_star_comp_deployment_component_PackageRegistryBackend_get_implementation",
+ "com_sun_star_comp_deployment_configuration_PackageRegistryBackend_get_implementation",
+ "com_sun_star_comp_deployment_executable_PackageRegistryBackend_get_implementation",
+ "com_sun_star_comp_deployment_help_PackageRegistryBackend_get_implementation",
+ "com_sun_star_comp_deployment_script_PackageRegistryBackend_get_implementation",
+ "com_sun_star_comp_deployment_sfwk_PackageRegistryBackend_get_implementation",
+# embedded/source/msole/emboleobj.windows.component
+ "embeddedobj_OleEmbeddedObjectFactory_get_implementation",
+# filter/source/svg/svgfilter.component
+ "filter_SVGFilter_get_implementation",
+ "filter_SVGWriter_get_implementation",
+# sd/util/sd.component
+ "sd_DrawingDocument_get_implementation",
+ "com_sun_star_comp_Draw_DrawingModule_get_implementation",
+ "sd_PresentationDocument_get_implementation",
+ "com_sun_star_comp_Draw_PresenterHelper_get_implementation",
+ "com_sun_star_comp_Draw_PresenterPreviewCache_get_implementation",
+ "com_sun_star_comp_Draw_PresenterTextView_get_implementation",
+ "com_sun_star_comp_Draw_SlideRenderer_get_implementation",
+ "com_sun_star_comp_Draw_SlideSorter_get_implementation",
+ "com_sun_star_comp_Draw_framework_configuration_Configuration_get_implementation",
+ "com_sun_star_comp_draw_SdHtmlOptionsDialog_get_implementation",
+ "com_sun_star_comp_sd_InsertSlideController_get_implementation",
+ "com_sun_star_comp_sd_SlideLayoutController_get_implementation",
+ "com_sun_star_comp_sd_DisplayModeController_get_implementation",
+ "RandomAnimationNode_get_implementation",
+ "com_sun_star_comp_Draw_framework_BasicPaneFactory_get_implementation",
+ "com_sun_star_comp_Draw_framework_BasicToolBarFactory_get_implementation",
+ "com_sun_star_comp_Draw_framework_BasicViewFactory_get_implementation",
+ "com_sun_star_comp_Draw_framework_PresentationFactoryProvider_get_implementation",
+ "com_sun_star_comp_Draw_framework_ResourceID_get_implementation",
+ "com_sun_star_comp_Draw_framework_configuration_ConfigurationController_get_implementation",
+ "com_sun_star_comp_Draw_framework_module_ModuleController_get_implementation",
+ "org_openoffice_comp_Draw_framework_PanelFactory_get_implementation",
+# sd/util/sdd.component
+ "com_sun_star_comp_draw_FormatDetector_get_implementation",
+# sd/util/sdfilt.component
+ "css_comp_Impress_oox_PowerPointExport",
+# writerperfect/source/draw/wpftdraw.component
+ "com_sun_star_comp_Draw_VisioImportFilter_get_implementation",
+# sdext/source/pdfimport/pdfimport.component
+ ("sdext_PDFIHybridAdaptor_get_implementation", "#if HAVE_FEATURE_PDFIMPORT"),
+ ("sdext_PDFIRawAdaptor_Writer_get_implementation", "#if HAVE_FEATURE_PDFIMPORT"),
+ ("sdext_PDFIRawAdaptor_Draw_get_implementation", "#if HAVE_FEATURE_PDFIMPORT"),
+ ("sdext_PDFIRawAdaptor_Impress_get_implementation", "#if HAVE_FEATURE_PDFIMPORT"),
+ ("sdext_PDFDetector_get_implementation", "#if HAVE_FEATURE_PDFIMPORT"),
+ ]
+
+writer_factory_list = [
+ ]
+
+writer_constructor_list = [
+# filter/source/textfilterdetect/textfd.component
+ "com_sun_star_comp_filters_PlainTextFilterDetect_get_implementation",
+# sw/util/sw.component
+ "Writer_SwTextDocument_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisContentImporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisImporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisMetaImporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisSettingsImporter_get_implementation",
+ "com_sun_star_comp_Writer_XMLOasisStylesImporter_get_implementation",
+ "com_sun_star_util_comp_FinalThreadManager_get_implementation",
+# sw/util/swd.component
+ "com_sun_star_comp_writer_FormatDetector_get_implementation",
+# sw/util/msword.component
+ "com_sun_star_comp_Writer_RtfExport_get_implementation",
+ "com_sun_star_comp_Writer_DocxExport_get_implementation",
+# writerfilter/util/writerfilter.component
+ "com_sun_star_comp_Writer_RtfFilter_get_implementation",
+ "com_sun_star_comp_Writer_WriterFilter_get_implementation",
+# writerperfect/source/writer/wpftwriter.component
+ "com_sun_star_comp_Writer_EPUBExportFilter_get_implementation",
+ ]
+
+factory_map = {
+ 'core' : core_factory_list,
+ 'edit' : edit_factory_list,
+ 'math' : math_factory_list,
+ 'calc' : calc_factory_list,
+ 'draw' : draw_factory_list,
+ 'writer' : writer_factory_list,
+ }
+
+constructor_map = {
+ 'core' : core_constructor_list,
+ 'edit' : edit_constructor_list,
+ 'math' : math_constructor_list,
+ 'calc' : calc_constructor_list,
+ 'draw' : draw_constructor_list,
+ 'writer' : writer_constructor_list,
+ }
+
+custom_widgets = [
+ 'NotebookbarTabControl',
+ 'NotebookbarToolBox',
+ ]
+
+def get_constructor_guard(constructor):
+ if type(full_constructor_map[constructor]) is bool:
+ return None
+ else:
+ return full_constructor_map[constructor]
+
+# instead of outputting native-code.cxx, reduce the services.rdb according to
+# the constraints, so that we can easily emulate what services do we need to
+# add for a fully functional file loading / saving / ...
+def limit_rdb(services_rdb, full_factory_map, full_constructor_map):
+ ET.register_namespace('','http://openoffice.org/2010/uno-components')
+ tree = ET.parse(services_rdb[0])
+ root = tree.getroot()
+
+ for component in root.findall('{http://openoffice.org/2010/uno-components}component'):
+ # direct
+ uri = component.get('uri')
+ component_name = None
+ if uri != None:
+ component_name = re.sub(r'^vnd.sun.star.expand:\$LO_LIB_DIR/([^.]*).so$', r'\1.a', uri)
+ if component_name in full_factory_map:
+ continue
+
+ # via a constructor - limit only to those we have
+ has_constructor = False
+ for implementation in component.findall('{http://openoffice.org/2010/uno-components}implementation'):
+ constructor = implementation.get('constructor')
+ if constructor in full_constructor_map:
+ has_constructor = True
+ else:
+ component.remove(implementation)
+
+ if not has_constructor:
+ root.remove(component)
+
+ tree.write(services_rdb[0] + '.out', xml_declaration = True, method = 'xml')
+
+
+# do the actual work
+opts = OptionParser()
+opts.add_option("-j", "--java-guard", action="store_true", help="include external java functions", dest="java", default=False)
+opts.add_option("-g", "--group", action="append", help="group of implementations to make available in application", dest="groups")
+opts.add_option("-r", "--limit-rdb", action="append", help="instead of outputting native-code.cxx, limit the services.rdb only to the services defined by the groups", dest="services")
+opts.add_option("-C", "--pure-c", action="store_true", help="do not print extern \"C\"", dest="pure_c", default=False)
+opts.add_option("-c", "--constructors", help="file with the list of constructors", dest="constructors_file")
+
+(options, args) = opts.parse_args()
+
+# dict of all the constructors that we need according to -g's
+full_constructor_map = {}
+if options.groups:
+ for constructor_group in options.groups:
+ for constructor in constructor_map[constructor_group]:
+ if type(constructor) is tuple:
+ full_constructor_map[constructor[0]] = constructor[1]
+ else:
+ full_constructor_map[constructor] = True
+
+if not options.groups and options.constructors_file:
+ options.groups = factory_map.keys()
+
+# dict of all the factories that we need according to -g's
+full_factory_map = {}
+if options.groups:
+ for factory_group in options.groups:
+ for entry in factory_map[factory_group]:
+ factory_guard = None
+ if len(entry) > 2:
+ factory_guard = entry[2]
+ map_entry = { 'function': entry[1], 'guard': factory_guard }
+ full_factory_map[entry[0]] = map_entry
+
+# are we only shuffling the services.rdb?
+if options.services:
+ limit_rdb(options.services, full_factory_map, full_constructor_map)
+ exit(0)
+
+if options.constructors_file:
+ with open(options.constructors_file, "r") as constructors:
+ for line in constructors:
+ full_constructor_map[line.strip()] = True
+
+print ("""/*
+ * This is a generated file. Do not edit.
+ *
+ * File generated by solenv/bin/native-code.py
+ */
+
+#include <config_crypto.h>
+#include <config_features.h>
+#include <config_fuzzers.h>
+#include <config_gpgme.h>
+#include <config_locales.h>
+#include <osl/detail/component-mapping.h>
+#include <string.h>
+
+""")
+if not options.pure_c:
+ print ("""extern "C" {""")
+
+for entry in sorted(full_factory_map.keys()):
+ factory_function = full_factory_map[entry]['function']
+ factory_guard = full_factory_map[entry]['guard']
+ if factory_guard:
+ print (factory_guard)
+ print('void * ' + factory_function + '( const char* , void* , void* );')
+ if factory_guard:
+ print ('#endif')
+
+print ('')
+for constructor in sorted(full_constructor_map.keys()):
+ constructor_guard = get_constructor_guard(constructor)
+ if constructor_guard:
+ print (constructor_guard)
+ print ('void * '+constructor+'( void *, void * );')
+ if constructor_guard:
+ print ('#endif')
+
+print ('')
+for entry in sorted(custom_widgets):
+ print ('void make' + entry + '();')
+print ('typedef void (*custom_widget_func)();')
+print ('#if !ENABLE_FUZZERS')
+print ('static struct { const char *name; custom_widget_func func; } custom_widgets[] = {')
+for entry in sorted(custom_widgets):
+ print (' { "make' + entry + '", make' + entry + ' },')
+print ('};')
+print ('#endif')
+print ('')
+print ("""
+custom_widget_func lo_get_custom_widget_func(const char* name)
+{
+#if ENABLE_FUZZERS
+ (void)name;
+ return nullptr;
+#else
+ for (size_t i = 0; i < sizeof(custom_widgets) / sizeof(custom_widgets[0]); i++)
+ if (strcmp(name, custom_widgets[i].name) == 0)
+ return custom_widgets[i].func;
+ return nullptr;
+#endif
+}
+""")
+
+print ("""
+const lib_to_factory_mapping *
+lo_get_factory_map(void)
+{
+ static lib_to_factory_mapping map[] = {""")
+
+for entry in sorted(full_factory_map.keys()):
+ factory_function = full_factory_map[entry]['function']
+ factory_guard = full_factory_map[entry]['guard']
+ if factory_guard:
+ print (factory_guard)
+ print(' { "' + entry + '", ' + factory_function + ' },')
+ if factory_guard:
+ print ('#endif')
+
+print ("""
+ { 0, 0 }
+ };""")
+
+if options.java:
+ print ("""
+ extern void Java_org_libreoffice_kit_LibreOfficeKit_initializeNative();
+ volatile void *p = (void *) Java_org_libreoffice_kit_LibreOfficeKit_initializeNative;
+
+ extern void Java_org_libreoffice_kit_Office_getError();
+ p = (void *) Java_org_libreoffice_kit_Office_getError;
+
+ """)
+
+print ("""
+ return map;
+}
+
+const lib_to_constructor_mapping *
+lo_get_constructor_map(void)
+{
+ static lib_to_constructor_mapping map[] = {""")
+
+for constructor in sorted(full_constructor_map.keys()):
+ constructor_guard = get_constructor_guard(constructor)
+ if constructor_guard:
+ print (constructor_guard)
+ print (' { "' +constructor+ '", ' +constructor+ ' },')
+ if constructor_guard:
+ print ('#endif')
+
+print ("""
+ { 0, 0 }
+ };
+
+ return map;
+}
+
+""")
+if not options.pure_c:
+ print("""}""")
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/bin/ooinstall b/solenv/bin/ooinstall
new file mode 100755
index 000000000..efb1f28de
--- /dev/null
+++ b/solenv/bin/ooinstall
@@ -0,0 +1,115 @@
+#!/usr/bin/env perl
+#
+# 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 script has three uses:
+# 1. From the command line to install straight into a given directory:
+# bin/ooinstall /opt/Foo
+# 2. From the command line to link into a given directory:
+# bin/ooinstall -l /opt/FooLinked
+# 3. When packaging (called from package-ooo), to install to DESTDIR
+
+use File::Find;
+use File::Path qw(mkpath);
+use Cwd;
+
+$path = '';
+$strip = '';
+$is_windows = 0;
+my $tmp_dir;
+
+# FIXME: really we should hunt and parse / source the config_host.mk magic I guess.
+die "You need your environment setup right, eg. run make cmd cmd='ooinstall /path/to/install'" if (!defined $ENV{SRC_ROOT});
+
+if ($ENV{OS} eq 'WNT') {
+ $is_windows = 1;
+}
+
+if (defined($ENV{TMPDIR})) {
+ $tmp_dir = $ENV{TMPDIR};
+}
+if (!-d $tmp_dir) {die "Set TMPDIR!\n";}
+
+for $arg (@ARGV) {
+ if ($arg eq '-s' || $arg eq '--strip') {
+ $strip = "-strip";
+ } elsif ($arg eq '-h' || $arg eq '--help') {
+ $help = 1;
+ } else {
+ # Cwd::realpath does not work if the path does not exist
+ mkpath($ENV{DESTDIR} . $arg) unless -d $ENV{DESTDIR} . $arg;
+ $path = Cwd::realpath($ENV{DESTDIR} . $arg);
+ }
+}
+
+$help = 1 if $path eq '';
+
+if ($help) {
+ print "ooinstall [-s] <prefix to install to>\n";
+ print " -s/--strip - strip the installed binaries\n";
+ exit 1;
+}
+
+my $BUILD=$ENV{LIBO_VERSION_PATCH};
+$ENV{OUT} = "../FIXME";
+$ENV{LOCAL_OUT} = $ENV{OUT};
+$ENV{LOCAL_COMMON_OUT} = $ENV{OUT};
+
+my @larr;
+$langs=$ENV{WITH_LANG_LIST};
+@larr = grep { $_ ne '' } split(/ /, $langs);
+$langs = join (",", @larr);
+
+$destdir='';
+if (defined $ENV{DESTDIR} &&
+ $ENV{DESTDIR} ne "" ) {
+ $destdir = "-destdir \"$ENV{DESTDIR}\"";
+}
+
+$msi='';
+if ($is_windows) {
+ $msi = "-msitemplate $ENV{SRC_ROOT}/workdir/CustomTarget/instsetoo_native/install/msi_templates " .
+ "-msilanguage $ENV{SRC_ROOT}/workdir/CustomTarget/instsetoo_native/install/win_ulffiles";
+}
+
+# FIXME: a better solution would be to fix installer to deal with broken symlinks
+# make distro-pack-install shuffle with the SDK installation to make it LSB compliant
+# it creates symlinks from the original path to /usr/share; they are not valid with $DESTDIR
+# and potential second ooinstall call fails with strange error messages if the old tree is still there
+if ($destdir && "$ENV{DESTDIR}" ne "/" && -d "$ENV{DESTDIR}") {
+ print "Cleaning destdir...\n";
+ system ("rm -rf \"$ENV{DESTDIR}\"") && die "Failed to clean up destdir: $!";
+}
+
+print "Running LibreOffice installer\n";
+
+system ("cd $ENV{SRC_ROOT}/instsetoo_native/util ; " .
+ "perl " .
+ (scalar keys(%DB::sub) ? "-d " : "") .
+ "-w $ENV{SRCDIR}/solenv/bin/make_installer.pl " .
+ "-f $ENV{BUILDDIR}/instsetoo_native/util/openoffice.lst -l $langs -p LibreOffice " .
+ "-u $tmp_dir " .
+ "-buildid $BUILD $destdir $strip $msi " .
+ "-simple $path") && die "Failed to install: $!";
+
+if ($ENV{BUILD_TYPE} =~ m/ODK/) {
+ print "Running SDK installer\n";
+ system ("cd $ENV{SRC_ROOT}/instsetoo_native/util ; " .
+ "perl -w $ENV{SRCDIR}/solenv/bin/make_installer.pl " .
+ "-f $ENV{BUILDDIR}/instsetoo_native/util/openoffice.lst -l en-US -p LibreOffice_SDK " .
+ "-u $tmp_dir " .
+ "-buildid $BUILD $destdir $strip $msi " .
+ "-simple $path") && die "Failed to install: $!";
+}
+print "Installer finished\n";
+
+# Local Variables:
+# cperl-indent-level: 4
+# indent-tabs-mode: nil
+# End:
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/bin/optionalimplementations.xslt b/solenv/bin/optionalimplementations.xslt
new file mode 100644
index 000000000..fa8ca5b1c
--- /dev/null
+++ b/solenv/bin/optionalimplementations.xslt
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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 "misuses" xsl:message to dump all optional components
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns="http://openoffice.org/2010/uno-components"
+ xmlns:uc="http://openoffice.org/2010/uno-components">
+<xsl:template match="uc:component">
+ <xsl:for-each select="uc:implementation">
+ <xsl:if test="uc:optional">
+ <xsl:message><xsl:value-of select="@name"/></xsl:message>
+ </xsl:if>
+ </xsl:for-each>
+</xsl:template>
+</xsl:stylesheet>
diff --git a/solenv/bin/pack_images.py b/solenv/bin/pack_images.py
new file mode 100644
index 000000000..5ccc194e6
--- /dev/null
+++ b/solenv/bin/pack_images.py
@@ -0,0 +1,612 @@
+# -*- coding: utf-8 -*-
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+""" Pack images into archives. """
+
+from __future__ import with_statement
+
+import argparse
+from collections import OrderedDict
+import contextlib
+import logging
+import os
+import shutil
+import sys
+import tempfile
+import zipfile
+
+
+logging.basicConfig(format='%(message)s')
+LOGGER = logging.getLogger()
+
+
+def main(args):
+ """ Main function. """
+
+ tmp_output_file = "%s.%d.tmp" % (args.output_file, os.getpid())
+
+ # Sanity checks
+ if not os.path.exists(args.imagelist_file):
+ LOGGER.error("imagelist_file '%s' doesn't exists", args.imagelist_file)
+ sys.exit(2)
+
+ if args.links_file is not None and not os.path.exists(args.links_file):
+ LOGGER.error("link_file '%s' doesn't exists", args.links_file)
+ sys.exit(2)
+
+ out_path = os.path.dirname(args.output_file)
+ for path in (out_path, args.global_path, args.module_path):
+ if not os.path.exists(path):
+ LOGGER.error("Path '%s' doesn't exists", path)
+ sys.exit(2)
+ if not os.access(path, os.X_OK):
+ LOGGER.error("Unable to search path %s", path)
+ sys.exit(2)
+
+ if not os.access(out_path, os.W_OK):
+ LOGGER.error("Unable to write into path %s", out_path)
+
+ custom_paths = []
+ for path in args.custom_path:
+ if not os.path.exists(path):
+ LOGGER.warning("Skipping non-existing path: %s", path)
+ continue
+ elif not os.access(path, os.X_OK):
+ LOGGER.error("Unable to search path %s", path)
+ sys.exit(2)
+
+ custom_paths.append(path)
+
+ imagelist_filenames = get_imagelist_filenames(args.imagelist_file)
+ global_image_list, module_image_list = parse_image_list(imagelist_filenames)
+ custom_image_list = find_custom(custom_paths)
+
+ links = {}
+ if args.links_file is not None:
+ read_links(links, args.links_file)
+ else:
+ read_links(links, os.path.join(ARGS.global_path, "links.txt"))
+ for path in custom_paths:
+ read_links(links, os.path.join(path, "links.txt"))
+ check_links(links)
+
+ zip_list = create_zip_list(global_image_list, module_image_list, custom_image_list,
+ args.global_path, args.module_path)
+ remove_links_from_zip_list(zip_list, links)
+
+ if check_rebuild(args.output_file, imagelist_filenames, custom_paths, zip_list, args.links_file):
+ tmp_dir = copy_images(zip_list)
+ create_zip_archive(zip_list, links, tmp_dir, tmp_output_file, args.sort_file)
+
+ replace_zip_file(tmp_output_file, args.output_file)
+ try:
+ LOGGER.info("Remove temporary directory %s", tmp_dir)
+ shutil.rmtree(tmp_dir)
+ except Exception as e:
+ LOGGER.error("Unable to remove temporary directory %s", tmp_dir)
+ sys.exit(2)
+ else:
+ LOGGER.info("No rebuild needed. %s is up to date.", args.output_file)
+
+
+def check_rebuild(zip_file, imagelist_filenames, custom_paths, zip_list, links_file):
+ """ Check if a rebuild is needed.
+
+ :type zip_file: str
+ :param zip_file: File to check against (use st_mtime).
+
+ :type imagelist_filenames: dict
+ :param imagelist_filenames: List of imagelist filename.
+
+ :type custom_paths: list
+ :param custom_paths: List of paths to use with links.txt files.
+
+ :type zip_list: dict
+ :param zip_list: List of filenames to create the zip archive.
+
+ :type links_file: str
+ :param links_file: filename to read the links from
+
+ :rtype: bool
+ :return: True if rebuild is needed and False if not.
+ """
+
+ if not os.path.exists(zip_file):
+ return True
+
+ zip_file_stat = os.stat(zip_file)
+
+ def compare_modtime(filenames):
+ """ Check if modification time of zip archive is older the provided
+ list of files.
+
+ :type filenames: dict
+ :param filenames: List of filenames to check against.
+
+ :rtype: bool
+ :return: True if zip archive is older and False if not.
+ """
+ for filename, path in filenames.items():
+ filename = os.path.join(path, filename) if filename else path
+ if os.path.exists(filename) and zip_file_stat.st_mtime < os.stat(filename).st_mtime:
+ return True
+ return False
+
+ if compare_modtime(imagelist_filenames):
+ return True
+ if compare_modtime(zip_list):
+ return True
+ if links_file is not None:
+ if zip_file_stat.st_mtime < os.stat(links_file).st_mtime:
+ return True
+ else:
+ for path in custom_paths:
+ link_file = os.path.join(path, 'links.txt')
+ if os.path.exists(link_file):
+ if zip_file_stat.st_mtime < os.stat(link_file).st_mtime:
+ return True
+
+ return False
+
+
+def replace_zip_file(src, dst):
+ """ Replace the old archive file with the newly created one.
+
+ :type src: str
+ :param src: Source file name.
+
+ :type dst: str
+ :param dst: Destination file name.
+ """
+ LOGGER.info("Replace old zip archive with new archive")
+ if os.path.exists(dst):
+ try:
+ os.unlink(dst)
+ except OSError as e:
+ if os.path.exists(src):
+ os.unlink(src)
+
+ LOGGER.error("Unable to unlink old archive '%s'", dst)
+ LOGGER.error(str(e))
+ sys.exit(1)
+
+ try:
+ LOGGER.info("Copy archive '%s' to '%s'", src, dst)
+ shutil.move(src, dst)
+ except (shutil.SameFileError, OSError) as e:
+ os.unlink(src)
+ LOGGER.error("Cannot copy file '%s' to %s: %s", src, dst, str(e))
+ sys.exit(1)
+
+
+def optimize_zip_layout(zip_list, sort_file=None):
+ """ Optimize the zip layout by ordering the list of filename alphabetically
+ or with provided sort file (can be partly).
+
+ :type zip_list: dict
+ :param zip_list: List of files to include in the zip archive.
+
+ :type sort_file: str
+ :param sort_file: Path/Filename to file with sort order.
+
+ :rtype: OrderedDict
+ :return: Dict with right sort order.
+ """
+ if sort_file is None:
+ LOGGER.info("No sort file provided")
+ LOGGER.info("Sorting entries alphabetically")
+
+ return OrderedDict(sorted(zip_list.items(), key=lambda t: t[0]))
+
+ LOGGER.info("Sort entries from file '%s'", sort_file)
+ sorted_zip_list = OrderedDict()
+ try:
+ fh = open(sort_file)
+ except IOError:
+ LOGGER.error("Cannot open file %s", sort_file)
+ sys.exit(1)
+ else:
+ with fh:
+ for line in fh:
+ line = line.strip()
+ if line == '' or line.startswith('#'):
+ continue
+
+ if line in zip_list:
+ sorted_zip_list[line] = ''
+ else:
+ LOGGER.warning("Unknown file '%s'", line)
+
+ for key in sorted(zip_list.keys()):
+ if key not in sorted_zip_list:
+ sorted_zip_list[key] = ''
+
+ return sorted_zip_list
+
+
+def create_zip_archive(zip_list, links, tmp_dir, tmp_zip_file, sort_file=None):
+ """ Create the zip archive.
+
+ :type zip_list: dict
+ :param zip_list: All filenames to be included in the archive.
+
+ :type links: dict
+ :param links: All filenames to create links.txt file.
+
+ :type tmp_dir: str
+ :param tmp_dir: Path to temporary saved files.
+
+ :type tmp_zip_file: str
+ :param tmp_zip_file: Filename/Path of temporary zip archive.
+
+ :type sort_file: str|None
+ :param sort_file: Optional filename with sort order to apply.
+ """
+ LOGGER.info("Creating image archive")
+
+ old_pwd = os.getcwd()
+ os.chdir(tmp_dir)
+
+ ordered_zip_list = optimize_zip_layout(zip_list, sort_file)
+
+ with contextlib.closing(zipfile.ZipFile(tmp_zip_file, 'w')) as tmp_zip:
+ if links.keys():
+ LOGGER.info("Add file 'links.txt' to zip archive")
+ create_links_file(tmp_dir, links)
+ tmp_zip.write('links.txt', compress_type=zipfile.ZIP_DEFLATED)
+
+ for link in ordered_zip_list:
+ LOGGER.info("Add file '%s' from path '%s' to zip archive", link, tmp_dir)
+ try:
+ if (link.endswith(".svg")):
+ tmp_zip.write(link, compress_type=zipfile.ZIP_DEFLATED)
+ else:
+ tmp_zip.write(link)
+ except OSError:
+ LOGGER.warning("Unable to add file '%s' to zip archive", link)
+
+ os.chdir(old_pwd)
+
+
+def create_links_file(path, links):
+ """ Create file links.txt. Contains all links.
+
+ :type path: str
+ :param path: Path where to create the file.
+
+ :type links: dict
+ :param links: Dict with links (source -> target).
+ """
+ LOGGER.info("Create file links.txt")
+
+ try:
+ filename = os.path.join(path, 'links.txt')
+ fh = open(filename, 'w')
+ except IOError:
+ LOGGER.error("Cannot open file %s", filename)
+ sys.exit(1)
+ else:
+ with fh:
+ for key in sorted(links.keys()):
+ fh.write("%s %s\n" % (key, links[key]))
+
+
+def copy_images(zip_list):
+ """ Create a temporary directory and copy images to that directory.
+
+ :type zip_list: dict
+ :param zip_list: Dict with all files.
+
+ :rtype: str
+ :return: Path of the temporary directory.
+ """
+ LOGGER.info("Copy image files to temporary directory")
+
+ tmp_dir = tempfile.mkdtemp()
+ for key, value in zip_list.items():
+ path = os.path.join(value, key)
+ out_path = os.path.join(tmp_dir, key)
+
+ LOGGER.debug("Copying '%s' to '%s'", path, out_path)
+ if os.path.exists(path):
+ dirname = os.path.dirname(out_path)
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+
+ try:
+ shutil.copyfile(path, out_path)
+ except (shutil.SameFileError, OSError) as e:
+ LOGGER.error("Cannot add file '%s' to image dir: %s", path, str(e))
+ sys.exit(1)
+
+ LOGGER.debug("Temporary directory '%s'", tmp_dir)
+ return tmp_dir
+
+
+def remove_links_from_zip_list(zip_list, links):
+ """ Remove any files from zip list that are linked.
+
+ :type zip_list: dict
+ :param zip_list: Files to include in the zip archive.
+
+ :type links: dict
+ :param links: Images which are linked.
+ """
+ LOGGER.info("Remove linked files from zip list")
+
+ for link in links.keys():
+ if link in zip_list:
+ module = zip_list[link]
+ del zip_list[link]
+ # tdf#135369 if we removed something that is a link to a real file
+ # from our list of images to pack, but that real image is not in
+ # the list of images to pack, add it in instead now
+ if links[link] not in zip_list:
+ zip_list[links[link]] = module
+
+ LOGGER.debug("Cleaned zip list:\n%s", "\n".join(zip_list))
+
+
+def create_zip_list(global_image_list, module_image_list, custom_image_list, global_path, module_path):
+ """ Create list of images for the zip archive.
+
+ :type global_image_list: dict
+ :param global_image_list: Global images.
+
+ :type module_image_list: dict
+ :param module_image_list: Module images.
+
+ :type custom_image_list: dict
+ :param custom_image_list: Custom images.
+
+ :type global_path: str
+ :param global_path: Global path (use when no custom path is available).
+
+ :type module_path: str
+ :param module_path: Module path (use when no custom path is available).
+
+ :rtype: dict
+ :return: List of images to include in zip archive.
+ """
+ LOGGER.info("Assemble image list")
+
+ zip_list = {}
+ duplicates = []
+
+ for key in global_image_list.keys():
+ if key in module_image_list:
+ duplicates.append(key)
+ continue
+
+ if key in custom_image_list:
+ zip_list[key] = custom_image_list[key]
+ continue
+
+ zip_list[key] = global_path
+
+ for key in module_image_list.keys():
+ if key in custom_image_list:
+ zip_list[key] = custom_image_list[key]
+ continue
+
+ zip_list[key] = module_path
+
+ if duplicates:
+ LOGGER.warning("Found duplicate entries in 'global' and 'module' list")
+ LOGGER.warning("\n".join(duplicates))
+
+ LOGGER.debug("Assembled image list:\n%s", "\n".join(zip_list))
+ return zip_list
+
+
+def check_links(links):
+ """ Check that no link points to another link.
+
+ :type links: dict
+ :param links: Links to icons
+ """
+
+ stop = False
+
+ for link, target in links.items():
+ if target in links.keys():
+ LOGGER.error("Link %s -> %s -> %s", link, target, links[target])
+ stop = True
+
+ if stop:
+ LOGGER.error("Some icons in links.txt were found to link to other linked icons")
+ sys.exit(1)
+
+
+def read_links(links, filename):
+ """ Read links from file.
+
+ :type links: dict
+ :param links: Hash to store all links
+
+ :type filename: str
+ :param filename: filename to read the links from
+ """
+
+ LOGGER.info("Read links from file '%s'", filename)
+ if not os.path.isfile(filename):
+ LOGGER.info("No file to read")
+ return
+
+ try:
+ fh = open(filename)
+ except IOError:
+ LOGGER.error("Cannot open file %s", filename)
+ sys.exit(1)
+ else:
+ with fh:
+ for line in fh:
+ line = line.strip()
+ if line == '' or line.startswith('#'):
+ continue
+
+ tmp = line.split(' ')
+ if len(tmp) == 2:
+ links[tmp[0]] = tmp[1]
+ else:
+ LOGGER.error("Malformed links line '%s' in file %s", line, filename)
+ sys.exit(1)
+
+ LOGGER.debug("Read links:\n%s", "\n".join(links))
+
+
+def find_custom(custom_paths):
+ """ Find all custom images.
+
+ :type custom_paths: list
+ :param custom_paths: List of custom paths to search within.
+
+ :rtype: dict
+ :return: List of all custom images.
+ """
+ LOGGER.info("Find all images in custom paths")
+
+ custom_image_list = {}
+ for path in custom_paths:
+ # find all png files under the path including subdirs
+ custom_files = [val for sublist in [
+ [os.path.join(i[0], j) for j in i[2]
+ if j.endswith('.png') and os.path.isfile(os.path.join(i[0], j))]
+ for i in os.walk(path)] for val in sublist]
+
+ for filename in custom_files:
+ if filename.startswith(path):
+ key = filename.replace(os.path.join(path, ''), '')
+ if key not in custom_image_list:
+ custom_image_list[key] = path
+
+ LOGGER.debug("Custom image list:\n%s", "\n".join(custom_image_list.keys()))
+ return custom_image_list
+
+
+def parse_image_list(imagelist_filenames):
+ """ Parse and extract filename from the imagelist files.
+
+ :type imagelist_filenames: list
+ :param imagelist_filenames: List of imagelist files.
+
+ :rtype: tuple
+ :return: Tuple with dicts containing the global or module image list.
+ """
+
+ global_image_list = {}
+ module_image_list = {}
+ for imagelist_filename in imagelist_filenames.keys():
+ LOGGER.info("Parsing '%s'", imagelist_filename)
+
+ try:
+ fh = open(imagelist_filename)
+ except IOError as e:
+ LOGGER.error("Cannot open imagelist file %s", imagelist_filename)
+ sys.exit(2)
+ else:
+ line_count = 0
+ with fh:
+ for line in fh:
+ line_count += 1
+ line = line.strip()
+ if line == '' or line.startswith('#'):
+ continue
+ # clean up backslashes and double slashes
+ line = line.replace('\\', '/')
+ line = line.replace('//', '/')
+
+ if line.startswith('%GLOBALRES%'):
+ key = "res/%s" % line.replace('%GLOBALRES%/', '')
+ global_image_list[key] = True
+ if key.endswith('.png'):
+ global_image_list[key[:-4] + '.svg'] = True
+ continue
+
+ if line.startswith('%MODULE%'):
+ key = line.replace('%MODULE%/', '')
+ module_image_list[key] = True
+ if key.endswith('.png'):
+ module_image_list[key[:-4] + '.svg'] = True
+ continue
+
+ LOGGER.error("Cannot parse line %s:%d", imagelist_filename, line_count)
+ sys.exit(1)
+
+ LOGGER.debug("Global image list:\n%s", "\n".join(global_image_list))
+ LOGGER.debug("Module image list:\n%s", "\n".join(module_image_list))
+ return global_image_list, module_image_list
+
+
+def get_imagelist_filenames(filename):
+ """ Extract a list of imagelist filenames.
+
+ :type filename: str
+ :param filename: Name of file from extracting the list.
+
+ :rtype: dict
+ :return: List of imagelist filenames.
+ """
+ LOGGER.info("Extract the imagelist filenames")
+
+ imagelist_filenames = {}
+ try:
+ fh = open(filename)
+ except IOError:
+ LOGGER.error("Cannot open imagelist file %s", filename)
+ sys.exit(1)
+ else:
+ with fh:
+ for line in fh:
+ line = line.strip()
+ if not line or line == '':
+ continue
+
+ for line_split in line.split(' '):
+ line_split.strip()
+ imagelist_filenames[line_split] = ''
+
+ LOGGER.debug("Extracted imagelist filenames:\n%s", "\n".join(imagelist_filenames.keys()))
+ return imagelist_filenames
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser("Pack images into archives")
+ parser.add_argument('-o', '--output-file', dest='output_file',
+ action='store', required=True,
+ help='path to output archive')
+ parser.add_argument('-l', '--imagelist-file', dest='imagelist_file',
+ action='store', required=True,
+ help='file containing list of image list file')
+ parser.add_argument('-L', '--links-file', dest='links_file',
+ action='store', required=False,
+ help='file containing linked images')
+ parser.add_argument('-s', '--sort-file', dest='sort_file',
+ action='store', required=True, default=None,
+ help='image sort order file')
+ parser.add_argument('-c', '--custom-path', dest='custom_path',
+ action='append', required=True,
+ help='path to custom path directory')
+ parser.add_argument('-g', '--global-path', dest='global_path',
+ action='store', required=True,
+ help='path to global images directory')
+ parser.add_argument('-m', '--module-path', dest='module_path',
+ action='store', required=True,
+ help='path to module images directory')
+ parser.add_argument('-v', '--verbose', dest='verbose',
+ action='count', default=0,
+ help='set the verbosity (can be used multiple times)')
+
+ ARGS = parser.parse_args()
+ LOGGER.setLevel(logging.ERROR - (10 * ARGS.verbose if ARGS.verbose <= 3 else 3))
+
+ main(ARGS)
+ sys.exit(0)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/bin/packcomponents.xslt b/solenv/bin/packcomponents.xslt
new file mode 100644
index 000000000..afe2d7d47
--- /dev/null
+++ b/solenv/bin/packcomponents.xslt
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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 .
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ exclude-result-prefixes="uc"
+ xmlns="http://openoffice.org/2010/uno-components"
+ xmlns:uc="http://openoffice.org/2010/uno-components">
+ <xsl:param name="prefix"/>
+ <xsl:strip-space elements="*"/>
+ <xsl:template match="/">
+ <xsl:element name="components"
+ namespace="http://openoffice.org/2010/uno-components">
+ <xsl:for-each select="list/filename">
+ <xsl:variable name="doc" select="document(concat($prefix, .))"/>
+ <xsl:choose>
+ <xsl:when test="count($doc/uc:components/uc:component) = 1">
+ <xsl:copy-of select="$doc/uc:components/uc:component"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>cannot process </xsl:text>
+ <xsl:value-of select="."/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/solenv/bin/packregistry.xslt b/solenv/bin/packregistry.xslt
new file mode 100644
index 000000000..9079bbc6b
--- /dev/null
+++ b/solenv/bin/packregistry.xslt
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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 .
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:oor="http://openoffice.org/2001/registry">
+ <xsl:param name="prefix"/>
+ <xsl:strip-space elements="*"/>
+ <xsl:preserve-space elements="value it"/>
+ <!-- TODO: strip space from "value" elements that have "it" children -->
+ <xsl:template match="/">
+ <oor:data xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <xsl:copy-of select="list/dependency"/>
+<!--
+ <xsl:copy-of select="document(list/filename)/oor:component-schema"/>
+ <xsl:copy-of select="document(list/filename)/oor:component-data"/>
+
+ instead of the below for-each would only issue warnings, not errors, for
+ non-existing or otherwise bad input files; it is important that the input
+ filename list is already sorted in an order suitable for the configmgr
+ (e.g., xcs files preceding xcu files).
+-->
+ <xsl:for-each select="list/filename">
+ <xsl:variable name="doc" select="document(concat($prefix, .))"/>
+ <xsl:choose>
+ <xsl:when test="count($doc/oor:component-schema) = 1">
+ <xsl:apply-templates select="$doc/oor:component-schema"/>
+ </xsl:when>
+ <xsl:when test="count($doc/oor:component-data) = 1">
+ <xsl:apply-templates select="$doc/oor:component-data"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>cannot process </xsl:text>
+ <xsl:value-of select="."/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </oor:data>
+ </xsl:template>
+ <xsl:template
+ match="oor:component-schema|oor:component-data|templates|component|group|
+ set|node-ref|prop|item|value|it|unicode|node">
+ <xsl:copy copy-namespaces="no">
+ <!-- prune oor:component-data xmlns:install="..." namespaces (would only
+ work in XSLT 2.0, however) -->
+ <xsl:apply-templates select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match="value[it]">
+ <xsl:copy copy-namespaces="no">
+ <xsl:apply-templates select="@*"/>
+ <xsl:apply-templates select="*"/>
+ <!-- ignore text elements (which must be whitespace only) -->
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match="info|import|uses|constraints"/>
+ <!-- TODO: no longer strip elements when they are eventually read by
+ configmgr implementation -->
+ <xsl:template match="@*">
+ <xsl:copy/>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/solenv/bin/par2script.pl b/solenv/bin/par2script.pl
new file mode 100644
index 000000000..000da995b
--- /dev/null
+++ b/solenv/bin/par2script.pl
@@ -0,0 +1,106 @@
+#
+# 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 lib ("$ENV{SRCDIR}/solenv/bin/modules");
+
+use Cwd;
+use par2script::check;
+use par2script::files;
+use par2script::globals;
+use par2script::parameter;
+use par2script::module;
+use par2script::undefine;
+use par2script::work;
+
+####################################
+# Main program
+####################################
+
+par2script::parameter::getparameter();
+par2script::parameter::control_parameter();
+par2script::parameter::outputparameter() if $par2script::globals::verbose;
+
+my $includes = par2script::work::setincludes($par2script::globals::includepathlist);
+my $parfiles = par2script::work::setparfiles($par2script::globals::parfilelist);
+
+par2script::work::make_complete_paths_for_parfiles($parfiles, $includes);
+
+print "Reading par files\n" if $par2script::globals::verbose;
+my $parfilecontent = par2script::work::read_all_parfiles($parfiles);
+
+print "Collecting items\n" if $par2script::globals::verbose;
+par2script::work::collect_definitions($parfilecontent);
+
+print "Collecting assigned items\n" if $par2script::globals::verbose;
+par2script::work::collect_assigned_gids();
+
+# print "First control of multiple assignments\n";
+# par2script::check::check_multiple_assignments();
+
+print "Searching for Undefinitions\n" if $par2script::globals::verbose;
+par2script::undefine::undefine_gids($parfilecontent);
+par2script::undefine::remove_complete_item("Directory", $parfilecontent);
+par2script::undefine::remove_complete_item("Profile", $parfilecontent);
+
+print "Removing assigned GIDs without definitions\n" if $par2script::globals::verbose;
+par2script::module::remove_undefined_gids_from_modules();
+
+print "Adding definitions without assignment to the root\n" if $par2script::globals::verbose;
+par2script::module::add_to_root_module();
+
+print "Control of multiple assignments\n" if $par2script::globals::verbose;
+par2script::check::check_multiple_assignments();
+
+print "Control of definitions with missing assignments\n" if $par2script::globals::verbose;
+par2script::check::check_missing_assignments();
+
+# checking the setup script
+print "Checking directory definitions ...\n" if $par2script::globals::verbose;
+par2script::check::check_needed_directories();
+par2script::check::check_directories_in_item_definitions();
+print "Checking module definitions ...\n" if $par2script::globals::verbose;
+par2script::check::check_module_existence();
+print "Checking module assignments ...\n" if $par2script::globals::verbose;
+par2script::check::check_moduleid_at_items();
+print "Checking Root Module ..." if $par2script::globals::verbose;
+par2script::check::check_rootmodule();
+print "Checking Shortcut assignments ...\n" if $par2script::globals::verbose;
+par2script::check::check_shortcut_assignments();
+print "Checking missing parents ...\n" if $par2script::globals::verbose;
+par2script::check::check_missing_parents();
+
+print "Shorten lines at modules\n" if $par2script::globals::verbose;
+par2script::module::shorten_lines_at_modules();
+
+# Now the script can be created
+print "Creating setup script\n" if $par2script::globals::verbose;
+my $setupscript = par2script::work::create_script();
+
+print "Saving script\n" if $par2script::globals::verbose;
+par2script::files::save_file($par2script::globals::scriptname, $setupscript);
+
+# logging, if set
+if ($par2script::globals::logging)
+{
+ par2script::files::save_file($par2script::globals::logfilename, \@par2script::globals::logfileinfo);
+ print "Log file written: $par2script::globals::logfilename\n";
+}
+
+####################################
+# End main program
+####################################
diff --git a/solenv/bin/polib.py b/solenv/bin/polib.py
new file mode 100644
index 000000000..092e7dfdb
--- /dev/null
+++ b/solenv/bin/polib.py
@@ -0,0 +1,1868 @@
+# -* coding: utf-8 -*-
+#
+# License: MIT (see LICENSE file provided)
+# vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4:
+8
+"""
+**polib** allows you to manipulate, create, modify gettext files (pot, po and
+mo files). You can load existing files, iterate through it's entries, add,
+modify entries, comments or metadata, etc. or create new po files from scratch.
+
+**polib** provides a simple and pythonic API via the :func:`~polib.pofile` and
+:func:`~polib.mofile` convenience functions.
+"""
+
+__author__ = 'David Jean Louis <izimobil@gmail.com>'
+__version__ = '1.0.8'
+__all__ = ['pofile', 'POFile', 'POEntry', 'mofile', 'MOFile', 'MOEntry',
+ 'default_encoding', 'escape', 'unescape', 'detect_encoding', ]
+
+import array
+import codecs
+import os
+import re
+import struct
+import sys
+import textwrap
+import binascii
+
+try:
+ import io
+except ImportError:
+ # replacement of io.open() for python < 2.6
+ # we use codecs instead
+ class io(object):
+ @staticmethod
+ def open(fpath, mode='r', encoding=None):
+ return codecs.open(fpath, mode, encoding)
+
+
+# the default encoding to use when encoding cannot be detected
+default_encoding = 'utf-8'
+
+# python 2/3 compatibility helpers {{{
+
+
+if sys.version_info[:2] < (3, 0):
+ PY3 = False
+ text_type = unicode
+
+ def b(s):
+ return s
+
+ def u(s):
+ return unicode(s, "unicode_escape")
+
+else:
+ PY3 = True
+ text_type = str
+
+ def b(s):
+ return s.encode("latin-1")
+
+ def u(s):
+ return s
+# }}}
+# _pofile_or_mofile {{{
+
+
+def _pofile_or_mofile(f, type, **kwargs):
+ """
+ Internal function used by :func:`polib.pofile` and :func:`polib.mofile` to
+ honor the DRY concept.
+ """
+ # get the file encoding
+ enc = kwargs.get('encoding')
+ if enc is None:
+ enc = detect_encoding(f, type == 'mofile')
+
+ # parse the file
+ kls = type == 'pofile' and _POFileParser or _MOFileParser
+ parser = kls(
+ f,
+ encoding=enc,
+ check_for_duplicates=kwargs.get('check_for_duplicates', False),
+ klass=kwargs.get('klass')
+ )
+ instance = parser.parse()
+ instance.wrapwidth = kwargs.get('wrapwidth', 78)
+ return instance
+# }}}
+# _is_file {{{
+
+
+def _is_file(filename_or_contents):
+ """
+ Safely returns the value of os.path.exists(filename_or_contents).
+
+ Arguments:
+
+ ``filename_or_contents``
+ either a filename, or a string holding the contents of some file.
+ In the latter case, this function will always return False.
+ """
+ try:
+ return os.path.exists(filename_or_contents)
+ except (ValueError, UnicodeEncodeError):
+ return False
+# }}}
+# function pofile() {{{
+
+
+def pofile(pofile, **kwargs):
+ """
+ Convenience function that parses the po or pot file ``pofile`` and returns
+ a :class:`~polib.POFile` instance.
+
+ Arguments:
+
+ ``pofile``
+ string, full or relative path to the po/pot file or its content (data).
+
+ ``wrapwidth``
+ integer, the wrap width, only useful when the ``-w`` option was passed
+ to xgettext (optional, default: ``78``).
+
+ ``encoding``
+ string, the encoding to use (e.g. "utf-8") (default: ``None``, the
+ encoding will be auto-detected).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+
+ ``klass``
+ class which is used to instantiate the return value (optional,
+ default: ``None``, the return value with be a :class:`~polib.POFile`
+ instance).
+ """
+ return _pofile_or_mofile(pofile, 'pofile', **kwargs)
+# }}}
+# function mofile() {{{
+
+
+def mofile(mofile, **kwargs):
+ """
+ Convenience function that parses the mo file ``mofile`` and returns a
+ :class:`~polib.MOFile` instance.
+
+ Arguments:
+
+ ``mofile``
+ string, full or relative path to the mo file or its content (data).
+
+ ``wrapwidth``
+ integer, the wrap width, only useful when the ``-w`` option was passed
+ to xgettext to generate the po file that was used to format the mo file
+ (optional, default: ``78``).
+
+ ``encoding``
+ string, the encoding to use (e.g. "utf-8") (default: ``None``, the
+ encoding will be auto-detected).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+
+ ``klass``
+ class which is used to instantiate the return value (optional,
+ default: ``None``, the return value with be a :class:`~polib.POFile`
+ instance).
+ """
+ return _pofile_or_mofile(mofile, 'mofile', **kwargs)
+# }}}
+# function detect_encoding() {{{
+
+
+def detect_encoding(file, binary_mode=False):
+ """
+ Try to detect the encoding used by the ``file``. The ``file`` argument can
+ be a PO or MO file path or a string containing the contents of the file.
+ If the encoding cannot be detected, the function will return the value of
+ ``default_encoding``.
+
+ Arguments:
+
+ ``file``
+ string, full or relative path to the po/mo file or its content.
+
+ ``binary_mode``
+ boolean, set this to True if ``file`` is a mo file.
+ """
+ PATTERN = r'"?Content-Type:.+? charset=([\w_\-:\.]+)'
+ rxt = re.compile(u(PATTERN))
+ rxb = re.compile(b(PATTERN))
+
+ def charset_exists(charset):
+ """Check whether ``charset`` is valid or not."""
+ try:
+ codecs.lookup(charset)
+ except LookupError:
+ return False
+ return True
+
+ if not _is_file(file):
+ match = rxt.search(file)
+ if match:
+ enc = match.group(1).strip()
+ if charset_exists(enc):
+ return enc
+ else:
+ # For PY3, always treat as binary
+ if binary_mode or PY3:
+ mode = 'rb'
+ rx = rxb
+ else:
+ mode = 'r'
+ rx = rxt
+ f = open(file, mode)
+ for l in f.readlines():
+ match = rx.search(l)
+ if match:
+ f.close()
+ enc = match.group(1).strip()
+ if not isinstance(enc, text_type):
+ enc = enc.decode('utf-8')
+ if charset_exists(enc):
+ return enc
+ f.close()
+ return default_encoding
+# }}}
+# function escape() {{{
+
+
+def escape(st):
+ """
+ Escapes the characters ``\\\\``, ``\\t``, ``\\n``, ``\\r`` and ``"`` in
+ the given string ``st`` and returns it.
+ """
+ return st.replace('\\', r'\\')\
+ .replace('\t', r'\t')\
+ .replace('\r', r'\r')\
+ .replace('\n', r'\n')\
+ .replace('\"', r'\"')
+# }}}
+# function unescape() {{{
+
+
+def unescape(st):
+ """
+ Unescapes the characters ``\\\\``, ``\\t``, ``\\n``, ``\\r`` and ``"`` in
+ the given string ``st`` and returns it.
+ """
+ def unescape_repl(m):
+ m = m.group(1)
+ if m == 'n':
+ return '\n'
+ if m == 't':
+ return '\t'
+ if m == 'r':
+ return '\r'
+ if m == '\\':
+ return '\\'
+ return m # handles escaped double quote
+ return re.sub(r'\\(\\|n|t|r|")', unescape_repl, st)
+# }}}
+# function natural_sort() {{{
+
+
+def natural_sort(lst):
+ """
+ Sort naturally the given list.
+ Credits: http://stackoverflow.com/a/4836734
+ """
+ convert = lambda text: int(text) if text.isdigit() else text.lower()
+ alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
+ return sorted(lst, key = alphanum_key)
+# }}}
+# class _BaseFile {{{
+
+
+class _BaseFile(list):
+ """
+ Common base class for the :class:`~polib.POFile` and :class:`~polib.MOFile`
+ classes. This class should **not** be instantiated directly.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments:
+
+ ``pofile``
+ string, the path to the po or mo file, or its content as a string.
+
+ ``wrapwidth``
+ integer, the wrap width, only useful when the ``-w`` option was
+ passed to xgettext (optional, default: ``78``).
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file, (optional, default: ``False``).
+ """
+ list.__init__(self)
+ # the opened file handle
+ pofile = kwargs.get('pofile', None)
+ if pofile and _is_file(pofile):
+ self.fpath = pofile
+ else:
+ self.fpath = kwargs.get('fpath')
+ # the width at which lines should be wrapped
+ self.wrapwidth = kwargs.get('wrapwidth', 78)
+ # the file encoding
+ self.encoding = kwargs.get('encoding', default_encoding)
+ # whether to check for duplicate entries or not
+ self.check_for_duplicates = kwargs.get('check_for_duplicates', False)
+ # header
+ self.header = ''
+ # both po and mo files have metadata
+ self.metadata = {}
+ self.metadata_is_fuzzy = 0
+
+ def __unicode__(self):
+ """
+ Returns the unicode representation of the file.
+ """
+ ret = []
+ entries = [self.metadata_as_entry()] + \
+ [e for e in self if not e.obsolete]
+ for entry in entries:
+ ret.append(entry.__unicode__(self.wrapwidth))
+ for entry in self.obsolete_entries():
+ ret.append(entry.__unicode__(self.wrapwidth))
+ ret = u('\n').join(ret)
+
+ assert isinstance(ret, text_type)
+ #if type(ret) != text_type:
+ # return unicode(ret, self.encoding)
+ return ret
+
+ if PY3:
+ def __str__(self):
+ return self.__unicode__()
+ else:
+ def __str__(self):
+ """
+ Returns the string representation of the file.
+ """
+ return unicode(self).encode(self.encoding)
+
+ def __contains__(self, entry):
+ """
+ Overridden ``list`` method to implement the membership test (in and
+ not in).
+ The method considers that an entry is in the file if it finds an entry
+ that has the same msgid (the test is **case sensitive**) and the same
+ msgctxt (or none for both entries).
+
+ Argument:
+
+ ``entry``
+ an instance of :class:`~polib._BaseEntry`.
+ """
+ return self.find(entry.msgid, by='msgid', msgctxt=entry.msgctxt) \
+ is not None
+
+ def __eq__(self, other):
+ return str(self) == str(other)
+
+ def append(self, entry):
+ """
+ Overridden method to check for duplicates entries, if a user tries to
+ add an entry that is already in the file, the method will raise a
+ ``ValueError`` exception.
+
+ Argument:
+
+ ``entry``
+ an instance of :class:`~polib._BaseEntry`.
+ """
+ # check_for_duplicates may not be defined (yet) when unpickling.
+ # But if pickling, we never want to check for duplicates anyway.
+ if getattr(self, 'check_for_duplicates', False) and entry in self:
+ raise ValueError('Entry "%s" already exists' % entry.msgid)
+ super(_BaseFile, self).append(entry)
+
+ def insert(self, index, entry):
+ """
+ Overridden method to check for duplicates entries, if a user tries to
+ add an entry that is already in the file, the method will raise a
+ ``ValueError`` exception.
+
+ Arguments:
+
+ ``index``
+ index at which the entry should be inserted.
+
+ ``entry``
+ an instance of :class:`~polib._BaseEntry`.
+ """
+ if self.check_for_duplicates and entry in self:
+ raise ValueError('Entry "%s" already exists' % entry.msgid)
+ super(_BaseFile, self).insert(index, entry)
+
+ def metadata_as_entry(self):
+ """
+ Returns the file metadata as a :class:`~polib.POFile` instance.
+ """
+ e = POEntry(msgid='')
+ mdata = self.ordered_metadata()
+ if mdata:
+ strs = []
+ for name, value in mdata:
+ # Strip whitespace off each line in a multi-line entry
+ strs.append('%s: %s' % (name, value))
+ e.msgstr = '\n'.join(strs) + '\n'
+ if self.metadata_is_fuzzy:
+ e.flags.append('fuzzy')
+ return e
+
+ def save(self, fpath=None, repr_method='__unicode__'):
+ """
+ Saves the po file to ``fpath``.
+ If it is an existing file and no ``fpath`` is provided, then the
+ existing file is rewritten with the modified data.
+
+ Keyword arguments:
+
+ ``fpath``
+ string, full or relative path to the file.
+
+ ``repr_method``
+ string, the method to use for output.
+ """
+ if self.fpath is None and fpath is None:
+ raise IOError('You must provide a file path to save() method')
+ contents = getattr(self, repr_method)()
+ if fpath is None:
+ fpath = self.fpath
+ if repr_method == 'to_binary':
+ fhandle = open(fpath, 'wb')
+ else:
+ fhandle = io.open(fpath, 'w', encoding=self.encoding)
+ if not isinstance(contents, text_type):
+ contents = contents.decode(self.encoding)
+ fhandle.write(contents)
+ fhandle.close()
+ # set the file path if not set
+ if self.fpath is None and fpath:
+ self.fpath = fpath
+
+ def find(self, st, by='msgid', include_obsolete_entries=False,
+ msgctxt=False):
+ """
+ Find the entry which msgid (or property identified by the ``by``
+ argument) matches the string ``st``.
+
+ Keyword arguments:
+
+ ``st``
+ string, the string to search for.
+
+ ``by``
+ string, the property to use for comparison (default: ``msgid``).
+
+ ``include_obsolete_entries``
+ boolean, whether to also search in entries that are obsolete.
+
+ ``msgctxt``
+ string, allows specifying a specific message context for the
+ search.
+ """
+ if include_obsolete_entries:
+ entries = self[:]
+ else:
+ entries = [e for e in self if not e.obsolete]
+ for e in entries:
+ if getattr(e, by) == st:
+ if msgctxt is not False and e.msgctxt != msgctxt:
+ continue
+ return e
+ return None
+
+ def ordered_metadata(self):
+ """
+ Convenience method that returns an ordered version of the metadata
+ dictionary. The return value is list of tuples (metadata name,
+ metadata_value).
+ """
+ # copy the dict first
+ metadata = self.metadata.copy()
+ data_order = [
+ 'Project-Id-Version',
+ 'Report-Msgid-Bugs-To',
+ 'POT-Creation-Date',
+ 'PO-Revision-Date',
+ 'Last-Translator',
+ 'Language-Team',
+ 'Language',
+ 'MIME-Version',
+ 'Content-Type',
+ 'Content-Transfer-Encoding',
+ 'Plural-Forms'
+ ]
+ ordered_data = []
+ for data in data_order:
+ try:
+ value = metadata.pop(data)
+ ordered_data.append((data, value))
+ except KeyError:
+ pass
+ # the rest of the metadata will be alphabetically ordered since there
+ # are no specs for this AFAIK
+ for data in natural_sort(metadata.keys()):
+ value = metadata[data]
+ ordered_data.append((data, value))
+ return ordered_data
+
+ def to_binary(self):
+ """
+ Return the binary representation of the file.
+ """
+ offsets = []
+ entries = self.translated_entries()
+
+ # the keys are sorted in the .mo file
+ def cmp(_self, other):
+ # msgfmt compares entries with msgctxt if it exists
+ self_msgid = _self.msgctxt and _self.msgctxt or _self.msgid
+ other_msgid = other.msgctxt and other.msgctxt or other.msgid
+ if self_msgid > other_msgid:
+ return 1
+ elif self_msgid < other_msgid:
+ return -1
+ else:
+ return 0
+ # add metadata entry
+ entries.sort(key=lambda o: o.msgctxt or o.msgid)
+ mentry = self.metadata_as_entry()
+ #mentry.msgstr = mentry.msgstr.replace('\\n', '').lstrip()
+ entries = [mentry] + entries
+ entries_len = len(entries)
+ ids, strs = b(''), b('')
+ for e in entries:
+ # For each string, we need size and file offset. Each string is
+ # NUL terminated; the NUL does not count into the size.
+ msgid = b('')
+ if e.msgctxt:
+ # Contexts are stored by storing the concatenation of the
+ # context, a <EOT> byte, and the original string
+ msgid = self._encode(e.msgctxt + '\4')
+ if e.msgid_plural:
+ msgstr = []
+ for index in sorted(e.msgstr_plural.keys()):
+ msgstr.append(e.msgstr_plural[index])
+ msgid += self._encode(e.msgid + '\0' + e.msgid_plural)
+ msgstr = self._encode('\0'.join(msgstr))
+ else:
+ msgid += self._encode(e.msgid)
+ msgstr = self._encode(e.msgstr)
+ offsets.append((len(ids), len(msgid), len(strs), len(msgstr)))
+ ids += msgid + b('\0')
+ strs += msgstr + b('\0')
+
+ # The header is 7 32-bit unsigned integers.
+ keystart = 7 * 4 + 16 * entries_len
+ # and the values start after the keys
+ valuestart = keystart + len(ids)
+ koffsets = []
+ voffsets = []
+ # The string table first has the list of keys, then the list of values.
+ # Each entry has first the size of the string, then the file offset.
+ for o1, l1, o2, l2 in offsets:
+ koffsets += [l1, o1 + keystart]
+ voffsets += [l2, o2 + valuestart]
+ offsets = koffsets + voffsets
+
+ output = struct.pack(
+ "Iiiiiii",
+ # Magic number
+ MOFile.MAGIC,
+ # Version
+ 0,
+ # number of entries
+ entries_len,
+ # start of key index
+ 7 * 4,
+ # start of value index
+ 7 * 4 + entries_len * 8,
+ # size and offset of hash table, we don't use hash tables
+ 0, keystart
+
+ )
+ if PY3 and sys.version_info.minor > 1: # python 3.2 or superior
+ output += array.array("i", offsets).tobytes()
+ else:
+ output += array.array("i", offsets).tostring()
+ output += ids
+ output += strs
+ return output
+
+ def _encode(self, mixed):
+ """
+ Encodes the given ``mixed`` argument with the file encoding if and
+ only if it's a unicode string and returns the encoded string.
+ """
+ if isinstance(mixed, text_type):
+ mixed = mixed.encode(self.encoding)
+ return mixed
+# }}}
+# class POFile {{{
+
+
+class POFile(_BaseFile):
+ """
+ Po (or Pot) file reader/writer.
+ This class inherits the :class:`~polib._BaseFile` class and, by extension,
+ the python ``list`` type.
+ """
+
+ def __unicode__(self):
+ """
+ Returns the unicode representation of the po file.
+ """
+ ret, headers = '', self.header.split('\n')
+ for header in headers:
+ if not len(header):
+ ret += "#\n"
+ elif header[:1] in [',', ':']:
+ ret += '#%s\n' % header
+ else:
+ ret += '# %s\n' % header
+
+ if not isinstance(ret, text_type):
+ ret = ret.decode(self.encoding)
+
+ return ret + _BaseFile.__unicode__(self)
+
+ def save_as_mofile(self, fpath):
+ """
+ Saves the binary representation of the file to given ``fpath``.
+
+ Keyword argument:
+
+ ``fpath``
+ string, full or relative path to the mo file.
+ """
+ _BaseFile.save(self, fpath, 'to_binary')
+
+ def percent_translated(self):
+ """
+ Convenience method that returns the percentage of translated
+ messages.
+ """
+ total = len([e for e in self if not e.obsolete])
+ if total == 0:
+ return 100
+ translated = len(self.translated_entries())
+ return int(translated * 100 / float(total))
+
+ def translated_entries(self):
+ """
+ Convenience method that returns the list of translated entries.
+ """
+ return [e for e in self if e.translated()]
+
+ def untranslated_entries(self):
+ """
+ Convenience method that returns the list of untranslated entries.
+ """
+ return [e for e in self if not e.translated() and not e.obsolete
+ and not 'fuzzy' in e.flags]
+
+ def fuzzy_entries(self):
+ """
+ Convenience method that returns the list of fuzzy entries.
+ """
+ return [e for e in self if 'fuzzy' in e.flags]
+
+ def obsolete_entries(self):
+ """
+ Convenience method that returns the list of obsolete entries.
+ """
+ return [e for e in self if e.obsolete]
+
+ def merge(self, refpot):
+ """
+ Convenience method that merges the current pofile with the pot file
+ provided. It behaves exactly as the gettext msgmerge utility:
+
+ * comments of this file will be preserved, but extracted comments and
+ occurrences will be discarded;
+ * any translations or comments in the file will be discarded, however,
+ dot comments and file positions will be preserved;
+ * the fuzzy flags are preserved.
+
+ Keyword argument:
+
+ ``refpot``
+ object POFile, the reference catalog.
+ """
+ # Store entries in dict/set for faster access
+ self_entries = dict((entry.msgid, entry) for entry in self)
+ refpot_msgids = set(entry.msgid for entry in refpot)
+ # Merge entries that are in the refpot
+ for entry in refpot:
+ e = self_entries.get(entry.msgid)
+ if e is None:
+ e = POEntry()
+ self.append(e)
+ e.merge(entry)
+ # ok, now we must "obsolete" entries that are not in the refpot anymore
+ for entry in self:
+ if entry.msgid not in refpot_msgids:
+ entry.obsolete = True
+# }}}
+# class MOFile {{{
+
+
+class MOFile(_BaseFile):
+ """
+ Mo file reader/writer.
+ This class inherits the :class:`~polib._BaseFile` class and, by
+ extension, the python ``list`` type.
+ """
+ MAGIC = 0x950412de
+ MAGIC_SWAPPED = 0xde120495
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts all keywords arguments accepted by
+ :class:`~polib._BaseFile` class.
+ """
+ _BaseFile.__init__(self, *args, **kwargs)
+ self.magic_number = None
+ self.version = 0
+
+ def save_as_pofile(self, fpath):
+ """
+ Saves the mofile as a pofile to ``fpath``.
+
+ Keyword argument:
+
+ ``fpath``
+ string, full or relative path to the file.
+ """
+ _BaseFile.save(self, fpath)
+
+ def save(self, fpath=None):
+ """
+ Saves the mofile to ``fpath``.
+
+ Keyword argument:
+
+ ``fpath``
+ string, full or relative path to the file.
+ """
+ _BaseFile.save(self, fpath, 'to_binary')
+
+ def percent_translated(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return 100
+
+ def translated_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return self
+
+ def untranslated_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return []
+
+ def fuzzy_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return []
+
+ def obsolete_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return []
+# }}}
+# class _BaseEntry {{{
+
+
+class _BaseEntry(object):
+ """
+ Base class for :class:`~polib.POEntry` and :class:`~polib.MOEntry` classes.
+ This class should **not** be instantiated directly.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments:
+
+ ``msgid``
+ string, the entry msgid.
+
+ ``msgstr``
+ string, the entry msgstr.
+
+ ``msgid_plural``
+ string, the entry msgid_plural.
+
+ ``msgstr_plural``
+ list, the entry msgstr_plural lines.
+
+ ``msgctxt``
+ string, the entry context (msgctxt).
+
+ ``obsolete``
+ bool, whether the entry is "obsolete" or not.
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+ """
+ self.msgid = kwargs.get('msgid', '')
+ self.msgstr = kwargs.get('msgstr', '')
+ self.msgid_plural = kwargs.get('msgid_plural', '')
+ self.msgstr_plural = kwargs.get('msgstr_plural', {})
+ self.msgctxt = kwargs.get('msgctxt', None)
+ self.obsolete = kwargs.get('obsolete', False)
+ self.encoding = kwargs.get('encoding', default_encoding)
+
+ def __unicode__(self, wrapwidth=78):
+ """
+ Returns the unicode representation of the entry.
+ """
+ if self.obsolete:
+ delflag = '#~ '
+ else:
+ delflag = ''
+ ret = []
+ # write the msgctxt if any
+ if self.msgctxt is not None:
+ ret += self._str_field("msgctxt", delflag, "", self.msgctxt,
+ wrapwidth)
+ # write the msgid
+ ret += self._str_field("msgid", delflag, "", self.msgid, wrapwidth)
+ # write the msgid_plural if any
+ if self.msgid_plural:
+ ret += self._str_field("msgid_plural", delflag, "",
+ self.msgid_plural, wrapwidth)
+ if self.msgstr_plural:
+ # write the msgstr_plural if any
+ msgstrs = self.msgstr_plural
+ keys = list(msgstrs)
+ keys.sort()
+ for index in keys:
+ msgstr = msgstrs[index]
+ plural_index = '[%s]' % index
+ ret += self._str_field("msgstr", delflag, plural_index, msgstr,
+ wrapwidth)
+ else:
+ # otherwise write the msgstr
+ ret += self._str_field("msgstr", delflag, "", self.msgstr,
+ wrapwidth)
+ ret.append('')
+ usedirect = True
+ if not PY3 and type(ret[0] != unicode):
+ try:
+ usedirect = False
+ ret = u('\n').join(x.decode('utf-8') for x in ret)
+ except:
+ usedirect = True
+ if usedirect:
+ ret = u('\n').join(ret)
+ return ret
+
+ if PY3:
+ def __str__(self):
+ return self.__unicode__()
+ else:
+ def __str__(self):
+ """
+ Returns the string representation of the entry.
+ """
+ return unicode(self).encode(self.encoding)
+
+ def __eq__(self, other):
+ return str(self) == str(other)
+
+ def _str_field(self, fieldname, delflag, plural_index, field,
+ wrapwidth=78):
+ lines = field.splitlines(True)
+ if len(lines) > 1:
+ lines = [''] + lines # start with initial empty line
+ else:
+ escaped_field = escape(field)
+ specialchars_count = 0
+ for c in ['\\', '\n', '\r', '\t', '"']:
+ specialchars_count += field.count(c)
+ # comparison must take into account fieldname length + one space
+ # + 2 quotes (eg. msgid "<string>")
+ flength = len(fieldname) + 3
+ if plural_index:
+ flength += len(plural_index)
+ real_wrapwidth = wrapwidth - flength + specialchars_count
+ if wrapwidth > 0 and len(field) > real_wrapwidth:
+ # Wrap the line but take field name into account
+ lines = [''] + [unescape(item) for item in wrap(
+ escaped_field,
+ wrapwidth - 2, # 2 for quotes ""
+ drop_whitespace=False,
+ break_long_words=False
+ )]
+ else:
+ lines = [field]
+ if fieldname.startswith('previous_'):
+ # quick and dirty trick to get the real field name
+ fieldname = fieldname[9:]
+
+ ret = ['%s%s%s "%s"' % (delflag, fieldname, plural_index,
+ escape(lines.pop(0)))]
+ for line in lines:
+ ret.append('%s"%s"' % (delflag, escape(line)))
+ return ret
+# }}}
+# class POEntry {{{
+
+
+class POEntry(_BaseEntry):
+ """
+ Represents a po file entry.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments:
+
+ ``comment``
+ string, the entry comment.
+
+ ``tcomment``
+ string, the entry translator comment.
+
+ ``occurrences``
+ list, the entry occurrences.
+
+ ``flags``
+ list, the entry flags.
+
+ ``previous_msgctxt``
+ string, the entry previous context.
+
+ ``previous_msgid``
+ string, the entry previous msgid.
+
+ ``previous_msgid_plural``
+ string, the entry previous msgid_plural.
+
+ ``linenum``
+ integer, the line number of the entry
+ """
+ _BaseEntry.__init__(self, *args, **kwargs)
+ self.comment = kwargs.get('comment', '')
+ self.tcomment = kwargs.get('tcomment', '')
+ self.occurrences = kwargs.get('occurrences', [])
+ self.flags = kwargs.get('flags', [])
+ self.previous_msgctxt = kwargs.get('previous_msgctxt', None)
+ self.previous_msgid = kwargs.get('previous_msgid', None)
+ self.previous_msgid_plural = kwargs.get('previous_msgid_plural', None)
+ self.linenum = kwargs.get('linenum', None)
+
+ def __unicode__(self, wrapwidth=0):
+ """
+ Returns the unicode representation of the entry.
+ """
+ ret = []
+ # comments first, if any (with text wrapping as xgettext does)
+ if self.obsolete:
+ comments = [('tcomment', '# ')]
+ else:
+ comments = [('comment', '#. '), ('tcomment', '# ')]
+ for c in comments:
+ val = getattr(self, c[0])
+ if val:
+ for comment in val.split('\n'):
+ if wrapwidth > 0 and len(comment) + len(c[1]) > wrapwidth:
+ ret += wrap(
+ comment,
+ wrapwidth,
+ initial_indent=c[1],
+ subsequent_indent=c[1],
+ break_long_words=False
+ )
+ else:
+ ret.append('%s%s' % (c[1], comment))
+
+ # occurrences (with text wrapping as xgettext does)
+ if not self.obsolete and self.occurrences:
+ filelist = []
+ for fpath, lineno in self.occurrences:
+ if lineno:
+ filelist.append('%s:%s' % (fpath, lineno))
+ else:
+ filelist.append(fpath)
+ filestr = ' '.join(filelist)
+ if wrapwidth > 0 and len(filestr) + 3 > wrapwidth:
+ # textwrap split words that contain hyphen, this is not
+ # what we want for filenames, so the dirty hack is to
+ # temporally replace hyphens with a char that a file cannot
+ # contain, like "*"
+ ret += [l.replace('*', '-') for l in wrap(
+ filestr.replace('-', '*'),
+ wrapwidth,
+ initial_indent='#: ',
+ subsequent_indent='#: ',
+ break_long_words=False
+ )]
+ else:
+ ret.append('#: ' + filestr)
+
+ # flags (TODO: wrapping ?)
+ if self.flags:
+ ret.append('#, %s' % ', '.join(self.flags))
+
+ # previous context and previous msgid/msgid_plural
+ fields = ['previous_msgctxt', 'previous_msgid',
+ 'previous_msgid_plural']
+ if self.obsolete:
+ prefix = "#~| "
+ else:
+ prefix = "#| "
+ for f in fields:
+ val = getattr(self, f)
+ if val:
+ ret += self._str_field(f, prefix, "", val, wrapwidth)
+
+ ret.append(_BaseEntry.__unicode__(self, wrapwidth))
+ ret = u('\n').join(ret)
+ return ret
+
+ def __cmp__(self, other):
+ """
+ Called by comparison operations if rich comparison is not defined.
+ """
+
+ # First: Obsolete test
+ if self.obsolete != other.obsolete:
+ if self.obsolete:
+ return -1
+ else:
+ return 1
+ # Work on a copy to protect original
+ occ1 = sorted(self.occurrences[:])
+ occ2 = sorted(other.occurrences[:])
+ pos = 0
+ for entry1 in occ1:
+ try:
+ entry2 = occ2[pos]
+ except IndexError:
+ return 1
+ pos = pos + 1
+ if entry1[0] != entry2[0]:
+ if entry1[0] > entry2[0]:
+ return 1
+ else:
+ return -1
+ if entry1[1] != entry2[1]:
+ if entry1[1] > entry2[1]:
+ return 1
+ else:
+ return -1
+ # Compare msgid_plural if set
+ if self.msgid_plural:
+ if not other.msgid_plural:
+ return 1
+ for pos in self.msgid_plural:
+ if pos not in other.msgid_plural:
+ return 1
+ if self.msgid_plural[pos] > other.msgid_plural[pos]:
+ return 1
+ if self.msgid_plural[pos] < other.msgid_plural[pos]:
+ return -1
+ # Finally: Compare message ID
+ if self.msgid > other.msgid:
+ return 1
+ elif self.msgid < other.msgid:
+ return -1
+ return 0
+
+ def __gt__(self, other):
+ return self.__cmp__(other) > 0
+
+ def __lt__(self, other):
+ return self.__cmp__(other) < 0
+
+ def __ge__(self, other):
+ return self.__cmp__(other) >= 0
+
+ def __le__(self, other):
+ return self.__cmp__(other) <= 0
+
+ def __eq__(self, other):
+ return self.__cmp__(other) == 0
+
+ def __ne__(self, other):
+ return self.__cmp__(other) != 0
+
+ def translated(self):
+ """
+ Returns ``True`` if the entry has been translated or ``False``
+ otherwise.
+ """
+ if self.obsolete or 'fuzzy' in self.flags:
+ return False
+ if self.msgstr != '':
+ return True
+ if self.msgstr_plural:
+ for pos in self.msgstr_plural:
+ if self.msgstr_plural[pos] == '':
+ return False
+ return True
+ return False
+
+ def merge(self, other):
+ """
+ Merge the current entry with the given pot entry.
+ """
+ self.msgid = other.msgid
+ self.msgctxt = other.msgctxt
+ self.occurrences = other.occurrences
+ self.comment = other.comment
+ fuzzy = 'fuzzy' in self.flags
+ self.flags = other.flags[:] # clone flags
+ if fuzzy:
+ self.flags.append('fuzzy')
+ self.msgid_plural = other.msgid_plural
+ self.obsolete = other.obsolete
+ self.previous_msgctxt = other.previous_msgctxt
+ self.previous_msgid = other.previous_msgid
+ self.previous_msgid_plural = other.previous_msgid_plural
+ if other.msgstr_plural:
+ for pos in other.msgstr_plural:
+ try:
+ # keep existing translation at pos if any
+ self.msgstr_plural[pos]
+ except KeyError:
+ self.msgstr_plural[pos] = ''
+
+ def __hash__(self):
+ return hash((self.msgid, self.msgstr))
+# }}}
+# class MOEntry {{{
+
+
+class MOEntry(_BaseEntry):
+ """
+ Represents a mo file entry.
+ """
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments,
+ for consistency with :class:`~polib.POEntry`:
+
+ ``comment``
+ ``tcomment``
+ ``occurrences``
+ ``flags``
+ ``previous_msgctxt``
+ ``previous_msgid``
+ ``previous_msgid_plural``
+
+ Note: even though these keyword arguments are accepted,
+ they hold no real meaning in the context of MO files
+ and are simply ignored.
+ """
+ _BaseEntry.__init__(self, *args, **kwargs)
+ self.comment = ''
+ self.tcomment = ''
+ self.occurrences = []
+ self.flags = []
+ self.previous_msgctxt = None
+ self.previous_msgid = None
+ self.previous_msgid_plural = None
+
+ def __hash__(self):
+ return hash((self.msgid, self.msgstr))
+
+# }}}
+# class _POFileParser {{{
+
+
+class _POFileParser(object):
+ """
+ A finite state machine to parse efficiently and correctly po
+ file format.
+ """
+
+ def __init__(self, pofile, *args, **kwargs):
+ """
+ Constructor.
+
+ Keyword arguments:
+
+ ``pofile``
+ string, path to the po file or its content
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+ """
+ enc = kwargs.get('encoding', default_encoding)
+ if _is_file(pofile):
+ try:
+ self.fhandle = io.open(pofile, 'rt', encoding=enc)
+ except LookupError:
+ enc = default_encoding
+ self.fhandle = io.open(pofile, 'rt', encoding=enc)
+ else:
+ self.fhandle = pofile.splitlines()
+
+ klass = kwargs.get('klass')
+ if klass is None:
+ klass = POFile
+ self.instance = klass(
+ pofile=pofile,
+ encoding=enc,
+ check_for_duplicates=kwargs.get('check_for_duplicates', False)
+ )
+ self.transitions = {}
+ self.current_line = 0
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_state = 'st'
+ self.current_token = None
+ # two memo flags used in handlers
+ self.msgstr_index = 0
+ self.entry_obsolete = 0
+ # Configure the state machine, by adding transitions.
+ # Signification of symbols:
+ # * ST: Beginning of the file (start)
+ # * HE: Header
+ # * TC: a translation comment
+ # * GC: a generated comment
+ # * OC: a file/line occurrence
+ # * FL: a flags line
+ # * CT: a message context
+ # * PC: a previous msgctxt
+ # * PM: a previous msgid
+ # * PP: a previous msgid_plural
+ # * MI: a msgid
+ # * MP: a msgid plural
+ # * MS: a msgstr
+ # * MX: a msgstr plural
+ # * MC: a msgid or msgstr continuation line
+ all = ['st', 'he', 'gc', 'oc', 'fl', 'ct', 'pc', 'pm', 'pp', 'tc',
+ 'ms', 'mp', 'mx', 'mi']
+
+ self.add('tc', ['st', 'he'], 'he')
+ self.add('tc', ['gc', 'oc', 'fl', 'tc', 'pc', 'pm', 'pp', 'ms',
+ 'mp', 'mx', 'mi'], 'tc')
+ self.add('gc', all, 'gc')
+ self.add('oc', all, 'oc')
+ self.add('fl', all, 'fl')
+ self.add('pc', all, 'pc')
+ self.add('pm', all, 'pm')
+ self.add('pp', all, 'pp')
+ self.add('ct', ['st', 'he', 'gc', 'oc', 'fl', 'tc', 'pc', 'pm',
+ 'pp', 'ms', 'mx'], 'ct')
+ self.add('mi', ['st', 'he', 'gc', 'oc', 'fl', 'ct', 'tc', 'pc',
+ 'pm', 'pp', 'ms', 'mx'], 'mi')
+ self.add('mp', ['tc', 'gc', 'pc', 'pm', 'pp', 'mi'], 'mp')
+ self.add('ms', ['mi', 'mp', 'tc'], 'ms')
+ self.add('mx', ['mi', 'mx', 'mp', 'tc'], 'mx')
+ self.add('mc', ['ct', 'mi', 'mp', 'ms', 'mx', 'pm', 'pp', 'pc'], 'mc')
+
+ def parse(self):
+ """
+ Run the state machine, parse the file line by line and call process()
+ with the current matched symbol.
+ """
+
+ keywords = {
+ 'msgctxt': 'ct',
+ 'msgid': 'mi',
+ 'msgstr': 'ms',
+ 'msgid_plural': 'mp',
+ }
+ prev_keywords = {
+ 'msgid_plural': 'pp',
+ 'msgid': 'pm',
+ 'msgctxt': 'pc',
+ }
+ tokens = []
+ for line in self.fhandle:
+ self.current_line += 1
+ line = line.strip()
+ if line == '':
+ continue
+
+ tokens = line.split(None, 2)
+ nb_tokens = len(tokens)
+
+ if tokens[0] == '#~|':
+ continue
+
+ if tokens[0] == '#~' and nb_tokens > 1:
+ line = line[3:].strip()
+ tokens = tokens[1:]
+ nb_tokens -= 1
+ self.entry_obsolete = 1
+ else:
+ self.entry_obsolete = 0
+
+ # Take care of keywords like
+ # msgid, msgid_plural, msgctxt & msgstr.
+ if tokens[0] in keywords and nb_tokens > 1:
+ line = line[len(tokens[0]):].lstrip()
+ if re.search(r'([^\\]|^)"', line[1:-1]):
+ raise IOError('Syntax error in po file %s (line %s): '
+ 'unescaped double quote found' %
+ (self.instance.fpath, self.current_line))
+ self.current_token = line
+ self.process(keywords[tokens[0]])
+ continue
+
+ self.current_token = line
+
+ if tokens[0] == '#:':
+ if nb_tokens <= 1:
+ continue
+ # we are on an occurrences line
+ self.process('oc')
+
+ elif line[:1] == '"':
+ # we are on a continuation line
+ if re.search(r'([^\\]|^)"', line[1:-1]):
+ raise IOError('Syntax error in po file %s (line %s): '
+ 'unescaped double quote found' %
+ (self.instance.fpath, self.current_line))
+ self.process('mc')
+
+ elif line[:7] == 'msgstr[':
+ # we are on a msgstr plural
+ self.process('mx')
+
+ elif tokens[0] == '#,':
+ if nb_tokens <= 1:
+ continue
+ # we are on a flags line
+ self.process('fl')
+
+ elif tokens[0] == '#' or tokens[0].startswith('##'):
+ if line == '#':
+ line += ' '
+ # we are on a translator comment line
+ self.process('tc')
+
+ elif tokens[0] == '#.':
+ if nb_tokens <= 1:
+ continue
+ # we are on a generated comment line
+ self.process('gc')
+
+ elif tokens[0] == '#|':
+ if nb_tokens <= 1:
+ raise IOError('Syntax error in po file %s (line %s)' %
+ (self.instance.fpath, self.current_line))
+
+ # Remove the marker and any whitespace right after that.
+ line = line[2:].lstrip()
+ self.current_token = line
+
+ if tokens[1].startswith('"'):
+ # Continuation of previous metadata.
+ self.process('mc')
+ continue
+
+ if nb_tokens == 2:
+ # Invalid continuation line.
+ raise IOError('Syntax error in po file %s (line %s): '
+ 'invalid continuation line' %
+ (self.instance.fpath, self.current_line))
+
+ # we are on a "previous translation" comment line,
+ if tokens[1] not in prev_keywords:
+ # Unknown keyword in previous translation comment.
+ raise IOError('Syntax error in po file %s (line %s): '
+ 'unknown keyword %s' %
+ (self.instance.fpath, self.current_line,
+ tokens[1]))
+
+ # Remove the keyword and any whitespace
+ # between it and the starting quote.
+ line = line[len(tokens[1]):].lstrip()
+ self.current_token = line
+ self.process(prev_keywords[tokens[1]])
+
+ else:
+ raise IOError('Syntax error in po file %s (line %s)' %
+ (self.instance.fpath, self.current_line))
+
+ if self.current_entry and len(tokens) > 0 and \
+ not tokens[0].startswith('#'):
+ # since entries are added when another entry is found, we must add
+ # the last entry here (only if there are lines). Trailing comments
+ # are ignored
+ self.instance.append(self.current_entry)
+
+ # before returning the instance, check if there's metadata and if
+ # so extract it in a dict
+ metadataentry = self.instance.find('')
+ if metadataentry: # metadata found
+ # remove the entry
+ self.instance.remove(metadataentry)
+ self.instance.metadata_is_fuzzy = metadataentry.flags
+ key = None
+ for msg in metadataentry.msgstr.splitlines():
+ try:
+ key, val = msg.split(':', 1)
+ self.instance.metadata[key] = val.strip()
+ except (ValueError, KeyError):
+ if key is not None:
+ self.instance.metadata[key] += '\n' + msg.strip()
+ # close opened file
+ if not isinstance(self.fhandle, list): # must be file
+ self.fhandle.close()
+ return self.instance
+
+ def add(self, symbol, states, next_state):
+ """
+ Add a transition to the state machine.
+
+ Keywords arguments:
+
+ ``symbol``
+ string, the matched token (two chars symbol).
+
+ ``states``
+ list, a list of states (two chars symbols).
+
+ ``next_state``
+ the next state the fsm will have after the action.
+ """
+ for state in states:
+ action = getattr(self, 'handle_%s' % next_state)
+ self.transitions[(symbol, state)] = (action, next_state)
+
+ def process(self, symbol):
+ """
+ Process the transition corresponding to the current state and the
+ symbol provided.
+
+ Keywords arguments:
+
+ ``symbol``
+ string, the matched token (two chars symbol).
+
+ ``linenum``
+ integer, the current line number of the parsed file.
+ """
+ try:
+ (action, state) = self.transitions[(symbol, self.current_state)]
+ if action():
+ self.current_state = state
+ except Exception:
+ raise IOError('Syntax error in po file (line %s)' %
+ self.current_line)
+
+ # state handlers
+
+ def handle_he(self):
+ """Handle a header comment."""
+ if self.instance.header != '':
+ self.instance.header += '\n'
+ self.instance.header += self.current_token[2:]
+ return 1
+
+ def handle_tc(self):
+ """Handle a translator comment."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ if self.current_entry.tcomment != '':
+ self.current_entry.tcomment += '\n'
+ tcomment = self.current_token.lstrip('#')
+ if tcomment.startswith(' '):
+ tcomment = tcomment[1:]
+ self.current_entry.tcomment += tcomment
+ return True
+
+ def handle_gc(self):
+ """Handle a generated comment."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ if self.current_entry.comment != '':
+ self.current_entry.comment += '\n'
+ self.current_entry.comment += self.current_token[3:]
+ return True
+
+ def handle_oc(self):
+ """Handle a file:num occurrence."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ occurrences = self.current_token[3:].split()
+ for occurrence in occurrences:
+ if occurrence != '':
+ try:
+ fil, line = occurrence.rsplit(':', 1)
+ if not line.isdigit():
+ fil = fil + line
+ line = ''
+ self.current_entry.occurrences.append((fil, line))
+ except (ValueError, AttributeError):
+ self.current_entry.occurrences.append((occurrence, ''))
+ return True
+
+ def handle_fl(self):
+ """Handle a flags line."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.flags += [c.strip() for c in
+ self.current_token[3:].split(',')]
+ return True
+
+ def handle_pp(self):
+ """Handle a previous msgid_plural line."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.previous_msgid_plural = \
+ unescape(self.current_token[1:-1])
+ return True
+
+ def handle_pm(self):
+ """Handle a previous msgid line."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.previous_msgid = \
+ unescape(self.current_token[1:-1])
+ return True
+
+ def handle_pc(self):
+ """Handle a previous msgctxt line."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.previous_msgctxt = \
+ unescape(self.current_token[1:-1])
+ return True
+
+ def handle_ct(self):
+ """Handle a msgctxt."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.msgctxt = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_mi(self):
+ """Handle a msgid."""
+ if self.current_state in ['mc', 'ms', 'mx']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry(linenum=self.current_line)
+ self.current_entry.obsolete = self.entry_obsolete
+ self.current_entry.msgid = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_mp(self):
+ """Handle a msgid plural."""
+ self.current_entry.msgid_plural = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_ms(self):
+ """Handle a msgstr."""
+ self.current_entry.msgstr = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_mx(self):
+ """Handle a msgstr plural."""
+ index = self.current_token[7]
+ value = self.current_token[self.current_token.find('"') + 1:-1]
+ self.current_entry.msgstr_plural[int(index)] = unescape(value)
+ self.msgstr_index = int(index)
+ return True
+
+ def handle_mc(self):
+ """Handle a msgid or msgstr continuation line."""
+ token = unescape(self.current_token[1:-1])
+ if self.current_state == 'ct':
+ self.current_entry.msgctxt += token
+ elif self.current_state == 'mi':
+ self.current_entry.msgid += token
+ elif self.current_state == 'mp':
+ self.current_entry.msgid_plural += token
+ elif self.current_state == 'ms':
+ self.current_entry.msgstr += token
+ elif self.current_state == 'mx':
+ self.current_entry.msgstr_plural[self.msgstr_index] += token
+ elif self.current_state == 'pp':
+ self.current_entry.previous_msgid_plural += token
+ elif self.current_state == 'pm':
+ self.current_entry.previous_msgid += token
+ elif self.current_state == 'pc':
+ self.current_entry.previous_msgctxt += token
+ # don't change the current state
+ return False
+# }}}
+# class _MOFileParser {{{
+
+
+class _MOFileParser(object):
+ """
+ A class to parse binary mo files.
+ """
+
+ def __init__(self, mofile, *args, **kwargs):
+ """
+ Constructor.
+
+ Keyword arguments:
+
+ ``mofile``
+ string, path to the mo file or its content
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+ """
+ self.fhandle = open(mofile, 'rb')
+
+ klass = kwargs.get('klass')
+ if klass is None:
+ klass = MOFile
+ self.instance = klass(
+ fpath=mofile,
+ encoding=kwargs.get('encoding', default_encoding),
+ check_for_duplicates=kwargs.get('check_for_duplicates', False)
+ )
+
+ def __del__(self):
+ """
+ Make sure the file is closed, this prevents warnings on unclosed file
+ when running tests with python >= 3.2.
+ """
+ if self.fhandle:
+ self.fhandle.close()
+
+ def parse(self):
+ """
+ Build the instance with the file handle provided in the
+ constructor.
+ """
+ # parse magic number
+ magic_number = self._readbinary('<I', 4)
+ if magic_number == MOFile.MAGIC:
+ ii = '<II'
+ elif magic_number == MOFile.MAGIC_SWAPPED:
+ ii = '>II'
+ else:
+ raise IOError('Invalid mo file, magic number is incorrect !')
+ self.instance.magic_number = magic_number
+ # parse the version number and the number of strings
+ version, numofstrings = self._readbinary(ii, 8)
+ # from MO file format specs: "A program seeing an unexpected major
+ # revision number should stop reading the MO file entirely"
+ if version not in (0, 1):
+ raise IOError('Invalid mo file, unexpected major revision number')
+ self.instance.version = version
+ # original strings and translation strings hash table offset
+ msgids_hash_offset, msgstrs_hash_offset = self._readbinary(ii, 8)
+ # move to msgid hash table and read length and offset of msgids
+ self.fhandle.seek(msgids_hash_offset)
+ msgids_index = []
+ for i in range(numofstrings):
+ msgids_index.append(self._readbinary(ii, 8))
+ # move to msgstr hash table and read length and offset of msgstrs
+ self.fhandle.seek(msgstrs_hash_offset)
+ msgstrs_index = []
+ for i in range(numofstrings):
+ msgstrs_index.append(self._readbinary(ii, 8))
+ # build entries
+ encoding = self.instance.encoding
+ for i in range(numofstrings):
+ self.fhandle.seek(msgids_index[i][1])
+ msgid = self.fhandle.read(msgids_index[i][0])
+
+ self.fhandle.seek(msgstrs_index[i][1])
+ msgstr = self.fhandle.read(msgstrs_index[i][0])
+ if i == 0 and not msgid: # metadata
+ raw_metadata, metadata = msgstr.split(b('\n')), {}
+ for line in raw_metadata:
+ tokens = line.split(b(':'), 1)
+ if tokens[0] != b(''):
+ try:
+ k = tokens[0].decode(encoding)
+ v = tokens[1].decode(encoding)
+ metadata[k] = v.strip()
+ except IndexError:
+ metadata[k] = u('')
+ self.instance.metadata = metadata
+ continue
+ # test if we have a plural entry
+ msgid_tokens = msgid.split(b('\0'))
+ if len(msgid_tokens) > 1:
+ entry = self._build_entry(
+ msgid=msgid_tokens[0],
+ msgid_plural=msgid_tokens[1],
+ msgstr_plural=dict((k, v) for k, v in
+ enumerate(msgstr.split(b('\0'))))
+ )
+ else:
+ entry = self._build_entry(msgid=msgid, msgstr=msgstr)
+ self.instance.append(entry)
+ # close opened file
+ self.fhandle.close()
+ return self.instance
+
+ def _build_entry(self, msgid, msgstr=None, msgid_plural=None,
+ msgstr_plural=None):
+ msgctxt_msgid = msgid.split(b('\x04'))
+ encoding = self.instance.encoding
+ if len(msgctxt_msgid) > 1:
+ kwargs = {
+ 'msgctxt': msgctxt_msgid[0].decode(encoding),
+ 'msgid': msgctxt_msgid[1].decode(encoding),
+ }
+ else:
+ kwargs = {'msgid': msgid.decode(encoding)}
+ if msgstr:
+ kwargs['msgstr'] = msgstr.decode(encoding)
+ if msgid_plural:
+ kwargs['msgid_plural'] = msgid_plural.decode(encoding)
+ if msgstr_plural:
+ for k in msgstr_plural:
+ msgstr_plural[k] = msgstr_plural[k].decode(encoding)
+ kwargs['msgstr_plural'] = msgstr_plural
+ return MOEntry(**kwargs)
+
+ def _readbinary(self, fmt, numbytes):
+ """
+ Private method that unpack n bytes of data using format <fmt>.
+ It returns a tuple or a mixed value if the tuple length is 1.
+ """
+ bytes = self.fhandle.read(numbytes)
+ tup = struct.unpack(fmt, bytes)
+ if len(tup) == 1:
+ return tup[0]
+ return tup
+# }}}
+# class TextWrapper {{{
+
+
+class TextWrapper(textwrap.TextWrapper):
+ """
+ Subclass of textwrap.TextWrapper that backport the
+ drop_whitespace option.
+ """
+ def __init__(self, *args, **kwargs):
+ drop_whitespace = kwargs.pop('drop_whitespace', True)
+ textwrap.TextWrapper.__init__(self, *args, **kwargs)
+ self.drop_whitespace = drop_whitespace
+
+ def _wrap_chunks(self, chunks):
+ """_wrap_chunks(chunks : [string]) -> [string]
+
+ Wrap a sequence of text chunks and return a list of lines of
+ length 'self.width' or less. (If 'break_long_words' is false,
+ some lines may be longer than this.) Chunks correspond roughly
+ to words and the whitespace between them: each chunk is
+ indivisible (modulo 'break_long_words'), but a line break can
+ come between any two chunks. Chunks should not have internal
+ whitespace; ie. a chunk is either all whitespace or a "word".
+ Whitespace chunks will be removed from the beginning and end of
+ lines, but apart from that whitespace is preserved.
+ """
+ lines = []
+ if self.width <= 0:
+ raise ValueError("invalid width %r (must be > 0)" % self.width)
+
+ # Arrange in reverse order so items can be efficiently popped
+ # from a stack of chucks.
+ chunks.reverse()
+
+ while chunks:
+
+ # Start the list of chunks that will make up the current line.
+ # cur_len is just the length of all the chunks in cur_line.
+ cur_line = []
+ cur_len = 0
+
+ # Figure out which static string will prefix this line.
+ if lines:
+ indent = self.subsequent_indent
+ else:
+ indent = self.initial_indent
+
+ # Maximum width for this line.
+ width = self.width - len(indent)
+
+ # First chunk on line is whitespace -- drop it, unless this
+ # is the very beginning of the text (ie. no lines started yet).
+ if self.drop_whitespace and chunks[-1].strip() == '' and lines:
+ del chunks[-1]
+
+ while chunks:
+ l = len(chunks[-1])
+
+ # Can at least squeeze this chunk onto the current line.
+ if cur_len + l <= width:
+ cur_line.append(chunks.pop())
+ cur_len += l
+
+ # Nope, this line is full.
+ else:
+ break
+
+ # The current line is full, and the next chunk is too big to
+ # fit on *any* line (not just this one).
+ if chunks and len(chunks[-1]) > width:
+ self._handle_long_word(chunks, cur_line, cur_len, width)
+
+ # If the last chunk on this line is all whitespace, drop it.
+ if self.drop_whitespace and cur_line and not cur_line[-1].strip():
+ del cur_line[-1]
+
+ # Convert current line back to a string and store it in list
+ # of all lines (return value).
+ if cur_line:
+ lines.append(indent + ''.join(cur_line))
+
+ return lines
+# }}}
+# function wrap() {{{
+
+
+def wrap(text, width=70, **kwargs):
+ """
+ Wrap a single paragraph of text, returning a list of wrapped lines.
+ """
+ if sys.version_info < (2, 6):
+ return TextWrapper(width=width, **kwargs).wrap(text)
+ return textwrap.wrap(text, width=width, **kwargs)
+
+# }}}
+
+def genKeyId(inkey):
+ crc = binascii.crc32(bytes(inkey, encoding="UTF-8")) & 0xffffffff
+ # Use simple ASCII characters, exclude I, l, 1 and O, 0 to avoid confusing IDs
+ symbols = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789";
+ outkey = ""
+ for keyind in range(0, 5):
+ outkey += symbols[(crc & 63) % len(symbols)];
+ crc >>= 6;
+ return outkey
diff --git a/solenv/bin/pre2par.pl b/solenv/bin/pre2par.pl
new file mode 100644
index 000000000..28ca73312
--- /dev/null
+++ b/solenv/bin/pre2par.pl
@@ -0,0 +1,62 @@
+#
+# 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 lib ("$ENV{SRCDIR}/solenv/bin/modules");
+
+use Cwd;
+use pre2par::directory;
+use pre2par::files;
+use pre2par::globals;
+use pre2par::language;
+use pre2par::parameter;
+use pre2par::work;
+
+####################################
+# Main program
+####################################
+
+pre2par::parameter::getparameter();
+pre2par::parameter::control_parameter();
+
+pre2par::directory::check_directory($pre2par::globals::parfilename);
+
+my $prefile = pre2par::files::read_file($pre2par::globals::prefilename);
+
+pre2par::work::check_content($prefile, $pre2par::globals::prefilename);
+
+my $parfile = pre2par::work::convert($prefile);
+
+pre2par::work::formatter($parfile);
+
+my $langfilename = $pre2par::globals::langfilename;
+
+if ( -f $langfilename )
+{
+ my $langfile = pre2par::files::read_file($langfilename);
+ pre2par::language::localize($parfile, $langfile);
+}
+
+pre2par::files::save_file($pre2par::globals::parfilename, $parfile);
+
+# checking of par file was written correctly
+my $parfilecomp = pre2par::files::read_file($pre2par::globals::parfilename);
+pre2par::work::diff_content($parfile, $parfilecomp, $pre2par::globals::parfilename);
+
+####################################
+# End main program
+####################################
diff --git a/solenv/bin/run-configure b/solenv/bin/run-configure
new file mode 100755
index 000000000..9758ff1d8
--- /dev/null
+++ b/solenv/bin/run-configure
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+# We could run emconfigure here, but LO's gbuild should have set up everything
+# correctly. If something breaks because of this, we likely have mre problems.
+if test "$OS" = "EMSCRIPTEN"; then
+ export EMMAKEN_JUST_CONFIGURE=1
+fi
+
+exec "$@"
diff --git a/solenv/bin/uiex b/solenv/bin/uiex
new file mode 100755
index 000000000..b9344c429
--- /dev/null
+++ b/solenv/bin/uiex
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+
+import polib
+import binascii
+import getopt
+import sys
+import os.path
+from subprocess import check_output
+
+try:
+ myopts, args = getopt.getopt(sys.argv[1:], "i:o:")
+except getopt.GetoptError as e:
+ print(" Syntax: uiex -i FileIn -o FileOut")
+ print(" FileIn: Source files (*.ui)")
+ print(" FileOut: Destination file (*.*)")
+ sys.exit(2)
+
+for o, a in myopts:
+ if o == '-i':
+ ifile = a
+ elif o == '-o':
+ ofile = a
+
+with open(ofile, "a") as output:
+ input = check_output(["xgettext", "--add-comments", "--no-wrap", ifile, "-o", "-"], encoding="UTF-8")
+ po = polib.pofile(input)
+ if len(po) != 0:
+ print("", file=output)
+ for entry in po:
+ # skip 'stock' entries like "cancel", "help", "ok", etc
+ # l10ntools/source/localize.cxx will insert one entry for each stock per .po
+ if entry.msgctxt == "stock":
+ continue
+ keyid = entry.msgctxt + '|' + entry.msgid
+ print('#. ' + polib.genKeyId(keyid), file=output)
+ for i, occurrence in enumerate(entry.occurrences):
+ entry.occurrences[i] = os.path.relpath(occurrence[0], os.environ['SRCDIR']), occurrence[1]
+ print(entry, file=output)
diff --git a/solenv/bin/uiimagelist.xsl b/solenv/bin/uiimagelist.xsl
new file mode 100644
index 000000000..659d3b943
--- /dev/null
+++ b/solenv/bin/uiimagelist.xsl
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * 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/.
+ *
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="text"/>
+
+ <xsl:template match="/|node()">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="@*|text()|processing-instruction()|comment()"/>
+
+ <xsl:template match="property[@name='icon_name'] | property[@name='icon-name'] | property[@name='pixbuf']">
+ <xsl:variable name="inpath" select="normalize-space(.)"/>
+ <xsl:variable name="outpath">
+ <xsl:choose>
+ <xsl:when test="starts-with($inpath,'res/')">
+ <xsl:value-of select="concat('%GLOBALRES%/',substring-after($inpath,'res/'))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat('%MODULE%/',$inpath)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$outpath"/>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/solenv/bin/version.py b/solenv/bin/version.py
new file mode 100755
index 000000000..3193b3fa3
--- /dev/null
+++ b/solenv/bin/version.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+
+from optparse import OptionParser
+import os.path
+import re
+import sys
+
+M = {
+ 'juh': 'javaunohelper',
+ 'jurt': 'jurt',
+ 'officebean': 'bean',
+ 'ridl': 'ridljar',
+ 'unoil': 'unoil',
+ 'unoloader': 'ridljar',
+ 'libreoffice': 'ridljar',
+}
+
+parser = OptionParser()
+_, args = parser.parse_args()
+
+if not len(args):
+ parser.error('not enough arguments')
+elif len(args) > 1:
+ parser.error('too many arguments')
+
+DEST = r'\g<1>%s\g<3>' % args[0]
+
+
+def replace_in_file(filename, src_pattern):
+ try:
+ f = open(filename, "r")
+ s = f.read()
+ f.close()
+ s = re.sub(src_pattern, DEST, s)
+ f = open(filename, "w")
+ f.write(s)
+ f.close()
+ except IOError as err:
+ print('error updating %s: %s' % (filename, err), file=sys.stderr)
+
+src_pattern = re.compile(r'^(\s*<version>)([-.@\w]+)(</version>\s*)$',
+ re.MULTILINE)
+
+for a in ['juh', 'jurt', 'libreoffice', 'officebean', 'ridl', 'unoil', 'unoloader']:
+ replace_in_file(os.path.join(M[a], 'pom.%s.xml' % a), src_pattern)
+
+src_pattern = re.compile(r"^(LIBREOFFICE_VERSION = ')([-.@\w]+)(')$",
+ re.MULTILINE)
+replace_in_file('solenv/maven/VERSION', src_pattern)
diff --git a/solenv/bin/write_classpath.sh b/solenv/bin/write_classpath.sh
new file mode 100755
index 000000000..4b9fd6bcb
--- /dev/null
+++ b/solenv/bin/write_classpath.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+dest="$1"
+shift
+base='Class-Path: '
+
+while [ "${1}" != "" ]; do
+ p="$1"
+ shift
+ echo "$base $p" >> $dest
+ base=' '
+done
+
+#echo "added classpath"
+#cat $dest
+#echo "==="
diff --git a/solenv/buck/build.defs b/solenv/buck/build.defs
new file mode 100644
index 000000000..f6a1a7463
--- /dev/null
+++ b/solenv/buck/build.defs
@@ -0,0 +1,51 @@
+def java_sources(
+ name,
+ srcs,
+ root = None,
+ visibility = []
+ ):
+ java_library(
+ name = name,
+ resources = srcs,
+ resources_root = root,
+ visibility = visibility,
+ )
+
+def java_doc(
+ name,
+ title,
+ pkgs,
+ paths,
+ srcs = [],
+ deps = [],
+ visibility = [],
+ do_it_wrong = False,
+ ):
+ if do_it_wrong:
+ sourcepath = paths
+ else:
+ sourcepath = ['$SRCDIR/' + n for n in paths]
+ genrule(
+ name = name,
+ cmd = ' '.join([
+ 'while ! test -f .buckconfig; do cd ..; done;',
+ 'javadoc',
+ '-quiet',
+ '-protected',
+ '-encoding UTF-8',
+ '-charset UTF-8',
+ '-notimestamp',
+ '-windowtitle "' + title + '"',
+ '-link http://docs.oracle.com/javase/7/docs/api',
+ '-subpackages ',
+ ':'.join(pkgs),
+ '-sourcepath ',
+ ':'.join(sourcepath),
+ ' -classpath ',
+ ':'.join(['$(location %s)' % n for n in deps]),
+ '-d $TMP',
+ ]) + ';jar cf $OUT -C $TMP .',
+ srcs = srcs,
+ out = name + '.jar',
+ visibility = visibility,
+)
diff --git a/solenv/clang-cl/config_global.h b/solenv/clang-cl/config_global.h
new file mode 100644
index 000000000..80120f1d2
--- /dev/null
+++ b/solenv/clang-cl/config_global.h
@@ -0,0 +1,21 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 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/.
+ */
+
+/* A partial copy of config_host/config_global.h.in, with hardcoded values that
+ suffice to compile CxxClr code in cli_ure/ with MSVC when building the rest
+ with clang-cl. A bad hack, should be replaced with a better copy that is
+ actually filled in by configure.
+*/
+
+#ifndef CONFIG_GLOBAL_H
+#define CONFIG_GLOBAL_H
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/solenv/clang-format/ClangFormat.pm b/solenv/clang-format/ClangFormat.pm
new file mode 100644
index 000000000..30f381623
--- /dev/null
+++ b/solenv/clang-format/ClangFormat.pm
@@ -0,0 +1,128 @@
+# 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/.
+
+package ClangFormat;
+
+use strict;
+use warnings;
+
+our @EXPORT_OK = qw(get_excludelist set_excludelist get_wanted_version get_own_directory get_extension_regex find check_style);
+
+# Reads the excludelist.
+sub get_excludelist()
+{
+ my $src = "c|cpp|cxx|h|hxx|inl";
+ my %excludelist_names = ();
+
+ # Read the excludelist.
+ if (open(LINES, "solenv/clang-format/excludelist"))
+ {
+ while (my $line = <LINES>)
+ {
+ chomp $line;
+ $excludelist_names{$line} = 1;
+ }
+ }
+
+ return \%excludelist_names;
+}
+
+# Writes the excludelist.
+# The single argument is a reference to an array.
+sub set_excludelist
+{
+ my @filenames = @{$_[0]};
+ open my $fh, ">", "solenv/clang-format/excludelist" or die $!;
+ print $fh "$_\n" for @filenames;
+ close $fh;
+}
+
+# Returns the clang-format version used of style enforcement.
+sub get_wanted_version()
+{
+ return "5.0.0";
+}
+
+# Returns the directory that can host a binary which is used automatically, even
+# if it's not in PATH.
+sub get_own_directory()
+{
+ return "/opt/lo/bin";
+}
+
+# Returns a regex matching filenames we clang-format.
+sub get_extension_regex()
+{
+ return "c|cpp|cxx|h|hxx|inl";
+}
+
+# Use clang-format from CLANG_FORMAT, from our dedicated directory or from
+# PATH, in this order.
+sub find()
+{
+ my $version = get_wanted_version();
+ my $opt_lo = get_own_directory();
+ my $clang_format;
+ if (!(defined($ENV{CLANG_FORMAT}) && is_matching_clang_format_version($ENV{CLANG_FORMAT}, $version)))
+ {
+ my @dirs = split /:/, $ENV{PATH};
+ unshift(@dirs, $opt_lo);
+
+ foreach my $dir (@dirs)
+ {
+ if (is_matching_clang_format_version("$dir/clang-format", $version))
+ {
+ $clang_format = "$dir/clang-format";
+ last;
+ }
+ }
+ }
+ else
+ {
+ $clang_format = $ENV{CLANG_FORMAT};
+ }
+
+ if ($^O eq "cygwin" && defined($clang_format))
+ {
+ $clang_format = `cygpath -m '$clang_format'`;
+ chomp $clang_format;
+ }
+
+ return $clang_format;
+}
+
+# Diffs the original and the formatted version of a single file from the index.
+sub check_style($$)
+{
+ # Make sure that not staged changes are not considered when diffing.
+ my ($clang_format, $filename) = @_;
+ my $index = $filename . ".index";
+ system("git show :$filename > $index");
+ my $format = $index . ".format";
+ system("'$clang_format' -assume-filename=$filename $index > $format");
+ my $ret = system("git --no-pager diff --no-index --exit-code $index $format") == 0;
+ unlink($index);
+ unlink($format);
+ return $ret;
+}
+
+# Private functions.
+
+# Is this binary the version we standardize on?
+sub is_matching_clang_format_version($$)
+{
+ my ($clang_format, $version) = @_;
+ if (! -x $clang_format)
+ {
+ return 0;
+ }
+
+ return `'$clang_format' -version` =~ /^clang-format version $version(-\d+)? \(tags/;
+}
+
+1;
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/clang-format/README b/solenv/clang-format/README
new file mode 100644
index 000000000..fc3a8be91
--- /dev/null
+++ b/solenv/clang-format/README
@@ -0,0 +1,35 @@
+Style enforcing code.
+
+== How to reproduce the binaries at <https://dev-www.libreoffice.org/bin/> ==
+
+- Linux:
+
+ - Built from source on openSUSE Leap 42.3
+ - get <http://releases.llvm.org/5.0.0/llvm-5.0.0.src.tar.xz>
+ - get <http://releases.llvm.org/5.0.0/cfe-5.0.0.src.tar.xz> and extract this as tools/clang/ in the LLVM source code
+ - mkdir workdir; cd workdir; cmake -G 'Unix Makefiles' -DCMAKE_INSTALL_PREFIX=$PWD/../instdir -DCMAKE_BUILD_TYPE=Release -DLLVM_BUILD_STATIC=true ..; make -j8 clang-format
+ - this produces a binary that is statically linked
+
+- macOS:
+
+ - <http://releases.llvm.org/5.0.0/clang+llvm-5.0.0-x86_64-apple-darwin.tar.xz> provides a portable binary already
+
+- Windows:
+
+ - <http://releases.llvm.org/5.0.0/LLVM-5.0.0-win32.exe> provides a portable binary already
+
+== Directory contents ==
+
+- excludelist: list of existing files not to be formatted:
+
+ - if you rename a file mentioned in this list, please update the entry (and
+ keep the file sorted)
+
+- check-last-commit: this is used during gerrit / jenkins verification
+
+- ClangFormat.pm: shared code between the git hook and these scripts
+
+- generate-style-excludelist: was used to generate `excludelist`
+
+- reformat-formatted-files: run this script in case the style config changes or
+ clang-format version is updated
diff --git a/solenv/clang-format/check-last-commit b/solenv/clang-format/check-last-commit
new file mode 100755
index 000000000..0de5ac4b0
--- /dev/null
+++ b/solenv/clang-format/check-last-commit
@@ -0,0 +1,98 @@
+#!/usr/bin/env perl
+# 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/.
+
+# Checks the style of the files changed in the last commit, for CI purposes.
+
+use strict;
+use warnings;
+use lib "solenv/clang-format";
+use ClangFormat;
+
+my $commit = 0;
+my $commit_id = 'HEAD';
+
+sub check_style()
+{
+ if ( ! -e ".git" )
+ {
+ # Can't diff when this is not a git checkout.
+ return;
+ }
+
+ my $src = ClangFormat::get_extension_regex();
+ my @good_names = ();
+ my @bad_names = ();
+ my $excluded_list_names = ClangFormat::get_excludelist();
+ my $clang_format = ClangFormat::find();
+ my $parent = $commit + 1;
+
+ # Get a list of non-deleted changed files.
+ # Explicitly use the low-level 'git diff-tree' (rather than plain 'git
+ # diff') so we get the new, but not the old files for renames and/or
+ # copies.
+ open (FILES, "git diff-tree -r --diff-filter=AM --name-only ${commit_id}~${parent} ${commit_id}~${commit} |") || die "Cannot run git diff.";
+ while (my $filename = <FILES>)
+ {
+ chomp $filename;
+ if ($filename =~ /\.($src)$/ and !exists($excluded_list_names->{$filename}))
+ {
+ if (! -x $clang_format)
+ {
+ my $version = ClangFormat::get_wanted_version();
+
+ print("solenv/clang-format/check-last-commit: ");
+ print("ERROR: no clang-format ${version} was found.\n\n");
+
+ exit(1);
+ }
+ if (ClangFormat::check_style($clang_format, $filename))
+ {
+ push @good_names, $filename;
+ }
+ else
+ {
+ push @bad_names, $filename;
+ }
+ }
+ }
+
+ # Enforce style.
+ if (scalar @bad_names)
+ {
+ print("\nERROR: The above differences were found between the code to commit \n");
+ print("and the clang-format rules. Tips:\n");
+ print("\n- You may run '/opt/lo/bin/clang-format -i <problematic file>' to fix up style automatically.\n");
+ print("- See solenv/clang-format/README on where to get the required version of clang-format binaries.\n");
+ print("- If you renamed an excluded file, update solenv/clang-format/excludelist accordingly to keep it excluded.\n");
+ print("\nsolenv/clang-format/check-last-commit: KO\n");
+ exit(1);
+ }
+ else
+ {
+ print("solenv/clang-format/check-last-commit: checked the following files:\n");
+ print(join("\n", @good_names));
+ print("\nsolenv/clang-format/check-last-commit: OK\n");
+ }
+}
+
+if (scalar(@ARGV) == 1)
+{
+ if (($ARGV[0] !~ /^[0-9]+$/) || (scalar($ARGV[0]) >= 8))
+ {
+ $commit_id = $ARGV[0];
+ }
+ else
+ {
+ $commit = $ARGV[0];
+ }
+}
+
+check_style();
+
+exit(0);
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist
new file mode 100644
index 000000000..7f6eb2eeb
--- /dev/null
+++ b/solenv/clang-format/excludelist
@@ -0,0 +1,16163 @@
+UnoControls/inc/basecontainercontrol.hxx
+UnoControls/inc/basecontrol.hxx
+UnoControls/inc/multiplexer.hxx
+UnoControls/source/base/basecontainercontrol.cxx
+UnoControls/source/base/basecontrol.cxx
+UnoControls/source/base/multiplexer.cxx
+UnoControls/source/controls/OConnectionPointContainerHelper.cxx
+UnoControls/source/controls/OConnectionPointHelper.cxx
+UnoControls/source/controls/framecontrol.cxx
+UnoControls/source/controls/progressbar.cxx
+UnoControls/source/controls/progressmonitor.cxx
+UnoControls/source/controls/statusindicator.cxx
+UnoControls/source/inc/OConnectionPointContainerHelper.hxx
+UnoControls/source/inc/OConnectionPointHelper.hxx
+UnoControls/source/inc/framecontrol.hxx
+UnoControls/source/inc/progressbar.hxx
+UnoControls/source/inc/progressmonitor.hxx
+UnoControls/source/inc/statusindicator.hxx
+accessibility/inc/extended/AccessibleBrowseBox.hxx
+accessibility/inc/extended/AccessibleBrowseBoxBase.hxx
+accessibility/inc/extended/AccessibleBrowseBoxCheckBoxCell.hxx
+accessibility/inc/extended/AccessibleBrowseBoxHeaderBar.hxx
+accessibility/inc/extended/AccessibleBrowseBoxHeaderCell.hxx
+accessibility/inc/extended/AccessibleBrowseBoxTable.hxx
+accessibility/inc/extended/AccessibleBrowseBoxTableBase.hxx
+accessibility/inc/extended/AccessibleBrowseBoxTableCell.hxx
+accessibility/inc/extended/AccessibleGridControl.hxx
+accessibility/inc/extended/AccessibleGridControlBase.hxx
+accessibility/inc/extended/AccessibleGridControlHeader.hxx
+accessibility/inc/extended/AccessibleGridControlHeaderCell.hxx
+accessibility/inc/extended/AccessibleGridControlTable.hxx
+accessibility/inc/extended/AccessibleGridControlTableBase.hxx
+accessibility/inc/extended/AccessibleGridControlTableCell.hxx
+accessibility/inc/extended/accessiblebrowseboxcell.hxx
+accessibility/inc/extended/accessibleeditbrowseboxcell.hxx
+accessibility/inc/extended/accessibleiconchoicectrl.hxx
+accessibility/inc/extended/accessibleiconchoicectrlentry.hxx
+accessibility/inc/extended/accessiblelistbox.hxx
+accessibility/inc/extended/accessiblelistboxentry.hxx
+accessibility/inc/extended/accessibletabbar.hxx
+accessibility/inc/extended/accessibletabbarbase.hxx
+accessibility/inc/extended/accessibletabbarpage.hxx
+accessibility/inc/extended/accessibletabbarpagelist.hxx
+accessibility/inc/extended/accessibletablistbox.hxx
+accessibility/inc/extended/accessibletablistboxtable.hxx
+accessibility/inc/extended/textwindowaccessibility.hxx
+accessibility/inc/helper/IComboListBoxHelper.hxx
+accessibility/inc/helper/listboxhelper.hxx
+accessibility/inc/standard/accessiblemenubasecomponent.hxx
+accessibility/inc/standard/accessiblemenucomponent.hxx
+accessibility/inc/standard/accessiblemenuitemcomponent.hxx
+accessibility/inc/standard/vclxaccessiblebox.hxx
+accessibility/inc/standard/vclxaccessiblebutton.hxx
+accessibility/inc/standard/vclxaccessiblecheckbox.hxx
+accessibility/inc/standard/vclxaccessibleedit.hxx
+accessibility/inc/standard/vclxaccessibleheaderbaritem.hxx
+accessibility/inc/standard/vclxaccessiblelist.hxx
+accessibility/inc/standard/vclxaccessiblelistitem.hxx
+accessibility/inc/standard/vclxaccessiblemenu.hxx
+accessibility/inc/standard/vclxaccessiblemenubar.hxx
+accessibility/inc/standard/vclxaccessiblemenuitem.hxx
+accessibility/inc/standard/vclxaccessibleradiobutton.hxx
+accessibility/inc/standard/vclxaccessiblescrollbar.hxx
+accessibility/inc/standard/vclxaccessiblestatusbar.hxx
+accessibility/inc/standard/vclxaccessiblestatusbaritem.hxx
+accessibility/inc/standard/vclxaccessibletabcontrol.hxx
+accessibility/inc/standard/vclxaccessibletabpage.hxx
+accessibility/inc/standard/vclxaccessibletabpagewindow.hxx
+accessibility/inc/standard/vclxaccessibletextcomponent.hxx
+accessibility/inc/standard/vclxaccessibletextfield.hxx
+accessibility/inc/standard/vclxaccessibletoolbox.hxx
+accessibility/inc/standard/vclxaccessibletoolboxitem.hxx
+accessibility/inc/strings.hxx
+accessibility/source/extended/AccessibleBrowseBox.cxx
+accessibility/source/extended/AccessibleBrowseBoxBase.cxx
+accessibility/source/extended/AccessibleBrowseBoxCheckBoxCell.cxx
+accessibility/source/extended/AccessibleBrowseBoxHeaderBar.cxx
+accessibility/source/extended/AccessibleBrowseBoxHeaderCell.cxx
+accessibility/source/extended/AccessibleBrowseBoxTable.cxx
+accessibility/source/extended/AccessibleBrowseBoxTableBase.cxx
+accessibility/source/extended/AccessibleBrowseBoxTableCell.cxx
+accessibility/source/extended/AccessibleGridControl.cxx
+accessibility/source/extended/AccessibleGridControlBase.cxx
+accessibility/source/extended/AccessibleGridControlHeader.cxx
+accessibility/source/extended/AccessibleGridControlHeaderCell.cxx
+accessibility/source/extended/AccessibleGridControlTable.cxx
+accessibility/source/extended/AccessibleGridControlTableBase.cxx
+accessibility/source/extended/AccessibleGridControlTableCell.cxx
+accessibility/source/extended/accessiblebrowseboxcell.cxx
+accessibility/source/extended/accessibleeditbrowseboxcell.cxx
+accessibility/source/extended/accessibleiconchoicectrl.cxx
+accessibility/source/extended/accessibleiconchoicectrlentry.cxx
+accessibility/source/extended/accessiblelistbox.cxx
+accessibility/source/extended/accessiblelistboxentry.cxx
+accessibility/source/extended/accessibletabbar.cxx
+accessibility/source/extended/accessibletabbarbase.cxx
+accessibility/source/extended/accessibletabbarpage.cxx
+accessibility/source/extended/accessibletabbarpagelist.cxx
+accessibility/source/extended/accessibletablistbox.cxx
+accessibility/source/extended/accessibletablistboxtable.cxx
+accessibility/source/extended/textwindowaccessibility.cxx
+accessibility/source/helper/acc_factory.cxx
+accessibility/source/helper/characterattributeshelper.cxx
+accessibility/source/standard/accessiblemenubasecomponent.cxx
+accessibility/source/standard/accessiblemenucomponent.cxx
+accessibility/source/standard/accessiblemenuitemcomponent.cxx
+accessibility/source/standard/floatingwindowaccessible.cxx
+accessibility/source/standard/vclxaccessiblebox.cxx
+accessibility/source/standard/vclxaccessiblebutton.cxx
+accessibility/source/standard/vclxaccessiblecheckbox.cxx
+accessibility/source/standard/vclxaccessiblecombobox.cxx
+accessibility/source/standard/vclxaccessibledropdowncombobox.cxx
+accessibility/source/standard/vclxaccessibledropdownlistbox.cxx
+accessibility/source/standard/vclxaccessibleedit.cxx
+accessibility/source/standard/vclxaccessibleheaderbaritem.cxx
+accessibility/source/standard/vclxaccessiblelist.cxx
+accessibility/source/standard/vclxaccessiblelistbox.cxx
+accessibility/source/standard/vclxaccessiblelistitem.cxx
+accessibility/source/standard/vclxaccessiblemenu.cxx
+accessibility/source/standard/vclxaccessiblemenubar.cxx
+accessibility/source/standard/vclxaccessiblemenuitem.cxx
+accessibility/source/standard/vclxaccessiblepopupmenu.cxx
+accessibility/source/standard/vclxaccessibleradiobutton.cxx
+accessibility/source/standard/vclxaccessiblescrollbar.cxx
+accessibility/source/standard/vclxaccessiblestatusbar.cxx
+accessibility/source/standard/vclxaccessiblestatusbaritem.cxx
+accessibility/source/standard/vclxaccessibletabcontrol.cxx
+accessibility/source/standard/vclxaccessibletabpage.cxx
+accessibility/source/standard/vclxaccessibletabpagewindow.cxx
+accessibility/source/standard/vclxaccessibletextcomponent.cxx
+accessibility/source/standard/vclxaccessibletextfield.cxx
+accessibility/source/standard/vclxaccessibletoolbox.cxx
+accessibility/source/standard/vclxaccessibletoolboxitem.cxx
+animations/source/animcore/animcore.cxx
+avmedia/inc/helpids.h
+avmedia/inc/mediacontrol.hxx
+avmedia/source/avmediadummy.cxx
+avmedia/source/framework/MediaControlBase.cxx
+avmedia/source/framework/mediacontrol.cxx
+avmedia/source/framework/mediaitem.cxx
+avmedia/source/framework/mediaplayer.cxx
+avmedia/source/framework/mediatoolbox.cxx
+avmedia/source/framework/soundhandler.cxx
+avmedia/source/framework/soundhandler.hxx
+avmedia/source/gstreamer/gstframegrabber.cxx
+avmedia/source/gstreamer/gstframegrabber.hxx
+avmedia/source/gstreamer/gstmanager.cxx
+avmedia/source/gstreamer/gstmanager.hxx
+avmedia/source/gstreamer/gstplayer.cxx
+avmedia/source/gstreamer/gstplayer.hxx
+avmedia/source/gstreamer/gstwindow.cxx
+avmedia/source/gstreamer/gstwindow.hxx
+avmedia/source/macavf/framegrabber.hxx
+avmedia/source/macavf/macavfcommon.hxx
+avmedia/source/macavf/manager.hxx
+avmedia/source/macavf/player.hxx
+avmedia/source/macavf/window.hxx
+avmedia/source/viewer/mediaevent_impl.cxx
+avmedia/source/viewer/mediaevent_impl.hxx
+avmedia/source/viewer/mediawindow.cxx
+avmedia/source/viewer/mediawindow_impl.cxx
+avmedia/source/viewer/mediawindow_impl.hxx
+avmedia/source/win/framegrabber.cxx
+avmedia/source/win/framegrabber.hxx
+avmedia/source/win/interface.hxx
+avmedia/source/win/manager.cxx
+avmedia/source/win/manager.hxx
+avmedia/source/win/player.cxx
+avmedia/source/win/player.hxx
+avmedia/source/win/window.cxx
+avmedia/source/win/window.hxx
+basctl/inc/helpids.h
+basctl/inc/strings.hxx
+basctl/source/accessibility/accessibledialogcontrolshape.cxx
+basctl/source/accessibility/accessibledialogwindow.cxx
+basctl/source/basicide/basdoc.cxx
+basctl/source/basicide/basdoc.hxx
+basctl/source/basicide/basicrenderable.cxx
+basctl/source/basicide/basicrenderable.hxx
+basctl/source/basicide/baside2.cxx
+basctl/source/basicide/baside2.hxx
+basctl/source/basicide/baside2b.cxx
+basctl/source/basicide/baside3.cxx
+basctl/source/basicide/basidectrlr.cxx
+basctl/source/basicide/basides1.cxx
+basctl/source/basicide/basides2.cxx
+basctl/source/basicide/basides3.cxx
+basctl/source/basicide/basidesh.cxx
+basctl/source/basicide/basobj2.cxx
+basctl/source/basicide/basobj3.cxx
+basctl/source/basicide/bastype2.cxx
+basctl/source/basicide/bastype3.cxx
+basctl/source/basicide/bastypes.cxx
+basctl/source/basicide/breakpoint.cxx
+basctl/source/basicide/doceventnotifier.cxx
+basctl/source/basicide/docsignature.cxx
+basctl/source/basicide/documentenumeration.cxx
+basctl/source/basicide/documentenumeration.hxx
+basctl/source/basicide/iderdll.cxx
+basctl/source/basicide/iderdll2.hxx
+basctl/source/basicide/layout.cxx
+basctl/source/basicide/localizationmgr.cxx
+basctl/source/basicide/macrodlg.cxx
+basctl/source/basicide/macrodlg.hxx
+basctl/source/basicide/moduldl2.cxx
+basctl/source/basicide/moduldlg.cxx
+basctl/source/basicide/moduldlg.hxx
+basctl/source/basicide/sbxitem.cxx
+basctl/source/basicide/scriptdocument.cxx
+basctl/source/basicide/textwindowpeer.cxx
+basctl/source/basicide/unomodel.cxx
+basctl/source/basicide/unomodel.hxx
+basctl/source/dlged/dlged.cxx
+basctl/source/dlged/dlgedclip.cxx
+basctl/source/dlged/dlgedfac.cxx
+basctl/source/dlged/dlgedfunc.cxx
+basctl/source/dlged/dlgedlist.cxx
+basctl/source/dlged/dlgedobj.cxx
+basctl/source/dlged/dlgedpage.cxx
+basctl/source/dlged/dlgedview.cxx
+basctl/source/dlged/managelang.cxx
+basctl/source/dlged/propbrw.cxx
+basctl/source/inc/accessibledialogcontrolshape.hxx
+basctl/source/inc/accessibledialogwindow.hxx
+basctl/source/inc/baside3.hxx
+basctl/source/inc/basidectrlr.hxx
+basctl/source/inc/basidesh.hxx
+basctl/source/inc/basobj.hxx
+basctl/source/inc/bastype2.hxx
+basctl/source/inc/bastypes.hxx
+basctl/source/inc/dlged.hxx
+basctl/source/inc/dlgedclip.hxx
+basctl/source/inc/dlgeddef.hxx
+basctl/source/inc/dlgedobj.hxx
+basctl/source/inc/dlgedview.hxx
+basctl/source/inc/doceventnotifier.hxx
+basctl/source/inc/docsignature.hxx
+basctl/source/inc/localizationmgr.hxx
+basctl/source/inc/managelang.hxx
+basctl/source/inc/propbrw.hxx
+basctl/source/inc/sbxitem.hxx
+basctl/source/inc/scriptdocument.hxx
+basegfx/source/color/bcolormodifier.cxx
+basegfx/source/color/bcolortools.cxx
+basegfx/source/curve/b2dbeziertools.cxx
+basegfx/source/curve/b2dcubicbezier.cxx
+basegfx/source/inc/hommatrixtemplate.hxx
+basegfx/source/inc/stringconversiontools.hxx
+basegfx/source/matrix/b2dhommatrix.cxx
+basegfx/source/matrix/b2dhommatrixtools.cxx
+basegfx/source/matrix/b3dhommatrix.cxx
+basegfx/source/numeric/ftools.cxx
+basegfx/source/point/b2dpoint.cxx
+basegfx/source/point/b2ipoint.cxx
+basegfx/source/point/b3dpoint.cxx
+basegfx/source/polygon/b2dlinegeometry.cxx
+basegfx/source/polygon/b2dpolygon.cxx
+basegfx/source/polygon/b2dpolygonclipper.cxx
+basegfx/source/polygon/b2dpolygoncutandtouch.cxx
+basegfx/source/polygon/b2dpolygontools.cxx
+basegfx/source/polygon/b2dpolygontriangulator.cxx
+basegfx/source/polygon/b2dpolypolygon.cxx
+basegfx/source/polygon/b2dpolypolygoncutter.cxx
+basegfx/source/polygon/b2dpolypolygontools.cxx
+basegfx/source/polygon/b2dsvgpolypolygon.cxx
+basegfx/source/polygon/b2dtrapezoid.cxx
+basegfx/source/polygon/b3dpolygon.cxx
+basegfx/source/polygon/b3dpolygontools.cxx
+basegfx/source/polygon/b3dpolypolygon.cxx
+basegfx/source/polygon/b3dpolypolygontools.cxx
+basegfx/source/range/b2dpolyrange.cxx
+basegfx/source/range/b2drange.cxx
+basegfx/source/range/b2drangeclipper.cxx
+basegfx/source/range/b2xrange.cxx
+basegfx/source/range/b3drange.cxx
+basegfx/source/raster/rasterconvert3d.cxx
+basegfx/source/tools/b2dclipstate.cxx
+basegfx/source/tools/canvastools.cxx
+basegfx/source/tools/gradienttools.cxx
+basegfx/source/tools/keystoplerp.cxx
+basegfx/source/tools/numbertools.cxx
+basegfx/source/tools/stringconversiontools.cxx
+basegfx/source/tools/systemdependentdata.cxx
+basegfx/source/tools/tools.cxx
+basegfx/source/tools/unopolypolygon.cxx
+basegfx/source/tools/zoomtools.cxx
+basegfx/source/tuple/b2dtuple.cxx
+basegfx/source/tuple/b3dtuple.cxx
+basegfx/source/vector/b2dvector.cxx
+basegfx/source/vector/b2ivector.cxx
+basegfx/source/vector/b3dvector.cxx
+basegfx/source/workbench/bezierclip.cxx
+basegfx/source/workbench/bezierclip.hxx
+basegfx/source/workbench/convexhull.cxx
+basegfx/source/workbench/gauss.hxx
+basegfx/test/SvgPathImportExport.cxx
+basegfx/test/boxclipper.cxx
+basegfx/test/clipstate.cxx
+basegfx/test/genericclipper.cxx
+basic/inc/sbobjmod.hxx
+basic/inc/sbprop.hxx
+basic/inc/sbstdobj.hxx
+basic/inc/sbxform.hxx
+basic/inc/sbxprop.hxx
+basic/qa/cppunit/basic_coverage.cxx
+basic/qa/cppunit/basictest.cxx
+basic/qa/cppunit/test_append.cxx
+basic/qa/cppunit/test_nested_struct.cxx
+basic/qa/cppunit/test_vba.cxx
+basic/source/basmgr/basicmanagerrepository.cxx
+basic/source/basmgr/basmgr.cxx
+basic/source/basmgr/vbahelper.cxx
+basic/source/classes/codecompletecache.cxx
+basic/source/classes/errobject.cxx
+basic/source/classes/eventatt.cxx
+basic/source/classes/global.cxx
+basic/source/classes/image.cxx
+basic/source/classes/propacc.cxx
+basic/source/classes/sb.cxx
+basic/source/classes/sbunoobj.cxx
+basic/source/classes/sbxmod.cxx
+basic/source/comp/basiccharclass.cxx
+basic/source/comp/buffer.cxx
+basic/source/comp/codegen.cxx
+basic/source/comp/dim.cxx
+basic/source/comp/exprgen.cxx
+basic/source/comp/exprnode.cxx
+basic/source/comp/exprtree.cxx
+basic/source/comp/io.cxx
+basic/source/comp/loops.cxx
+basic/source/comp/parser.cxx
+basic/source/comp/sbcomp.cxx
+basic/source/comp/scanner.cxx
+basic/source/comp/symtbl.cxx
+basic/source/comp/token.cxx
+basic/source/inc/basiccharclass.hxx
+basic/source/inc/buffer.hxx
+basic/source/inc/codegen.hxx
+basic/source/inc/date.hxx
+basic/source/inc/dlgcont.hxx
+basic/source/inc/expr.hxx
+basic/source/inc/filefmt.hxx
+basic/source/inc/image.hxx
+basic/source/inc/iosys.hxx
+basic/source/inc/namecont.hxx
+basic/source/inc/opcodes.hxx
+basic/source/inc/parser.hxx
+basic/source/inc/propacc.hxx
+basic/source/inc/rtlproto.hxx
+basic/source/inc/runtime.hxx
+basic/source/inc/sbintern.hxx
+basic/source/inc/sbunoobj.hxx
+basic/source/inc/scanner.hxx
+basic/source/inc/scriptcont.hxx
+basic/source/inc/symtbl.hxx
+basic/source/inc/token.hxx
+basic/source/runtime/basrdll.cxx
+basic/source/runtime/comenumwrapper.cxx
+basic/source/runtime/ddectrl.cxx
+basic/source/runtime/ddectrl.hxx
+basic/source/runtime/dllmgr-none.cxx
+basic/source/runtime/dllmgr-x64.cxx
+basic/source/runtime/dllmgr-x86.cxx
+basic/source/runtime/dllmgr.hxx
+basic/source/runtime/inputbox.cxx
+basic/source/runtime/iosys.cxx
+basic/source/runtime/methods.cxx
+basic/source/runtime/methods1.cxx
+basic/source/runtime/props.cxx
+basic/source/runtime/runtime.cxx
+basic/source/runtime/stdobj.cxx
+basic/source/runtime/stdobj1.cxx
+basic/source/sbx/sbxarray.cxx
+basic/source/sbx/sbxbase.cxx
+basic/source/sbx/sbxbool.cxx
+basic/source/sbx/sbxbyte.cxx
+basic/source/sbx/sbxchar.cxx
+basic/source/sbx/sbxcoll.cxx
+basic/source/sbx/sbxconv.hxx
+basic/source/sbx/sbxcurr.cxx
+basic/source/sbx/sbxdate.cxx
+basic/source/sbx/sbxdbl.cxx
+basic/source/sbx/sbxdec.cxx
+basic/source/sbx/sbxdec.hxx
+basic/source/sbx/sbxexec.cxx
+basic/source/sbx/sbxform.cxx
+basic/source/sbx/sbxint.cxx
+basic/source/sbx/sbxlng.cxx
+basic/source/sbx/sbxobj.cxx
+basic/source/sbx/sbxres.cxx
+basic/source/sbx/sbxres.hxx
+basic/source/sbx/sbxscan.cxx
+basic/source/sbx/sbxsng.cxx
+basic/source/sbx/sbxstr.cxx
+basic/source/sbx/sbxuint.cxx
+basic/source/sbx/sbxulng.cxx
+basic/source/sbx/sbxvalue.cxx
+basic/source/sbx/sbxvar.cxx
+basic/source/uno/dlgcont.cxx
+basic/source/uno/namecont.cxx
+basic/source/uno/scriptcont.cxx
+bean/native/unix/com_sun_star_comp_beans_LocalOfficeWindow.c
+bean/native/win32/com_sun_star_comp_beans_LocalOfficeWindow.c
+binaryurp/qa/test-cache.cxx
+binaryurp/qa/test-unmarshal.cxx
+binaryurp/source/binaryany.cxx
+binaryurp/source/binaryany.hxx
+binaryurp/source/bridge.cxx
+binaryurp/source/bridge.hxx
+binaryurp/source/bridgefactory.cxx
+binaryurp/source/bridgefactory.hxx
+binaryurp/source/cache.hxx
+binaryurp/source/currentcontext.cxx
+binaryurp/source/incomingreply.hxx
+binaryurp/source/incomingrequest.cxx
+binaryurp/source/incomingrequest.hxx
+binaryurp/source/lessoperators.cxx
+binaryurp/source/lessoperators.hxx
+binaryurp/source/marshal.cxx
+binaryurp/source/marshal.hxx
+binaryurp/source/outgoingrequest.hxx
+binaryurp/source/outgoingrequests.cxx
+binaryurp/source/proxy.cxx
+binaryurp/source/proxy.hxx
+binaryurp/source/reader.cxx
+binaryurp/source/unmarshal.cxx
+binaryurp/source/unmarshal.hxx
+binaryurp/source/writer.cxx
+binaryurp/source/writer.hxx
+binaryurp/source/writerstate.hxx
+bridges/inc/bridge.hxx
+bridges/inc/cppinterfaceproxy.hxx
+bridges/inc/unointerfaceproxy.hxx
+bridges/inc/vtablefactory.hxx
+bridges/source/cpp_uno/gcc3_aix_powerpc/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_aix_powerpc/except.cxx
+bridges/source/cpp_uno/gcc3_aix_powerpc/share.hxx
+bridges/source/cpp_uno/gcc3_aix_powerpc/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_ios/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_ios/except.cxx
+bridges/source/cpp_uno/gcc3_ios/rtti.h
+bridges/source/cpp_uno/gcc3_ios/share.hxx
+bridges/source/cpp_uno/gcc3_ios/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_ios/unwind-cxx.h
+bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx
+bridges/source/cpp_uno/gcc3_linux_aarch64/abi.hxx
+bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.cxx
+bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.hxx
+bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_alpha/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_alpha/except.cxx
+bridges/source/cpp_uno/gcc3_linux_alpha/share.hxx
+bridges/source/cpp_uno/gcc3_linux_alpha/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_arm/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_arm/except.cxx
+bridges/source/cpp_uno/gcc3_linux_arm/share.hxx
+bridges/source/cpp_uno/gcc3_linux_arm/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_hppa/call.cxx
+bridges/source/cpp_uno/gcc3_linux_hppa/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_hppa/except.cxx
+bridges/source/cpp_uno/gcc3_linux_hppa/share.hxx
+bridges/source/cpp_uno/gcc3_linux_hppa/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_ia64/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_ia64/except.cxx
+bridges/source/cpp_uno/gcc3_linux_ia64/share.hxx
+bridges/source/cpp_uno/gcc3_linux_ia64/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_intel/call.hxx
+bridges/source/cpp_uno/gcc3_linux_intel/callvirtualmethod.cxx
+bridges/source/cpp_uno/gcc3_linux_intel/callvirtualmethod.hxx
+bridges/source/cpp_uno/gcc3_linux_intel/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_intel/except.cxx
+bridges/source/cpp_uno/gcc3_linux_intel/share.hxx
+bridges/source/cpp_uno/gcc3_linux_intel/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_m68k/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_m68k/except.cxx
+bridges/source/cpp_uno/gcc3_linux_m68k/share.hxx
+bridges/source/cpp_uno/gcc3_linux_m68k/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_mips/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_mips/except.cxx
+bridges/source/cpp_uno/gcc3_linux_mips/share.hxx
+bridges/source/cpp_uno/gcc3_linux_mips/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_mips64/call.hxx
+bridges/source/cpp_uno/gcc3_linux_mips64/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_mips64/except.cxx
+bridges/source/cpp_uno/gcc3_linux_mips64/share.hxx
+bridges/source/cpp_uno/gcc3_linux_mips64/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_powerpc/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_powerpc/except.cxx
+bridges/source/cpp_uno/gcc3_linux_powerpc/share.hxx
+bridges/source/cpp_uno/gcc3_linux_powerpc/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_powerpc64/except.cxx
+bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx
+bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_s390/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_s390/except.cxx
+bridges/source/cpp_uno/gcc3_linux_s390/share.hxx
+bridges/source/cpp_uno/gcc3_linux_s390/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_s390x/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_s390x/except.cxx
+bridges/source/cpp_uno/gcc3_linux_s390x/share.hxx
+bridges/source/cpp_uno/gcc3_linux_s390x/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_sparc/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_sparc/except.cxx
+bridges/source/cpp_uno/gcc3_linux_sparc/share.hxx
+bridges/source/cpp_uno/gcc3_linux_sparc/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_sparc64/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_sparc64/except.cxx
+bridges/source/cpp_uno/gcc3_linux_sparc64/share.hxx
+bridges/source/cpp_uno/gcc3_linux_sparc64/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_linux_x86-64/abi.cxx
+bridges/source/cpp_uno/gcc3_linux_x86-64/abi.hxx
+bridges/source/cpp_uno/gcc3_linux_x86-64/call.hxx
+bridges/source/cpp_uno/gcc3_linux_x86-64/callvirtualmethod.cxx
+bridges/source/cpp_uno/gcc3_linux_x86-64/callvirtualmethod.hxx
+bridges/source/cpp_uno/gcc3_linux_x86-64/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx
+bridges/source/cpp_uno/gcc3_linux_x86-64/rtti.cxx
+bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx
+bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_macosx_x86-64/abi.cxx
+bridges/source/cpp_uno/gcc3_macosx_x86-64/abi.hxx
+bridges/source/cpp_uno/gcc3_macosx_x86-64/call.cxx
+bridges/source/cpp_uno/gcc3_macosx_x86-64/call.hxx
+bridges/source/cpp_uno/gcc3_macosx_x86-64/callvirtualmethod.cxx
+bridges/source/cpp_uno/gcc3_macosx_x86-64/callvirtualmethod.hxx
+bridges/source/cpp_uno/gcc3_macosx_x86-64/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_macosx_x86-64/except.cxx
+bridges/source/cpp_uno/gcc3_macosx_x86-64/share.hxx
+bridges/source/cpp_uno/gcc3_macosx_x86-64/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_solaris_intel/callvirtualmethod.cxx
+bridges/source/cpp_uno/gcc3_solaris_intel/callvirtualmethod.hxx
+bridges/source/cpp_uno/gcc3_solaris_intel/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_solaris_intel/except.cxx
+bridges/source/cpp_uno/gcc3_solaris_intel/share.hxx
+bridges/source/cpp_uno/gcc3_solaris_intel/uno2cpp.cxx
+bridges/source/cpp_uno/gcc3_solaris_sparc/cpp2uno.cxx
+bridges/source/cpp_uno/gcc3_solaris_sparc/except.cxx
+bridges/source/cpp_uno/gcc3_solaris_sparc/share.hxx
+bridges/source/cpp_uno/gcc3_solaris_sparc/uno2cpp.cxx
+bridges/source/cpp_uno/msvc_win32_intel/cpp2uno.cxx
+bridges/source/cpp_uno/msvc_win32_intel/except.cxx
+bridges/source/cpp_uno/msvc_win32_intel/uno2cpp.cxx
+bridges/source/cpp_uno/msvc_win32_x86-64/cpp2uno.cxx
+bridges/source/cpp_uno/msvc_win32_x86-64/uno2cpp.cxx
+bridges/source/cpp_uno/shared/bridge.cxx
+bridges/source/cpp_uno/shared/component.cxx
+bridges/source/cpp_uno/shared/cppinterfaceproxy.cxx
+bridges/source/cpp_uno/shared/types.cxx
+bridges/source/cpp_uno/shared/unointerfaceproxy.cxx
+bridges/source/cpp_uno/shared/vtablefactory.cxx
+bridges/source/cpp_uno/shared/vtables.cxx
+bridges/source/jni_uno/jni_base.h
+bridges/source/jni_uno/jni_bridge.cxx
+bridges/source/jni_uno/jni_bridge.h
+bridges/source/jni_uno/jni_data.cxx
+bridges/source/jni_uno/jni_helper.h
+bridges/source/jni_uno/jni_info.cxx
+bridges/source/jni_uno/jni_info.h
+bridges/source/jni_uno/jni_java2uno.cxx
+bridges/source/jni_uno/jni_uno2java.cxx
+bridges/source/jni_uno/jniunoenvironmentdata.hxx
+bridges/source/jni_uno/nativethreadpool.cxx
+canvas/inc/base/basemutexhelper.hxx
+canvas/inc/base/bitmapcanvasbase.hxx
+canvas/inc/base/bufferedgraphicdevicebase.hxx
+canvas/inc/base/cachedprimitivebase.hxx
+canvas/inc/base/canvasbase.hxx
+canvas/inc/base/canvascustomspritebase.hxx
+canvas/inc/base/canvascustomspritehelper.hxx
+canvas/inc/base/disambiguationhelper.hxx
+canvas/inc/base/graphicdevicebase.hxx
+canvas/inc/base/integerbitmapbase.hxx
+canvas/inc/base/sprite.hxx
+canvas/inc/base/spritecanvasbase.hxx
+canvas/inc/base/spritesurface.hxx
+canvas/inc/parametricpolypolygon.hxx
+canvas/inc/propertysethelper.hxx
+canvas/inc/rendering/icolorbuffer.hxx
+canvas/inc/rendering/irendermodule.hxx
+canvas/inc/rendering/isurface.hxx
+canvas/inc/rendering/isurfaceproxy.hxx
+canvas/inc/rendering/isurfaceproxymanager.hxx
+canvas/inc/spriteredrawmanager.hxx
+canvas/inc/vclwrapper.hxx
+canvas/inc/verifyinput.hxx
+canvas/source/cairo/cairo_cachedbitmap.cxx
+canvas/source/cairo/cairo_cachedbitmap.hxx
+canvas/source/cairo/cairo_canvas.cxx
+canvas/source/cairo/cairo_canvas.hxx
+canvas/source/cairo/cairo_canvasbitmap.cxx
+canvas/source/cairo/cairo_canvasbitmap.hxx
+canvas/source/cairo/cairo_canvascustomsprite.cxx
+canvas/source/cairo/cairo_canvascustomsprite.hxx
+canvas/source/cairo/cairo_canvasfont.cxx
+canvas/source/cairo/cairo_canvasfont.hxx
+canvas/source/cairo/cairo_canvashelper.cxx
+canvas/source/cairo/cairo_canvashelper.hxx
+canvas/source/cairo/cairo_canvashelper_text.cxx
+canvas/source/cairo/cairo_devicehelper.cxx
+canvas/source/cairo/cairo_devicehelper.hxx
+canvas/source/cairo/cairo_repainttarget.hxx
+canvas/source/cairo/cairo_sprite.hxx
+canvas/source/cairo/cairo_spritecanvas.cxx
+canvas/source/cairo/cairo_spritecanvas.hxx
+canvas/source/cairo/cairo_spritecanvashelper.cxx
+canvas/source/cairo/cairo_spritecanvashelper.hxx
+canvas/source/cairo/cairo_spritedevicehelper.cxx
+canvas/source/cairo/cairo_spritedevicehelper.hxx
+canvas/source/cairo/cairo_spritehelper.cxx
+canvas/source/cairo/cairo_spritehelper.hxx
+canvas/source/cairo/cairo_surfaceprovider.hxx
+canvas/source/cairo/cairo_textlayout.cxx
+canvas/source/cairo/cairo_textlayout.hxx
+canvas/source/directx/dx_9rm.cxx
+canvas/source/directx/dx_bitmap.cxx
+canvas/source/directx/dx_bitmap.hxx
+canvas/source/directx/dx_bitmapcanvashelper.cxx
+canvas/source/directx/dx_bitmapcanvashelper.hxx
+canvas/source/directx/dx_canvas.cxx
+canvas/source/directx/dx_canvas.hxx
+canvas/source/directx/dx_canvasbitmap.cxx
+canvas/source/directx/dx_canvasbitmap.hxx
+canvas/source/directx/dx_canvascustomsprite.cxx
+canvas/source/directx/dx_canvascustomsprite.hxx
+canvas/source/directx/dx_canvasfont.cxx
+canvas/source/directx/dx_canvasfont.hxx
+canvas/source/directx/dx_canvashelper.cxx
+canvas/source/directx/dx_canvashelper.hxx
+canvas/source/directx/dx_canvashelper_texturefill.cxx
+canvas/source/directx/dx_config.cxx
+canvas/source/directx/dx_config.hxx
+canvas/source/directx/dx_devicehelper.cxx
+canvas/source/directx/dx_devicehelper.hxx
+canvas/source/directx/dx_gdiplususer.cxx
+canvas/source/directx/dx_gdiplususer.hxx
+canvas/source/directx/dx_graphicsprovider.hxx
+canvas/source/directx/dx_ibitmap.hxx
+canvas/source/directx/dx_impltools.cxx
+canvas/source/directx/dx_impltools.hxx
+canvas/source/directx/dx_linepolypolygon.cxx
+canvas/source/directx/dx_linepolypolygon.hxx
+canvas/source/directx/dx_rendermodule.hxx
+canvas/source/directx/dx_sprite.hxx
+canvas/source/directx/dx_spritecanvas.cxx
+canvas/source/directx/dx_spritecanvas.hxx
+canvas/source/directx/dx_spritecanvashelper.cxx
+canvas/source/directx/dx_spritecanvashelper.hxx
+canvas/source/directx/dx_spritedevicehelper.cxx
+canvas/source/directx/dx_spritedevicehelper.hxx
+canvas/source/directx/dx_spritehelper.cxx
+canvas/source/directx/dx_spritehelper.hxx
+canvas/source/directx/dx_surfacebitmap.cxx
+canvas/source/directx/dx_surfacebitmap.hxx
+canvas/source/directx/dx_surfacegraphics.cxx
+canvas/source/directx/dx_textlayout.cxx
+canvas/source/directx/dx_textlayout.hxx
+canvas/source/directx/dx_textlayout_drawhelper.cxx
+canvas/source/directx/dx_textlayout_drawhelper.hxx
+canvas/source/directx/dx_vcltools.cxx
+canvas/source/directx/dx_vcltools.hxx
+canvas/source/directx/dx_winstuff.hxx
+canvas/source/factory/cf_service.cxx
+canvas/source/opengl/ogl_bitmapcanvashelper.cxx
+canvas/source/opengl/ogl_bitmapcanvashelper.hxx
+canvas/source/opengl/ogl_buffercontext.hxx
+canvas/source/opengl/ogl_canvasbitmap.cxx
+canvas/source/opengl/ogl_canvasbitmap.hxx
+canvas/source/opengl/ogl_canvascustomsprite.cxx
+canvas/source/opengl/ogl_canvascustomsprite.hxx
+canvas/source/opengl/ogl_canvasfont.cxx
+canvas/source/opengl/ogl_canvasfont.hxx
+canvas/source/opengl/ogl_canvashelper.cxx
+canvas/source/opengl/ogl_canvashelper.hxx
+canvas/source/opengl/ogl_canvastools.cxx
+canvas/source/opengl/ogl_canvastools.hxx
+canvas/source/opengl/ogl_spritecanvas.cxx
+canvas/source/opengl/ogl_spritecanvas.hxx
+canvas/source/opengl/ogl_spritedevicehelper.cxx
+canvas/source/opengl/ogl_spritedevicehelper.hxx
+canvas/source/opengl/ogl_textlayout.cxx
+canvas/source/opengl/ogl_textlayout.hxx
+canvas/source/opengl/ogl_texturecache.cxx
+canvas/source/opengl/ogl_texturecache.hxx
+canvas/source/opengl/ogl_tools.hxx
+canvas/source/simplecanvas/simplecanvasimpl.cxx
+canvas/source/tools/cachedprimitivebase.cxx
+canvas/source/tools/canvascustomspritehelper.cxx
+canvas/source/tools/canvastools.cxx
+canvas/source/tools/elapsedtime.cxx
+canvas/source/tools/page.cxx
+canvas/source/tools/page.hxx
+canvas/source/tools/pagemanager.cxx
+canvas/source/tools/pagemanager.hxx
+canvas/source/tools/parametricpolypolygon.cxx
+canvas/source/tools/propertysethelper.cxx
+canvas/source/tools/spriteredrawmanager.cxx
+canvas/source/tools/surface.cxx
+canvas/source/tools/surface.hxx
+canvas/source/tools/surfaceproxy.cxx
+canvas/source/tools/surfaceproxy.hxx
+canvas/source/tools/surfaceproxymanager.cxx
+canvas/source/tools/surfacerect.hxx
+canvas/source/tools/verifyinput.cxx
+canvas/source/vcl/backbuffer.cxx
+canvas/source/vcl/backbuffer.hxx
+canvas/source/vcl/bitmapbackbuffer.cxx
+canvas/source/vcl/bitmapbackbuffer.hxx
+canvas/source/vcl/cachedbitmap.cxx
+canvas/source/vcl/cachedbitmap.hxx
+canvas/source/vcl/canvas.cxx
+canvas/source/vcl/canvas.hxx
+canvas/source/vcl/canvasbitmap.cxx
+canvas/source/vcl/canvasbitmap.hxx
+canvas/source/vcl/canvasbitmaphelper.cxx
+canvas/source/vcl/canvasbitmaphelper.hxx
+canvas/source/vcl/canvascustomsprite.cxx
+canvas/source/vcl/canvascustomsprite.hxx
+canvas/source/vcl/canvasfont.cxx
+canvas/source/vcl/canvasfont.hxx
+canvas/source/vcl/canvashelper.cxx
+canvas/source/vcl/canvashelper.hxx
+canvas/source/vcl/canvashelper_texturefill.cxx
+canvas/source/vcl/devicehelper.cxx
+canvas/source/vcl/devicehelper.hxx
+canvas/source/vcl/impltools.cxx
+canvas/source/vcl/impltools.hxx
+canvas/source/vcl/outdevprovider.hxx
+canvas/source/vcl/repainttarget.hxx
+canvas/source/vcl/sprite.hxx
+canvas/source/vcl/spritecanvas.cxx
+canvas/source/vcl/spritecanvas.hxx
+canvas/source/vcl/spritecanvashelper.cxx
+canvas/source/vcl/spritecanvashelper.hxx
+canvas/source/vcl/spritedevicehelper.cxx
+canvas/source/vcl/spritedevicehelper.hxx
+canvas/source/vcl/spritehelper.cxx
+canvas/source/vcl/spritehelper.hxx
+canvas/source/vcl/textlayout.cxx
+canvas/source/vcl/textlayout.hxx
+canvas/source/vcl/windowoutdevholder.cxx
+canvas/source/vcl/windowoutdevholder.hxx
+canvas/workben/canvasdemo.cxx
+chart2/inc/ChartModel.hxx
+chart2/inc/ChartTypeManager.hxx
+chart2/inc/ChartView.hxx
+chart2/inc/unonames.hxx
+chart2/qa/extras/PivotChartTest.cxx
+chart2/qa/extras/chart2_trendcalculators.cxx
+chart2/qa/extras/chart2dump/chart2dump.cxx
+chart2/qa/extras/chart2export.cxx
+chart2/qa/extras/chart2import.cxx
+chart2/qa/extras/charttest.hxx
+chart2/qa/unit/common_functor_test.cxx
+chart2/source/controller/accessibility/AccessibleBase.cxx
+chart2/source/controller/accessibility/AccessibleChartElement.cxx
+chart2/source/controller/accessibility/AccessibleChartElement.hxx
+chart2/source/controller/accessibility/AccessibleChartShape.cxx
+chart2/source/controller/accessibility/AccessibleChartShape.hxx
+chart2/source/controller/accessibility/AccessibleChartView.cxx
+chart2/source/controller/accessibility/AccessibleTextHelper.cxx
+chart2/source/controller/accessibility/AccessibleViewForwarder.cxx
+chart2/source/controller/chartapiwrapper/AreaWrapper.cxx
+chart2/source/controller/chartapiwrapper/AreaWrapper.hxx
+chart2/source/controller/chartapiwrapper/AxisWrapper.cxx
+chart2/source/controller/chartapiwrapper/AxisWrapper.hxx
+chart2/source/controller/chartapiwrapper/Chart2ModelContact.cxx
+chart2/source/controller/chartapiwrapper/Chart2ModelContact.hxx
+chart2/source/controller/chartapiwrapper/ChartDataWrapper.cxx
+chart2/source/controller/chartapiwrapper/ChartDataWrapper.hxx
+chart2/source/controller/chartapiwrapper/ChartDocumentWrapper.cxx
+chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.cxx
+chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.hxx
+chart2/source/controller/chartapiwrapper/DiagramWrapper.cxx
+chart2/source/controller/chartapiwrapper/DiagramWrapper.hxx
+chart2/source/controller/chartapiwrapper/GridWrapper.cxx
+chart2/source/controller/chartapiwrapper/GridWrapper.hxx
+chart2/source/controller/chartapiwrapper/LegendWrapper.cxx
+chart2/source/controller/chartapiwrapper/LegendWrapper.hxx
+chart2/source/controller/chartapiwrapper/MinMaxLineWrapper.cxx
+chart2/source/controller/chartapiwrapper/MinMaxLineWrapper.hxx
+chart2/source/controller/chartapiwrapper/TitleWrapper.cxx
+chart2/source/controller/chartapiwrapper/TitleWrapper.hxx
+chart2/source/controller/chartapiwrapper/UpDownBarWrapper.cxx
+chart2/source/controller/chartapiwrapper/UpDownBarWrapper.hxx
+chart2/source/controller/chartapiwrapper/WallFloorWrapper.cxx
+chart2/source/controller/chartapiwrapper/WallFloorWrapper.hxx
+chart2/source/controller/chartapiwrapper/WrappedAddInProperty.cxx
+chart2/source/controller/chartapiwrapper/WrappedAddInProperty.hxx
+chart2/source/controller/chartapiwrapper/WrappedAutomaticPositionProperties.cxx
+chart2/source/controller/chartapiwrapper/WrappedAxisAndGridExistenceProperties.cxx
+chart2/source/controller/chartapiwrapper/WrappedAxisAndGridExistenceProperties.hxx
+chart2/source/controller/chartapiwrapper/WrappedCharacterHeightProperty.cxx
+chart2/source/controller/chartapiwrapper/WrappedCharacterHeightProperty.hxx
+chart2/source/controller/chartapiwrapper/WrappedDataCaptionProperties.cxx
+chart2/source/controller/chartapiwrapper/WrappedDataCaptionProperties.hxx
+chart2/source/controller/chartapiwrapper/WrappedGapwidthProperty.cxx
+chart2/source/controller/chartapiwrapper/WrappedGapwidthProperty.hxx
+chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.cxx
+chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.hxx
+chart2/source/controller/chartapiwrapper/WrappedScaleProperty.cxx
+chart2/source/controller/chartapiwrapper/WrappedScaleProperty.hxx
+chart2/source/controller/chartapiwrapper/WrappedScaleTextProperties.cxx
+chart2/source/controller/chartapiwrapper/WrappedScaleTextProperties.hxx
+chart2/source/controller/chartapiwrapper/WrappedSceneProperty.cxx
+chart2/source/controller/chartapiwrapper/WrappedSceneProperty.hxx
+chart2/source/controller/chartapiwrapper/WrappedSeriesAreaOrLineProperty.cxx
+chart2/source/controller/chartapiwrapper/WrappedSeriesAreaOrLineProperty.hxx
+chart2/source/controller/chartapiwrapper/WrappedSeriesOrDiagramProperty.hxx
+chart2/source/controller/chartapiwrapper/WrappedSplineProperties.cxx
+chart2/source/controller/chartapiwrapper/WrappedSplineProperties.hxx
+chart2/source/controller/chartapiwrapper/WrappedStatisticProperties.cxx
+chart2/source/controller/chartapiwrapper/WrappedStatisticProperties.hxx
+chart2/source/controller/chartapiwrapper/WrappedStockProperties.cxx
+chart2/source/controller/chartapiwrapper/WrappedStockProperties.hxx
+chart2/source/controller/chartapiwrapper/WrappedSymbolProperties.cxx
+chart2/source/controller/chartapiwrapper/WrappedSymbolProperties.hxx
+chart2/source/controller/chartapiwrapper/WrappedTextRotationProperty.cxx
+chart2/source/controller/dialogs/ChartTypeDialogController.cxx
+chart2/source/controller/dialogs/DataBrowser.cxx
+chart2/source/controller/dialogs/DataBrowser.hxx
+chart2/source/controller/dialogs/DataBrowserModel.cxx
+chart2/source/controller/dialogs/DataBrowserModel.hxx
+chart2/source/controller/dialogs/DialogModel.cxx
+chart2/source/controller/dialogs/DialogModel.hxx
+chart2/source/controller/dialogs/ObjectNameProvider.cxx
+chart2/source/controller/dialogs/RangeSelectionHelper.cxx
+chart2/source/controller/dialogs/RangeSelectionListener.cxx
+chart2/source/controller/dialogs/TitleDialogData.cxx
+chart2/source/controller/dialogs/dlg_ChartType_UNO.cxx
+chart2/source/controller/dialogs/dlg_CreationWizard.cxx
+chart2/source/controller/dialogs/dlg_CreationWizard_UNO.cxx
+chart2/source/controller/dialogs/dlg_DataEditor.cxx
+chart2/source/controller/dialogs/dlg_DataSource.cxx
+chart2/source/controller/dialogs/dlg_InsertAxis_Grid.cxx
+chart2/source/controller/dialogs/dlg_InsertDataLabel.cxx
+chart2/source/controller/dialogs/dlg_InsertErrorBars.cxx
+chart2/source/controller/dialogs/dlg_NumberFormat.cxx
+chart2/source/controller/dialogs/dlg_ObjectProperties.cxx
+chart2/source/controller/dialogs/dlg_ShapeFont.cxx
+chart2/source/controller/dialogs/dlg_ShapeParagraph.cxx
+chart2/source/controller/dialogs/dlg_View3D.cxx
+chart2/source/controller/dialogs/res_DataLabel.cxx
+chart2/source/controller/dialogs/res_DataLabel.hxx
+chart2/source/controller/dialogs/res_ErrorBar.cxx
+chart2/source/controller/dialogs/res_LegendPosition.cxx
+chart2/source/controller/dialogs/res_Trendline.cxx
+chart2/source/controller/dialogs/res_Trendline.hxx
+chart2/source/controller/dialogs/tp_3D_SceneAppearance.cxx
+chart2/source/controller/dialogs/tp_3D_SceneAppearance.hxx
+chart2/source/controller/dialogs/tp_3D_SceneGeometry.cxx
+chart2/source/controller/dialogs/tp_3D_SceneGeometry.hxx
+chart2/source/controller/dialogs/tp_3D_SceneIllumination.cxx
+chart2/source/controller/dialogs/tp_AxisLabel.cxx
+chart2/source/controller/dialogs/tp_AxisLabel.hxx
+chart2/source/controller/dialogs/tp_AxisPositions.cxx
+chart2/source/controller/dialogs/tp_ChartType.cxx
+chart2/source/controller/dialogs/tp_ChartType.hxx
+chart2/source/controller/dialogs/tp_DataLabel.cxx
+chart2/source/controller/dialogs/tp_DataSource.cxx
+chart2/source/controller/dialogs/tp_DataSource.hxx
+chart2/source/controller/dialogs/tp_ErrorBars.cxx
+chart2/source/controller/dialogs/tp_ErrorBars.hxx
+chart2/source/controller/dialogs/tp_LegendPosition.cxx
+chart2/source/controller/dialogs/tp_LegendPosition.hxx
+chart2/source/controller/dialogs/tp_PointGeometry.cxx
+chart2/source/controller/dialogs/tp_PolarOptions.cxx
+chart2/source/controller/dialogs/tp_PolarOptions.hxx
+chart2/source/controller/dialogs/tp_RangeChooser.cxx
+chart2/source/controller/dialogs/tp_RangeChooser.hxx
+chart2/source/controller/dialogs/tp_Scale.cxx
+chart2/source/controller/dialogs/tp_Scale.hxx
+chart2/source/controller/dialogs/tp_SeriesToAxis.cxx
+chart2/source/controller/dialogs/tp_SeriesToAxis.hxx
+chart2/source/controller/dialogs/tp_TitleRotation.cxx
+chart2/source/controller/dialogs/tp_TitleRotation.hxx
+chart2/source/controller/dialogs/tp_Trendline.cxx
+chart2/source/controller/dialogs/tp_Trendline.hxx
+chart2/source/controller/dialogs/tp_Wizard_TitlesAndObjects.cxx
+chart2/source/controller/dialogs/tp_Wizard_TitlesAndObjects.hxx
+chart2/source/controller/drawinglayer/DrawViewWrapper.cxx
+chart2/source/controller/drawinglayer/ViewElementListProvider.cxx
+chart2/source/controller/inc/AccessibleBase.hxx
+chart2/source/controller/inc/AccessibleChartView.hxx
+chart2/source/controller/inc/AccessibleTextHelper.hxx
+chart2/source/controller/inc/AxisItemConverter.hxx
+chart2/source/controller/inc/CharacterPropertyItemConverter.hxx
+chart2/source/controller/inc/ChartController.hxx
+chart2/source/controller/inc/ChartDocumentWrapper.hxx
+chart2/source/controller/inc/ChartToolbarController.hxx
+chart2/source/controller/inc/ChartWindow.hxx
+chart2/source/controller/inc/CommandDispatchContainer.hxx
+chart2/source/controller/inc/DataPointItemConverter.hxx
+chart2/source/controller/inc/DrawViewWrapper.hxx
+chart2/source/controller/inc/ErrorBarItemConverter.hxx
+chart2/source/controller/inc/GraphicPropertyItemConverter.hxx
+chart2/source/controller/inc/ItemConverter.hxx
+chart2/source/controller/inc/LegendItemConverter.hxx
+chart2/source/controller/inc/MultipleChartConverters.hxx
+chart2/source/controller/inc/MultipleItemConverter.hxx
+chart2/source/controller/inc/ObjectHierarchy.hxx
+chart2/source/controller/inc/ObjectNameProvider.hxx
+chart2/source/controller/inc/PositionAndSizeHelper.hxx
+chart2/source/controller/inc/RangeSelectionHelper.hxx
+chart2/source/controller/inc/RegressionCurveItemConverter.hxx
+chart2/source/controller/inc/RegressionEquationItemConverter.hxx
+chart2/source/controller/inc/SelectionHelper.hxx
+chart2/source/controller/inc/SeriesOptionsItemConverter.hxx
+chart2/source/controller/inc/ShapeController.h
+chart2/source/controller/inc/StatisticsItemConverter.hxx
+chart2/source/controller/inc/TextLabelItemConverter.hxx
+chart2/source/controller/inc/TitleDialogData.hxx
+chart2/source/controller/inc/TitleItemConverter.hxx
+chart2/source/controller/inc/ViewElementListProvider.hxx
+chart2/source/controller/inc/dlg_ChartType_UNO.hxx
+chart2/source/controller/inc/dlg_CreationWizard_UNO.hxx
+chart2/source/controller/inc/dlg_DataEditor.hxx
+chart2/source/controller/inc/dlg_DataSource.hxx
+chart2/source/controller/inc/dlg_InsertLegend.hxx
+chart2/source/controller/inc/dlg_ObjectProperties.hxx
+chart2/source/controller/inc/helpids.h
+chart2/source/controller/inc/res_ErrorBar.hxx
+chart2/source/controller/inc/res_LegendPosition.hxx
+chart2/source/controller/inc/uiobject.hxx
+chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx
+chart2/source/controller/itemsetwrapper/CharacterPropertyItemConverter.cxx
+chart2/source/controller/itemsetwrapper/DataPointItemConverter.cxx
+chart2/source/controller/itemsetwrapper/ErrorBarItemConverter.cxx
+chart2/source/controller/itemsetwrapper/GraphicPropertyItemConverter.cxx
+chart2/source/controller/itemsetwrapper/ItemConverter.cxx
+chart2/source/controller/itemsetwrapper/LegendItemConverter.cxx
+chart2/source/controller/itemsetwrapper/MultipleChartConverters.cxx
+chart2/source/controller/itemsetwrapper/MultipleItemConverter.cxx
+chart2/source/controller/itemsetwrapper/RegressionCurveItemConverter.cxx
+chart2/source/controller/itemsetwrapper/RegressionEquationItemConverter.cxx
+chart2/source/controller/itemsetwrapper/SchWhichPairs.hxx
+chart2/source/controller/itemsetwrapper/SeriesOptionsItemConverter.cxx
+chart2/source/controller/itemsetwrapper/StatisticsItemConverter.cxx
+chart2/source/controller/itemsetwrapper/TextLabelItemConverter.cxx
+chart2/source/controller/itemsetwrapper/TitleItemConverter.cxx
+chart2/source/controller/main/ChartController.cxx
+chart2/source/controller/main/ChartController_EditData.cxx
+chart2/source/controller/main/ChartController_Insert.cxx
+chart2/source/controller/main/ChartController_Position.cxx
+chart2/source/controller/main/ChartController_Properties.cxx
+chart2/source/controller/main/ChartController_TextEdit.cxx
+chart2/source/controller/main/ChartController_Tools.cxx
+chart2/source/controller/main/ChartController_Window.cxx
+chart2/source/controller/main/ChartDropTargetHelper.cxx
+chart2/source/controller/main/ChartDropTargetHelper.hxx
+chart2/source/controller/main/ChartFrameloader.cxx
+chart2/source/controller/main/ChartFrameloader.hxx
+chart2/source/controller/main/ChartModelClone.cxx
+chart2/source/controller/main/ChartModelClone.hxx
+chart2/source/controller/main/ChartTransferable.cxx
+chart2/source/controller/main/ChartTransferable.hxx
+chart2/source/controller/main/ChartWindow.cxx
+chart2/source/controller/main/CommandDispatch.cxx
+chart2/source/controller/main/CommandDispatch.hxx
+chart2/source/controller/main/CommandDispatchContainer.cxx
+chart2/source/controller/main/ConfigurationAccess.cxx
+chart2/source/controller/main/ControllerCommandDispatch.cxx
+chart2/source/controller/main/ControllerCommandDispatch.hxx
+chart2/source/controller/main/DragMethod_Base.cxx
+chart2/source/controller/main/DragMethod_Base.hxx
+chart2/source/controller/main/DragMethod_PieSegment.cxx
+chart2/source/controller/main/DragMethod_PieSegment.hxx
+chart2/source/controller/main/DragMethod_RotateDiagram.cxx
+chart2/source/controller/main/DragMethod_RotateDiagram.hxx
+chart2/source/controller/main/DrawCommandDispatch.cxx
+chart2/source/controller/main/DrawCommandDispatch.h
+chart2/source/controller/main/DrawCommandDispatch.hxx
+chart2/source/controller/main/ElementSelector.cxx
+chart2/source/controller/main/ElementSelector.hxx
+chart2/source/controller/main/FeatureCommandDispatchBase.cxx
+chart2/source/controller/main/FeatureCommandDispatchBase.hxx
+chart2/source/controller/main/ObjectHierarchy.cxx
+chart2/source/controller/main/PositionAndSizeHelper.cxx
+chart2/source/controller/main/SelectionHelper.cxx
+chart2/source/controller/main/ShapeController.cxx
+chart2/source/controller/main/ShapeController.hxx
+chart2/source/controller/main/StatusBarCommandDispatch.cxx
+chart2/source/controller/main/StatusBarCommandDispatch.hxx
+chart2/source/controller/main/ToolbarController.cxx
+chart2/source/controller/main/UndoActions.cxx
+chart2/source/controller/main/UndoActions.hxx
+chart2/source/controller/main/UndoCommandDispatch.cxx
+chart2/source/controller/main/UndoCommandDispatch.hxx
+chart2/source/controller/main/UndoGuard.cxx
+chart2/source/controller/main/UndoGuard.hxx
+chart2/source/controller/sidebar/Chart2PanelFactory.cxx
+chart2/source/controller/sidebar/Chart2PanelFactory.hxx
+chart2/source/controller/sidebar/ChartAreaPanel.cxx
+chart2/source/controller/sidebar/ChartAreaPanel.hxx
+chart2/source/controller/sidebar/ChartAxisPanel.cxx
+chart2/source/controller/sidebar/ChartAxisPanel.hxx
+chart2/source/controller/sidebar/ChartColorWrapper.cxx
+chart2/source/controller/sidebar/ChartColorWrapper.hxx
+chart2/source/controller/sidebar/ChartElementsPanel.cxx
+chart2/source/controller/sidebar/ChartElementsPanel.hxx
+chart2/source/controller/sidebar/ChartErrorBarPanel.cxx
+chart2/source/controller/sidebar/ChartErrorBarPanel.hxx
+chart2/source/controller/sidebar/ChartLinePanel.cxx
+chart2/source/controller/sidebar/ChartLinePanel.hxx
+chart2/source/controller/sidebar/ChartSeriesPanel.cxx
+chart2/source/controller/sidebar/ChartSeriesPanel.hxx
+chart2/source/controller/sidebar/ChartSidebarSelectionListener.cxx
+chart2/source/controller/uitest/uiobject.cxx
+chart2/source/inc/Axis.hxx
+chart2/source/inc/AxisHelper.hxx
+chart2/source/inc/BaseGFXHelper.hxx
+chart2/source/inc/BaseCoordinateSystem.hxx
+chart2/source/inc/CachedDataSequence.hxx
+chart2/source/inc/CharacterProperties.hxx
+chart2/source/inc/ChartModelHelper.hxx
+chart2/source/inc/ChartType.hxx
+chart2/source/inc/ChartTypeHelper.hxx
+chart2/source/inc/ChartTypeTemplate.hxx
+chart2/source/inc/CloneHelper.hxx
+chart2/source/inc/ColorPerPointHelper.hxx
+chart2/source/inc/CommonConverters.hxx
+chart2/source/inc/CommonFunctors.hxx
+chart2/source/inc/ConfigColorScheme.hxx
+chart2/source/inc/DataInterpreter.hxx
+chart2/source/inc/DataSeries.hxx
+chart2/source/inc/DataSeriesHelper.hxx
+chart2/source/inc/DataSource.hxx
+chart2/source/inc/DataSourceHelper.hxx
+chart2/source/inc/Diagram.hxx
+chart2/source/inc/DiagramHelper.hxx
+chart2/source/inc/ErrorBar.hxx
+chart2/source/inc/EventListenerHelper.hxx
+chart2/source/inc/ExplicitCategoriesProvider.hxx
+chart2/source/inc/ExponentialRegressionCurveCalculator.hxx
+chart2/source/inc/FillProperties.hxx
+chart2/source/inc/FormattedStringHelper.hxx
+chart2/source/inc/InternalData.hxx
+chart2/source/inc/InternalDataProvider.hxx
+chart2/source/inc/LabeledDataSequence.hxx
+chart2/source/inc/Legend.hxx
+chart2/source/inc/LegendHelper.hxx
+chart2/source/inc/LifeTime.hxx
+chart2/source/inc/LinePropertiesHelper.hxx
+chart2/source/inc/LinearRegressionCurveCalculator.hxx
+chart2/source/inc/LogarithmicRegressionCurveCalculator.hxx
+chart2/source/inc/MeanValueRegressionCurveCalculator.hxx
+chart2/source/inc/MediaDescriptorHelper.hxx
+chart2/source/inc/ModifyListenerHelper.hxx
+chart2/source/inc/MovingAverageRegressionCurveCalculator.hxx
+chart2/source/inc/NameContainer.hxx
+chart2/source/inc/NumberFormatterWrapper.hxx
+chart2/source/inc/OPropertySet.hxx
+chart2/source/inc/ObjectIdentifier.hxx
+chart2/source/inc/PolynomialRegressionCurveCalculator.hxx
+chart2/source/inc/PotentialRegressionCurveCalculator.hxx
+chart2/source/inc/PropertyHelper.hxx
+chart2/source/inc/RangeHighlighter.hxx
+chart2/source/inc/ReferenceSizeProvider.hxx
+chart2/source/inc/RegressionCalculationHelper.hxx
+chart2/source/inc/RegressionCurveCalculator.hxx
+chart2/source/inc/RegressionCurveHelper.hxx
+chart2/source/inc/RegressionCurveModel.hxx
+chart2/source/inc/RelativePositionHelper.hxx
+chart2/source/inc/RelativeSizeHelper.hxx
+chart2/source/inc/Scaling.hxx
+chart2/source/inc/SceneProperties.hxx
+chart2/source/inc/StatisticsHelper.hxx
+chart2/source/inc/ThreeDHelper.hxx
+chart2/source/inc/Title.hxx
+chart2/source/inc/TitleHelper.hxx
+chart2/source/inc/UncachedDataSequence.hxx
+chart2/source/inc/UserDefinedProperties.hxx
+chart2/source/inc/WeakListenerAdapter.hxx
+chart2/source/inc/WrappedDefaultProperty.hxx
+chart2/source/inc/WrappedIgnoreProperty.hxx
+chart2/source/inc/WrappedProperty.hxx
+chart2/source/inc/WrappedPropertySet.hxx
+chart2/source/inc/XMLRangeHelper.hxx
+chart2/source/inc/chartview/ChartSfxItemIds.hxx
+chart2/source/inc/chartview/DataPointSymbolSupplier.hxx
+chart2/source/inc/chartview/DrawModelWrapper.hxx
+chart2/source/inc/chartview/ExplicitValueProvider.hxx
+chart2/source/inc/servicenames_coosystems.hxx
+chart2/source/model/filter/XMLFilter.cxx
+chart2/source/model/inc/StockBar.hxx
+chart2/source/model/inc/XMLFilter.hxx
+chart2/source/model/main/Axis.cxx
+chart2/source/model/main/BaseCoordinateSystem.cxx
+chart2/source/model/main/CartesianCoordinateSystem.cxx
+chart2/source/model/main/ChartModel.cxx
+chart2/source/model/main/ChartModel_Persistence.cxx
+chart2/source/model/main/DataPoint.cxx
+chart2/source/model/main/DataPoint.hxx
+chart2/source/model/main/DataPointProperties.cxx
+chart2/source/model/main/DataPointProperties.hxx
+chart2/source/model/main/DataSeries.cxx
+chart2/source/model/main/DataSeriesProperties.cxx
+chart2/source/model/main/DataSeriesProperties.hxx
+chart2/source/model/main/Diagram.cxx
+chart2/source/model/main/FormattedString.cxx
+chart2/source/model/main/FormattedString.hxx
+chart2/source/model/main/GridProperties.cxx
+chart2/source/model/main/GridProperties.hxx
+chart2/source/model/main/Legend.cxx
+chart2/source/model/main/PageBackground.cxx
+chart2/source/model/main/PageBackground.hxx
+chart2/source/model/main/PolarCoordinateSystem.cxx
+chart2/source/model/main/StockBar.cxx
+chart2/source/model/main/Title.cxx
+chart2/source/model/main/UndoManager.cxx
+chart2/source/model/main/UndoManager.hxx
+chart2/source/model/main/Wall.cxx
+chart2/source/model/main/Wall.hxx
+chart2/source/model/template/AreaChartType.cxx
+chart2/source/model/template/AreaChartType.hxx
+chart2/source/model/template/AreaChartTypeTemplate.cxx
+chart2/source/model/template/AreaChartTypeTemplate.hxx
+chart2/source/model/template/BarChartType.cxx
+chart2/source/model/template/BarChartType.hxx
+chart2/source/model/template/BarChartTypeTemplate.cxx
+chart2/source/model/template/BarChartTypeTemplate.hxx
+chart2/source/model/template/BubbleChartType.cxx
+chart2/source/model/template/BubbleChartType.hxx
+chart2/source/model/template/BubbleChartTypeTemplate.cxx
+chart2/source/model/template/BubbleChartTypeTemplate.hxx
+chart2/source/model/template/BubbleDataInterpreter.cxx
+chart2/source/model/template/BubbleDataInterpreter.hxx
+chart2/source/model/template/CandleStickChartType.cxx
+chart2/source/model/template/CandleStickChartType.hxx
+chart2/source/model/template/ChartType.cxx
+chart2/source/model/template/ChartTypeManager.cxx
+chart2/source/model/template/ChartTypeTemplate.cxx
+chart2/source/model/template/ColumnChartType.cxx
+chart2/source/model/template/ColumnChartType.hxx
+chart2/source/model/template/ColumnLineChartTypeTemplate.cxx
+chart2/source/model/template/ColumnLineChartTypeTemplate.hxx
+chart2/source/model/template/ColumnLineDataInterpreter.cxx
+chart2/source/model/template/DataInterpreter.cxx
+chart2/source/model/template/FilledNetChartType.cxx
+chart2/source/model/template/LineChartType.cxx
+chart2/source/model/template/LineChartType.hxx
+chart2/source/model/template/LineChartTypeTemplate.cxx
+chart2/source/model/template/LineChartTypeTemplate.hxx
+chart2/source/model/template/NetChartType.cxx
+chart2/source/model/template/NetChartType.hxx
+chart2/source/model/template/NetChartTypeTemplate.cxx
+chart2/source/model/template/NetChartTypeTemplate.hxx
+chart2/source/model/template/PieChartType.cxx
+chart2/source/model/template/PieChartType.hxx
+chart2/source/model/template/PieChartTypeTemplate.cxx
+chart2/source/model/template/PieChartTypeTemplate.hxx
+chart2/source/model/template/ScatterChartType.cxx
+chart2/source/model/template/ScatterChartType.hxx
+chart2/source/model/template/ScatterChartTypeTemplate.cxx
+chart2/source/model/template/ScatterChartTypeTemplate.hxx
+chart2/source/model/template/StockChartTypeTemplate.cxx
+chart2/source/model/template/StockChartTypeTemplate.hxx
+chart2/source/model/template/StockDataInterpreter.cxx
+chart2/source/model/template/StockDataInterpreter.hxx
+chart2/source/model/template/XYDataInterpreter.cxx
+chart2/source/model/template/XYDataInterpreter.hxx
+chart2/source/tools/AxisHelper.cxx
+chart2/source/tools/BaseGFXHelper.cxx
+chart2/source/tools/CachedDataSequence.cxx
+chart2/source/tools/CharacterProperties.cxx
+chart2/source/tools/ChartModelHelper.cxx
+chart2/source/tools/ChartTypeHelper.cxx
+chart2/source/tools/ColorPerPointHelper.cxx
+chart2/source/tools/CommonConverters.cxx
+chart2/source/tools/ConfigColorScheme.cxx
+chart2/source/tools/ControllerLockGuard.cxx
+chart2/source/tools/DataSeriesHelper.cxx
+chart2/source/tools/DataSource.cxx
+chart2/source/tools/DataSourceHelper.cxx
+chart2/source/tools/DiagramHelper.cxx
+chart2/source/tools/ErrorBar.cxx
+chart2/source/tools/ExplicitCategoriesProvider.cxx
+chart2/source/tools/ExponentialRegressionCurveCalculator.cxx
+chart2/source/tools/FillProperties.cxx
+chart2/source/tools/FormattedStringHelper.cxx
+chart2/source/tools/InternalData.cxx
+chart2/source/tools/InternalDataProvider.cxx
+chart2/source/tools/LabeledDataSequence.cxx
+chart2/source/tools/LegendHelper.cxx
+chart2/source/tools/LifeTime.cxx
+chart2/source/tools/LinePropertiesHelper.cxx
+chart2/source/tools/LinearRegressionCurveCalculator.cxx
+chart2/source/tools/LogarithmicRegressionCurveCalculator.cxx
+chart2/source/tools/MeanValueRegressionCurveCalculator.cxx
+chart2/source/tools/MediaDescriptorHelper.cxx
+chart2/source/tools/ModifyListenerCallBack.cxx
+chart2/source/tools/ModifyListenerHelper.cxx
+chart2/source/tools/MovingAverageRegressionCurveCalculator.cxx
+chart2/source/tools/NameContainer.cxx
+chart2/source/tools/NumberFormatterWrapper.cxx
+chart2/source/tools/OPropertySet.cxx
+chart2/source/tools/ObjectIdentifier.cxx
+chart2/source/tools/PolynomialRegressionCurveCalculator.cxx
+chart2/source/tools/PotentialRegressionCurveCalculator.cxx
+chart2/source/tools/PropertyHelper.cxx
+chart2/source/tools/RangeHighlighter.cxx
+chart2/source/tools/ReferenceSizeProvider.cxx
+chart2/source/tools/RegressionCurveCalculator.cxx
+chart2/source/tools/RegressionCurveHelper.cxx
+chart2/source/tools/RegressionCurveModel.cxx
+chart2/source/tools/RegressionEquation.cxx
+chart2/source/tools/RegressionEquation.hxx
+chart2/source/tools/RelativePositionHelper.cxx
+chart2/source/tools/RelativeSizeHelper.cxx
+chart2/source/tools/ResId.cxx
+chart2/source/tools/Scaling.cxx
+chart2/source/tools/SceneProperties.cxx
+chart2/source/tools/StatisticsHelper.cxx
+chart2/source/tools/ThreeDHelper.cxx
+chart2/source/tools/TitleHelper.cxx
+chart2/source/tools/UncachedDataSequence.cxx
+chart2/source/tools/UserDefinedProperties.cxx
+chart2/source/tools/WeakListenerAdapter.cxx
+chart2/source/tools/WrappedDefaultProperty.cxx
+chart2/source/tools/WrappedDirectStateProperty.cxx
+chart2/source/tools/WrappedIgnoreProperty.cxx
+chart2/source/tools/WrappedProperty.cxx
+chart2/source/tools/WrappedPropertySet.cxx
+chart2/source/tools/XMLRangeHelper.cxx
+chart2/source/view/axes/DateHelper.cxx
+chart2/source/view/axes/DateScaling.cxx
+chart2/source/view/axes/DateScaling.hxx
+chart2/source/view/axes/MinimumAndMaximumSupplier.cxx
+chart2/source/view/axes/ScaleAutomatism.cxx
+chart2/source/view/axes/Tickmarks.cxx
+chart2/source/view/axes/Tickmarks.hxx
+chart2/source/view/axes/Tickmarks_Dates.cxx
+chart2/source/view/axes/Tickmarks_Dates.hxx
+chart2/source/view/axes/Tickmarks_Equidistant.cxx
+chart2/source/view/axes/Tickmarks_Equidistant.hxx
+chart2/source/view/axes/VAxisBase.cxx
+chart2/source/view/axes/VAxisBase.hxx
+chart2/source/view/axes/VAxisOrGridBase.cxx
+chart2/source/view/axes/VAxisOrGridBase.hxx
+chart2/source/view/axes/VAxisProperties.cxx
+chart2/source/view/axes/VAxisProperties.hxx
+chart2/source/view/axes/VCartesianAxis.cxx
+chart2/source/view/axes/VCartesianAxis.hxx
+chart2/source/view/axes/VCartesianCoordinateSystem.cxx
+chart2/source/view/axes/VCartesianCoordinateSystem.hxx
+chart2/source/view/axes/VCartesianGrid.cxx
+chart2/source/view/axes/VCartesianGrid.hxx
+chart2/source/view/axes/VCoordinateSystem.cxx
+chart2/source/view/axes/VPolarAngleAxis.cxx
+chart2/source/view/axes/VPolarAngleAxis.hxx
+chart2/source/view/axes/VPolarAxis.cxx
+chart2/source/view/axes/VPolarAxis.hxx
+chart2/source/view/axes/VPolarCoordinateSystem.cxx
+chart2/source/view/axes/VPolarCoordinateSystem.hxx
+chart2/source/view/axes/VPolarGrid.cxx
+chart2/source/view/axes/VPolarGrid.hxx
+chart2/source/view/axes/VPolarRadiusAxis.cxx
+chart2/source/view/axes/VPolarRadiusAxis.hxx
+chart2/source/view/charttypes/AreaChart.cxx
+chart2/source/view/charttypes/AreaChart.hxx
+chart2/source/view/charttypes/BarChart.cxx
+chart2/source/view/charttypes/BarChart.hxx
+chart2/source/view/charttypes/BarPositionHelper.cxx
+chart2/source/view/charttypes/BubbleChart.cxx
+chart2/source/view/charttypes/BubbleChart.hxx
+chart2/source/view/charttypes/CandleStickChart.cxx
+chart2/source/view/charttypes/CandleStickChart.hxx
+chart2/source/view/charttypes/CategoryPositionHelper.cxx
+chart2/source/view/charttypes/NetChart.cxx
+chart2/source/view/charttypes/NetChart.hxx
+chart2/source/view/charttypes/PieChart.cxx
+chart2/source/view/charttypes/PieChart.hxx
+chart2/source/view/charttypes/Splines.cxx
+chart2/source/view/charttypes/Splines.hxx
+chart2/source/view/charttypes/VSeriesPlotter.cxx
+chart2/source/view/diagram/VDiagram.cxx
+chart2/source/view/inc/Clipping.hxx
+chart2/source/view/inc/DateHelper.hxx
+chart2/source/view/inc/LabelPositionHelper.hxx
+chart2/source/view/inc/LegendEntryProvider.hxx
+chart2/source/view/inc/Linear3DTransformation.hxx
+chart2/source/view/inc/MinimumAndMaximumSupplier.hxx
+chart2/source/view/inc/PlotterBase.hxx
+chart2/source/view/inc/PlottingPositionHelper.hxx
+chart2/source/view/inc/PolarLabelPositionHelper.hxx
+chart2/source/view/inc/PropertyMapper.hxx
+chart2/source/view/inc/ScaleAutomatism.hxx
+chart2/source/view/inc/ShapeFactory.hxx
+chart2/source/view/inc/Stripe.hxx
+chart2/source/view/inc/VCoordinateSystem.hxx
+chart2/source/view/inc/VDataSeries.hxx
+chart2/source/view/inc/VDiagram.hxx
+chart2/source/view/inc/VLegendSymbolFactory.hxx
+chart2/source/view/inc/VPolarTransformation.hxx
+chart2/source/view/inc/VSeriesPlotter.hxx
+chart2/source/view/main/ChartItemPool.cxx
+chart2/source/view/main/ChartView.cxx
+chart2/source/view/main/Clipping.cxx
+chart2/source/view/main/DataPointSymbolSupplier.cxx
+chart2/source/view/main/DrawModelWrapper.cxx
+chart2/source/view/main/LabelPositionHelper.cxx
+chart2/source/view/main/Linear3DTransformation.cxx
+chart2/source/view/main/PlotterBase.cxx
+chart2/source/view/main/PlottingPositionHelper.cxx
+chart2/source/view/main/PolarLabelPositionHelper.cxx
+chart2/source/view/main/PropertyMapper.cxx
+chart2/source/view/main/ShapeFactory.cxx
+chart2/source/view/main/Stripe.cxx
+chart2/source/view/main/VButton.hxx
+chart2/source/view/main/VDataSeries.cxx
+chart2/source/view/main/VLegend.cxx
+chart2/source/view/main/VLegend.hxx
+chart2/source/view/main/VLegendSymbolFactory.cxx
+chart2/source/view/main/VPolarTransformation.cxx
+chart2/source/view/main/VTitle.cxx
+chart2/source/view/main/VTitle.hxx
+chart2/workbench/addin/sampleaddin.cxx
+chart2/workbench/addin/sampleaddin.hxx
+cli_ure/source/climaker/climaker_app.cxx
+cli_ure/source/climaker/climaker_emit.cxx
+cli_ure/source/climaker/climaker_share.h
+cli_ure/source/native/native_bootstrap.cxx
+cli_ure/source/native/native_share.h
+cli_ure/source/native/path.cxx
+cli_ure/source/uno_bridge/cli_base.h
+cli_ure/source/uno_bridge/cli_bridge.cxx
+cli_ure/source/uno_bridge/cli_bridge.h
+cli_ure/source/uno_bridge/cli_data.cxx
+cli_ure/source/uno_bridge/cli_environment.cxx
+cli_ure/source/uno_bridge/cli_proxy.cxx
+cli_ure/source/uno_bridge/cli_proxy.h
+cli_ure/source/uno_bridge/cli_uno.cxx
+codemaker/source/codemaker/codemaker.cxx
+codemaker/source/codemaker/exceptiontree.cxx
+codemaker/source/codemaker/global.cxx
+codemaker/source/codemaker/typemanager.cxx
+codemaker/source/codemaker/unotype.cxx
+codemaker/source/commoncpp/commoncpp.cxx
+codemaker/source/commonjava/commonjava.cxx
+codemaker/source/cppumaker/cppumaker.cxx
+codemaker/source/cppumaker/cppuoptions.cxx
+codemaker/source/cppumaker/cpputype.cxx
+codemaker/source/cppumaker/cpputype.hxx
+codemaker/source/cppumaker/dependencies.cxx
+codemaker/source/cppumaker/dependencies.hxx
+codemaker/source/cppumaker/dumputils.cxx
+codemaker/source/cppumaker/includes.cxx
+codemaker/source/cppumaker/includes.hxx
+codemaker/source/javamaker/classfile.cxx
+codemaker/source/javamaker/classfile.hxx
+codemaker/source/javamaker/javamaker.cxx
+codemaker/source/javamaker/javaoptions.cxx
+codemaker/source/javamaker/javatype.cxx
+codemaker/source/javamaker/javatype.hxx
+comphelper/qa/container/comphelper_ifcontainer.cxx
+comphelper/qa/container/testifcontainer.cxx
+comphelper/qa/string/test_string.cxx
+comphelper/qa/unit/syntaxhighlighttest.cxx
+comphelper/qa/unit/test_hash.cxx
+comphelper/qa/unit/variadictemplates.cxx
+comphelper/source/compare/AnyCompareFactory.cxx
+comphelper/source/container/IndexedPropertyValuesContainer.cxx
+comphelper/source/container/NamedPropertyValuesContainer.cxx
+comphelper/source/container/container.cxx
+comphelper/source/container/containermultiplexer.cxx
+comphelper/source/container/embeddedobjectcontainer.cxx
+comphelper/source/container/enumerablemap.cxx
+comphelper/source/container/enumhelper.cxx
+comphelper/source/container/interfacecontainer2.cxx
+comphelper/source/container/namecontainer.cxx
+comphelper/source/eventattachermgr/eventattachermgr.cxx
+comphelper/source/misc/SelectionMultiplex.cxx
+comphelper/source/misc/accessiblecomponenthelper.cxx
+comphelper/source/misc/accessiblecontexthelper.cxx
+comphelper/source/misc/accessibleeventnotifier.cxx
+comphelper/source/misc/accessiblekeybindinghelper.cxx
+comphelper/source/misc/accessibleselectionhelper.cxx
+comphelper/source/misc/accessibletexthelper.cxx
+comphelper/source/misc/accessiblewrapper.cxx
+comphelper/source/misc/accimplaccess.cxx
+comphelper/source/misc/anycompare.cxx
+comphelper/source/misc/anytohash.cxx
+comphelper/source/misc/anytostring.cxx
+comphelper/source/misc/asyncnotification.cxx
+comphelper/source/misc/backupfilehelper.cxx
+comphelper/source/misc/base64.cxx
+comphelper/source/misc/componentbase.cxx
+comphelper/source/misc/configuration.cxx
+comphelper/source/misc/configurationhelper.cxx
+comphelper/source/misc/dispatchcommand.cxx
+comphelper/source/misc/docpasswordhelper.cxx
+comphelper/source/misc/docpasswordrequest.cxx
+comphelper/source/misc/documentinfo.cxx
+comphelper/source/misc/evtlistenerhlp.cxx
+comphelper/source/misc/evtmethodhelper.cxx
+comphelper/source/misc/getexpandeduri.cxx
+comphelper/source/misc/hash.cxx
+comphelper/source/misc/instancelocker.cxx
+comphelper/source/misc/instancelocker.hxx
+comphelper/source/misc/interaction.cxx
+comphelper/source/misc/logging.cxx
+comphelper/source/misc/lok.cxx
+comphelper/source/misc/mimeconfighelper.cxx
+comphelper/source/misc/namedvaluecollection.cxx
+comphelper/source/misc/numberedcollection.cxx
+comphelper/source/misc/numbers.cxx
+comphelper/source/misc/officerestartmanager.cxx
+comphelper/source/misc/officerestartmanager.hxx
+comphelper/source/misc/profilezone.cxx
+comphelper/source/misc/proxyaggregation.cxx
+comphelper/source/misc/sequenceashashmap.cxx
+comphelper/source/misc/servicedecl.cxx
+comphelper/source/misc/sharedmutex.cxx
+comphelper/source/misc/solarmutex.cxx
+comphelper/source/misc/stillreadwriteinteraction.cxx
+comphelper/source/misc/storagehelper.cxx
+comphelper/source/misc/string.cxx
+comphelper/source/misc/synchronousdispatch.cxx
+comphelper/source/misc/syntaxhighlight.cxx
+comphelper/source/misc/threadpool.cxx
+comphelper/source/misc/weak.cxx
+comphelper/source/misc/weakeventlistener.cxx
+comphelper/source/misc/xmlsechelper.cxx
+comphelper/source/officeinstdir/officeinstallationdirectories.cxx
+comphelper/source/officeinstdir/officeinstallationdirectories.hxx
+comphelper/source/processfactory/processfactory.cxx
+comphelper/source/property/ChainablePropertySet.cxx
+comphelper/source/property/ChainablePropertySetInfo.cxx
+comphelper/source/property/MasterPropertySet.cxx
+comphelper/source/property/MasterPropertySetInfo.cxx
+comphelper/source/property/genericpropertyset.cxx
+comphelper/source/property/opropertybag.cxx
+comphelper/source/property/opropertybag.hxx
+comphelper/source/property/propagg.cxx
+comphelper/source/property/property.cxx
+comphelper/source/property/propertybag.cxx
+comphelper/source/property/propertycontainer.cxx
+comphelper/source/property/propertycontainerhelper.cxx
+comphelper/source/property/propertysethelper.cxx
+comphelper/source/property/propertysetinfo.cxx
+comphelper/source/property/propertystatecontainer.cxx
+comphelper/source/property/propmultiplex.cxx
+comphelper/source/property/propstate.cxx
+comphelper/source/streaming/basicio.cxx
+comphelper/source/streaming/memorystream.cxx
+comphelper/source/streaming/oslfile2streamwrap.cxx
+comphelper/source/streaming/seekableinput.cxx
+comphelper/source/streaming/seqinputstreamserv.cxx
+comphelper/source/streaming/seqoutputstreamserv.cxx
+comphelper/source/streaming/seqstream.cxx
+comphelper/source/streaming/streamsection.cxx
+comphelper/source/windows/windows_process.cxx
+comphelper/source/xml/attributelist.cxx
+comphelper/source/xml/ofopxmlhelper.cxx
+comphelper/source/xml/xmltools.cxx
+compilerplugins/clang/automem.cxx
+compilerplugins/clang/badstatics.cxx
+compilerplugins/clang/blockblock.cxx
+compilerplugins/clang/casttovoid.cxx
+compilerplugins/clang/charrightshift.cxx
+compilerplugins/clang/check.cxx
+compilerplugins/clang/check.hxx
+compilerplugins/clang/checkconfigmacros.cxx
+compilerplugins/clang/checkunusedparams.cxx
+compilerplugins/clang/commaoperator.cxx
+compilerplugins/clang/comparisonwithconstant.cxx
+compilerplugins/clang/compat.hxx
+compilerplugins/clang/constantparam.cxx
+compilerplugins/clang/constmethod.cxx
+compilerplugins/clang/constparams.cxx
+compilerplugins/clang/conststringvar.cxx
+compilerplugins/clang/countusersofdefaultparams.cxx
+compilerplugins/clang/cppunitassertequals.cxx
+compilerplugins/clang/cstylecast.cxx
+compilerplugins/clang/datamembershadow.cxx
+compilerplugins/clang/derefnullptr.cxx
+compilerplugins/clang/dllprivate.cxx
+compilerplugins/clang/dodgyswitch.cxx
+compilerplugins/clang/dyncastvisibility.cxx
+compilerplugins/clang/dynexcspec.cxx
+compilerplugins/clang/expandablemethods.cxx
+compilerplugins/clang/externandnotdefined.cxx
+compilerplugins/clang/faileddyncast.cxx
+compilerplugins/clang/fakebool.cxx
+compilerplugins/clang/finalclasses.cxx
+compilerplugins/clang/flatten.cxx
+compilerplugins/clang/fragiledestructor.cxx
+compilerplugins/clang/functionaddress.hxx
+compilerplugins/clang/getimplementationname.cxx
+compilerplugins/clang/implicitboolconversion.cxx
+compilerplugins/clang/includeform.cxx
+compilerplugins/clang/inlinefields.cxx
+compilerplugins/clang/inlinesimplememberfunctions.cxx
+compilerplugins/clang/inlinevisible.cxx
+compilerplugins/clang/literaltoboolconversion.cxx
+compilerplugins/clang/loopvartoosmall.cxx
+compilerplugins/clang/memoryvar.cxx
+compilerplugins/clang/mergeclasses.cxx
+compilerplugins/clang/nullptr.cxx
+compilerplugins/clang/oncevar.cxx
+compilerplugins/clang/oslendian.cxx
+compilerplugins/clang/overrideparam.cxx
+compilerplugins/clang/overridevirtual.cxx
+compilerplugins/clang/passparamsbyref.cxx
+compilerplugins/clang/passstuffbyref.cxx
+compilerplugins/clang/plugin.cxx
+compilerplugins/clang/plugin.hxx
+compilerplugins/clang/pluginhandler.cxx
+compilerplugins/clang/pluginhandler.hxx
+compilerplugins/clang/privatebase.cxx
+compilerplugins/clang/ptrvector.cxx
+compilerplugins/clang/rangedforcopy.cxx
+compilerplugins/clang/redundantcast.cxx
+compilerplugins/clang/redundantinline.cxx
+compilerplugins/clang/redundantpointerops.cxx
+compilerplugins/clang/redundantstatic.cxx
+compilerplugins/clang/refcounting.cxx
+compilerplugins/clang/rendercontext.cxx
+compilerplugins/clang/reservedid.cxx
+compilerplugins/clang/sallogareas.cxx
+compilerplugins/clang/salunicodeliteral.cxx
+compilerplugins/clang/sfxpoolitem.cxx
+compilerplugins/clang/sharedvisitor/analyzer.cxx
+compilerplugins/clang/sharedvisitor/dummyplugin.hxx
+compilerplugins/clang/sharedvisitor/generator.cxx
+compilerplugins/clang/singlevalfields.cxx
+compilerplugins/clang/staticaccess.cxx
+compilerplugins/clang/staticmethods.cxx
+compilerplugins/clang/store/badvectorinit.cxx
+compilerplugins/clang/store/bodynotinblock.cxx
+compilerplugins/clang/store/bodynotinblock.hxx
+compilerplugins/clang/store/cascadingassignop.cxx
+compilerplugins/clang/store/cascadingassignop.hxx
+compilerplugins/clang/store/cascadingcondop.hxx
+compilerplugins/clang/store/changefunctioncalls.cxx
+compilerplugins/clang/store/constantfunction.cxx
+compilerplugins/clang/store/deadclass.cxx
+compilerplugins/clang/store/defaultparams.cxx
+compilerplugins/clang/store/deletedspecial.cxx
+compilerplugins/clang/store/derivedclass.cxx
+compilerplugins/clang/store/finalprotected.cxx
+compilerplugins/clang/store/findoncontainer.cxx
+compilerplugins/clang/store/fpcomparison.cxx
+compilerplugins/clang/store/lclstaticfix.cxx
+compilerplugins/clang/store/lclstaticfix.hxx
+compilerplugins/clang/store/manualrefcount.cxx
+compilerplugins/clang/store/paintmethodconversion.cxx
+compilerplugins/clang/store/postfixincrementfix.cxx
+compilerplugins/clang/store/postfixincrementfix.hxx
+compilerplugins/clang/store/removeforwardstringdecl.cxx
+compilerplugins/clang/store/removeforwardstringdecl.hxx
+compilerplugins/clang/store/removevirtuals.cxx
+compilerplugins/clang/store/returnbyref.cxx
+compilerplugins/clang/store/returnunique.cxx
+compilerplugins/clang/store/revisibility.cxx
+compilerplugins/clang/store/rtlconstasciimacro.cxx
+compilerplugins/clang/store/sfxitemsetrewrite.cxx
+compilerplugins/clang/store/simplifybool.cxx
+compilerplugins/clang/store/stdexception.cxx
+compilerplugins/clang/store/stylepolice.cxx
+compilerplugins/clang/store/svstreamoutputoperators.cxx
+compilerplugins/clang/store/tutorial/tutorial1.cxx
+compilerplugins/clang/store/tutorial/tutorial1.hxx
+compilerplugins/clang/store/tutorial/tutorial1_example.cxx
+compilerplugins/clang/store/tutorial/tutorial2.cxx
+compilerplugins/clang/store/tutorial/tutorial2.hxx
+compilerplugins/clang/store/tutorial/tutorial2_example.cxx
+compilerplugins/clang/store/tutorial/tutorial3.cxx
+compilerplugins/clang/store/tutorial/tutorial3.hxx
+compilerplugins/clang/store/unusedcode.cxx
+compilerplugins/clang/store/valueof.cxx
+compilerplugins/clang/stringconcatauto.cxx
+compilerplugins/clang/stringconcatliterals.cxx
+compilerplugins/clang/stringconstant.cxx
+compilerplugins/clang/stringstatic.cxx
+compilerplugins/clang/subtlezeroinit.cxx
+compilerplugins/clang/test/badstatics.cxx
+compilerplugins/clang/test/blockblock.cxx
+compilerplugins/clang/test/casttovoid.cxx
+compilerplugins/clang/test/commaoperator.cxx
+compilerplugins/clang/test/constmethod.cxx
+compilerplugins/clang/test/constparams.cxx
+compilerplugins/clang/test/cppunitassertequals.cxx
+compilerplugins/clang/test/cppunitassertequals.hxx
+compilerplugins/clang/test/dodgyswitch.cxx
+compilerplugins/clang/test/expressionalwayszero.cxx
+compilerplugins/clang/test/faileddyncast.cxx
+compilerplugins/clang/test/fakebool.cxx
+compilerplugins/clang/test/finalprotected.cxx
+compilerplugins/clang/test/flatten.cxx
+compilerplugins/clang/test/indentation.cxx
+compilerplugins/clang/test/loopvartoosmall.cxx
+compilerplugins/clang/test/namespaceindentation.cxx
+compilerplugins/clang/test/oncevar.cxx
+compilerplugins/clang/test/oslendian-2.cxx
+compilerplugins/clang/test/oslendian-3.cxx
+compilerplugins/clang/test/passparamsbyref.cxx
+compilerplugins/clang/test/passstuffbyref.cxx
+compilerplugins/clang/test/redundantcast.cxx
+compilerplugins/clang/test/redundantinline.cxx
+compilerplugins/clang/test/redundantinline.hxx
+compilerplugins/clang/test/redundantpointerops.cxx
+compilerplugins/clang/test/salunicodeliteral.cxx
+compilerplugins/clang/test/stringconstant.cxx
+compilerplugins/clang/test/unnecessarycatchthrow.cxx
+compilerplugins/clang/test/unnecessaryoverride-dtor.cxx
+compilerplugins/clang/test/unnecessaryoverride-dtor.hxx
+compilerplugins/clang/test/unnecessaryparen.cxx
+compilerplugins/clang/test/unoany.cxx
+compilerplugins/clang/test/unusedfields.cxx
+compilerplugins/clang/test/useuniqueptr.cxx
+compilerplugins/clang/test/vclwidgets.cxx
+compilerplugins/clang/unicodetochar.cxx
+compilerplugins/clang/unnecessarycatchthrow.cxx
+compilerplugins/clang/unnecessaryoverride.cxx
+compilerplugins/clang/unnecessaryparen.cxx
+compilerplugins/clang/unnecessaryvirtual.cxx
+compilerplugins/clang/unoany.cxx
+compilerplugins/clang/unreffun.cxx
+compilerplugins/clang/unusedenumconstants.cxx
+compilerplugins/clang/unusedfields.cxx
+compilerplugins/clang/unusedfieldsremove.cxx
+compilerplugins/clang/unusedmethods.cxx
+compilerplugins/clang/unusedmethodsremove.cxx
+compilerplugins/clang/unusedvariablecheck.cxx
+compilerplugins/clang/unusedvariablecheck.hxx
+compilerplugins/clang/useuniqueptr.cxx
+compilerplugins/clang/vclwidgets.cxx
+compilerplugins/clang/weakobject.cxx
+configmgr/qa/unit/test.cxx
+configmgr/source/access.cxx
+configmgr/source/access.hxx
+configmgr/source/broadcaster.cxx
+configmgr/source/broadcaster.hxx
+configmgr/source/childaccess.cxx
+configmgr/source/childaccess.hxx
+configmgr/source/components.cxx
+configmgr/source/components.hxx
+configmgr/source/configurationprovider.cxx
+configmgr/source/configurationprovider.hxx
+configmgr/source/configurationregistry.cxx
+configmgr/source/data.cxx
+configmgr/source/data.hxx
+configmgr/source/dconf.cxx
+configmgr/source/dconf.hxx
+configmgr/source/groupnode.cxx
+configmgr/source/localizedpropertynode.cxx
+configmgr/source/localizedvaluenode.cxx
+configmgr/source/modifications.cxx
+configmgr/source/node.cxx
+configmgr/source/node.hxx
+configmgr/source/nodemap.hxx
+configmgr/source/parsemanager.cxx
+configmgr/source/parsemanager.hxx
+configmgr/source/parser.hxx
+configmgr/source/partial.cxx
+configmgr/source/partial.hxx
+configmgr/source/propertynode.cxx
+configmgr/source/propertynode.hxx
+configmgr/source/readonlyaccess.cxx
+configmgr/source/readwriteaccess.cxx
+configmgr/source/rootaccess.cxx
+configmgr/source/rootaccess.hxx
+configmgr/source/rootnode.cxx
+configmgr/source/setnode.cxx
+configmgr/source/setnode.hxx
+configmgr/source/type.cxx
+configmgr/source/type.hxx
+configmgr/source/update.cxx
+configmgr/source/valueparser.cxx
+configmgr/source/valueparser.hxx
+configmgr/source/winreg.cxx
+configmgr/source/winreg.hxx
+configmgr/source/writemodfile.cxx
+configmgr/source/writemodfile.hxx
+configmgr/source/xcdparser.cxx
+configmgr/source/xcdparser.hxx
+configmgr/source/xcsparser.cxx
+configmgr/source/xcsparser.hxx
+configmgr/source/xcuparser.cxx
+configmgr/source/xcuparser.hxx
+configmgr/source/xmldata.cxx
+configmgr/source/xmldata.hxx
+connectivity/inc/ParameterCont.hxx
+connectivity/inc/SQLStatementHelper.hxx
+connectivity/inc/TIndex.hxx
+connectivity/inc/TIndexColumns.hxx
+connectivity/inc/TKey.hxx
+connectivity/inc/TKeyColumns.hxx
+connectivity/inc/sdbcx/VCatalog.hxx
+connectivity/inc/sdbcx/VGroup.hxx
+connectivity/inc/sdbcx/VIndex.hxx
+connectivity/inc/sdbcx/VIndexColumn.hxx
+connectivity/inc/sdbcx/VKey.hxx
+connectivity/inc/sdbcx/VKeyColumn.hxx
+connectivity/inc/sdbcx/VTypeDef.hxx
+connectivity/inc/sdbcx/VUser.hxx
+connectivity/inc/strings.hxx
+connectivity/qa/connectivity/ado/DriverTest.cxx
+connectivity/qa/connectivity/commontools/FValue_test.cxx
+connectivity/source/commontools/AutoRetrievingBase.cxx
+connectivity/source/commontools/BlobHelper.cxx
+connectivity/source/commontools/CommonTools.cxx
+connectivity/source/commontools/ConnectionWrapper.cxx
+connectivity/source/commontools/DateConversion.cxx
+connectivity/source/commontools/DriversConfig.cxx
+connectivity/source/commontools/FDatabaseMetaDataResultSet.cxx
+connectivity/source/commontools/FDatabaseMetaDataResultSetMetaData.cxx
+connectivity/source/commontools/FValue.cxx
+connectivity/source/commontools/ParameterSubstitution.cxx
+connectivity/source/commontools/RowFunctionParser.cxx
+connectivity/source/commontools/TColumnsHelper.cxx
+connectivity/source/commontools/TConnection.cxx
+connectivity/source/commontools/TDatabaseMetaDataBase.cxx
+connectivity/source/commontools/TIndex.cxx
+connectivity/source/commontools/TIndexColumns.cxx
+connectivity/source/commontools/TIndexes.cxx
+connectivity/source/commontools/TKey.cxx
+connectivity/source/commontools/TKeyColumns.cxx
+connectivity/source/commontools/TKeys.cxx
+connectivity/source/commontools/TPrivilegesResultSet.cxx
+connectivity/source/commontools/TSkipDeletedSet.cxx
+connectivity/source/commontools/TSortIndex.cxx
+connectivity/source/commontools/TTableHelper.cxx
+connectivity/source/commontools/conncleanup.cxx
+connectivity/source/commontools/dbcharset.cxx
+connectivity/source/commontools/dbconversion.cxx
+connectivity/source/commontools/dbexception.cxx
+connectivity/source/commontools/dbmetadata.cxx
+connectivity/source/commontools/dbtools.cxx
+connectivity/source/commontools/dbtools2.cxx
+connectivity/source/commontools/filtermanager.cxx
+connectivity/source/commontools/formattedcolumnvalue.cxx
+connectivity/source/commontools/parameters.cxx
+connectivity/source/commontools/paramwrapper.cxx
+connectivity/source/commontools/predicateinput.cxx
+connectivity/source/commontools/propertyids.cxx
+connectivity/source/commontools/sqlerror.cxx
+connectivity/source/commontools/statementcomposer.cxx
+connectivity/source/commontools/warningscontainer.cxx
+connectivity/source/cpool/ZConnectionPool.cxx
+connectivity/source/cpool/ZConnectionPool.hxx
+connectivity/source/cpool/ZConnectionWrapper.cxx
+connectivity/source/cpool/ZConnectionWrapper.hxx
+connectivity/source/cpool/ZDriverWrapper.cxx
+connectivity/source/cpool/ZDriverWrapper.hxx
+connectivity/source/cpool/ZPoolCollection.cxx
+connectivity/source/cpool/ZPoolCollection.hxx
+connectivity/source/cpool/ZPooledConnection.cxx
+connectivity/source/cpool/ZPooledConnection.hxx
+connectivity/source/drivers/ado/ACallableStatement.cxx
+connectivity/source/drivers/ado/ACatalog.cxx
+connectivity/source/drivers/ado/AColumn.cxx
+connectivity/source/drivers/ado/AColumns.cxx
+connectivity/source/drivers/ado/AConnection.cxx
+connectivity/source/drivers/ado/ADatabaseMetaData.cxx
+connectivity/source/drivers/ado/ADatabaseMetaDataImpl.cxx
+connectivity/source/drivers/ado/ADatabaseMetaDataResultSet.cxx
+connectivity/source/drivers/ado/ADriver.cxx
+connectivity/source/drivers/ado/AGroup.cxx
+connectivity/source/drivers/ado/AGroups.cxx
+connectivity/source/drivers/ado/AIndex.cxx
+connectivity/source/drivers/ado/AIndexes.cxx
+connectivity/source/drivers/ado/AKey.cxx
+connectivity/source/drivers/ado/AKeys.cxx
+connectivity/source/drivers/ado/APreparedStatement.cxx
+connectivity/source/drivers/ado/AResultSet.cxx
+connectivity/source/drivers/ado/AResultSetMetaData.cxx
+connectivity/source/drivers/ado/AStatement.cxx
+connectivity/source/drivers/ado/ATable.cxx
+connectivity/source/drivers/ado/ATables.cxx
+connectivity/source/drivers/ado/AUser.cxx
+connectivity/source/drivers/ado/AUsers.cxx
+connectivity/source/drivers/ado/AView.cxx
+connectivity/source/drivers/ado/AViews.cxx
+connectivity/source/drivers/ado/Aolevariant.cxx
+connectivity/source/drivers/ado/Awrapado.cxx
+connectivity/source/drivers/ado/adoimp.cxx
+connectivity/source/drivers/calc/CConnection.cxx
+connectivity/source/drivers/calc/CDatabaseMetaData.cxx
+connectivity/source/drivers/calc/CDriver.cxx
+connectivity/source/drivers/calc/CTable.cxx
+connectivity/source/drivers/calc/CTables.cxx
+connectivity/source/drivers/component/CColumns.cxx
+connectivity/source/drivers/component/CDatabaseMetaData.cxx
+connectivity/source/drivers/component/CPreparedStatement.cxx
+connectivity/source/drivers/component/CResultSet.cxx
+connectivity/source/drivers/component/CTable.cxx
+connectivity/source/drivers/dbase/DColumns.cxx
+connectivity/source/drivers/dbase/DConnection.cxx
+connectivity/source/drivers/dbase/DDatabaseMetaData.cxx
+connectivity/source/drivers/dbase/DDriver.cxx
+connectivity/source/drivers/dbase/DIndex.cxx
+connectivity/source/drivers/dbase/DIndexColumns.cxx
+connectivity/source/drivers/dbase/DIndexes.cxx
+connectivity/source/drivers/dbase/DResultSet.cxx
+connectivity/source/drivers/dbase/DStatement.cxx
+connectivity/source/drivers/dbase/DTable.cxx
+connectivity/source/drivers/dbase/DTables.cxx
+connectivity/source/drivers/dbase/dindexnode.cxx
+connectivity/source/drivers/evoab2/EApi.cxx
+connectivity/source/drivers/evoab2/EApi.h
+connectivity/source/drivers/evoab2/NCatalog.cxx
+connectivity/source/drivers/evoab2/NCatalog.hxx
+connectivity/source/drivers/evoab2/NColumns.cxx
+connectivity/source/drivers/evoab2/NColumns.hxx
+connectivity/source/drivers/evoab2/NConnection.cxx
+connectivity/source/drivers/evoab2/NConnection.hxx
+connectivity/source/drivers/evoab2/NDatabaseMetaData.cxx
+connectivity/source/drivers/evoab2/NDatabaseMetaData.hxx
+connectivity/source/drivers/evoab2/NDriver.cxx
+connectivity/source/drivers/evoab2/NDriver.hxx
+connectivity/source/drivers/evoab2/NPreparedStatement.cxx
+connectivity/source/drivers/evoab2/NPreparedStatement.hxx
+connectivity/source/drivers/evoab2/NResultSet.cxx
+connectivity/source/drivers/evoab2/NResultSet.hxx
+connectivity/source/drivers/evoab2/NResultSetMetaData.cxx
+connectivity/source/drivers/evoab2/NResultSetMetaData.hxx
+connectivity/source/drivers/evoab2/NStatement.cxx
+connectivity/source/drivers/evoab2/NStatement.hxx
+connectivity/source/drivers/evoab2/NTable.cxx
+connectivity/source/drivers/evoab2/NTable.hxx
+connectivity/source/drivers/evoab2/NTables.cxx
+connectivity/source/drivers/evoab2/NTables.hxx
+connectivity/source/drivers/file/FCatalog.cxx
+connectivity/source/drivers/file/FColumns.cxx
+connectivity/source/drivers/file/FConnection.cxx
+connectivity/source/drivers/file/FDatabaseMetaData.cxx
+connectivity/source/drivers/file/FDriver.cxx
+connectivity/source/drivers/file/FNoException.cxx
+connectivity/source/drivers/file/FNumericFunctions.cxx
+connectivity/source/drivers/file/FPreparedStatement.cxx
+connectivity/source/drivers/file/FResultSet.cxx
+connectivity/source/drivers/file/FResultSetMetaData.cxx
+connectivity/source/drivers/file/FStatement.cxx
+connectivity/source/drivers/file/FTable.cxx
+connectivity/source/drivers/file/FTables.cxx
+connectivity/source/drivers/file/fanalyzer.cxx
+connectivity/source/drivers/file/fcode.cxx
+connectivity/source/drivers/file/fcomp.cxx
+connectivity/source/drivers/file/quotedstring.cxx
+connectivity/source/drivers/firebird/Blob.cxx
+connectivity/source/drivers/firebird/Blob.hxx
+connectivity/source/drivers/firebird/Catalog.cxx
+connectivity/source/drivers/firebird/Catalog.hxx
+connectivity/source/drivers/firebird/Clob.cxx
+connectivity/source/drivers/firebird/Clob.hxx
+connectivity/source/drivers/firebird/Column.cxx
+connectivity/source/drivers/firebird/Column.hxx
+connectivity/source/drivers/firebird/Columns.cxx
+connectivity/source/drivers/firebird/Columns.hxx
+connectivity/source/drivers/firebird/Connection.cxx
+connectivity/source/drivers/firebird/Connection.hxx
+connectivity/source/drivers/firebird/DatabaseMetaData.cxx
+connectivity/source/drivers/firebird/DatabaseMetaData.hxx
+connectivity/source/drivers/firebird/Driver.cxx
+connectivity/source/drivers/firebird/Driver.hxx
+connectivity/source/drivers/firebird/Indexes.hxx
+connectivity/source/drivers/firebird/Keys.cxx
+connectivity/source/drivers/firebird/Keys.hxx
+connectivity/source/drivers/firebird/PreparedStatement.cxx
+connectivity/source/drivers/firebird/PreparedStatement.hxx
+connectivity/source/drivers/firebird/ResultSet.cxx
+connectivity/source/drivers/firebird/ResultSet.hxx
+connectivity/source/drivers/firebird/ResultSetMetaData.cxx
+connectivity/source/drivers/firebird/ResultSetMetaData.hxx
+connectivity/source/drivers/firebird/Statement.cxx
+connectivity/source/drivers/firebird/Statement.hxx
+connectivity/source/drivers/firebird/StatementCommonBase.cxx
+connectivity/source/drivers/firebird/StatementCommonBase.hxx
+connectivity/source/drivers/firebird/SubComponent.hxx
+connectivity/source/drivers/firebird/Table.cxx
+connectivity/source/drivers/firebird/Table.hxx
+connectivity/source/drivers/firebird/Tables.cxx
+connectivity/source/drivers/firebird/Tables.hxx
+connectivity/source/drivers/firebird/User.cxx
+connectivity/source/drivers/firebird/User.hxx
+connectivity/source/drivers/firebird/Users.cxx
+connectivity/source/drivers/firebird/Users.hxx
+connectivity/source/drivers/firebird/Util.cxx
+connectivity/source/drivers/firebird/Util.hxx
+connectivity/source/drivers/flat/EColumns.cxx
+connectivity/source/drivers/flat/EConnection.cxx
+connectivity/source/drivers/flat/EDatabaseMetaData.cxx
+connectivity/source/drivers/flat/EDriver.cxx
+connectivity/source/drivers/flat/EResultSet.cxx
+connectivity/source/drivers/flat/EStatement.cxx
+connectivity/source/drivers/flat/ETable.cxx
+connectivity/source/drivers/flat/ETables.cxx
+connectivity/source/drivers/hsqldb/HCatalog.cxx
+connectivity/source/drivers/hsqldb/HColumns.cxx
+connectivity/source/drivers/hsqldb/HConnection.cxx
+connectivity/source/drivers/hsqldb/HDriver.cxx
+connectivity/source/drivers/hsqldb/HStorageAccess.cxx
+connectivity/source/drivers/hsqldb/HStorageMap.cxx
+connectivity/source/drivers/hsqldb/HTable.cxx
+connectivity/source/drivers/hsqldb/HTables.cxx
+connectivity/source/drivers/hsqldb/HTerminateListener.hxx
+connectivity/source/drivers/hsqldb/HTools.cxx
+connectivity/source/drivers/hsqldb/HUser.cxx
+connectivity/source/drivers/hsqldb/HUsers.cxx
+connectivity/source/drivers/hsqldb/HView.cxx
+connectivity/source/drivers/hsqldb/HViews.cxx
+connectivity/source/drivers/hsqldb/StorageFileAccess.cxx
+connectivity/source/drivers/hsqldb/StorageNativeInputStream.cxx
+connectivity/source/drivers/hsqldb/StorageNativeOutputStream.cxx
+connectivity/source/drivers/hsqldb/accesslog.cxx
+connectivity/source/drivers/hsqldb/accesslog.hxx
+connectivity/source/drivers/jdbc/Array.cxx
+connectivity/source/drivers/jdbc/Blob.cxx
+connectivity/source/drivers/jdbc/CallableStatement.cxx
+connectivity/source/drivers/jdbc/Clob.cxx
+connectivity/source/drivers/jdbc/ConnectionLog.cxx
+connectivity/source/drivers/jdbc/ContextClassLoader.cxx
+connectivity/source/drivers/jdbc/DatabaseMetaData.cxx
+connectivity/source/drivers/jdbc/InputStream.cxx
+connectivity/source/drivers/jdbc/JBigDecimal.cxx
+connectivity/source/drivers/jdbc/JConnection.cxx
+connectivity/source/drivers/jdbc/JDriver.cxx
+connectivity/source/drivers/jdbc/JStatement.cxx
+connectivity/source/drivers/jdbc/Object.cxx
+connectivity/source/drivers/jdbc/PreparedStatement.cxx
+connectivity/source/drivers/jdbc/Reader.cxx
+connectivity/source/drivers/jdbc/ResultSet.cxx
+connectivity/source/drivers/jdbc/ResultSetMetaData.cxx
+connectivity/source/drivers/jdbc/SQLException.cxx
+connectivity/source/drivers/jdbc/Timestamp.cxx
+connectivity/source/drivers/jdbc/tools.cxx
+connectivity/source/drivers/macab/MacabAddressBook.cxx
+connectivity/source/drivers/macab/MacabAddressBook.hxx
+connectivity/source/drivers/macab/MacabCatalog.cxx
+connectivity/source/drivers/macab/MacabCatalog.hxx
+connectivity/source/drivers/macab/MacabColumns.cxx
+connectivity/source/drivers/macab/MacabColumns.hxx
+connectivity/source/drivers/macab/MacabConnection.cxx
+connectivity/source/drivers/macab/MacabConnection.hxx
+connectivity/source/drivers/macab/MacabDatabaseMetaData.cxx
+connectivity/source/drivers/macab/MacabDatabaseMetaData.hxx
+connectivity/source/drivers/macab/MacabDriver.cxx
+connectivity/source/drivers/macab/MacabDriver.hxx
+connectivity/source/drivers/macab/MacabGroup.cxx
+connectivity/source/drivers/macab/MacabGroup.hxx
+connectivity/source/drivers/macab/MacabHeader.cxx
+connectivity/source/drivers/macab/MacabHeader.hxx
+connectivity/source/drivers/macab/MacabPreparedStatement.cxx
+connectivity/source/drivers/macab/MacabPreparedStatement.hxx
+connectivity/source/drivers/macab/MacabRecord.cxx
+connectivity/source/drivers/macab/MacabRecord.hxx
+connectivity/source/drivers/macab/MacabRecords.cxx
+connectivity/source/drivers/macab/MacabRecords.hxx
+connectivity/source/drivers/macab/MacabResultSet.cxx
+connectivity/source/drivers/macab/MacabResultSet.hxx
+connectivity/source/drivers/macab/MacabResultSetMetaData.cxx
+connectivity/source/drivers/macab/MacabResultSetMetaData.hxx
+connectivity/source/drivers/macab/MacabStatement.cxx
+connectivity/source/drivers/macab/MacabStatement.hxx
+connectivity/source/drivers/macab/MacabTable.cxx
+connectivity/source/drivers/macab/MacabTable.hxx
+connectivity/source/drivers/macab/MacabTables.cxx
+connectivity/source/drivers/macab/MacabTables.hxx
+connectivity/source/drivers/macab/macabcondition.cxx
+connectivity/source/drivers/macab/macabcondition.hxx
+connectivity/source/drivers/macab/macaborder.cxx
+connectivity/source/drivers/macab/macaborder.hxx
+connectivity/source/drivers/macab/macabutilities.hxx
+connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.cxx
+connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.hxx
+connectivity/source/drivers/mozab/bootstrap/MNSFolders.cxx
+connectivity/source/drivers/mozab/bootstrap/MNSINIParser.cxx
+connectivity/source/drivers/mozab/bootstrap/MNSINIParser.hxx
+connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.cxx
+connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.hxx
+connectivity/source/drivers/odbc/OConnection.cxx
+connectivity/source/drivers/odbc/ODatabaseMetaData.cxx
+connectivity/source/drivers/odbc/ODatabaseMetaDataResultSet.cxx
+connectivity/source/drivers/odbc/ODriver.cxx
+connectivity/source/drivers/odbc/OFunctions.cxx
+connectivity/source/drivers/odbc/OPreparedStatement.cxx
+connectivity/source/drivers/odbc/ORealDriver.cxx
+connectivity/source/drivers/odbc/OResultSet.cxx
+connectivity/source/drivers/odbc/OResultSetMetaData.cxx
+connectivity/source/drivers/odbc/OStatement.cxx
+connectivity/source/drivers/odbc/OTools.cxx
+connectivity/source/drivers/postgresql/pq_array.cxx
+connectivity/source/drivers/postgresql/pq_array.hxx
+connectivity/source/drivers/postgresql/pq_baseresultset.cxx
+connectivity/source/drivers/postgresql/pq_baseresultset.hxx
+connectivity/source/drivers/postgresql/pq_connection.cxx
+connectivity/source/drivers/postgresql/pq_connection.hxx
+connectivity/source/drivers/postgresql/pq_databasemetadata.cxx
+connectivity/source/drivers/postgresql/pq_databasemetadata.hxx
+connectivity/source/drivers/postgresql/pq_driver.cxx
+connectivity/source/drivers/postgresql/pq_driver.hxx
+connectivity/source/drivers/postgresql/pq_fakedupdateableresultset.cxx
+connectivity/source/drivers/postgresql/pq_fakedupdateableresultset.hxx
+connectivity/source/drivers/postgresql/pq_preparedstatement.cxx
+connectivity/source/drivers/postgresql/pq_preparedstatement.hxx
+connectivity/source/drivers/postgresql/pq_resultset.cxx
+connectivity/source/drivers/postgresql/pq_resultset.hxx
+connectivity/source/drivers/postgresql/pq_resultsetmetadata.cxx
+connectivity/source/drivers/postgresql/pq_resultsetmetadata.hxx
+connectivity/source/drivers/postgresql/pq_sequenceresultset.cxx
+connectivity/source/drivers/postgresql/pq_sequenceresultset.hxx
+connectivity/source/drivers/postgresql/pq_sequenceresultsetmetadata.cxx
+connectivity/source/drivers/postgresql/pq_sequenceresultsetmetadata.hxx
+connectivity/source/drivers/postgresql/pq_statement.cxx
+connectivity/source/drivers/postgresql/pq_statement.hxx
+connectivity/source/drivers/postgresql/pq_statics.cxx
+connectivity/source/drivers/postgresql/pq_statics.hxx
+connectivity/source/drivers/postgresql/pq_tools.cxx
+connectivity/source/drivers/postgresql/pq_tools.hxx
+connectivity/source/drivers/postgresql/pq_updateableresultset.cxx
+connectivity/source/drivers/postgresql/pq_updateableresultset.hxx
+connectivity/source/drivers/postgresql/pq_xbase.cxx
+connectivity/source/drivers/postgresql/pq_xbase.hxx
+connectivity/source/drivers/postgresql/pq_xcolumn.cxx
+connectivity/source/drivers/postgresql/pq_xcolumn.hxx
+connectivity/source/drivers/postgresql/pq_xcolumns.cxx
+connectivity/source/drivers/postgresql/pq_xcolumns.hxx
+connectivity/source/drivers/postgresql/pq_xcontainer.cxx
+connectivity/source/drivers/postgresql/pq_xcontainer.hxx
+connectivity/source/drivers/postgresql/pq_xindex.cxx
+connectivity/source/drivers/postgresql/pq_xindex.hxx
+connectivity/source/drivers/postgresql/pq_xindexcolumn.cxx
+connectivity/source/drivers/postgresql/pq_xindexcolumn.hxx
+connectivity/source/drivers/postgresql/pq_xindexcolumns.cxx
+connectivity/source/drivers/postgresql/pq_xindexcolumns.hxx
+connectivity/source/drivers/postgresql/pq_xindexes.cxx
+connectivity/source/drivers/postgresql/pq_xindexes.hxx
+connectivity/source/drivers/postgresql/pq_xkey.cxx
+connectivity/source/drivers/postgresql/pq_xkey.hxx
+connectivity/source/drivers/postgresql/pq_xkeycolumn.cxx
+connectivity/source/drivers/postgresql/pq_xkeycolumn.hxx
+connectivity/source/drivers/postgresql/pq_xkeycolumns.cxx
+connectivity/source/drivers/postgresql/pq_xkeycolumns.hxx
+connectivity/source/drivers/postgresql/pq_xkeys.cxx
+connectivity/source/drivers/postgresql/pq_xkeys.hxx
+connectivity/source/drivers/postgresql/pq_xtable.cxx
+connectivity/source/drivers/postgresql/pq_xtable.hxx
+connectivity/source/drivers/postgresql/pq_xtables.cxx
+connectivity/source/drivers/postgresql/pq_xtables.hxx
+connectivity/source/drivers/postgresql/pq_xuser.cxx
+connectivity/source/drivers/postgresql/pq_xuser.hxx
+connectivity/source/drivers/postgresql/pq_xusers.cxx
+connectivity/source/drivers/postgresql/pq_xusers.hxx
+connectivity/source/drivers/postgresql/pq_xview.cxx
+connectivity/source/drivers/postgresql/pq_xview.hxx
+connectivity/source/drivers/postgresql/pq_xviews.cxx
+connectivity/source/drivers/postgresql/pq_xviews.hxx
+connectivity/source/inc/AutoRetrievingBase.hxx
+connectivity/source/inc/FDatabaseMetaDataResultSet.hxx
+connectivity/source/inc/FDatabaseMetaDataResultSetMetaData.hxx
+connectivity/source/inc/OColumn.hxx
+connectivity/source/inc/OTypeInfo.hxx
+connectivity/source/inc/ParameterSubstitution.hxx
+connectivity/source/inc/TConnection.hxx
+connectivity/source/inc/TDatabaseMetaDataBase.hxx
+connectivity/source/inc/TKeyValue.hxx
+connectivity/source/inc/TPrivilegesResultSet.hxx
+connectivity/source/inc/TResultSetHelper.hxx
+connectivity/source/inc/TSkipDeletedSet.hxx
+connectivity/source/inc/TSortIndex.hxx
+connectivity/source/inc/ado/ACallableStatement.hxx
+connectivity/source/inc/ado/ACatalog.hxx
+connectivity/source/inc/ado/AColumn.hxx
+connectivity/source/inc/ado/AColumns.hxx
+connectivity/source/inc/ado/AConnection.hxx
+connectivity/source/inc/ado/ADatabaseMetaData.hxx
+connectivity/source/inc/ado/ADatabaseMetaDataResultSet.hxx
+connectivity/source/inc/ado/ADatabaseMetaDataResultSetMetaData.hxx
+connectivity/source/inc/ado/ADriver.hxx
+connectivity/source/inc/ado/AGroup.hxx
+connectivity/source/inc/ado/AGroups.hxx
+connectivity/source/inc/ado/AIndex.hxx
+connectivity/source/inc/ado/AIndexes.hxx
+connectivity/source/inc/ado/AKey.hxx
+connectivity/source/inc/ado/AKeys.hxx
+connectivity/source/inc/ado/APreparedStatement.hxx
+connectivity/source/inc/ado/AResultSet.hxx
+connectivity/source/inc/ado/AResultSetMetaData.hxx
+connectivity/source/inc/ado/AStatement.hxx
+connectivity/source/inc/ado/ATable.hxx
+connectivity/source/inc/ado/ATables.hxx
+connectivity/source/inc/ado/AUser.hxx
+connectivity/source/inc/ado/AUsers.hxx
+connectivity/source/inc/ado/AView.hxx
+connectivity/source/inc/ado/AViews.hxx
+connectivity/source/inc/ado/Aolevariant.hxx
+connectivity/source/inc/ado/Aolewrap.hxx
+connectivity/source/inc/ado/Awrapado.hxx
+connectivity/source/inc/ado/Awrapadox.hxx
+connectivity/source/inc/ado/WrapCatalog.hxx
+connectivity/source/inc/ado/WrapColumn.hxx
+connectivity/source/inc/ado/WrapIndex.hxx
+connectivity/source/inc/ado/WrapKey.hxx
+connectivity/source/inc/ado/WrapTable.hxx
+connectivity/source/inc/ado/WrapTypeDefs.hxx
+connectivity/source/inc/ado/adoimp.hxx
+connectivity/source/inc/calc/CCatalog.hxx
+connectivity/source/inc/calc/CConnection.hxx
+connectivity/source/inc/calc/CDatabaseMetaData.hxx
+connectivity/source/inc/calc/CDriver.hxx
+connectivity/source/inc/calc/CTable.hxx
+connectivity/source/inc/calc/CTables.hxx
+connectivity/source/inc/component/CColumns.hxx
+connectivity/source/inc/component/CDatabaseMetaData.hxx
+connectivity/source/inc/component/CPreparedStatement.hxx
+connectivity/source/inc/component/CResultSet.hxx
+connectivity/source/inc/component/CStatement.hxx
+connectivity/source/inc/component/CTable.hxx
+connectivity/source/inc/dbase/DCatalog.hxx
+connectivity/source/inc/dbase/DColumns.hxx
+connectivity/source/inc/dbase/DConnection.hxx
+connectivity/source/inc/dbase/DDatabaseMetaData.hxx
+connectivity/source/inc/dbase/DDriver.hxx
+connectivity/source/inc/dbase/DIndex.hxx
+connectivity/source/inc/dbase/DIndexColumns.hxx
+connectivity/source/inc/dbase/DIndexIter.hxx
+connectivity/source/inc/dbase/DIndexes.hxx
+connectivity/source/inc/dbase/DPreparedStatement.hxx
+connectivity/source/inc/dbase/DResultSet.hxx
+connectivity/source/inc/dbase/DStatement.hxx
+connectivity/source/inc/dbase/DTable.hxx
+connectivity/source/inc/dbase/DTables.hxx
+connectivity/source/inc/dbase/dindexnode.hxx
+connectivity/source/inc/file/FCatalog.hxx
+connectivity/source/inc/file/FColumns.hxx
+connectivity/source/inc/file/FConnection.hxx
+connectivity/source/inc/file/FDatabaseMetaData.hxx
+connectivity/source/inc/file/FDateFunctions.hxx
+connectivity/source/inc/file/FDriver.hxx
+connectivity/source/inc/file/FNumericFunctions.hxx
+connectivity/source/inc/file/FPreparedStatement.hxx
+connectivity/source/inc/file/FResultSet.hxx
+connectivity/source/inc/file/FResultSetMetaData.hxx
+connectivity/source/inc/file/FStatement.hxx
+connectivity/source/inc/file/FStringFunctions.hxx
+connectivity/source/inc/file/FTable.hxx
+connectivity/source/inc/file/FTables.hxx
+connectivity/source/inc/file/fanalyzer.hxx
+connectivity/source/inc/file/fcode.hxx
+connectivity/source/inc/file/fcomp.hxx
+connectivity/source/inc/file/quotedstring.hxx
+connectivity/source/inc/flat/ECatalog.hxx
+connectivity/source/inc/flat/EColumns.hxx
+connectivity/source/inc/flat/EConnection.hxx
+connectivity/source/inc/flat/EDatabaseMetaData.hxx
+connectivity/source/inc/flat/EDriver.hxx
+connectivity/source/inc/flat/EPreparedStatement.hxx
+connectivity/source/inc/flat/EResultSet.hxx
+connectivity/source/inc/flat/EStatement.hxx
+connectivity/source/inc/flat/ETable.hxx
+connectivity/source/inc/flat/ETables.hxx
+connectivity/source/inc/hsqldb/HCatalog.hxx
+connectivity/source/inc/hsqldb/HColumns.hxx
+connectivity/source/inc/hsqldb/HConnection.hxx
+connectivity/source/inc/hsqldb/HDriver.hxx
+connectivity/source/inc/hsqldb/HStorageAccess.hxx
+connectivity/source/inc/hsqldb/HStorageMap.hxx
+connectivity/source/inc/hsqldb/HTable.hxx
+connectivity/source/inc/hsqldb/HTables.hxx
+connectivity/source/inc/hsqldb/HTools.hxx
+connectivity/source/inc/hsqldb/HUser.hxx
+connectivity/source/inc/hsqldb/HUsers.hxx
+connectivity/source/inc/hsqldb/HView.hxx
+connectivity/source/inc/hsqldb/HViews.hxx
+connectivity/source/inc/java/ContextClassLoader.hxx
+connectivity/source/inc/java/GlobalRef.hxx
+connectivity/source/inc/java/LocalRef.hxx
+connectivity/source/inc/java/io/InputStream.hxx
+connectivity/source/inc/java/io/Reader.hxx
+connectivity/source/inc/java/lang/Boolean.hxx
+connectivity/source/inc/java/lang/Class.hxx
+connectivity/source/inc/java/lang/Exception.hxx
+connectivity/source/inc/java/lang/Object.hxx
+connectivity/source/inc/java/lang/String.hxx
+connectivity/source/inc/java/lang/Throwable.hxx
+connectivity/source/inc/java/math/BigDecimal.hxx
+connectivity/source/inc/java/sql/Array.hxx
+connectivity/source/inc/java/sql/Blob.hxx
+connectivity/source/inc/java/sql/CallableStatement.hxx
+connectivity/source/inc/java/sql/Clob.hxx
+connectivity/source/inc/java/sql/Connection.hxx
+connectivity/source/inc/java/sql/ConnectionLog.hxx
+connectivity/source/inc/java/sql/DatabaseMetaData.hxx
+connectivity/source/inc/java/sql/Driver.hxx
+connectivity/source/inc/java/sql/DriverPropertyInfo.hxx
+connectivity/source/inc/java/sql/JStatement.hxx
+connectivity/source/inc/java/sql/PreparedStatement.hxx
+connectivity/source/inc/java/sql/Ref.hxx
+connectivity/source/inc/java/sql/ResultSet.hxx
+connectivity/source/inc/java/sql/ResultSetMetaData.hxx
+connectivity/source/inc/java/sql/SQLException.hxx
+connectivity/source/inc/java/sql/SQLWarning.hxx
+connectivity/source/inc/java/sql/Timestamp.hxx
+connectivity/source/inc/java/tools.hxx
+connectivity/source/inc/java/util/Date.hxx
+connectivity/source/inc/java/util/Property.hxx
+connectivity/source/inc/mysql/YCatalog.hxx
+connectivity/source/inc/mysql/YColumns.hxx
+connectivity/source/inc/mysql/YDriver.hxx
+connectivity/source/inc/mysql/YTable.hxx
+connectivity/source/inc/mysql/YTables.hxx
+connectivity/source/inc/mysql/YUser.hxx
+connectivity/source/inc/mysql/YUsers.hxx
+connectivity/source/inc/mysql/YViews.hxx
+connectivity/source/inc/odbc/OBoundParam.hxx
+connectivity/source/inc/odbc/OConnection.hxx
+connectivity/source/inc/odbc/ODatabaseMetaData.hxx
+connectivity/source/inc/odbc/ODatabaseMetaDataResultSet.hxx
+connectivity/source/inc/odbc/ODriver.hxx
+connectivity/source/inc/odbc/OFunctions.hxx
+connectivity/source/inc/odbc/OPreparedStatement.hxx
+connectivity/source/inc/odbc/OResultSet.hxx
+connectivity/source/inc/odbc/OResultSetMetaData.hxx
+connectivity/source/inc/odbc/OStatement.hxx
+connectivity/source/inc/odbc/OTools.hxx
+connectivity/source/inc/propertyids.hxx
+connectivity/source/inc/resource/sharedresources.hxx
+connectivity/source/manager/mdrivermanager.cxx
+connectivity/source/manager/mdrivermanager.hxx
+connectivity/source/parse/PColumn.cxx
+connectivity/source/parse/internalnode.cxx
+connectivity/source/parse/sqliterator.cxx
+connectivity/source/parse/sqlnode.cxx
+connectivity/source/resource/sharedresources.cxx
+connectivity/source/sdbcx/VCatalog.cxx
+connectivity/source/sdbcx/VCollection.cxx
+connectivity/source/sdbcx/VColumn.cxx
+connectivity/source/sdbcx/VDescriptor.cxx
+connectivity/source/sdbcx/VGroup.cxx
+connectivity/source/sdbcx/VIndex.cxx
+connectivity/source/sdbcx/VIndexColumn.cxx
+connectivity/source/sdbcx/VKey.cxx
+connectivity/source/sdbcx/VKeyColumn.cxx
+connectivity/source/sdbcx/VTable.cxx
+connectivity/source/sdbcx/VUser.cxx
+connectivity/source/sdbcx/VView.cxx
+connectivity/workben/iniParser/main.cxx
+connectivity/workben/little/main.cxx
+connectivity/workben/skeleton/SResultSet.hxx
+cppcanvas/qa/unit/test.cxx
+cppcanvas/source/inc/action.hxx
+cppcanvas/source/inc/canvasgraphichelper.hxx
+cppcanvas/source/inc/implrenderer.hxx
+cppcanvas/source/inc/outdevstate.hxx
+cppcanvas/source/inc/tools.hxx
+cppcanvas/source/mtfrenderer/bitmapaction.cxx
+cppcanvas/source/mtfrenderer/bitmapaction.hxx
+cppcanvas/source/mtfrenderer/cachedprimitivebase.cxx
+cppcanvas/source/mtfrenderer/cachedprimitivebase.hxx
+cppcanvas/source/mtfrenderer/implrenderer.cxx
+cppcanvas/source/mtfrenderer/lineaction.cxx
+cppcanvas/source/mtfrenderer/lineaction.hxx
+cppcanvas/source/mtfrenderer/mtftools.cxx
+cppcanvas/source/mtfrenderer/mtftools.hxx
+cppcanvas/source/mtfrenderer/pointaction.cxx
+cppcanvas/source/mtfrenderer/pointaction.hxx
+cppcanvas/source/mtfrenderer/polypolyaction.cxx
+cppcanvas/source/mtfrenderer/polypolyaction.hxx
+cppcanvas/source/mtfrenderer/textaction.cxx
+cppcanvas/source/mtfrenderer/textaction.hxx
+cppcanvas/source/mtfrenderer/transparencygroupaction.cxx
+cppcanvas/source/mtfrenderer/transparencygroupaction.hxx
+cppcanvas/source/tools/canvasgraphichelper.cxx
+cppcanvas/source/tools/tools.cxx
+cppcanvas/source/uno/uno_mtfrenderer.cxx
+cppcanvas/source/wrapper/basegfxfactory.cxx
+cppcanvas/source/wrapper/implbitmap.cxx
+cppcanvas/source/wrapper/implbitmap.hxx
+cppcanvas/source/wrapper/implbitmapcanvas.cxx
+cppcanvas/source/wrapper/implbitmapcanvas.hxx
+cppcanvas/source/wrapper/implcanvas.cxx
+cppcanvas/source/wrapper/implcanvas.hxx
+cppcanvas/source/wrapper/implcustomsprite.cxx
+cppcanvas/source/wrapper/implcustomsprite.hxx
+cppcanvas/source/wrapper/implpolypolygon.cxx
+cppcanvas/source/wrapper/implpolypolygon.hxx
+cppcanvas/source/wrapper/implsprite.cxx
+cppcanvas/source/wrapper/implsprite.hxx
+cppcanvas/source/wrapper/implspritecanvas.cxx
+cppcanvas/source/wrapper/implspritecanvas.hxx
+cppcanvas/source/wrapper/vclfactory.cxx
+cppu/qa/any-external.cxx
+cppu/qa/cppumaker/test_cppumaker.cxx
+cppu/qa/test_any.cxx
+cppu/qa/test_recursion.cxx
+cppu/qa/test_reference.cxx
+cppu/qa/test_unotype.cxx
+cppu/source/AffineBridge/AffineBridge.cxx
+cppu/source/LogBridge/LogBridge.cxx
+cppu/source/UnsafeBridge/UnsafeBridge.cxx
+cppu/source/cppu/compat.cxx
+cppu/source/cppu/cppu_opt.cxx
+cppu/source/helper/purpenv/Proxy.hxx
+cppu/source/helper/purpenv/helper_purpenv_Environment.cxx
+cppu/source/helper/purpenv/helper_purpenv_Mapping.cxx
+cppu/source/helper/purpenv/helper_purpenv_Proxy.cxx
+cppu/source/threadpool/current.cxx
+cppu/source/threadpool/current.hxx
+cppu/source/threadpool/jobqueue.cxx
+cppu/source/threadpool/jobqueue.hxx
+cppu/source/threadpool/thread.cxx
+cppu/source/threadpool/thread.hxx
+cppu/source/threadpool/threadident.cxx
+cppu/source/threadpool/threadpool.cxx
+cppu/source/threadpool/threadpool.hxx
+cppu/source/typelib/static_types.cxx
+cppu/source/typelib/typelib.cxx
+cppu/source/typelib/typelib.hxx
+cppu/source/uno/EnvDcp.cxx
+cppu/source/uno/EnvStack.cxx
+cppu/source/uno/IdentityMapping.cxx
+cppu/source/uno/any.cxx
+cppu/source/uno/assign.hxx
+cppu/source/uno/cascade_mapping.cxx
+cppu/source/uno/cascade_mapping.hxx
+cppu/source/uno/check.cxx
+cppu/source/uno/constr.hxx
+cppu/source/uno/copy.hxx
+cppu/source/uno/data.cxx
+cppu/source/uno/destr.hxx
+cppu/source/uno/eq.hxx
+cppu/source/uno/lbenv.cxx
+cppu/source/uno/lbmap.cxx
+cppu/source/uno/loadmodule.cxx
+cppu/source/uno/prim.hxx
+cppu/source/uno/sequence.cxx
+cppuhelper/qa/ifcontainer/cppu_ifcontainer.cxx
+cppuhelper/qa/propertysetmixin/comp_propertysetmixin.cxx
+cppuhelper/qa/propertysetmixin/test_propertysetmixin.cxx
+cppuhelper/qa/unourl/cppu_unourl.cxx
+cppuhelper/qa/weak/test_weak.cxx
+cppuhelper/source/access_control.cxx
+cppuhelper/source/bootstrap.cxx
+cppuhelper/source/compat.cxx
+cppuhelper/source/component.cxx
+cppuhelper/source/component_context.cxx
+cppuhelper/source/defaultbootstrap.cxx
+cppuhelper/source/exc_thrower.cxx
+cppuhelper/source/factory.cxx
+cppuhelper/source/findsofficepath.c
+cppuhelper/source/implbase.cxx
+cppuhelper/source/implbase_ex.cxx
+cppuhelper/source/implementationentry.cxx
+cppuhelper/source/interfacecontainer.cxx
+cppuhelper/source/loadsharedlibcomponentfactory.hxx
+cppuhelper/source/macro_expander.cxx
+cppuhelper/source/macro_expander.hxx
+cppuhelper/source/paths.cxx
+cppuhelper/source/propertysetmixin.cxx
+cppuhelper/source/propshlp.cxx
+cppuhelper/source/servicemanager.cxx
+cppuhelper/source/servicemanager.hxx
+cppuhelper/source/shlib.cxx
+cppuhelper/source/tdmgr.cxx
+cppuhelper/source/typemanager.cxx
+cppuhelper/source/typemanager.hxx
+cppuhelper/source/typeprovider.cxx
+cppuhelper/source/unourl.cxx
+cppuhelper/source/weak.cxx
+cpputools/source/sp2bv/sp2bv.cxx
+cpputools/source/unoexe/unoexe.cxx
+cui/source/customize/cfg.cxx
+cui/source/customize/cfgutil.cxx
+cui/source/customize/eventdlg.cxx
+cui/source/customize/eventdlg.hxx
+cui/source/customize/macropg.cxx
+cui/source/customize/macropg_impl.hxx
+cui/source/dialogs/DiagramDialog.cxx
+cui/source/dialogs/SpellAttrib.hxx
+cui/source/dialogs/SpellDialog.cxx
+cui/source/dialogs/about.cxx
+cui/source/dialogs/colorpicker.cxx
+cui/source/dialogs/cuicharmap.cxx
+cui/source/dialogs/cuifmsearch.cxx
+cui/source/dialogs/cuigaldlg.cxx
+cui/source/dialogs/cuigrfflt.cxx
+cui/source/dialogs/cuihyperdlg.cxx
+cui/source/dialogs/hangulhanjadlg.cxx
+cui/source/dialogs/hldocntp.cxx
+cui/source/dialogs/hldoctp.cxx
+cui/source/dialogs/hlinettp.cxx
+cui/source/dialogs/hlmailtp.cxx
+cui/source/dialogs/hlmarkwn.cxx
+cui/source/dialogs/hltpbase.cxx
+cui/source/dialogs/hyphen.cxx
+cui/source/dialogs/iconcdlg.cxx
+cui/source/dialogs/insdlg.cxx
+cui/source/dialogs/insrc.cxx
+cui/source/dialogs/linkdlg.cxx
+cui/source/dialogs/multipat.cxx
+cui/source/dialogs/passwdomdlg.cxx
+cui/source/dialogs/pastedlg.cxx
+cui/source/dialogs/postdlg.cxx
+cui/source/dialogs/screenshotannotationdlg.cxx
+cui/source/dialogs/scriptdlg.cxx
+cui/source/dialogs/sdrcelldlg.cxx
+cui/source/dialogs/splitcelldlg.cxx
+cui/source/dialogs/srchxtra.cxx
+cui/source/dialogs/thesdlg.cxx
+cui/source/factory/dlgfact.cxx
+cui/source/factory/dlgfact.hxx
+cui/source/factory/init.cxx
+cui/source/inc/SpellDialog.hxx
+cui/source/inc/align.hxx
+cui/source/inc/autocdlg.hxx
+cui/source/inc/backgrnd.hxx
+cui/source/inc/bbdlg.hxx
+cui/source/inc/border.hxx
+cui/source/inc/cfg.hxx
+cui/source/inc/cfgutil.hxx
+cui/source/inc/chardlg.hxx
+cui/source/inc/connect.hxx
+cui/source/inc/cuigaldlg.hxx
+cui/source/inc/cuigrfflt.hxx
+cui/source/inc/cuihyperdlg.hxx
+cui/source/inc/cuiimapwnd.hxx
+cui/source/inc/cuioptgenrl.hxx
+cui/source/inc/cuisrchdlg.hxx
+cui/source/inc/cuitabarea.hxx
+cui/source/inc/cuitabline.hxx
+cui/source/inc/dbregister.hxx
+cui/source/inc/defdlgname.hxx
+cui/source/inc/grfpage.hxx
+cui/source/inc/hangulhanjadlg.hxx
+cui/source/inc/hldocntp.hxx
+cui/source/inc/hldoctp.hxx
+cui/source/inc/hlinettp.hxx
+cui/source/inc/hlmailtp.hxx
+cui/source/inc/hlmarkwn.hxx
+cui/source/inc/hltpbase.hxx
+cui/source/inc/hyphen.hxx
+cui/source/inc/iconcdlg.hxx
+cui/source/inc/insdlg.hxx
+cui/source/inc/labdlg.hxx
+cui/source/inc/macroass.hxx
+cui/source/inc/macropg.hxx
+cui/source/inc/measure.hxx
+cui/source/inc/multipat.hxx
+cui/source/inc/numfmt.hxx
+cui/source/inc/numpages.hxx
+cui/source/inc/optdict.hxx
+cui/source/inc/optlingu.hxx
+cui/source/inc/optpath.hxx
+cui/source/inc/page.hxx
+cui/source/inc/paragrph.hxx
+cui/source/inc/passwdomdlg.hxx
+cui/source/inc/pastedlg.hxx
+cui/source/inc/postdlg.hxx
+cui/source/inc/scriptdlg.hxx
+cui/source/inc/sdrcelldlg.hxx
+cui/source/inc/splitcelldlg.hxx
+cui/source/inc/srchxtra.hxx
+cui/source/inc/swpossizetabpage.hxx
+cui/source/inc/tabstpge.hxx
+cui/source/inc/textanim.hxx
+cui/source/inc/textattr.hxx
+cui/source/inc/thesdlg.hxx
+cui/source/inc/transfrm.hxx
+cui/source/inc/treeopt.hxx
+cui/source/inc/zoom.hxx
+cui/source/options/certpath.cxx
+cui/source/options/cfgchart.cxx
+cui/source/options/cfgchart.hxx
+cui/source/options/connpoolconfig.cxx
+cui/source/options/connpoolconfig.hxx
+cui/source/options/connpooloptions.cxx
+cui/source/options/connpooloptions.hxx
+cui/source/options/connpoolsettings.cxx
+cui/source/options/connpoolsettings.hxx
+cui/source/options/cuisrchdlg.cxx
+cui/source/options/dbregister.cxx
+cui/source/options/dbregisterednamesconfig.cxx
+cui/source/options/dbregisterednamesconfig.hxx
+cui/source/options/dbregistersettings.cxx
+cui/source/options/dbregistersettings.hxx
+cui/source/options/doclinkdialog.cxx
+cui/source/options/doclinkdialog.hxx
+cui/source/options/fontsubs.cxx
+cui/source/options/fontsubs.hxx
+cui/source/options/optaboutconfig.cxx
+cui/source/options/optaboutconfig.hxx
+cui/source/options/optaccessibility.cxx
+cui/source/options/optaccessibility.hxx
+cui/source/options/optasian.cxx
+cui/source/options/optbasic.cxx
+cui/source/options/optbasic.hxx
+cui/source/options/optchart.cxx
+cui/source/options/optchart.hxx
+cui/source/options/optcolor.cxx
+cui/source/options/optcolor.hxx
+cui/source/options/optctl.cxx
+cui/source/options/optctl.hxx
+cui/source/options/optdict.cxx
+cui/source/options/optfltr.cxx
+cui/source/options/optfltr.hxx
+cui/source/options/optgdlg.cxx
+cui/source/options/optgdlg.hxx
+cui/source/options/optgenrl.cxx
+cui/source/options/opthtml.cxx
+cui/source/options/opthtml.hxx
+cui/source/options/optinet2.cxx
+cui/source/options/optinet2.hxx
+cui/source/options/optjava.cxx
+cui/source/options/optjava.hxx
+cui/source/options/optjsearch.cxx
+cui/source/options/optjsearch.hxx
+cui/source/options/optlingu.cxx
+cui/source/options/optopencl.cxx
+cui/source/options/optopencl.hxx
+cui/source/options/optpath.cxx
+cui/source/options/optsave.cxx
+cui/source/options/optsave.hxx
+cui/source/options/optupdt.cxx
+cui/source/options/optupdt.hxx
+cui/source/options/sdbcdriverenum.cxx
+cui/source/options/sdbcdriverenum.hxx
+cui/source/options/securityoptions.cxx
+cui/source/options/securityoptions.hxx
+cui/source/options/treeopt.cxx
+cui/source/options/webconninfo.cxx
+cui/source/options/webconninfo.hxx
+cui/source/tabpages/align.cxx
+cui/source/tabpages/autocdlg.cxx
+cui/source/tabpages/backgrnd.cxx
+cui/source/tabpages/bbdlg.cxx
+cui/source/tabpages/border.cxx
+cui/source/tabpages/chardlg.cxx
+cui/source/tabpages/chardlg.h
+cui/source/tabpages/connect.cxx
+cui/source/tabpages/grfpage.cxx
+cui/source/tabpages/labdlg.cxx
+cui/source/tabpages/macroass.cxx
+cui/source/tabpages/measure.cxx
+cui/source/tabpages/numfmt.cxx
+cui/source/tabpages/numpages.cxx
+cui/source/tabpages/page.cxx
+cui/source/tabpages/paragrph.cxx
+cui/source/tabpages/swpossizetabpage.cxx
+cui/source/tabpages/tabarea.cxx
+cui/source/tabpages/tabline.cxx
+cui/source/tabpages/tabstpge.cxx
+cui/source/tabpages/textanim.cxx
+cui/source/tabpages/textattr.cxx
+cui/source/tabpages/tparea.cxx
+cui/source/tabpages/tpbitmap.cxx
+cui/source/tabpages/tpcolor.cxx
+cui/source/tabpages/tpgradnt.cxx
+cui/source/tabpages/tphatch.cxx
+cui/source/tabpages/tpline.cxx
+cui/source/tabpages/tplnedef.cxx
+cui/source/tabpages/tplneend.cxx
+cui/source/tabpages/tppattern.cxx
+cui/source/tabpages/tpshadow.cxx
+cui/source/tabpages/tptrans.cxx
+cui/source/tabpages/transfrm.cxx
+dbaccess/inc/core_resource.hxx
+dbaccess/inc/helpids.h
+dbaccess/qa/extras/dialog-save.cxx
+dbaccess/qa/extras/empty-stdlib-save.cxx
+dbaccess/qa/extras/nolib-save.cxx
+dbaccess/qa/extras/rowsetclones.cxx
+dbaccess/qa/unit/dbtest_base.cxx
+dbaccess/qa/unit/embeddeddb_performancetest.cxx
+dbaccess/qa/unit/firebird-regression.cxx
+dbaccess/qa/unit/firebird.cxx
+dbaccess/source/core/api/BookmarkSet.cxx
+dbaccess/source/core/api/BookmarkSet.hxx
+dbaccess/source/core/api/CIndexes.cxx
+dbaccess/source/core/api/CIndexes.hxx
+dbaccess/source/core/api/CRowSetColumn.cxx
+dbaccess/source/core/api/CRowSetColumn.hxx
+dbaccess/source/core/api/CRowSetDataColumn.cxx
+dbaccess/source/core/api/CRowSetDataColumn.hxx
+dbaccess/source/core/api/CacheSet.cxx
+dbaccess/source/core/api/CacheSet.hxx
+dbaccess/source/core/api/FilteredContainer.cxx
+dbaccess/source/core/api/HelperCollections.cxx
+dbaccess/source/core/api/HelperCollections.hxx
+dbaccess/source/core/api/KeySet.cxx
+dbaccess/source/core/api/KeySet.hxx
+dbaccess/source/core/api/OptimisticSet.cxx
+dbaccess/source/core/api/OptimisticSet.hxx
+dbaccess/source/core/api/PrivateRow.cxx
+dbaccess/source/core/api/PrivateRow.hxx
+dbaccess/source/core/api/RowSet.cxx
+dbaccess/source/core/api/RowSet.hxx
+dbaccess/source/core/api/RowSetBase.cxx
+dbaccess/source/core/api/RowSetBase.hxx
+dbaccess/source/core/api/RowSetCache.cxx
+dbaccess/source/core/api/RowSetCache.hxx
+dbaccess/source/core/api/RowSetCacheIterator.cxx
+dbaccess/source/core/api/RowSetCacheIterator.hxx
+dbaccess/source/core/api/RowSetRow.hxx
+dbaccess/source/core/api/SingleSelectQueryComposer.cxx
+dbaccess/source/core/api/StaticSet.cxx
+dbaccess/source/core/api/StaticSet.hxx
+dbaccess/source/core/api/TableDeco.cxx
+dbaccess/source/core/api/View.cxx
+dbaccess/source/core/api/WrappedResultSet.cxx
+dbaccess/source/core/api/WrappedResultSet.hxx
+dbaccess/source/core/api/callablestatement.cxx
+dbaccess/source/core/api/column.cxx
+dbaccess/source/core/api/columnsettings.cxx
+dbaccess/source/core/api/datacolumn.cxx
+dbaccess/source/core/api/datacolumn.hxx
+dbaccess/source/core/api/datasettings.cxx
+dbaccess/source/core/api/definitioncolumn.cxx
+dbaccess/source/core/api/preparedstatement.cxx
+dbaccess/source/core/api/query.cxx
+dbaccess/source/core/api/query.hxx
+dbaccess/source/core/api/querycomposer.cxx
+dbaccess/source/core/api/querycontainer.cxx
+dbaccess/source/core/api/querydescriptor.cxx
+dbaccess/source/core/api/querydescriptor.hxx
+dbaccess/source/core/api/resultcolumn.cxx
+dbaccess/source/core/api/resultcolumn.hxx
+dbaccess/source/core/api/resultset.cxx
+dbaccess/source/core/api/resultset.hxx
+dbaccess/source/core/api/statement.cxx
+dbaccess/source/core/api/table.cxx
+dbaccess/source/core/api/tablecontainer.cxx
+dbaccess/source/core/api/viewcontainer.cxx
+dbaccess/source/core/dataaccess/ComponentDefinition.cxx
+dbaccess/source/core/dataaccess/ComponentDefinition.hxx
+dbaccess/source/core/dataaccess/ContentHelper.cxx
+dbaccess/source/core/dataaccess/ModelImpl.cxx
+dbaccess/source/core/dataaccess/SharedConnection.hxx
+dbaccess/source/core/dataaccess/bookmarkcontainer.cxx
+dbaccess/source/core/dataaccess/commandcontainer.cxx
+dbaccess/source/core/dataaccess/commandcontainer.hxx
+dbaccess/source/core/dataaccess/commanddefinition.cxx
+dbaccess/source/core/dataaccess/commanddefinition.hxx
+dbaccess/source/core/dataaccess/connection.cxx
+dbaccess/source/core/dataaccess/connection.hxx
+dbaccess/source/core/dataaccess/dataaccessdescriptor.cxx
+dbaccess/source/core/dataaccess/databasecontext.cxx
+dbaccess/source/core/dataaccess/databasedocument.cxx
+dbaccess/source/core/dataaccess/databasedocument.hxx
+dbaccess/source/core/dataaccess/databaseregistrations.cxx
+dbaccess/source/core/dataaccess/datasource.cxx
+dbaccess/source/core/dataaccess/datasource.hxx
+dbaccess/source/core/dataaccess/definitioncontainer.cxx
+dbaccess/source/core/dataaccess/documentcontainer.cxx
+dbaccess/source/core/dataaccess/documentcontainer.hxx
+dbaccess/source/core/dataaccess/documentdefinition.cxx
+dbaccess/source/core/dataaccess/documentdefinition.hxx
+dbaccess/source/core/dataaccess/documenteventexecutor.cxx
+dbaccess/source/core/dataaccess/documenteventexecutor.hxx
+dbaccess/source/core/dataaccess/documenteventnotifier.cxx
+dbaccess/source/core/dataaccess/documenteventnotifier.hxx
+dbaccess/source/core/dataaccess/documentevents.cxx
+dbaccess/source/core/dataaccess/intercept.cxx
+dbaccess/source/core/dataaccess/intercept.hxx
+dbaccess/source/core/dataaccess/myucp_datasupplier.cxx
+dbaccess/source/core/dataaccess/myucp_resultset.cxx
+dbaccess/source/core/dataaccess/myucp_resultset.hxx
+dbaccess/source/core/inc/ContainerMediator.hxx
+dbaccess/source/core/inc/ContentHelper.hxx
+dbaccess/source/core/inc/DatabaseDataProvider.hxx
+dbaccess/source/core/inc/FilteredContainer.hxx
+dbaccess/source/core/inc/ModelImpl.hxx
+dbaccess/source/core/inc/PropertyForward.hxx
+dbaccess/source/core/inc/RefreshListener.hxx
+dbaccess/source/core/inc/SingleSelectQueryComposer.hxx
+dbaccess/source/core/inc/TableDeco.hxx
+dbaccess/source/core/inc/View.hxx
+dbaccess/source/core/inc/bookmarkcontainer.hxx
+dbaccess/source/core/inc/callablestatement.hxx
+dbaccess/source/core/inc/column.hxx
+dbaccess/source/core/inc/columnsettings.hxx
+dbaccess/source/core/inc/commandbase.hxx
+dbaccess/source/core/inc/composertools.hxx
+dbaccess/source/core/inc/containerapprove.hxx
+dbaccess/source/core/inc/databasecontext.hxx
+dbaccess/source/core/inc/datasettings.hxx
+dbaccess/source/core/inc/definitioncolumn.hxx
+dbaccess/source/core/inc/definitioncontainer.hxx
+dbaccess/source/core/inc/documentevents.hxx
+dbaccess/source/core/inc/objectnameapproval.hxx
+dbaccess/source/core/inc/preparedstatement.hxx
+dbaccess/source/core/inc/querycomposer.hxx
+dbaccess/source/core/inc/querycontainer.hxx
+dbaccess/source/core/inc/recovery/dbdocrecovery.hxx
+dbaccess/source/core/inc/sdbcoretools.hxx
+dbaccess/source/core/inc/statement.hxx
+dbaccess/source/core/inc/table.hxx
+dbaccess/source/core/inc/tablecontainer.hxx
+dbaccess/source/core/inc/veto.hxx
+dbaccess/source/core/inc/viewcontainer.hxx
+dbaccess/source/core/misc/ContainerMediator.cxx
+dbaccess/source/core/misc/DatabaseDataProvider.cxx
+dbaccess/source/core/misc/PropertyForward.cxx
+dbaccess/source/core/misc/apitools.cxx
+dbaccess/source/core/misc/dsntypes.cxx
+dbaccess/source/core/misc/objectnameapproval.cxx
+dbaccess/source/core/misc/sdbcoretools.cxx
+dbaccess/source/core/misc/veto.cxx
+dbaccess/source/core/recovery/dbdocrecovery.cxx
+dbaccess/source/core/recovery/settingsimport.cxx
+dbaccess/source/core/recovery/settingsimport.hxx
+dbaccess/source/core/recovery/storagestream.cxx
+dbaccess/source/core/recovery/storagestream.hxx
+dbaccess/source/core/recovery/storagetextstream.cxx
+dbaccess/source/core/recovery/storagetextstream.hxx
+dbaccess/source/core/recovery/storagexmlstream.cxx
+dbaccess/source/core/recovery/storagexmlstream.hxx
+dbaccess/source/core/recovery/subcomponentloader.cxx
+dbaccess/source/core/recovery/subcomponentloader.hxx
+dbaccess/source/core/recovery/subcomponentrecovery.cxx
+dbaccess/source/core/recovery/subcomponentrecovery.hxx
+dbaccess/source/core/recovery/subcomponents.hxx
+dbaccess/source/core/resource/core_resource.cxx
+dbaccess/source/filter/xml/dbloader2.cxx
+dbaccess/source/filter/xml/xmlAutoStyle.cxx
+dbaccess/source/filter/xml/xmlAutoStyle.hxx
+dbaccess/source/filter/xml/xmlColumn.cxx
+dbaccess/source/filter/xml/xmlColumn.hxx
+dbaccess/source/filter/xml/xmlComponent.cxx
+dbaccess/source/filter/xml/xmlComponent.hxx
+dbaccess/source/filter/xml/xmlConnectionData.cxx
+dbaccess/source/filter/xml/xmlConnectionData.hxx
+dbaccess/source/filter/xml/xmlConnectionResource.cxx
+dbaccess/source/filter/xml/xmlConnectionResource.hxx
+dbaccess/source/filter/xml/xmlDataSource.cxx
+dbaccess/source/filter/xml/xmlDataSource.hxx
+dbaccess/source/filter/xml/xmlDataSourceInfo.cxx
+dbaccess/source/filter/xml/xmlDataSourceInfo.hxx
+dbaccess/source/filter/xml/xmlDataSourceSetting.cxx
+dbaccess/source/filter/xml/xmlDataSourceSetting.hxx
+dbaccess/source/filter/xml/xmlDataSourceSettings.cxx
+dbaccess/source/filter/xml/xmlDataSourceSettings.hxx
+dbaccess/source/filter/xml/xmlDatabase.cxx
+dbaccess/source/filter/xml/xmlDatabase.hxx
+dbaccess/source/filter/xml/xmlDatabaseDescription.cxx
+dbaccess/source/filter/xml/xmlDatabaseDescription.hxx
+dbaccess/source/filter/xml/xmlDocuments.cxx
+dbaccess/source/filter/xml/xmlDocuments.hxx
+dbaccess/source/filter/xml/xmlExport.cxx
+dbaccess/source/filter/xml/xmlExport.hxx
+dbaccess/source/filter/xml/xmlFileBasedDatabase.cxx
+dbaccess/source/filter/xml/xmlFileBasedDatabase.hxx
+dbaccess/source/filter/xml/xmlHelper.cxx
+dbaccess/source/filter/xml/xmlHelper.hxx
+dbaccess/source/filter/xml/xmlHierarchyCollection.cxx
+dbaccess/source/filter/xml/xmlHierarchyCollection.hxx
+dbaccess/source/filter/xml/xmlLogin.cxx
+dbaccess/source/filter/xml/xmlLogin.hxx
+dbaccess/source/filter/xml/xmlQuery.cxx
+dbaccess/source/filter/xml/xmlQuery.hxx
+dbaccess/source/filter/xml/xmlServerDatabase.cxx
+dbaccess/source/filter/xml/xmlServerDatabase.hxx
+dbaccess/source/filter/xml/xmlStyleImport.cxx
+dbaccess/source/filter/xml/xmlStyleImport.hxx
+dbaccess/source/filter/xml/xmlTable.cxx
+dbaccess/source/filter/xml/xmlTable.hxx
+dbaccess/source/filter/xml/xmlTableFilterList.cxx
+dbaccess/source/filter/xml/xmlTableFilterList.hxx
+dbaccess/source/filter/xml/xmlTableFilterPattern.cxx
+dbaccess/source/filter/xml/xmlTableFilterPattern.hxx
+dbaccess/source/filter/xml/xmlfilter.cxx
+dbaccess/source/filter/xml/xmlfilter.hxx
+dbaccess/source/inc/OAuthenticationContinuation.hxx
+dbaccess/source/inc/apitools.hxx
+dbaccess/source/inc/dsntypes.hxx
+dbaccess/source/inc/stringconstants.hxx
+dbaccess/source/sdbtools/connection/connectiontools.cxx
+dbaccess/source/sdbtools/connection/datasourcemetadata.cxx
+dbaccess/source/sdbtools/connection/datasourcemetadata.hxx
+dbaccess/source/sdbtools/connection/objectnames.cxx
+dbaccess/source/sdbtools/connection/objectnames.hxx
+dbaccess/source/sdbtools/connection/tablename.cxx
+dbaccess/source/sdbtools/connection/tablename.hxx
+dbaccess/source/sdbtools/inc/connectiondependent.hxx
+dbaccess/source/sdbtools/inc/connectiontools.hxx
+dbaccess/source/ui/app/AppController.cxx
+dbaccess/source/ui/app/AppController.hxx
+dbaccess/source/ui/app/AppControllerDnD.cxx
+dbaccess/source/ui/app/AppControllerGen.cxx
+dbaccess/source/ui/app/AppDetailPageHelper.cxx
+dbaccess/source/ui/app/AppDetailPageHelper.hxx
+dbaccess/source/ui/app/AppDetailView.cxx
+dbaccess/source/ui/app/AppDetailView.hxx
+dbaccess/source/ui/app/AppIconControl.hxx
+dbaccess/source/ui/app/AppSwapWindow.hxx
+dbaccess/source/ui/app/AppTitleWindow.hxx
+dbaccess/source/ui/app/AppView.cxx
+dbaccess/source/ui/app/AppView.hxx
+dbaccess/source/ui/app/DocumentInfoPreview.cxx
+dbaccess/source/ui/app/DocumentInfoPreview.hxx
+dbaccess/source/ui/app/subcomponentmanager.cxx
+dbaccess/source/ui/app/subcomponentmanager.hxx
+dbaccess/source/ui/app/templwin.cxx
+dbaccess/source/ui/browser/brwctrlr.cxx
+dbaccess/source/ui/browser/brwview.cxx
+dbaccess/source/ui/browser/dataview.cxx
+dbaccess/source/ui/browser/dbexchange.cxx
+dbaccess/source/ui/browser/dbloader.cxx
+dbaccess/source/ui/browser/dbtreemodel.cxx
+dbaccess/source/ui/browser/dbtreemodel.hxx
+dbaccess/source/ui/browser/dsEntriesNoExp.cxx
+dbaccess/source/ui/browser/dsbrowserDnD.cxx
+dbaccess/source/ui/browser/exsrcbrw.cxx
+dbaccess/source/ui/browser/formadapter.cxx
+dbaccess/source/ui/browser/genericcontroller.cxx
+dbaccess/source/ui/browser/sbagrid.cxx
+dbaccess/source/ui/browser/sbamultiplex.cxx
+dbaccess/source/ui/browser/unodatbr.cxx
+dbaccess/source/ui/control/ColumnControlWindow.cxx
+dbaccess/source/ui/control/FieldControls.cxx
+dbaccess/source/ui/control/FieldDescControl.cxx
+dbaccess/source/ui/control/RelationControl.cxx
+dbaccess/source/ui/control/SqlNameEdit.cxx
+dbaccess/source/ui/control/TableGrantCtrl.cxx
+dbaccess/source/ui/control/charsetlistbox.cxx
+dbaccess/source/ui/control/curledit.cxx
+dbaccess/source/ui/control/dbtreelistbox.cxx
+dbaccess/source/ui/control/opendoccontrols.cxx
+dbaccess/source/ui/control/sqledit.cxx
+dbaccess/source/ui/control/tabletree.cxx
+dbaccess/source/ui/dlg/CollectionView.cxx
+dbaccess/source/ui/dlg/ConnectionHelper.cxx
+dbaccess/source/ui/dlg/ConnectionHelper.hxx
+dbaccess/source/ui/dlg/ConnectionPage.cxx
+dbaccess/source/ui/dlg/ConnectionPage.hxx
+dbaccess/source/ui/dlg/ConnectionPageSetup.cxx
+dbaccess/source/ui/dlg/ConnectionPageSetup.hxx
+dbaccess/source/ui/dlg/DBSetupConnectionPages.cxx
+dbaccess/source/ui/dlg/DBSetupConnectionPages.hxx
+dbaccess/source/ui/dlg/DbAdminImpl.cxx
+dbaccess/source/ui/dlg/DbAdminImpl.hxx
+dbaccess/source/ui/dlg/DriverSettings.hxx
+dbaccess/source/ui/dlg/QueryPropertiesDialog.cxx
+dbaccess/source/ui/dlg/RelationDlg.cxx
+dbaccess/source/ui/dlg/TablesSingleDlg.cxx
+dbaccess/source/ui/dlg/TextConnectionHelper.cxx
+dbaccess/source/ui/dlg/TextConnectionHelper.hxx
+dbaccess/source/ui/dlg/UserAdmin.cxx
+dbaccess/source/ui/dlg/UserAdmin.hxx
+dbaccess/source/ui/dlg/UserAdminDlg.cxx
+dbaccess/source/ui/dlg/admincontrols.cxx
+dbaccess/source/ui/dlg/admincontrols.hxx
+dbaccess/source/ui/dlg/adminpages.cxx
+dbaccess/source/ui/dlg/adminpages.hxx
+dbaccess/source/ui/dlg/adodatalinks.cxx
+dbaccess/source/ui/dlg/adtabdlg.cxx
+dbaccess/source/ui/dlg/advancedsettings.cxx
+dbaccess/source/ui/dlg/advancedsettings.hxx
+dbaccess/source/ui/dlg/dbadmin.cxx
+dbaccess/source/ui/dlg/dbfindex.cxx
+dbaccess/source/ui/dlg/dbfindex.hxx
+dbaccess/source/ui/dlg/dbwiz.cxx
+dbaccess/source/ui/dlg/dbwizsetup.cxx
+dbaccess/source/ui/dlg/detailpages.cxx
+dbaccess/source/ui/dlg/detailpages.hxx
+dbaccess/source/ui/dlg/directsql.cxx
+dbaccess/source/ui/dlg/dlgattr.cxx
+dbaccess/source/ui/dlg/dlgsave.cxx
+dbaccess/source/ui/dlg/dlgsize.cxx
+dbaccess/source/ui/dlg/dsnItem.hxx
+dbaccess/source/ui/dlg/dsselect.cxx
+dbaccess/source/ui/dlg/finteraction.cxx
+dbaccess/source/ui/dlg/finteraction.hxx
+dbaccess/source/ui/dlg/generalpage.cxx
+dbaccess/source/ui/dlg/generalpage.hxx
+dbaccess/source/ui/dlg/indexdialog.cxx
+dbaccess/source/ui/dlg/indexfieldscontrol.cxx
+dbaccess/source/ui/dlg/odbcconfig.cxx
+dbaccess/source/ui/dlg/odbcconfig.hxx
+dbaccess/source/ui/dlg/optionalboolitem.cxx
+dbaccess/source/ui/dlg/optionalboolitem.hxx
+dbaccess/source/ui/dlg/paramdialog.cxx
+dbaccess/source/ui/dlg/queryfilter.cxx
+dbaccess/source/ui/dlg/queryorder.cxx
+dbaccess/source/ui/dlg/sqlmessage.cxx
+dbaccess/source/ui/dlg/tablespage.cxx
+dbaccess/source/ui/dlg/tablespage.hxx
+dbaccess/source/ui/dlg/textconnectionsettings.cxx
+dbaccess/source/ui/inc/AppElementType.hxx
+dbaccess/source/ui/inc/CollectionView.hxx
+dbaccess/source/ui/inc/ColumnControlWindow.hxx
+dbaccess/source/ui/inc/ConnectionLine.hxx
+dbaccess/source/ui/inc/ConnectionLineAccess.hxx
+dbaccess/source/ui/inc/ConnectionLineData.hxx
+dbaccess/source/ui/inc/DExport.hxx
+dbaccess/source/ui/inc/FieldControls.hxx
+dbaccess/source/ui/inc/FieldDescControl.hxx
+dbaccess/source/ui/inc/FieldDescriptions.hxx
+dbaccess/source/ui/inc/GeneralUndo.hxx
+dbaccess/source/ui/inc/HtmlReader.hxx
+dbaccess/source/ui/inc/IClipBoardTest.hxx
+dbaccess/source/ui/inc/IItemSetHelper.hxx
+dbaccess/source/ui/inc/IUpdateHelper.hxx
+dbaccess/source/ui/inc/JAccess.hxx
+dbaccess/source/ui/inc/JoinController.hxx
+dbaccess/source/ui/inc/JoinDesignView.hxx
+dbaccess/source/ui/inc/JoinExchange.hxx
+dbaccess/source/ui/inc/JoinTableView.hxx
+dbaccess/source/ui/inc/QEnumTypes.hxx
+dbaccess/source/ui/inc/QueryDesignView.hxx
+dbaccess/source/ui/inc/QueryPropertiesDialog.hxx
+dbaccess/source/ui/inc/QueryTableView.hxx
+dbaccess/source/ui/inc/QueryTextView.hxx
+dbaccess/source/ui/inc/QueryViewSwitch.hxx
+dbaccess/source/ui/inc/RTableConnectionData.hxx
+dbaccess/source/ui/inc/RelControliFace.hxx
+dbaccess/source/ui/inc/RelationControl.hxx
+dbaccess/source/ui/inc/RelationController.hxx
+dbaccess/source/ui/inc/RelationDesignView.hxx
+dbaccess/source/ui/inc/RelationDlg.hxx
+dbaccess/source/ui/inc/RelationTableView.hxx
+dbaccess/source/ui/inc/RtfReader.hxx
+dbaccess/source/ui/inc/SqlNameEdit.hxx
+dbaccess/source/ui/inc/TableConnection.hxx
+dbaccess/source/ui/inc/TableConnectionData.hxx
+dbaccess/source/ui/inc/TableController.hxx
+dbaccess/source/ui/inc/TableCopyHelper.hxx
+dbaccess/source/ui/inc/TableDesignControl.hxx
+dbaccess/source/ui/inc/TableDesignHelpBar.hxx
+dbaccess/source/ui/inc/TableDesignView.hxx
+dbaccess/source/ui/inc/TableFieldDescription.hxx
+dbaccess/source/ui/inc/TableGrantCtrl.hxx
+dbaccess/source/ui/inc/TableRow.hxx
+dbaccess/source/ui/inc/TableRowExchange.hxx
+dbaccess/source/ui/inc/TableWindow.hxx
+dbaccess/source/ui/inc/TableWindowAccess.hxx
+dbaccess/source/ui/inc/TableWindowData.hxx
+dbaccess/source/ui/inc/TableWindowListBox.hxx
+dbaccess/source/ui/inc/TableWindowTitle.hxx
+dbaccess/source/ui/inc/TablesSingleDlg.hxx
+dbaccess/source/ui/inc/TokenWriter.hxx
+dbaccess/source/ui/inc/TypeInfo.hxx
+dbaccess/source/ui/inc/UITools.hxx
+dbaccess/source/ui/inc/UserAdminDlg.hxx
+dbaccess/source/ui/inc/WCPage.hxx
+dbaccess/source/ui/inc/WColumnSelect.hxx
+dbaccess/source/ui/inc/WCopyTable.hxx
+dbaccess/source/ui/inc/WExtendPages.hxx
+dbaccess/source/ui/inc/WNameMatch.hxx
+dbaccess/source/ui/inc/WTabPage.hxx
+dbaccess/source/ui/inc/WTypeSelect.hxx
+dbaccess/source/ui/inc/adtabdlg.hxx
+dbaccess/source/ui/inc/advancedsettingsdlg.hxx
+dbaccess/source/ui/inc/asyncmodaldialog.hxx
+dbaccess/source/ui/inc/browserids.hxx
+dbaccess/source/ui/inc/brwctrlr.hxx
+dbaccess/source/ui/inc/brwview.hxx
+dbaccess/source/ui/inc/callbacks.hxx
+dbaccess/source/ui/inc/charsetlistbox.hxx
+dbaccess/source/ui/inc/charsets.hxx
+dbaccess/source/ui/inc/commontypes.hxx
+dbaccess/source/ui/inc/curledit.hxx
+dbaccess/source/ui/inc/databaseobjectview.hxx
+dbaccess/source/ui/inc/datasourceconnector.hxx
+dbaccess/source/ui/inc/dbadmin.hxx
+dbaccess/source/ui/inc/dbexchange.hxx
+dbaccess/source/ui/inc/dbtreelistbox.hxx
+dbaccess/source/ui/inc/dbwiz.hxx
+dbaccess/source/ui/inc/dbwizsetup.hxx
+dbaccess/source/ui/inc/defaultobjectnamecheck.hxx
+dbaccess/source/ui/inc/directsql.hxx
+dbaccess/source/ui/inc/dlgattr.hxx
+dbaccess/source/ui/inc/dlgsave.hxx
+dbaccess/source/ui/inc/dlgsize.hxx
+dbaccess/source/ui/inc/dsitems.hxx
+dbaccess/source/ui/inc/dsmeta.hxx
+dbaccess/source/ui/inc/exsrcbrw.hxx
+dbaccess/source/ui/inc/formadapter.hxx
+dbaccess/source/ui/inc/imageprovider.hxx
+dbaccess/source/ui/inc/indexcollection.hxx
+dbaccess/source/ui/inc/indexdialog.hxx
+dbaccess/source/ui/inc/indexes.hxx
+dbaccess/source/ui/inc/indexfieldscontrol.hxx
+dbaccess/source/ui/inc/linkeddocuments.hxx
+dbaccess/source/ui/inc/objectnamecheck.hxx
+dbaccess/source/ui/inc/opendoccontrols.hxx
+dbaccess/source/ui/inc/paramdialog.hxx
+dbaccess/source/ui/inc/propertystorage.hxx
+dbaccess/source/ui/inc/querycontainerwindow.hxx
+dbaccess/source/ui/inc/querycontroller.hxx
+dbaccess/source/ui/inc/queryfilter.hxx
+dbaccess/source/ui/inc/queryorder.hxx
+dbaccess/source/ui/inc/sbagrid.hxx
+dbaccess/source/ui/inc/sbamultiplex.hxx
+dbaccess/source/ui/inc/singledoccontroller.hxx
+dbaccess/source/ui/inc/sqledit.hxx
+dbaccess/source/ui/inc/sqlmessage.hxx
+dbaccess/source/ui/inc/tabletree.hxx
+dbaccess/source/ui/inc/textconnectionsettings.hxx
+dbaccess/source/ui/inc/undosqledit.hxx
+dbaccess/source/ui/inc/unoadmin.hxx
+dbaccess/source/ui/inc/unodatbr.hxx
+dbaccess/source/ui/inc/unosqlmessage.hxx
+dbaccess/source/ui/misc/DExport.cxx
+dbaccess/source/ui/misc/HtmlReader.cxx
+dbaccess/source/ui/misc/RowSetDrop.cxx
+dbaccess/source/ui/misc/RtfReader.cxx
+dbaccess/source/ui/misc/TableCopyHelper.cxx
+dbaccess/source/ui/misc/TokenWriter.cxx
+dbaccess/source/ui/misc/UITools.cxx
+dbaccess/source/ui/misc/UpdateHelperImpl.hxx
+dbaccess/source/ui/misc/WCPage.cxx
+dbaccess/source/ui/misc/WColumnSelect.cxx
+dbaccess/source/ui/misc/WCopyTable.cxx
+dbaccess/source/ui/misc/WExtendPages.cxx
+dbaccess/source/ui/misc/WNameMatch.cxx
+dbaccess/source/ui/misc/WTypeSelect.cxx
+dbaccess/source/ui/misc/asyncmodaldialog.cxx
+dbaccess/source/ui/misc/charsets.cxx
+dbaccess/source/ui/misc/controllerframe.cxx
+dbaccess/source/ui/misc/databaseobjectview.cxx
+dbaccess/source/ui/misc/datasourceconnector.cxx
+dbaccess/source/ui/misc/dbaundomanager.cxx
+dbaccess/source/ui/misc/dbsubcomponentcontroller.cxx
+dbaccess/source/ui/misc/defaultobjectnamecheck.cxx
+dbaccess/source/ui/misc/dsmeta.cxx
+dbaccess/source/ui/misc/imageprovider.cxx
+dbaccess/source/ui/misc/indexcollection.cxx
+dbaccess/source/ui/misc/linkeddocuments.cxx
+dbaccess/source/ui/misc/propertystorage.cxx
+dbaccess/source/ui/misc/singledoccontroller.cxx
+dbaccess/source/ui/querydesign/ConnectionLine.cxx
+dbaccess/source/ui/querydesign/ConnectionLineAccess.cxx
+dbaccess/source/ui/querydesign/ConnectionLineData.cxx
+dbaccess/source/ui/querydesign/JAccess.cxx
+dbaccess/source/ui/querydesign/JoinController.cxx
+dbaccess/source/ui/querydesign/JoinDesignView.cxx
+dbaccess/source/ui/querydesign/JoinExchange.cxx
+dbaccess/source/ui/querydesign/JoinTableView.cxx
+dbaccess/source/ui/querydesign/QTableConnection.cxx
+dbaccess/source/ui/querydesign/QTableConnection.hxx
+dbaccess/source/ui/querydesign/QTableConnectionData.cxx
+dbaccess/source/ui/querydesign/QTableConnectionData.hxx
+dbaccess/source/ui/querydesign/QTableWindow.cxx
+dbaccess/source/ui/querydesign/QTableWindow.hxx
+dbaccess/source/ui/querydesign/QTableWindowData.cxx
+dbaccess/source/ui/querydesign/QTableWindowData.hxx
+dbaccess/source/ui/querydesign/QueryAddTabConnUndoAction.hxx
+dbaccess/source/ui/querydesign/QueryDesignFieldUndoAct.hxx
+dbaccess/source/ui/querydesign/QueryDesignUndoAction.hxx
+dbaccess/source/ui/querydesign/QueryDesignView.cxx
+dbaccess/source/ui/querydesign/QueryMoveTabWinUndoAct.hxx
+dbaccess/source/ui/querydesign/QuerySizeTabWinUndoAct.hxx
+dbaccess/source/ui/querydesign/QueryTabConnUndoAction.hxx
+dbaccess/source/ui/querydesign/QueryTabWinShowUndoAct.hxx
+dbaccess/source/ui/querydesign/QueryTabWinUndoAct.cxx
+dbaccess/source/ui/querydesign/QueryTabWinUndoAct.hxx
+dbaccess/source/ui/querydesign/QueryTableView.cxx
+dbaccess/source/ui/querydesign/QueryViewSwitch.cxx
+dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx
+dbaccess/source/ui/querydesign/SelectionBrowseBox.hxx
+dbaccess/source/ui/querydesign/TableConnection.cxx
+dbaccess/source/ui/querydesign/TableConnectionData.cxx
+dbaccess/source/ui/querydesign/TableFieldDescription.cxx
+dbaccess/source/ui/querydesign/TableFieldInfo.hxx
+dbaccess/source/ui/querydesign/TableWindow.cxx
+dbaccess/source/ui/querydesign/TableWindowAccess.cxx
+dbaccess/source/ui/querydesign/TableWindowData.cxx
+dbaccess/source/ui/querydesign/TableWindowTitle.cxx
+dbaccess/source/ui/querydesign/limitboxcontroller.cxx
+dbaccess/source/ui/querydesign/limitboxcontroller.hxx
+dbaccess/source/ui/querydesign/querycontainerwindow.cxx
+dbaccess/source/ui/querydesign/querycontroller.cxx
+dbaccess/source/ui/querydesign/querydlg.cxx
+dbaccess/source/ui/querydesign/querydlg.hxx
+dbaccess/source/ui/relationdesign/RTableConnection.cxx
+dbaccess/source/ui/relationdesign/RTableConnection.hxx
+dbaccess/source/ui/relationdesign/RTableConnectionData.cxx
+dbaccess/source/ui/relationdesign/RTableWindow.hxx
+dbaccess/source/ui/relationdesign/RelationController.cxx
+dbaccess/source/ui/relationdesign/RelationDesignView.cxx
+dbaccess/source/ui/relationdesign/RelationTableView.cxx
+dbaccess/source/ui/tabledesign/FieldDescriptions.cxx
+dbaccess/source/ui/tabledesign/TEditControl.cxx
+dbaccess/source/ui/tabledesign/TEditControl.hxx
+dbaccess/source/ui/tabledesign/TableController.cxx
+dbaccess/source/ui/tabledesign/TableDesignControl.cxx
+dbaccess/source/ui/tabledesign/TableDesignView.cxx
+dbaccess/source/ui/tabledesign/TableFieldControl.cxx
+dbaccess/source/ui/tabledesign/TableFieldControl.hxx
+dbaccess/source/ui/tabledesign/TableFieldDescWin.cxx
+dbaccess/source/ui/tabledesign/TableFieldDescWin.hxx
+dbaccess/source/ui/tabledesign/TableRow.cxx
+dbaccess/source/ui/tabledesign/TableRowExchange.cxx
+dbaccess/source/ui/tabledesign/TableUndo.cxx
+dbaccess/source/ui/tabledesign/TableUndo.hxx
+dbaccess/source/ui/uno/AdvancedSettingsDlg.cxx
+dbaccess/source/ui/uno/ColumnControl.cxx
+dbaccess/source/ui/uno/ColumnControl.hxx
+dbaccess/source/ui/uno/ColumnModel.cxx
+dbaccess/source/ui/uno/ColumnModel.hxx
+dbaccess/source/ui/uno/ColumnPeer.cxx
+dbaccess/source/ui/uno/ColumnPeer.hxx
+dbaccess/source/ui/uno/DBTypeWizDlg.cxx
+dbaccess/source/ui/uno/DBTypeWizDlg.hxx
+dbaccess/source/ui/uno/DBTypeWizDlgSetup.cxx
+dbaccess/source/ui/uno/DBTypeWizDlgSetup.hxx
+dbaccess/source/ui/uno/TableFilterDlg.cxx
+dbaccess/source/ui/uno/TableFilterDlg.hxx
+dbaccess/source/ui/uno/UserSettingsDlg.cxx
+dbaccess/source/ui/uno/UserSettingsDlg.hxx
+dbaccess/source/ui/uno/admindlg.hxx
+dbaccess/source/ui/uno/composerdialogs.cxx
+dbaccess/source/ui/uno/composerdialogs.hxx
+dbaccess/source/ui/uno/copytablewizard.cxx
+dbaccess/source/ui/uno/dbinteraction.cxx
+dbaccess/source/ui/uno/dbinteraction.hxx
+dbaccess/source/ui/uno/textconnectionsettings_uno.cxx
+dbaccess/source/ui/uno/unoDirectSql.cxx
+dbaccess/source/ui/uno/unoDirectSql.hxx
+dbaccess/source/ui/uno/unoadmin.cxx
+dbaccess/source/ui/uno/unosqlmessage.cxx
+dbaccess/win32/source/odbcconfig/odbcconfig.cxx
+desktop/inc/app.hxx
+desktop/inc/dp_misc.h
+desktop/inc/dp_shared.hxx
+desktop/inc/lib/init.hxx
+desktop/qa/deployment_misc/test_dp_version.cxx
+desktop/qa/desktop_app/test_desktop_app.cxx
+desktop/qa/desktop_lib/test_desktop_lib.cxx
+desktop/source/app/app.cxx
+desktop/source/app/appinit.cxx
+desktop/source/app/check_ext_deps.cxx
+desktop/source/app/cmdlineargs.cxx
+desktop/source/app/cmdlineargs.hxx
+desktop/source/app/cmdlinehelp.cxx
+desktop/source/app/crashreport.cxx
+desktop/source/app/desktopcontext.hxx
+desktop/source/app/dispatchwatcher.cxx
+desktop/source/app/dispatchwatcher.hxx
+desktop/source/app/langselect.cxx
+desktop/source/app/lockfile2.cxx
+desktop/source/app/officeipcthread.cxx
+desktop/source/app/officeipcthread.hxx
+desktop/source/app/opencl.cxx
+desktop/source/app/sofficemain.cxx
+desktop/source/app/updater.cxx
+desktop/source/app/userinstall.cxx
+desktop/source/deployment/dp_log.cxx
+desktop/source/deployment/dp_persmap.cxx
+desktop/source/deployment/dp_xml.cxx
+desktop/source/deployment/gui/dp_gui.h
+desktop/source/deployment/gui/dp_gui_dialog2.cxx
+desktop/source/deployment/gui/dp_gui_dialog2.hxx
+desktop/source/deployment/gui/dp_gui_extensioncmdqueue.cxx
+desktop/source/deployment/gui/dp_gui_extensioncmdqueue.hxx
+desktop/source/deployment/gui/dp_gui_extlistbox.cxx
+desktop/source/deployment/gui/dp_gui_extlistbox.hxx
+desktop/source/deployment/gui/dp_gui_service.cxx
+desktop/source/deployment/gui/dp_gui_theextmgr.cxx
+desktop/source/deployment/gui/dp_gui_theextmgr.hxx
+desktop/source/deployment/gui/dp_gui_updatedata.hxx
+desktop/source/deployment/gui/dp_gui_updatedialog.cxx
+desktop/source/deployment/gui/dp_gui_updatedialog.hxx
+desktop/source/deployment/gui/dp_gui_updateinstalldialog.cxx
+desktop/source/deployment/gui/dp_gui_updateinstalldialog.hxx
+desktop/source/deployment/gui/license_dialog.cxx
+desktop/source/deployment/inc/dp_dependencies.hxx
+desktop/source/deployment/inc/dp_descriptioninfoset.hxx
+desktop/source/deployment/inc/dp_identifier.hxx
+desktop/source/deployment/inc/dp_interact.h
+desktop/source/deployment/inc/dp_package.hxx
+desktop/source/deployment/inc/dp_registry.hxx
+desktop/source/deployment/inc/dp_ucb.h
+desktop/source/deployment/inc/dp_update.hxx
+desktop/source/deployment/inc/dp_version.hxx
+desktop/source/deployment/inc/dp_xml.h
+desktop/source/deployment/inc/lockfile.hxx
+desktop/source/deployment/manager/dp_activepackages.cxx
+desktop/source/deployment/manager/dp_activepackages.hxx
+desktop/source/deployment/manager/dp_commandenvironments.cxx
+desktop/source/deployment/manager/dp_commandenvironments.hxx
+desktop/source/deployment/manager/dp_extensionmanager.cxx
+desktop/source/deployment/manager/dp_extensionmanager.hxx
+desktop/source/deployment/manager/dp_informationprovider.cxx
+desktop/source/deployment/manager/dp_manager.cxx
+desktop/source/deployment/manager/dp_manager.h
+desktop/source/deployment/manager/dp_managerfac.cxx
+desktop/source/deployment/manager/dp_properties.cxx
+desktop/source/deployment/misc/dp_dependencies.cxx
+desktop/source/deployment/misc/dp_descriptioninfoset.cxx
+desktop/source/deployment/misc/dp_identifier.cxx
+desktop/source/deployment/misc/dp_interact.cxx
+desktop/source/deployment/misc/dp_misc.cxx
+desktop/source/deployment/misc/dp_platform.cxx
+desktop/source/deployment/misc/dp_ucb.cxx
+desktop/source/deployment/misc/dp_update.cxx
+desktop/source/deployment/misc/dp_version.cxx
+desktop/source/deployment/misc/lockfile.cxx
+desktop/source/deployment/registry/component/dp_compbackenddb.cxx
+desktop/source/deployment/registry/component/dp_compbackenddb.hxx
+desktop/source/deployment/registry/component/dp_component.cxx
+desktop/source/deployment/registry/configuration/dp_configuration.cxx
+desktop/source/deployment/registry/configuration/dp_configurationbackenddb.cxx
+desktop/source/deployment/registry/dp_backend.cxx
+desktop/source/deployment/registry/dp_backenddb.cxx
+desktop/source/deployment/registry/dp_registry.cxx
+desktop/source/deployment/registry/executable/dp_executable.cxx
+desktop/source/deployment/registry/executable/dp_executablebackenddb.cxx
+desktop/source/deployment/registry/help/dp_help.cxx
+desktop/source/deployment/registry/help/dp_helpbackenddb.cxx
+desktop/source/deployment/registry/inc/dp_backend.h
+desktop/source/deployment/registry/inc/dp_backenddb.hxx
+desktop/source/deployment/registry/package/dp_extbackenddb.cxx
+desktop/source/deployment/registry/package/dp_package.cxx
+desktop/source/deployment/registry/script/dp_lib_container.cxx
+desktop/source/deployment/registry/script/dp_lib_container.h
+desktop/source/deployment/registry/script/dp_script.cxx
+desktop/source/deployment/registry/script/dp_scriptbackenddb.cxx
+desktop/source/deployment/registry/script/dp_scriptbackenddb.hxx
+desktop/source/deployment/registry/sfwk/dp_parceldesc.cxx
+desktop/source/deployment/registry/sfwk/dp_parceldesc.hxx
+desktop/source/deployment/registry/sfwk/dp_sfwk.cxx
+desktop/source/inc/helpids.h
+desktop/source/lib/init.cxx
+desktop/source/lib/lokandroid.cxx
+desktop/source/lib/lokinteractionhandler.cxx
+desktop/source/lib/lokinteractionhandler.hxx
+desktop/source/migration/migration.cxx
+desktop/source/migration/migration_impl.hxx
+desktop/source/migration/services/basicmigration.cxx
+desktop/source/migration/services/basicmigration.hxx
+desktop/source/migration/services/jvmfwk.cxx
+desktop/source/migration/services/misc.hxx
+desktop/source/migration/services/oo3extensionmigration.cxx
+desktop/source/migration/services/oo3extensionmigration.hxx
+desktop/source/migration/services/wordbookmigration.cxx
+desktop/source/migration/services/wordbookmigration.hxx
+desktop/source/minidump/minidump.cxx
+desktop/source/offacc/acceptor.cxx
+desktop/source/offacc/acceptor.hxx
+desktop/source/pkgchk/unopkg/unopkg_app.cxx
+desktop/source/pkgchk/unopkg/unopkg_cmdenv.cxx
+desktop/source/pkgchk/unopkg/unopkg_misc.cxx
+desktop/source/pkgchk/unopkg/unopkg_shared.h
+desktop/source/splash/splash.cxx
+desktop/source/splash/unxsplash.cxx
+desktop/source/splash/unxsplash.hxx
+desktop/test/deployment/active/active_native.cxx
+desktop/test/deployment/passive/passive_native.cxx
+desktop/unx/source/args.c
+desktop/unx/source/args.h
+desktop/unx/source/file_image.h
+desktop/unx/source/file_image_unx.c
+desktop/unx/source/pagein.c
+desktop/unx/source/splashx.c
+desktop/unx/source/start.c
+desktop/win32/source/QuickStart/QuickStart.cxx
+desktop/win32/source/QuickStart/resource.h
+desktop/win32/source/applauncher/launcher.cxx
+desktop/win32/source/loader.cxx
+desktop/win32/source/loader.hxx
+desktop/win32/source/unoinfo.cxx
+drawinglayer/inc/converters.hxx
+drawinglayer/inc/emfplushelper.hxx
+drawinglayer/inc/primitive2d/cropprimitive2d.hxx
+drawinglayer/inc/primitive2d/graphicprimitivehelper2d.hxx
+drawinglayer/inc/primitive2d/textlineprimitive2d.hxx
+drawinglayer/inc/primitive2d/textstrikeoutprimitive2d.hxx
+drawinglayer/inc/primitive2d/wallpaperprimitive2d.hxx
+drawinglayer/inc/primitive3d/hatchtextureprimitive3d.hxx
+drawinglayer/inc/primitive3d/hiddengeometryprimitive3d.hxx
+drawinglayer/inc/primitive3d/polygontubeprimitive3d.hxx
+drawinglayer/inc/primitive3d/sdrdecompositiontools3d.hxx
+drawinglayer/inc/primitive3d/shadowprimitive3d.hxx
+drawinglayer/inc/primitive3d/textureprimitive3d.hxx
+drawinglayer/inc/processor3d/defaultprocessor3d.hxx
+drawinglayer/inc/processor3d/geometry2dextractor.hxx
+drawinglayer/inc/processor3d/shadow3dextractor.hxx
+drawinglayer/inc/processor3d/zbufferprocessor3d.hxx
+drawinglayer/inc/texture/texture.hxx
+drawinglayer/inc/texture/texture3d.hxx
+drawinglayer/inc/wmfemfhelper.hxx
+drawinglayer/source/animation/animationtiming.cxx
+drawinglayer/source/attribute/fillgradientattribute.cxx
+drawinglayer/source/attribute/fillgraphicattribute.cxx
+drawinglayer/source/attribute/fillhatchattribute.cxx
+drawinglayer/source/attribute/lineattribute.cxx
+drawinglayer/source/attribute/linestartendattribute.cxx
+drawinglayer/source/attribute/materialattribute3d.cxx
+drawinglayer/source/attribute/sdrallattribute3d.cxx
+drawinglayer/source/attribute/sdrfillattribute.cxx
+drawinglayer/source/attribute/sdrfillgraphicattribute.cxx
+drawinglayer/source/attribute/sdrlightattribute3d.cxx
+drawinglayer/source/attribute/sdrlightingattribute3d.cxx
+drawinglayer/source/attribute/sdrlineattribute.cxx
+drawinglayer/source/attribute/sdrlinestartendattribute.cxx
+drawinglayer/source/attribute/sdrobjectattribute3d.cxx
+drawinglayer/source/attribute/sdrsceneattribute3d.cxx
+drawinglayer/source/attribute/sdrshadowattribute.cxx
+drawinglayer/source/attribute/strokeattribute.cxx
+drawinglayer/source/drawinglayeruno/xprimitive2drenderer.cxx
+drawinglayer/source/dumper/EnhancedShapeDumper.cxx
+drawinglayer/source/dumper/EnhancedShapeDumper.hxx
+drawinglayer/source/dumper/XShapeDumper.cxx
+drawinglayer/source/geometry/viewinformation3d.cxx
+drawinglayer/source/primitive2d/animatedprimitive2d.cxx
+drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx
+drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
+drawinglayer/source/primitive2d/controlprimitive2d.cxx
+drawinglayer/source/primitive2d/cropprimitive2d.cxx
+drawinglayer/source/primitive2d/discretebitmapprimitive2d.cxx
+drawinglayer/source/primitive2d/discreteshadowprimitive2d.cxx
+drawinglayer/source/primitive2d/embedded3dprimitive2d.cxx
+drawinglayer/source/primitive2d/epsprimitive2d.cxx
+drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
+drawinglayer/source/primitive2d/fillgraphicprimitive2d.cxx
+drawinglayer/source/primitive2d/fillhatchprimitive2d.cxx
+drawinglayer/source/primitive2d/graphicprimitivehelper2d.cxx
+drawinglayer/source/primitive2d/gridprimitive2d.cxx
+drawinglayer/source/primitive2d/groupprimitive2d.cxx
+drawinglayer/source/primitive2d/helplineprimitive2d.cxx
+drawinglayer/source/primitive2d/hiddengeometryprimitive2d.cxx
+drawinglayer/source/primitive2d/invertprimitive2d.cxx
+drawinglayer/source/primitive2d/markerarrayprimitive2d.cxx
+drawinglayer/source/primitive2d/maskprimitive2d.cxx
+drawinglayer/source/primitive2d/mediaprimitive2d.cxx
+drawinglayer/source/primitive2d/metafileprimitive2d.cxx
+drawinglayer/source/primitive2d/modifiedcolorprimitive2d.cxx
+drawinglayer/source/primitive2d/objectinfoprimitive2d.cxx
+drawinglayer/source/primitive2d/pagehierarchyprimitive2d.cxx
+drawinglayer/source/primitive2d/pagepreviewprimitive2d.cxx
+drawinglayer/source/primitive2d/patternfillprimitive2d.cxx
+drawinglayer/source/primitive2d/pointarrayprimitive2d.cxx
+drawinglayer/source/primitive2d/primitivetools2d.cxx
+drawinglayer/source/primitive2d/sceneprimitive2d.cxx
+drawinglayer/source/primitive2d/sdrdecompositiontools2d.cxx
+drawinglayer/source/primitive2d/shadowprimitive2d.cxx
+drawinglayer/source/primitive2d/structuretagprimitive2d.cxx
+drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
+drawinglayer/source/primitive2d/textbreakuphelper.cxx
+drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx
+drawinglayer/source/primitive2d/textenumsprimitive2d.cxx
+drawinglayer/source/primitive2d/texthierarchyprimitive2d.cxx
+drawinglayer/source/primitive2d/textlineprimitive2d.cxx
+drawinglayer/source/primitive2d/textstrikeoutprimitive2d.cxx
+drawinglayer/source/primitive2d/transformprimitive2d.cxx
+drawinglayer/source/primitive2d/transparenceprimitive2d.cxx
+drawinglayer/source/primitive2d/unifiedtransparenceprimitive2d.cxx
+drawinglayer/source/primitive2d/wallpaperprimitive2d.cxx
+drawinglayer/source/primitive2d/wrongspellprimitive2d.cxx
+drawinglayer/source/primitive3d/baseprimitive3d.cxx
+drawinglayer/source/primitive3d/groupprimitive3d.cxx
+drawinglayer/source/primitive3d/hatchtextureprimitive3d.cxx
+drawinglayer/source/primitive3d/hiddengeometryprimitive3d.cxx
+drawinglayer/source/primitive3d/modifiedcolorprimitive3d.cxx
+drawinglayer/source/primitive3d/polygonprimitive3d.cxx
+drawinglayer/source/primitive3d/polygontubeprimitive3d.cxx
+drawinglayer/source/primitive3d/polypolygonprimitive3d.cxx
+drawinglayer/source/primitive3d/sdrcubeprimitive3d.cxx
+drawinglayer/source/primitive3d/sdrdecompositiontools3d.cxx
+drawinglayer/source/primitive3d/sdrextrudelathetools3d.cxx
+drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx
+drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx
+drawinglayer/source/primitive3d/sdrpolypolygonprimitive3d.cxx
+drawinglayer/source/primitive3d/sdrprimitive3d.cxx
+drawinglayer/source/primitive3d/sdrsphereprimitive3d.cxx
+drawinglayer/source/primitive3d/shadowprimitive3d.cxx
+drawinglayer/source/primitive3d/textureprimitive3d.cxx
+drawinglayer/source/primitive3d/transformprimitive3d.cxx
+drawinglayer/source/processor2d/baseprocessor2d.cxx
+drawinglayer/source/processor2d/contourextractor2d.cxx
+drawinglayer/source/processor2d/getdigitlanguage.cxx
+drawinglayer/source/processor2d/hittestprocessor2d.cxx
+drawinglayer/source/processor2d/linegeometryextractor2d.cxx
+drawinglayer/source/processor2d/objectinfoextractor2d.cxx
+drawinglayer/source/processor2d/processor2dtools.cxx
+drawinglayer/source/processor2d/processorfromoutputdevice.cxx
+drawinglayer/source/processor2d/textaspolygonextractor2d.cxx
+drawinglayer/source/processor3d/baseprocessor3d.cxx
+drawinglayer/source/processor3d/cutfindprocessor3d.cxx
+drawinglayer/source/processor3d/defaultprocessor3d.cxx
+drawinglayer/source/processor3d/geometry2dextractor.cxx
+drawinglayer/source/processor3d/shadow3dextractor.cxx
+drawinglayer/source/processor3d/zbufferprocessor3d.cxx
+drawinglayer/source/texture/texture.cxx
+drawinglayer/source/texture/texture3d.cxx
+drawinglayer/source/tools/converters.cxx
+drawinglayer/source/tools/emfpbrush.cxx
+drawinglayer/source/tools/emfpbrush.hxx
+drawinglayer/source/tools/emfpcustomlinecap.cxx
+drawinglayer/source/tools/emfpcustomlinecap.hxx
+drawinglayer/source/tools/emfpfont.cxx
+drawinglayer/source/tools/emfpfont.hxx
+drawinglayer/source/tools/emfphelperdata.cxx
+drawinglayer/source/tools/emfphelperdata.hxx
+drawinglayer/source/tools/emfpimage.cxx
+drawinglayer/source/tools/emfpimage.hxx
+drawinglayer/source/tools/emfplushelper.cxx
+drawinglayer/source/tools/emfppath.cxx
+drawinglayer/source/tools/emfppath.hxx
+drawinglayer/source/tools/emfppen.cxx
+drawinglayer/source/tools/emfppen.hxx
+drawinglayer/source/tools/emfpregion.cxx
+drawinglayer/source/tools/emfpregion.hxx
+drawinglayer/source/tools/emfpstringformat.cxx
+drawinglayer/source/tools/emfpstringformat.hxx
+drawinglayer/source/tools/wmfemfhelper.cxx
+editeng/inc/AccessibleStringWrap.hxx
+editeng/inc/editattr.hxx
+editeng/inc/editdoc.hxx
+editeng/inc/edtspell.hxx
+editeng/inc/eerdll2.hxx
+editeng/inc/unomodel.hxx
+editeng/qa/items/borderline_test.cxx
+editeng/qa/lookuptree/lookuptree_test.cxx
+editeng/qa/unit/core-test.cxx
+editeng/source/accessibility/AccessibleComponentBase.cxx
+editeng/source/accessibility/AccessibleContextBase.cxx
+editeng/source/accessibility/AccessibleEditableTextPara.cxx
+editeng/source/accessibility/AccessibleHyperlink.cxx
+editeng/source/accessibility/AccessibleHyperlink.hxx
+editeng/source/accessibility/AccessibleImageBullet.cxx
+editeng/source/accessibility/AccessibleImageBullet.hxx
+editeng/source/accessibility/AccessibleParaManager.cxx
+editeng/source/accessibility/AccessibleSelectionBase.cxx
+editeng/source/accessibility/AccessibleStaticTextBase.cxx
+editeng/source/accessibility/AccessibleStringWrap.cxx
+editeng/source/editeng/editattr.cxx
+editeng/source/editeng/editdbg.cxx
+editeng/source/editeng/editdoc.cxx
+editeng/source/editeng/editeng.cxx
+editeng/source/editeng/editobj.cxx
+editeng/source/editeng/editobj2.hxx
+editeng/source/editeng/editsel.cxx
+editeng/source/editeng/editsel.hxx
+editeng/source/editeng/editstt2.hxx
+editeng/source/editeng/editundo.cxx
+editeng/source/editeng/editundo.hxx
+editeng/source/editeng/editview.cxx
+editeng/source/editeng/edtspell.cxx
+editeng/source/editeng/eehtml.cxx
+editeng/source/editeng/eehtml.hxx
+editeng/source/editeng/eeobj.cxx
+editeng/source/editeng/eeobj.hxx
+editeng/source/editeng/eerdll.cxx
+editeng/source/editeng/eertfpar.cxx
+editeng/source/editeng/eertfpar.hxx
+editeng/source/editeng/fieldupdater.cxx
+editeng/source/editeng/impedit.cxx
+editeng/source/editeng/impedit.hxx
+editeng/source/editeng/impedit2.cxx
+editeng/source/editeng/impedit3.cxx
+editeng/source/editeng/impedit4.cxx
+editeng/source/editeng/impedit5.cxx
+editeng/source/editeng/misspellrange.cxx
+editeng/source/editeng/section.cxx
+editeng/source/editeng/textconv.cxx
+editeng/source/editeng/textconv.hxx
+editeng/source/items/CustomPropertyField.cxx
+editeng/source/items/borderline.cxx
+editeng/source/items/bulitem.cxx
+editeng/source/items/charhiddenitem.cxx
+editeng/source/items/flditem.cxx
+editeng/source/items/frmitems.cxx
+editeng/source/items/itemtype.cxx
+editeng/source/items/justifyitem.cxx
+editeng/source/items/legacyitem.cxx
+editeng/source/items/numitem.cxx
+editeng/source/items/optitems.cxx
+editeng/source/items/paperinf.cxx
+editeng/source/items/paraitem.cxx
+editeng/source/items/svxfont.cxx
+editeng/source/items/textitem.cxx
+editeng/source/items/writingmodeitem.cxx
+editeng/source/items/xmlcnitm.cxx
+editeng/source/lookuptree/Trie.cxx
+editeng/source/misc/SvXMLAutoCorrectExport.cxx
+editeng/source/misc/SvXMLAutoCorrectExport.hxx
+editeng/source/misc/SvXMLAutoCorrectImport.cxx
+editeng/source/misc/SvXMLAutoCorrectImport.hxx
+editeng/source/misc/SvXMLAutoCorrectTokenHandler.cxx
+editeng/source/misc/SvXMLAutoCorrectTokenHandler.hxx
+editeng/source/misc/acorrcfg.cxx
+editeng/source/misc/hangulhanja.cxx
+editeng/source/misc/splwrap.cxx
+editeng/source/misc/svxacorr.cxx
+editeng/source/misc/swafopt.cxx
+editeng/source/misc/txtrange.cxx
+editeng/source/misc/unolingu.cxx
+editeng/source/outliner/outleeng.cxx
+editeng/source/outliner/outleeng.hxx
+editeng/source/outliner/outlin2.cxx
+editeng/source/outliner/outliner.cxx
+editeng/source/outliner/outlobj.cxx
+editeng/source/outliner/outlundo.cxx
+editeng/source/outliner/outlundo.hxx
+editeng/source/outliner/outlvw.cxx
+editeng/source/outliner/overflowingtxt.cxx
+editeng/source/outliner/paralist.cxx
+editeng/source/outliner/paralist.hxx
+editeng/source/rtf/rtfitem.cxx
+editeng/source/rtf/svxrtf.cxx
+editeng/source/uno/UnoForbiddenCharsTable.cxx
+editeng/source/uno/unoedhlp.cxx
+editeng/source/uno/unoedprx.cxx
+editeng/source/uno/unoedsrc.cxx
+editeng/source/uno/unofdesc.cxx
+editeng/source/uno/unofield.cxx
+editeng/source/uno/unofored.cxx
+editeng/source/uno/unofored_internal.hxx
+editeng/source/uno/unoforou.cxx
+editeng/source/uno/unoipset.cxx
+editeng/source/uno/unonrule.cxx
+editeng/source/uno/unopracc.cxx
+editeng/source/uno/unotext.cxx
+editeng/source/uno/unotext2.cxx
+editeng/source/uno/unoviwou.cxx
+editeng/source/xml/editsource.hxx
+editeng/source/xml/xmltxtexp.cxx
+editeng/source/xml/xmltxtimp.cxx
+embeddedobj/source/commonembedding/embedobj.cxx
+embeddedobj/source/commonembedding/embedobj.hxx
+embeddedobj/source/commonembedding/inplaceobj.cxx
+embeddedobj/source/commonembedding/miscobj.cxx
+embeddedobj/source/commonembedding/persistence.cxx
+embeddedobj/source/commonembedding/persistence.hxx
+embeddedobj/source/commonembedding/specialobject.cxx
+embeddedobj/source/commonembedding/visobj.cxx
+embeddedobj/source/commonembedding/xfactory.cxx
+embeddedobj/source/commonembedding/xfactory.hxx
+embeddedobj/source/general/docholder.cxx
+embeddedobj/source/general/dummyobject.cxx
+embeddedobj/source/general/intercept.cxx
+embeddedobj/source/general/xcreator.cxx
+embeddedobj/source/inc/closepreventer.hxx
+embeddedobj/source/inc/commonembobj.hxx
+embeddedobj/source/inc/docholder.hxx
+embeddedobj/source/inc/dummyobject.hxx
+embeddedobj/source/inc/intercept.hxx
+embeddedobj/source/inc/oleembobj.hxx
+embeddedobj/source/inc/specialobject.hxx
+embeddedobj/source/inc/targetstatecontrol.hxx
+embeddedobj/source/inc/xcreator.hxx
+embeddedobj/source/msole/advisesink.cxx
+embeddedobj/source/msole/graphconvert.cxx
+embeddedobj/source/msole/graphconvert.hxx
+embeddedobj/source/msole/mtnotification.hxx
+embeddedobj/source/msole/olecomponent.cxx
+embeddedobj/source/msole/olecomponent.hxx
+embeddedobj/source/msole/oleembed.cxx
+embeddedobj/source/msole/olemisc.cxx
+embeddedobj/source/msole/olepersist.cxx
+embeddedobj/source/msole/olepersist.hxx
+embeddedobj/source/msole/olevisual.cxx
+embeddedobj/source/msole/olewrapclient.cxx
+embeddedobj/source/msole/ownview.cxx
+embeddedobj/source/msole/ownview.hxx
+embeddedobj/source/msole/xdialogcreator.cxx
+embeddedobj/source/msole/xdialogcreator.hxx
+embeddedobj/source/msole/xolefactory.cxx
+embeddedobj/source/msole/xolefactory.hxx
+embeddedobj/test/Container1/nativelib/nativeview.c
+embeddedobj/test/Container1/nativelib/nativeview.h
+embeddedobj/test/MainThreadExecutor/register.cxx
+embeddedobj/test/MainThreadExecutor/xexecutor.cxx
+embeddedobj/test/MainThreadExecutor/xexecutor.hxx
+embeddedobj/test/mtexecutor/bitmapcreator.cxx
+embeddedobj/test/mtexecutor/bitmapcreator.hxx
+embeddedobj/test/mtexecutor/mainthreadexecutor.cxx
+embeddedobj/test/mtexecutor/mainthreadexecutor.hxx
+embeddedobj/test/mtexecutor/mteregister.cxx
+embedserv/source/embed/docholder.cxx
+embedserv/source/embed/ed_idataobj.cxx
+embedserv/source/embed/ed_ioleobject.cxx
+embedserv/source/embed/ed_ipersiststr.cxx
+embedserv/source/embed/guid.cxx
+embedserv/source/embed/iipaobj.cxx
+embedserv/source/embed/intercept.cxx
+embedserv/source/embed/servprov.cxx
+embedserv/source/embed/syswinwrapper.cxx
+embedserv/source/embed/tracker.cxx
+embedserv/source/inc/common.h
+embedserv/source/inc/docholder.hxx
+embedserv/source/inc/embeddoc.hxx
+embedserv/source/inc/embeddocaccess.hxx
+embedserv/source/inc/iipaobj.hxx
+embedserv/source/inc/intercept.hxx
+embedserv/source/inc/servprov.hxx
+embedserv/source/inc/syswinwrapper.hxx
+embedserv/source/inprocserv/advisesink.cxx
+embedserv/source/inprocserv/dllentry.cxx
+embedserv/source/inprocserv/inprocembobj.cxx
+embedserv/source/inprocserv/inprocembobj.h
+emfio/inc/emfreader.hxx
+emfio/inc/mtftools.hxx
+emfio/inc/wmfreader.hxx
+emfio/source/emfuno/xemfparser.cxx
+emfio/source/reader/emfreader.cxx
+emfio/source/reader/mtftools.cxx
+emfio/source/reader/wmfreader.cxx
+eventattacher/source/eventattacher.cxx
+extensions/inc/helpids.h
+extensions/inc/propctrlr.h
+extensions/qa/update/test_update.cxx
+extensions/source/abpilot/abpfinalpage.cxx
+extensions/source/abpilot/abpfinalpage.hxx
+extensions/source/abpilot/abptypes.hxx
+extensions/source/abpilot/abspage.cxx
+extensions/source/abpilot/abspage.hxx
+extensions/source/abpilot/abspilot.cxx
+extensions/source/abpilot/abspilot.hxx
+extensions/source/abpilot/addresssettings.hxx
+extensions/source/abpilot/admininvokationimpl.cxx
+extensions/source/abpilot/admininvokationimpl.hxx
+extensions/source/abpilot/admininvokationpage.cxx
+extensions/source/abpilot/admininvokationpage.hxx
+extensions/source/abpilot/datasourcehandling.cxx
+extensions/source/abpilot/datasourcehandling.hxx
+extensions/source/abpilot/fieldmappingimpl.cxx
+extensions/source/abpilot/fieldmappingimpl.hxx
+extensions/source/abpilot/fieldmappingpage.cxx
+extensions/source/abpilot/fieldmappingpage.hxx
+extensions/source/abpilot/tableselectionpage.cxx
+extensions/source/abpilot/tableselectionpage.hxx
+extensions/source/abpilot/typeselectionpage.cxx
+extensions/source/abpilot/typeselectionpage.hxx
+extensions/source/abpilot/unodialogabp.cxx
+extensions/source/abpilot/unodialogabp.hxx
+extensions/source/activex/SOActionsApproval.h
+extensions/source/activex/SOActiveX.cxx
+extensions/source/activex/SOActiveX.h
+extensions/source/activex/SOComWindowPeer.h
+extensions/source/activex/SODispatchInterceptor.cxx
+extensions/source/activex/SODispatchInterceptor.h
+extensions/source/activex/com_uno_helper.h
+extensions/source/activex/resource.h
+extensions/source/activex/so_activex.cxx
+extensions/source/bibliography/bibbeam.cxx
+extensions/source/bibliography/bibbeam.hxx
+extensions/source/bibliography/bibconfig.cxx
+extensions/source/bibliography/bibconfig.hxx
+extensions/source/bibliography/bibcont.cxx
+extensions/source/bibliography/bibcont.hxx
+extensions/source/bibliography/bibload.cxx
+extensions/source/bibliography/bibmod.cxx
+extensions/source/bibliography/bibmod.hxx
+extensions/source/bibliography/bibshortcuthandler.hxx
+extensions/source/bibliography/bibtools.hxx
+extensions/source/bibliography/bibview.cxx
+extensions/source/bibliography/bibview.hxx
+extensions/source/bibliography/datman.cxx
+extensions/source/bibliography/datman.hxx
+extensions/source/bibliography/formcontrolcontainer.cxx
+extensions/source/bibliography/formcontrolcontainer.hxx
+extensions/source/bibliography/framectr.cxx
+extensions/source/bibliography/framectr.hxx
+extensions/source/bibliography/general.cxx
+extensions/source/bibliography/general.hxx
+extensions/source/bibliography/loadlisteneradapter.cxx
+extensions/source/bibliography/loadlisteneradapter.hxx
+extensions/source/bibliography/toolbar.cxx
+extensions/source/bibliography/toolbar.hxx
+extensions/source/config/ldap/ldapaccess.cxx
+extensions/source/config/ldap/ldapuserprofilebe.cxx
+extensions/source/config/ldap/ldapuserprofilebe.hxx
+extensions/source/dbpilots/commonpagesdbp.cxx
+extensions/source/dbpilots/commonpagesdbp.hxx
+extensions/source/dbpilots/controlwizard.cxx
+extensions/source/dbpilots/controlwizard.hxx
+extensions/source/dbpilots/dbptools.cxx
+extensions/source/dbpilots/dbptools.hxx
+extensions/source/dbpilots/gridwizard.cxx
+extensions/source/dbpilots/gridwizard.hxx
+extensions/source/dbpilots/groupboxwiz.cxx
+extensions/source/dbpilots/groupboxwiz.hxx
+extensions/source/dbpilots/listcombowizard.cxx
+extensions/source/dbpilots/listcombowizard.hxx
+extensions/source/dbpilots/optiongrouplayouter.cxx
+extensions/source/dbpilots/optiongrouplayouter.hxx
+extensions/source/dbpilots/unoautopilot.hxx
+extensions/source/dbpilots/wizardcontext.hxx
+extensions/source/dbpilots/wizardservices.cxx
+extensions/source/inc/componentmodule.cxx
+extensions/source/inc/componentmodule.hxx
+extensions/source/logging/consolehandler.cxx
+extensions/source/logging/csvformatter.cxx
+extensions/source/logging/filehandler.cxx
+extensions/source/logging/logger.cxx
+extensions/source/logging/loggerconfig.cxx
+extensions/source/logging/loggerconfig.hxx
+extensions/source/logging/loghandler.cxx
+extensions/source/logging/loghandler.hxx
+extensions/source/logging/logrecord.cxx
+extensions/source/logging/logrecord.hxx
+extensions/source/logging/methodguard.hxx
+extensions/source/logging/plaintextformatter.cxx
+extensions/source/macosx/spotlight/GetMetadataForFile.h
+extensions/source/macosx/spotlight/OOoContentDataParser.h
+extensions/source/macosx/spotlight/OOoMetaDataParser.h
+extensions/source/ole/comifaces.hxx
+extensions/source/ole/jscriptclasses.cxx
+extensions/source/ole/jscriptclasses.hxx
+extensions/source/ole/ole2uno.cxx
+extensions/source/ole/oleobjw.cxx
+extensions/source/ole/oleobjw.hxx
+extensions/source/ole/olethread.cxx
+extensions/source/ole/servprov.cxx
+extensions/source/ole/servprov.hxx
+extensions/source/ole/servreg.cxx
+extensions/source/ole/unoconversionutilities.hxx
+extensions/source/ole/unoobjw.cxx
+extensions/source/ole/unoobjw.hxx
+extensions/source/ole/unotypewrapper.cxx
+extensions/source/ole/unotypewrapper.hxx
+extensions/source/ole/windata.hxx
+extensions/source/propctrlr/MasterDetailLinkDialog.cxx
+extensions/source/propctrlr/MasterDetailLinkDialog.hxx
+extensions/source/propctrlr/browserline.cxx
+extensions/source/propctrlr/browserline.hxx
+extensions/source/propctrlr/browserlistbox.cxx
+extensions/source/propctrlr/browserlistbox.hxx
+extensions/source/propctrlr/browserpage.cxx
+extensions/source/propctrlr/browserpage.hxx
+extensions/source/propctrlr/browserview.cxx
+extensions/source/propctrlr/browserview.hxx
+extensions/source/propctrlr/buttonnavigationhandler.cxx
+extensions/source/propctrlr/buttonnavigationhandler.hxx
+extensions/source/propctrlr/cellbindinghandler.cxx
+extensions/source/propctrlr/cellbindinghandler.hxx
+extensions/source/propctrlr/cellbindinghelper.cxx
+extensions/source/propctrlr/cellbindinghelper.hxx
+extensions/source/propctrlr/commoncontrol.cxx
+extensions/source/propctrlr/commoncontrol.hxx
+extensions/source/propctrlr/composeduiupdate.cxx
+extensions/source/propctrlr/composeduiupdate.hxx
+extensions/source/propctrlr/controlfontdialog.cxx
+extensions/source/propctrlr/controlfontdialog.hxx
+extensions/source/propctrlr/controltype.hxx
+extensions/source/propctrlr/defaultforminspection.cxx
+extensions/source/propctrlr/defaultforminspection.hxx
+extensions/source/propctrlr/defaulthelpprovider.cxx
+extensions/source/propctrlr/defaulthelpprovider.hxx
+extensions/source/propctrlr/editpropertyhandler.cxx
+extensions/source/propctrlr/editpropertyhandler.hxx
+extensions/source/propctrlr/eformshelper.cxx
+extensions/source/propctrlr/eformshelper.hxx
+extensions/source/propctrlr/eformspropertyhandler.cxx
+extensions/source/propctrlr/eformspropertyhandler.hxx
+extensions/source/propctrlr/enumrepresentation.hxx
+extensions/source/propctrlr/eventhandler.cxx
+extensions/source/propctrlr/eventhandler.hxx
+extensions/source/propctrlr/fontdialog.cxx
+extensions/source/propctrlr/fontdialog.hxx
+extensions/source/propctrlr/fontitemids.hxx
+extensions/source/propctrlr/formbrowsertools.cxx
+extensions/source/propctrlr/formbrowsertools.hxx
+extensions/source/propctrlr/formcomponenthandler.cxx
+extensions/source/propctrlr/formcomponenthandler.hxx
+extensions/source/propctrlr/formcontroller.cxx
+extensions/source/propctrlr/formcontroller.hxx
+extensions/source/propctrlr/formgeometryhandler.cxx
+extensions/source/propctrlr/formlinkdialog.cxx
+extensions/source/propctrlr/formlinkdialog.hxx
+extensions/source/propctrlr/formmetadata.cxx
+extensions/source/propctrlr/formmetadata.hxx
+extensions/source/propctrlr/formstrings.hxx
+extensions/source/propctrlr/genericpropertyhandler.cxx
+extensions/source/propctrlr/genericpropertyhandler.hxx
+extensions/source/propctrlr/handlerhelper.cxx
+extensions/source/propctrlr/handlerhelper.hxx
+extensions/source/propctrlr/inspectorhelpwindow.cxx
+extensions/source/propctrlr/inspectorhelpwindow.hxx
+extensions/source/propctrlr/inspectormodelbase.cxx
+extensions/source/propctrlr/inspectormodelbase.hxx
+extensions/source/propctrlr/linedescriptor.hxx
+extensions/source/propctrlr/listselectiondlg.cxx
+extensions/source/propctrlr/listselectiondlg.hxx
+extensions/source/propctrlr/newdatatype.cxx
+extensions/source/propctrlr/newdatatype.hxx
+extensions/source/propctrlr/objectinspectormodel.cxx
+extensions/source/propctrlr/pcrcommon.cxx
+extensions/source/propctrlr/pcrcommon.hxx
+extensions/source/propctrlr/pcrstrings.hxx
+extensions/source/propctrlr/pcrunodialogs.cxx
+extensions/source/propctrlr/pcrunodialogs.hxx
+extensions/source/propctrlr/propcontroller.cxx
+extensions/source/propctrlr/propcontroller.hxx
+extensions/source/propctrlr/propcontrolobserver.hxx
+extensions/source/propctrlr/propertycomposer.cxx
+extensions/source/propctrlr/propertycomposer.hxx
+extensions/source/propctrlr/propertycontrolextender.cxx
+extensions/source/propctrlr/propertycontrolextender.hxx
+extensions/source/propctrlr/propertyeditor.cxx
+extensions/source/propctrlr/propertyeditor.hxx
+extensions/source/propctrlr/propertyhandler.cxx
+extensions/source/propctrlr/propertyhandler.hxx
+extensions/source/propctrlr/propertyinfo.hxx
+extensions/source/propctrlr/propeventtranslation.cxx
+extensions/source/propctrlr/propeventtranslation.hxx
+extensions/source/propctrlr/proplinelistener.hxx
+extensions/source/propctrlr/pushbuttonnavigation.cxx
+extensions/source/propctrlr/pushbuttonnavigation.hxx
+extensions/source/propctrlr/selectlabeldialog.cxx
+extensions/source/propctrlr/selectlabeldialog.hxx
+extensions/source/propctrlr/sqlcommanddesign.cxx
+extensions/source/propctrlr/sqlcommanddesign.hxx
+extensions/source/propctrlr/standardcontrol.cxx
+extensions/source/propctrlr/standardcontrol.hxx
+extensions/source/propctrlr/stringrepresentation.cxx
+extensions/source/propctrlr/submissionhandler.cxx
+extensions/source/propctrlr/submissionhandler.hxx
+extensions/source/propctrlr/taborder.cxx
+extensions/source/propctrlr/taborder.hxx
+extensions/source/propctrlr/unourl.cxx
+extensions/source/propctrlr/unourl.hxx
+extensions/source/propctrlr/usercontrol.cxx
+extensions/source/propctrlr/usercontrol.hxx
+extensions/source/propctrlr/xsddatatypes.cxx
+extensions/source/propctrlr/xsddatatypes.hxx
+extensions/source/propctrlr/xsdvalidationhelper.cxx
+extensions/source/propctrlr/xsdvalidationhelper.hxx
+extensions/source/propctrlr/xsdvalidationpropertyhandler.cxx
+extensions/source/propctrlr/xsdvalidationpropertyhandler.hxx
+extensions/source/scanner/grid.cxx
+extensions/source/scanner/sane.cxx
+extensions/source/scanner/sane.hxx
+extensions/source/scanner/sanedlg.cxx
+extensions/source/scanner/sanedlg.hxx
+extensions/source/scanner/scanner.cxx
+extensions/source/scanner/scanner.hxx
+extensions/source/scanner/scanunx.cxx
+extensions/source/update/check/actionlistener.hxx
+extensions/source/update/check/download.cxx
+extensions/source/update/check/onlinecheck.cxx
+extensions/source/update/check/updatecheck.cxx
+extensions/source/update/check/updatecheck.hxx
+extensions/source/update/check/updatecheckconfig.cxx
+extensions/source/update/check/updatecheckconfig.hxx
+extensions/source/update/check/updatecheckjob.cxx
+extensions/source/update/check/updatehdl.cxx
+extensions/source/update/check/updatehdl.hxx
+extensions/source/update/check/updateinfo.hxx
+extensions/source/update/check/updateprotocol.cxx
+extensions/source/update/check/updateprotocol.hxx
+extensions/source/update/check/updateprotocoltest.cxx
+extensions/source/update/feed/test/updatefeedtest.cxx
+extensions/source/update/feed/updatefeed.cxx
+extensions/source/update/ui/updatecheckui.cxx
+extensions/test/ole/AxTestComponents/Basic.cpp
+extensions/test/ole/AxTestComponents/Basic.h
+extensions/test/ole/AxTestComponents/Foo.h
+extensions/test/ole/AxTestComponents/resource.h
+extensions/test/ole/EventListenerSample/EventListener/EvtListener.cpp
+extensions/test/ole/EventListenerSample/EventListener/EvtListener.h
+extensions/test/ole/EventListenerSample/EventListener/resource.h
+extensions/test/ole/MfcControl/MfcControlCtl.cpp
+extensions/test/ole/MfcControl/MfcControlCtl.h
+extensions/test/ole/MfcControl/MfcControlPpg.cpp
+extensions/test/ole/MfcControl/MfcControlPpg.h
+extensions/test/ole/MfcControl/Resource.h
+extensions/test/ole/OleClient/axhost.hxx
+extensions/test/ole/OleClient/clientTest.cxx
+extensions/test/ole/OleClient/funcs.cxx
+extensions/test/ole/OleConverterVar1/convTest.cxx
+extensions/test/ole/OleConverterVar1/smartarray.h
+extensions/test/ole/cpnt/cpnt.cxx
+extensions/test/ole/cppToUno/testcppuno.cxx
+extensions/test/ole/unloading/unloadTest.cxx
+extensions/test/ole/unoTocomCalls/Test/Test.cpp
+extensions/test/ole/unoTocomCalls/XCallback_Impl/Callback.cpp
+extensions/test/ole/unoTocomCalls/XCallback_Impl/Callback.h
+extensions/test/ole/unoTocomCalls/XCallback_Impl/Simple.cpp
+extensions/test/ole/unoTocomCalls/XCallback_Impl/Simple.h
+extensions/test/ole/unoTocomCalls/XCallback_Impl/resource.h
+external/bluez_bluetooth/inc/bluetooth/bluetooth.h
+external/clew/source/clew.c
+external/clew/source/include/clew/clew.h
+external/clucene/configs/_clucene-config-LINUX.h
+external/clucene/configs/_clucene-config-MSVC.h
+external/clucene/configs/_clucene-config-generic.h
+external/clucene/configs/clucene-config-GCC-atomic.h
+external/clucene/configs/clucene-config-MSVC.h
+external/clucene/configs/clucene-config-generic.h
+external/mariadb-connector-c/configs/linux_my_config.h
+external/mariadb-connector-c/configs/mac_my_config.h
+external/mariadb-connector-c/configs/mariadb_version.h
+external/mariadb-connector-c/configs/wnt_ma_config.h
+external/redland/raptor/raptor2.h
+external/redland/raptor/raptor_config.h
+external/redland/rasqal/rasqal.h
+external/redland/redland/librdf.h
+external/sane/inc/sane/sane.h
+external/skia/inc/skia_opts.hxx
+external/skia/source/skia_opts.cxx
+external/skia/source/skia_opts_internal.hxx
+external/skia/source/skia_opts_ssse3.cxx
+external/unixODBC/inc/odbc/sql.h
+external/unixODBC/inc/odbc/sqlext.h
+external/unixODBC/inc/odbc/sqltypes.h
+external/unixODBC/inc/odbc/sqlucode.h
+filter/inc/strings.hxx
+filter/qa/cppunit/msfilter-test.cxx
+filter/qa/cppunit/priority-test.cxx
+filter/qa/cppunit/xslt-test.cxx
+filter/source/config/cache/basecontainer.cxx
+filter/source/config/cache/basecontainer.hxx
+filter/source/config/cache/cacheitem.cxx
+filter/source/config/cache/cacheitem.hxx
+filter/source/config/cache/cacheupdatelistener.cxx
+filter/source/config/cache/cacheupdatelistener.hxx
+filter/source/config/cache/configflush.cxx
+filter/source/config/cache/configflush.hxx
+filter/source/config/cache/constant.hxx
+filter/source/config/cache/contenthandlerfactory.cxx
+filter/source/config/cache/contenthandlerfactory.hxx
+filter/source/config/cache/filtercache.cxx
+filter/source/config/cache/filtercache.hxx
+filter/source/config/cache/filterfactory.cxx
+filter/source/config/cache/filterfactory.hxx
+filter/source/config/cache/frameloaderfactory.cxx
+filter/source/config/cache/frameloaderfactory.hxx
+filter/source/config/cache/querytokenizer.cxx
+filter/source/config/cache/querytokenizer.hxx
+filter/source/config/cache/typedetection.cxx
+filter/source/config/cache/typedetection.hxx
+filter/source/graphic/GraphicExportFilter.cxx
+filter/source/graphic/GraphicExportFilter.hxx
+filter/source/graphicfilter/icgm/actimpr.cxx
+filter/source/graphicfilter/icgm/bitmap.cxx
+filter/source/graphicfilter/icgm/bitmap.hxx
+filter/source/graphicfilter/icgm/bundles.cxx
+filter/source/graphicfilter/icgm/bundles.hxx
+filter/source/graphicfilter/icgm/cgm.cxx
+filter/source/graphicfilter/icgm/cgm.hxx
+filter/source/graphicfilter/icgm/cgmtypes.hxx
+filter/source/graphicfilter/icgm/chart.cxx
+filter/source/graphicfilter/icgm/chart.hxx
+filter/source/graphicfilter/icgm/class0.cxx
+filter/source/graphicfilter/icgm/class1.cxx
+filter/source/graphicfilter/icgm/class2.cxx
+filter/source/graphicfilter/icgm/class3.cxx
+filter/source/graphicfilter/icgm/class4.cxx
+filter/source/graphicfilter/icgm/class5.cxx
+filter/source/graphicfilter/icgm/class7.cxx
+filter/source/graphicfilter/icgm/classx.cxx
+filter/source/graphicfilter/icgm/elements.cxx
+filter/source/graphicfilter/icgm/elements.hxx
+filter/source/graphicfilter/icgm/outact.hxx
+filter/source/msfilter/countryid.cxx
+filter/source/msfilter/dffpropset.cxx
+filter/source/msfilter/escherex.cxx
+filter/source/msfilter/eschesdo.cxx
+filter/source/msfilter/eschesdo.hxx
+filter/source/msfilter/mscodec.cxx
+filter/source/msfilter/msdffimp.cxx
+filter/source/msfilter/msocximex.cxx
+filter/source/msfilter/msoleexp.cxx
+filter/source/msfilter/mstoolbar.cxx
+filter/source/msfilter/msvbahelper.cxx
+filter/source/msfilter/svdfppt.cxx
+filter/source/msfilter/svxmsbas2.cxx
+filter/source/msfilter/util.cxx
+filter/source/msfilter/viscache.hxx
+filter/source/odfflatxml/OdfFlatXml.cxx
+filter/source/pdf/impdialog.cxx
+filter/source/pdf/impdialog.hxx
+filter/source/pdf/pdfdialog.cxx
+filter/source/pdf/pdfdialog.hxx
+filter/source/pdf/pdfexport.cxx
+filter/source/pdf/pdfexport.hxx
+filter/source/pdf/pdffilter.cxx
+filter/source/pdf/pdffilter.hxx
+filter/source/pdf/pdfinteract.cxx
+filter/source/pdf/pdfinteract.hxx
+filter/source/storagefilterdetect/filterdetect.cxx
+filter/source/storagefilterdetect/filterdetect.hxx
+filter/source/svg/svgexport.cxx
+filter/source/svg/svgfilter.cxx
+filter/source/svg/svgfilter.hxx
+filter/source/svg/svgfontexport.cxx
+filter/source/svg/svgfontexport.hxx
+filter/source/svg/svgwriter.cxx
+filter/source/svg/svgwriter.hxx
+filter/source/svg/test/odfserializer.cxx
+filter/source/t602/t602filter.cxx
+filter/source/t602/t602filter.hxx
+filter/source/textfilterdetect/filterdetect.cxx
+filter/source/textfilterdetect/filterdetect.hxx
+filter/source/xmlfilteradaptor/XmlFilterAdaptor.cxx
+filter/source/xmlfilteradaptor/XmlFilterAdaptor.hxx
+filter/source/xmlfilterdetect/filterdetect.cxx
+filter/source/xmlfilterdetect/filterdetect.hxx
+filter/source/xsltdialog/typedetectionexport.cxx
+filter/source/xsltdialog/typedetectionexport.hxx
+filter/source/xsltdialog/typedetectionimport.cxx
+filter/source/xsltdialog/typedetectionimport.hxx
+filter/source/xsltdialog/xmlfiltercommon.hxx
+filter/source/xsltdialog/xmlfilterdialogcomponent.cxx
+filter/source/xsltdialog/xmlfilterjar.cxx
+filter/source/xsltdialog/xmlfilterjar.hxx
+filter/source/xsltdialog/xmlfiltersettingsdialog.cxx
+filter/source/xsltdialog/xmlfiltersettingsdialog.hxx
+filter/source/xsltdialog/xmlfiltertabdialog.cxx
+filter/source/xsltdialog/xmlfiltertabdialog.hxx
+filter/source/xsltdialog/xmlfiltertabpagebasic.cxx
+filter/source/xsltdialog/xmlfiltertabpagebasic.hxx
+filter/source/xsltdialog/xmlfiltertabpagexslt.cxx
+filter/source/xsltdialog/xmlfiltertabpagexslt.hxx
+filter/source/xsltdialog/xmlfiltertestdialog.cxx
+filter/source/xsltdialog/xmlfiltertestdialog.hxx
+filter/source/xsltfilter/LibXSLTTransformer.cxx
+filter/source/xsltfilter/LibXSLTTransformer.hxx
+filter/source/xsltfilter/OleHandler.cxx
+filter/source/xsltfilter/OleHandler.hxx
+filter/source/xsltfilter/XSLTFilter.cxx
+forms/source/component/Button.cxx
+forms/source/component/Button.hxx
+forms/source/component/CheckBox.cxx
+forms/source/component/CheckBox.hxx
+forms/source/component/Columns.cxx
+forms/source/component/Columns.hxx
+forms/source/component/ComboBox.cxx
+forms/source/component/ComboBox.hxx
+forms/source/component/Currency.cxx
+forms/source/component/Currency.hxx
+forms/source/component/DatabaseForm.cxx
+forms/source/component/DatabaseForm.hxx
+forms/source/component/Date.cxx
+forms/source/component/Date.hxx
+forms/source/component/Edit.cxx
+forms/source/component/Edit.hxx
+forms/source/component/EditBase.cxx
+forms/source/component/EditBase.hxx
+forms/source/component/EventThread.cxx
+forms/source/component/EventThread.hxx
+forms/source/component/File.cxx
+forms/source/component/File.hxx
+forms/source/component/Filter.cxx
+forms/source/component/Filter.hxx
+forms/source/component/FixedText.cxx
+forms/source/component/FixedText.hxx
+forms/source/component/FormComponent.cxx
+forms/source/component/FormattedField.cxx
+forms/source/component/FormattedField.hxx
+forms/source/component/FormattedFieldWrapper.cxx
+forms/source/component/FormattedFieldWrapper.hxx
+forms/source/component/FormsCollection.cxx
+forms/source/component/FormsCollection.hxx
+forms/source/component/Grid.cxx
+forms/source/component/Grid.hxx
+forms/source/component/GroupBox.cxx
+forms/source/component/GroupBox.hxx
+forms/source/component/GroupManager.cxx
+forms/source/component/GroupManager.hxx
+forms/source/component/Hidden.cxx
+forms/source/component/Hidden.hxx
+forms/source/component/ImageButton.cxx
+forms/source/component/ImageButton.hxx
+forms/source/component/ImageControl.cxx
+forms/source/component/ImageControl.hxx
+forms/source/component/ListBox.cxx
+forms/source/component/ListBox.hxx
+forms/source/component/Numeric.cxx
+forms/source/component/Numeric.hxx
+forms/source/component/Pattern.cxx
+forms/source/component/Pattern.hxx
+forms/source/component/RadioButton.cxx
+forms/source/component/RadioButton.hxx
+forms/source/component/Time.cxx
+forms/source/component/Time.hxx
+forms/source/component/cachedrowset.cxx
+forms/source/component/cachedrowset.hxx
+forms/source/component/clickableimage.cxx
+forms/source/component/clickableimage.hxx
+forms/source/component/cloneable.cxx
+forms/source/component/entrylisthelper.cxx
+forms/source/component/entrylisthelper.hxx
+forms/source/component/errorbroadcaster.cxx
+forms/source/component/errorbroadcaster.hxx
+forms/source/component/findpos.cxx
+forms/source/component/formcontrolfont.cxx
+forms/source/component/imgprod.cxx
+forms/source/component/imgprod.hxx
+forms/source/component/navigationbar.cxx
+forms/source/component/navigationbar.hxx
+forms/source/component/propertybaghelper.cxx
+forms/source/component/refvaluecomponent.cxx
+forms/source/component/refvaluecomponent.hxx
+forms/source/component/scrollbar.cxx
+forms/source/component/scrollbar.hxx
+forms/source/component/spinbutton.cxx
+forms/source/component/spinbutton.hxx
+forms/source/helper/commandimageprovider.cxx
+forms/source/helper/controlfeatureinterception.cxx
+forms/source/helper/formnavigation.cxx
+forms/source/helper/resettable.cxx
+forms/source/helper/urltransformer.cxx
+forms/source/helper/windowstateguard.cxx
+forms/source/inc/FormComponent.hxx
+forms/source/inc/InterfaceContainer.hxx
+forms/source/inc/cloneable.hxx
+forms/source/inc/commandimageprovider.hxx
+forms/source/inc/componenttools.hxx
+forms/source/inc/controlfeatureinterception.hxx
+forms/source/inc/featuredispatcher.hxx
+forms/source/inc/formcontrolfont.hxx
+forms/source/inc/formnavigation.hxx
+forms/source/inc/frm_resource.hxx
+forms/source/inc/frm_strings.hxx
+forms/source/inc/limitedformats.hxx
+forms/source/inc/listenercontainers.hxx
+forms/source/inc/property.hxx
+forms/source/inc/propertybaghelper.hxx
+forms/source/inc/resettable.hxx
+forms/source/inc/services.hxx
+forms/source/inc/togglestate.hxx
+forms/source/inc/urltransformer.hxx
+forms/source/inc/windowstateguard.hxx
+forms/source/misc/InterfaceContainer.cxx
+forms/source/misc/componenttools.cxx
+forms/source/misc/limitedformats.cxx
+forms/source/misc/listenercontainers.cxx
+forms/source/misc/property.cxx
+forms/source/resource/frm_resource.cxx
+forms/source/richtext/attributedispatcher.cxx
+forms/source/richtext/attributedispatcher.hxx
+forms/source/richtext/clipboarddispatcher.cxx
+forms/source/richtext/clipboarddispatcher.hxx
+forms/source/richtext/featuredispatcher.cxx
+forms/source/richtext/featuredispatcher.hxx
+forms/source/richtext/parametrizedattributedispatcher.cxx
+forms/source/richtext/parametrizedattributedispatcher.hxx
+forms/source/richtext/richtextcontrol.cxx
+forms/source/richtext/richtextcontrol.hxx
+forms/source/richtext/richtextengine.cxx
+forms/source/richtext/richtextengine.hxx
+forms/source/richtext/richtextimplcontrol.cxx
+forms/source/richtext/richtextimplcontrol.hxx
+forms/source/richtext/richtextmodel.cxx
+forms/source/richtext/richtextmodel.hxx
+forms/source/richtext/richtextunowrapper.cxx
+forms/source/richtext/richtextunowrapper.hxx
+forms/source/richtext/richtextvclcontrol.cxx
+forms/source/richtext/richtextvclcontrol.hxx
+forms/source/richtext/richtextviewport.cxx
+forms/source/richtext/richtextviewport.hxx
+forms/source/richtext/rtattributehandler.cxx
+forms/source/richtext/rtattributehandler.hxx
+forms/source/richtext/rtattributes.hxx
+forms/source/richtext/specialdispatchers.cxx
+forms/source/richtext/specialdispatchers.hxx
+forms/source/richtext/textattributelistener.hxx
+forms/source/runtime/formoperations.cxx
+forms/source/runtime/formoperations.hxx
+forms/source/solar/component/navbarcontrol.cxx
+forms/source/solar/component/navbarcontrol.hxx
+forms/source/solar/control/navtoolbar.cxx
+forms/source/solar/inc/navtoolbar.hxx
+forms/source/xforms/NameContainer.hxx
+forms/source/xforms/binding.cxx
+forms/source/xforms/binding.hxx
+forms/source/xforms/collection.hxx
+forms/source/xforms/computedexpression.cxx
+forms/source/xforms/computedexpression.hxx
+forms/source/xforms/convert.cxx
+forms/source/xforms/convert.hxx
+forms/source/xforms/datatyperepository.cxx
+forms/source/xforms/datatyperepository.hxx
+forms/source/xforms/datatypes.cxx
+forms/source/xforms/datatypes.hxx
+forms/source/xforms/enumeration.hxx
+forms/source/xforms/evaluationcontext.hxx
+forms/source/xforms/mip.cxx
+forms/source/xforms/model.cxx
+forms/source/xforms/model.hxx
+forms/source/xforms/model_helper.hxx
+forms/source/xforms/model_ui.cxx
+forms/source/xforms/namedcollection.hxx
+forms/source/xforms/pathexpression.cxx
+forms/source/xforms/propertysetbase.cxx
+forms/source/xforms/propertysetbase.hxx
+forms/source/xforms/resourcehelper.cxx
+forms/source/xforms/resourcehelper.hxx
+forms/source/xforms/submission.cxx
+forms/source/xforms/submission.hxx
+forms/source/xforms/submission/replace.cxx
+forms/source/xforms/submission/serialization_app_xml.cxx
+forms/source/xforms/submission/serialization_urlencoded.cxx
+forms/source/xforms/submission/submission.hxx
+forms/source/xforms/submission/submission_get.cxx
+forms/source/xforms/submission/submission_post.cxx
+forms/source/xforms/submission/submission_post.hxx
+forms/source/xforms/submission/submission_put.cxx
+forms/source/xforms/unohelper.hxx
+forms/source/xforms/xforms_services.cxx
+forms/source/xforms/xformsevent.cxx
+forms/source/xforms/xformsevent.hxx
+forms/source/xforms/xmlhelper.cxx
+forms/source/xforms/xmlhelper.hxx
+forms/source/xforms/xpathlib/extension.cxx
+forms/source/xforms/xpathlib/xpathlib.cxx
+forms/source/xforms/xpathlib/xpathlib.hxx
+formula/source/core/api/FormulaCompiler.cxx
+formula/source/core/api/FormulaOpCodeMapperObj.cxx
+formula/source/core/api/grammar.cxx
+formula/source/core/api/token.cxx
+formula/source/core/api/vectortoken.cxx
+formula/source/ui/dlg/ControlHelper.hxx
+formula/source/ui/dlg/FormulaHelper.cxx
+formula/source/ui/dlg/formula.cxx
+formula/source/ui/dlg/funcpage.hxx
+formula/source/ui/dlg/funcutl.cxx
+formula/source/ui/dlg/parawin.cxx
+formula/source/ui/dlg/parawin.hxx
+formula/source/ui/dlg/structpg.cxx
+formula/source/ui/dlg/structpg.hxx
+fpicker/source/aqua/ControlHelper.hxx
+fpicker/source/aqua/FilterHelper.hxx
+fpicker/source/aqua/SalAquaFilePicker.hxx
+fpicker/source/aqua/SalAquaFolderPicker.hxx
+fpicker/source/aqua/resourceprovider.hxx
+fpicker/source/office/OfficeControlAccess.cxx
+fpicker/source/office/OfficeControlAccess.hxx
+fpicker/source/office/OfficeFilePicker.cxx
+fpicker/source/office/OfficeFilePicker.hxx
+fpicker/source/office/OfficeFolderPicker.cxx
+fpicker/source/office/OfficeFolderPicker.hxx
+fpicker/source/office/PlacesListBox.cxx
+fpicker/source/office/PlacesListBox.hxx
+fpicker/source/office/RemoteFilesDialog.cxx
+fpicker/source/office/RemoteFilesDialog.hxx
+fpicker/source/office/asyncfilepicker.cxx
+fpicker/source/office/asyncfilepicker.hxx
+fpicker/source/office/autocmpledit.cxx
+fpicker/source/office/breadcrumb.cxx
+fpicker/source/office/commonpicker.cxx
+fpicker/source/office/commonpicker.hxx
+fpicker/source/office/contentenumeration.cxx
+fpicker/source/office/contentenumeration.hxx
+fpicker/source/office/fileview.cxx
+fpicker/source/office/fileview.hxx
+fpicker/source/office/foldertree.cxx
+fpicker/source/office/foldertree.hxx
+fpicker/source/office/fpdialogbase.hxx
+fpicker/source/office/fpinteraction.cxx
+fpicker/source/office/fpinteraction.hxx
+fpicker/source/office/fpsmartcontent.cxx
+fpicker/source/office/fpsmartcontent.hxx
+fpicker/source/office/iodlg.cxx
+fpicker/source/office/iodlg.hxx
+fpicker/source/office/iodlgimp.cxx
+fpicker/source/office/iodlgimp.hxx
+fpicker/source/office/pickercallbacks.hxx
+fpicker/source/win32/FilterContainer.cxx
+fpicker/source/win32/FilterContainer.hxx
+fpicker/source/win32/IVistaFilePickerInternalNotify.hxx
+fpicker/source/win32/VistaFilePicker.cxx
+fpicker/source/win32/VistaFilePicker.hxx
+fpicker/source/win32/VistaFilePickerEventHandler.cxx
+fpicker/source/win32/VistaFilePickerEventHandler.hxx
+fpicker/source/win32/VistaFilePickerImpl.cxx
+fpicker/source/win32/VistaFilePickerImpl.hxx
+fpicker/source/win32/WinImplHelper.cxx
+fpicker/source/win32/asyncrequests.cxx
+fpicker/source/win32/asyncrequests.hxx
+fpicker/source/win32/comptr.hxx
+fpicker/source/win32/platform_vista.h
+fpicker/source/win32/resourceprovider.cxx
+fpicker/source/win32/vistatypes.h
+fpicker/source/win32/workbench/Test_fps.cxx
+framework/inc/acceleratorconst.h
+framework/inc/addonmenu.hxx
+framework/inc/classes/actiontriggercontainer.hxx
+framework/inc/classes/actiontriggerpropertyset.hxx
+framework/inc/classes/actiontriggerseparatorpropertyset.hxx
+framework/inc/classes/converter.hxx
+framework/inc/classes/protocolhandlercache.hxx
+framework/inc/classes/resource.hxx
+framework/inc/classes/rootactiontriggercontainer.hxx
+framework/inc/classes/taskcreator.hxx
+framework/inc/dispatch/closedispatcher.hxx
+framework/inc/dispatch/dispatchinformationprovider.hxx
+framework/inc/dispatch/dispatchprovider.hxx
+framework/inc/dispatch/interceptionhelper.hxx
+framework/inc/dispatch/mailtodispatcher.hxx
+framework/inc/dispatch/oxt_handler.hxx
+framework/inc/dispatch/popupmenudispatcher.hxx
+framework/inc/dispatch/servicehandler.hxx
+framework/inc/dispatch/startmoduledispatcher.hxx
+framework/inc/dispatch/systemexec.hxx
+framework/inc/helper/dockingareadefaultacceptor.hxx
+framework/inc/helper/mischelper.hxx
+framework/inc/helper/ocomponentaccess.hxx
+framework/inc/helper/ocomponentenumeration.hxx
+framework/inc/helper/oframes.hxx
+framework/inc/helper/persistentwindowstate.hxx
+framework/inc/helper/propertysetcontainer.hxx
+framework/inc/helper/shareablemutex.hxx
+framework/inc/helper/statusindicator.hxx
+framework/inc/helper/statusindicatorfactory.hxx
+framework/inc/helper/tagwindowasmodified.hxx
+framework/inc/helper/titlebarupdate.hxx
+framework/inc/helper/uiconfigelementwrapperbase.hxx
+framework/inc/helper/uielementwrapperbase.hxx
+framework/inc/helper/vclstatusindicator.hxx
+framework/inc/interaction/quietinteraction.hxx
+framework/inc/jobs/configaccess.hxx
+framework/inc/jobs/helponstartup.hxx
+framework/inc/jobs/job.hxx
+framework/inc/jobs/jobdata.hxx
+framework/inc/jobs/jobresult.hxx
+framework/inc/jobs/joburl.hxx
+framework/inc/jobs/shelljob.hxx
+framework/inc/menuconfiguration.hxx
+framework/inc/properties.h
+framework/inc/protocols.h
+framework/inc/recording/dispatchrecorder.hxx
+framework/inc/recording/dispatchrecordersupplier.hxx
+framework/inc/services.h
+framework/inc/services/layoutmanager.hxx
+framework/inc/services/mediatypedetectionhelper.hxx
+framework/inc/statusbarconfiguration.hxx
+framework/inc/stdtypes.h
+framework/inc/targets.h
+framework/inc/threadhelp/transactionguard.hxx
+framework/inc/toolboxconfiguration.hxx
+framework/inc/uiconfiguration/globalsettings.hxx
+framework/inc/uiconfiguration/graphicnameaccess.hxx
+framework/inc/uiconfiguration/imagemanager.hxx
+framework/inc/uiconfiguration/imagetype.hxx
+framework/inc/uiconfiguration/moduleimagemanager.hxx
+framework/inc/uiconfiguration/windowstateproperties.hxx
+framework/inc/uielement/addonstoolbarwrapper.hxx
+framework/inc/uielement/buttontoolbarcontroller.hxx
+framework/inc/uielement/comboboxtoolbarcontroller.hxx
+framework/inc/uielement/commandinfo.hxx
+framework/inc/uielement/complextoolbarcontroller.hxx
+framework/inc/uielement/constitemcontainer.hxx
+framework/inc/uielement/dropdownboxtoolbarcontroller.hxx
+framework/inc/uielement/edittoolbarcontroller.hxx
+framework/inc/uielement/fontmenucontroller.hxx
+framework/inc/uielement/fontsizemenucontroller.hxx
+framework/inc/uielement/footermenucontroller.hxx
+framework/inc/uielement/genericstatusbarcontroller.hxx
+framework/inc/uielement/headermenucontroller.hxx
+framework/inc/uielement/imagebuttontoolbarcontroller.hxx
+framework/inc/uielement/itemcontainer.hxx
+framework/inc/uielement/langselectionmenucontroller.hxx
+framework/inc/uielement/macrosmenucontroller.hxx
+framework/inc/uielement/menubarmanager.hxx
+framework/inc/uielement/menubarmerger.hxx
+framework/inc/uielement/menubarwrapper.hxx
+framework/inc/uielement/newmenucontroller.hxx
+framework/inc/uielement/progressbarwrapper.hxx
+framework/inc/uielement/rootitemcontainer.hxx
+framework/inc/uielement/spinfieldtoolbarcontroller.hxx
+framework/inc/uielement/statusbar.hxx
+framework/inc/uielement/statusbaritem.hxx
+framework/inc/uielement/statusbarmanager.hxx
+framework/inc/uielement/statusbarmerger.hxx
+framework/inc/uielement/statusbarwrapper.hxx
+framework/inc/uielement/statusindicatorinterfacewrapper.hxx
+framework/inc/uielement/styletoolbarcontroller.hxx
+framework/inc/uielement/togglebuttontoolbarcontroller.hxx
+framework/inc/uielement/toolbarmanager.hxx
+framework/inc/uielement/toolbarmerger.hxx
+framework/inc/uielement/toolbarmodemenucontroller.hxx
+framework/inc/uielement/toolbarsmenucontroller.hxx
+framework/inc/uielement/toolbarwrapper.hxx
+framework/inc/uielement/uicommanddescription.hxx
+framework/inc/uielement/uielement.hxx
+framework/inc/uielement/uielementtypenames.hxx
+framework/inc/uifactory/configurationaccessfactorymanager.hxx
+framework/inc/uifactory/factoryconfiguration.hxx
+framework/inc/uifactory/menubarfactory.hxx
+framework/inc/xml/acceleratorconfigurationreader.hxx
+framework/inc/xml/acceleratorconfigurationwriter.hxx
+framework/inc/xml/imagesconfiguration.hxx
+framework/inc/xml/imagesdocumenthandler.hxx
+framework/inc/xml/menudocumenthandler.hxx
+framework/inc/xml/saxnamespacefilter.hxx
+framework/inc/xml/statusbardocumenthandler.hxx
+framework/inc/xml/toolboxconfigurationdefines.hxx
+framework/inc/xml/toolboxdocumenthandler.hxx
+framework/inc/xml/xmlnamespaces.hxx
+framework/source/accelerators/acceleratorconfiguration.cxx
+framework/source/accelerators/documentacceleratorconfiguration.cxx
+framework/source/accelerators/globalacceleratorconfiguration.cxx
+framework/source/accelerators/keymapping.cxx
+framework/source/accelerators/moduleacceleratorconfiguration.cxx
+framework/source/accelerators/presethandler.cxx
+framework/source/accelerators/storageholder.cxx
+framework/source/classes/taskcreator.cxx
+framework/source/dispatch/closedispatcher.cxx
+framework/source/dispatch/dispatchdisabler.cxx
+framework/source/dispatch/dispatchinformationprovider.cxx
+framework/source/dispatch/dispatchprovider.cxx
+framework/source/dispatch/interceptionhelper.cxx
+framework/source/dispatch/loaddispatcher.cxx
+framework/source/dispatch/mailtodispatcher.cxx
+framework/source/dispatch/oxt_handler.cxx
+framework/source/dispatch/popupmenudispatcher.cxx
+framework/source/dispatch/servicehandler.cxx
+framework/source/dispatch/startmoduledispatcher.cxx
+framework/source/dispatch/systemexec.cxx
+framework/source/dispatch/windowcommanddispatch.cxx
+framework/source/fwe/classes/actiontriggercontainer.cxx
+framework/source/fwe/classes/actiontriggerpropertyset.cxx
+framework/source/fwe/classes/actiontriggerseparatorpropertyset.cxx
+framework/source/fwe/classes/addonmenu.cxx
+framework/source/fwe/classes/addonsoptions.cxx
+framework/source/fwe/classes/framelistanalyzer.cxx
+framework/source/fwe/classes/rootactiontriggercontainer.cxx
+framework/source/fwe/classes/sfxhelperfunctions.cxx
+framework/source/fwe/dispatch/interaction.cxx
+framework/source/fwe/helper/actiontriggerhelper.cxx
+framework/source/fwe/helper/configimporter.cxx
+framework/source/fwe/helper/documentundoguard.cxx
+framework/source/fwe/helper/propertysetcontainer.cxx
+framework/source/fwe/helper/titlehelper.cxx
+framework/source/fwe/helper/undomanagerhelper.cxx
+framework/source/fwe/xml/menuconfiguration.cxx
+framework/source/fwe/xml/menudocumenthandler.cxx
+framework/source/fwe/xml/saxnamespacefilter.cxx
+framework/source/fwe/xml/statusbarconfiguration.cxx
+framework/source/fwe/xml/statusbardocumenthandler.cxx
+framework/source/fwe/xml/toolboxdocumenthandler.cxx
+framework/source/fwe/xml/xmlnamespaces.cxx
+framework/source/fwi/classes/converter.cxx
+framework/source/fwi/classes/protocolhandlercache.cxx
+framework/source/fwi/helper/mischelper.cxx
+framework/source/fwi/jobs/configaccess.cxx
+framework/source/fwi/threadhelp/transactionmanager.cxx
+framework/source/fwi/uielement/constitemcontainer.cxx
+framework/source/fwi/uielement/itemcontainer.cxx
+framework/source/fwi/uielement/rootitemcontainer.cxx
+framework/source/helper/dockingareadefaultacceptor.cxx
+framework/source/helper/ocomponentaccess.cxx
+framework/source/helper/ocomponentenumeration.cxx
+framework/source/helper/oframes.cxx
+framework/source/helper/persistentwindowstate.cxx
+framework/source/helper/statusindicatorfactory.cxx
+framework/source/helper/tagwindowasmodified.cxx
+framework/source/helper/titlebarupdate.cxx
+framework/source/helper/uiconfigelementwrapperbase.cxx
+framework/source/helper/uielementwrapperbase.cxx
+framework/source/helper/vclstatusindicator.cxx
+framework/source/helper/wakeupthread.cxx
+framework/source/inc/accelerators/acceleratorcache.hxx
+framework/source/inc/accelerators/acceleratorconfiguration.hxx
+framework/source/inc/accelerators/keymapping.hxx
+framework/source/inc/accelerators/presethandler.hxx
+framework/source/inc/accelerators/storageholder.hxx
+framework/source/inc/dispatch/dispatchdisabler.hxx
+framework/source/inc/dispatch/loaddispatcher.hxx
+framework/source/inc/dispatch/windowcommanddispatch.hxx
+framework/source/inc/loadenv/actionlockguard.hxx
+framework/source/inc/loadenv/loadenv.hxx
+framework/source/inc/loadenv/loadenvexception.hxx
+framework/source/inc/loadenv/targethelper.hxx
+framework/source/inc/pattern/frame.hxx
+framework/source/inc/pattern/window.hxx
+framework/source/interaction/quietinteraction.cxx
+framework/source/jobs/helponstartup.cxx
+framework/source/jobs/job.cxx
+framework/source/jobs/jobdata.cxx
+framework/source/jobs/jobdispatch.cxx
+framework/source/jobs/jobexecutor.cxx
+framework/source/jobs/joburl.cxx
+framework/source/jobs/shelljob.cxx
+framework/source/layoutmanager/helpers.cxx
+framework/source/layoutmanager/helpers.hxx
+framework/source/layoutmanager/layoutmanager.cxx
+framework/source/layoutmanager/toolbarlayoutmanager.cxx
+framework/source/layoutmanager/toolbarlayoutmanager.hxx
+framework/source/layoutmanager/uielement.cxx
+framework/source/loadenv/loadenv.cxx
+framework/source/loadenv/targethelper.cxx
+framework/source/recording/dispatchrecorder.cxx
+framework/source/recording/dispatchrecordersupplier.cxx
+framework/source/services/ContextChangeEventMultiplexer.cxx
+framework/source/services/autorecovery.cxx
+framework/source/services/desktop.cxx
+framework/source/services/frame.cxx
+framework/source/services/mediatypedetectionhelper.cxx
+framework/source/services/modulemanager.cxx
+framework/source/services/pathsettings.cxx
+framework/source/services/sessionlistener.cxx
+framework/source/services/substitutepathvars.cxx
+framework/source/services/taskcreatorsrv.cxx
+framework/source/services/uriabbreviation.cxx
+framework/source/services/urltransformer.cxx
+framework/source/uiconfiguration/CommandImageResolver.cxx
+framework/source/uiconfiguration/ImageList.cxx
+framework/source/uiconfiguration/ImageList.hxx
+framework/source/uiconfiguration/globalsettings.cxx
+framework/source/uiconfiguration/graphicnameaccess.cxx
+framework/source/uiconfiguration/imagemanager.cxx
+framework/source/uiconfiguration/imagemanagerimpl.cxx
+framework/source/uiconfiguration/imagemanagerimpl.hxx
+framework/source/uiconfiguration/moduleimagemanager.cxx
+framework/source/uiconfiguration/moduleuicfgsupplier.cxx
+framework/source/uiconfiguration/moduleuiconfigurationmanager.cxx
+framework/source/uiconfiguration/uicategorydescription.cxx
+framework/source/uiconfiguration/uiconfigurationmanager.cxx
+framework/source/uiconfiguration/windowstateconfiguration.cxx
+framework/source/uielement/addonstoolbarwrapper.cxx
+framework/source/uielement/buttontoolbarcontroller.cxx
+framework/source/uielement/comboboxtoolbarcontroller.cxx
+framework/source/uielement/complextoolbarcontroller.cxx
+framework/source/uielement/controlmenucontroller.cxx
+framework/source/uielement/dropdownboxtoolbarcontroller.cxx
+framework/source/uielement/edittoolbarcontroller.cxx
+framework/source/uielement/fontmenucontroller.cxx
+framework/source/uielement/fontsizemenucontroller.cxx
+framework/source/uielement/footermenucontroller.cxx
+framework/source/uielement/genericstatusbarcontroller.cxx
+framework/source/uielement/generictoolbarcontroller.cxx
+framework/source/uielement/headermenucontroller.cxx
+framework/source/uielement/imagebuttontoolbarcontroller.cxx
+framework/source/uielement/langselectionmenucontroller.cxx
+framework/source/uielement/langselectionstatusbarcontroller.cxx
+framework/source/uielement/macrosmenucontroller.cxx
+framework/source/uielement/menubarmanager.cxx
+framework/source/uielement/menubarmerger.cxx
+framework/source/uielement/menubarwrapper.cxx
+framework/source/uielement/newmenucontroller.cxx
+framework/source/uielement/objectmenucontroller.cxx
+framework/source/uielement/popuptoolbarcontroller.cxx
+framework/source/uielement/progressbarwrapper.cxx
+framework/source/uielement/recentfilesmenucontroller.cxx
+framework/source/uielement/resourcemenucontroller.cxx
+framework/source/uielement/spinfieldtoolbarcontroller.cxx
+framework/source/uielement/statusbar.cxx
+framework/source/uielement/statusbaritem.cxx
+framework/source/uielement/statusbarmanager.cxx
+framework/source/uielement/statusbarmerger.cxx
+framework/source/uielement/statusbarwrapper.cxx
+framework/source/uielement/statusindicatorinterfacewrapper.cxx
+framework/source/uielement/styletoolbarcontroller.cxx
+framework/source/uielement/subtoolbarcontroller.cxx
+framework/source/uielement/thesaurusmenucontroller.cxx
+framework/source/uielement/togglebuttontoolbarcontroller.cxx
+framework/source/uielement/toolbarmanager.cxx
+framework/source/uielement/toolbarmerger.cxx
+framework/source/uielement/toolbarmodemenucontroller.cxx
+framework/source/uielement/toolbarsmenucontroller.cxx
+framework/source/uielement/toolbarwrapper.cxx
+framework/source/uielement/uicommanddescription.cxx
+framework/source/uifactory/addonstoolbarfactory.cxx
+framework/source/uifactory/factoryconfiguration.cxx
+framework/source/uifactory/menubarfactory.cxx
+framework/source/uifactory/statusbarfactory.cxx
+framework/source/uifactory/toolbarfactory.cxx
+framework/source/uifactory/uicontrollerfactory.cxx
+framework/source/uifactory/uielementfactorymanager.cxx
+framework/source/uifactory/windowcontentfactorymanager.cxx
+framework/source/xml/acceleratorconfigurationreader.cxx
+framework/source/xml/acceleratorconfigurationwriter.cxx
+framework/source/xml/imagesdocumenthandler.cxx
+helpcompiler/inc/BasCodeTagger.hxx
+helpcompiler/inc/HelpCompiler.hxx
+helpcompiler/inc/HelpLinker.hxx
+helpcompiler/source/BasCodeTagger.cxx
+helpcompiler/source/HelpCompiler.cxx
+helpcompiler/source/HelpIndexer.cxx
+helpcompiler/source/HelpIndexer_main.cxx
+helpcompiler/source/HelpLinker.cxx
+helpcompiler/source/HelpSearch.cxx
+hwpfilter/qa/cppunit/test_hwpfilter.cxx
+hwpfilter/source/attributes.cxx
+hwpfilter/source/attributes.hxx
+hwpfilter/source/cspline.cxx
+hwpfilter/source/cspline.h
+hwpfilter/source/drawdef.h
+hwpfilter/source/drawing.h
+hwpfilter/source/fontmap.cxx
+hwpfilter/source/formula.cxx
+hwpfilter/source/formula.h
+hwpfilter/source/grammar.cxx
+hwpfilter/source/grammar.h
+hwpfilter/source/hbox.cxx
+hwpfilter/source/hbox.h
+hwpfilter/source/hcode.cxx
+hwpfilter/source/hcode.h
+hwpfilter/source/hfont.h
+hwpfilter/source/hgzip.cxx
+hwpfilter/source/hgzip.h
+hwpfilter/source/hinfo.cxx
+hwpfilter/source/hinfo.h
+hwpfilter/source/hiodev.cxx
+hwpfilter/source/hiodev.h
+hwpfilter/source/hpara.cxx
+hwpfilter/source/hpara.h
+hwpfilter/source/hstream.hxx
+hwpfilter/source/hstyle.h
+hwpfilter/source/htags.cxx
+hwpfilter/source/hutil.cxx
+hwpfilter/source/hutil.h
+hwpfilter/source/hwpeq.cxx
+hwpfilter/source/hwpfile.cxx
+hwpfilter/source/hwpfile.h
+hwpfilter/source/hwplib.h
+hwpfilter/source/hwpread.cxx
+hwpfilter/source/hwpreader.cxx
+hwpfilter/source/hwpreader.hxx
+hwpfilter/source/ksc5601.h
+hwpfilter/source/lexer.cxx
+hwpfilter/source/mapping.h
+hwpfilter/source/mzstring.cxx
+hwpfilter/source/mzstring.h
+hwpfilter/source/nodes.h
+hwpfilter/source/solver.cxx
+i18nlangtag/qa/cppunit/test_languagetag.cxx
+i18nlangtag/source/isolang/inunx.cxx
+i18nlangtag/source/isolang/inwnt.cxx
+i18nlangtag/source/isolang/isolang.cxx
+i18nlangtag/source/isolang/mslangid.cxx
+i18nlangtag/source/languagetag/languagetag.cxx
+i18nlangtag/source/languagetag/languagetagicu.cxx
+i18npool/inc/breakiteratorImpl.hxx
+i18npool/inc/breakiterator_cjk.hxx
+i18npool/inc/breakiterator_th.hxx
+i18npool/inc/breakiterator_unicode.hxx
+i18npool/inc/bullet.h
+i18npool/inc/calendarImpl.hxx
+i18npool/inc/calendar_gregorian.hxx
+i18npool/inc/calendar_hijri.hxx
+i18npool/inc/calendar_jewish.hxx
+i18npool/inc/cclass_unicode.hxx
+i18npool/inc/chaptercollator.hxx
+i18npool/inc/characterclassificationImpl.hxx
+i18npool/inc/chartonum.hxx
+i18npool/inc/collatorImpl.hxx
+i18npool/inc/collator_unicode.hxx
+i18npool/inc/defaultnumberingprovider.hxx
+i18npool/inc/indexentrysupplier.hxx
+i18npool/inc/indexentrysupplier_asian.hxx
+i18npool/inc/indexentrysupplier_common.hxx
+i18npool/inc/indexentrysupplier_default.hxx
+i18npool/inc/indexentrysupplier_ja_phonetic.hxx
+i18npool/inc/inputsequencechecker.hxx
+i18npool/inc/inputsequencechecker_hi.hxx
+i18npool/inc/inputsequencechecker_th.hxx
+i18npool/inc/localedata.hxx
+i18npool/inc/nativenumbersupplier.hxx
+i18npool/inc/numberformatcode.hxx
+i18npool/inc/numtochar.hxx
+i18npool/inc/numtotext_cjk.hxx
+i18npool/inc/ordinalsuffix.hxx
+i18npool/inc/textToPronounce_zh.hxx
+i18npool/inc/textconversion.hxx
+i18npool/inc/textconversionImpl.hxx
+i18npool/inc/texttonum.hxx
+i18npool/inc/transliterationImpl.hxx
+i18npool/inc/transliteration_Ignore.hxx
+i18npool/inc/transliteration_Numeric.hxx
+i18npool/inc/transliteration_OneToOne.hxx
+i18npool/inc/transliteration_body.hxx
+i18npool/inc/transliteration_caseignore.hxx
+i18npool/inc/transliteration_commonclass.hxx
+i18npool/inc/unoscripttypedetector.hxx
+i18npool/inc/wtt.h
+i18npool/inc/xdictionary.hxx
+i18npool/qa/cppunit/test_breakiterator.cxx
+i18npool/qa/cppunit/test_characterclassification.cxx
+i18npool/qa/cppunit/test_ordinalsuffix.cxx
+i18npool/qa/cppunit/test_textsearch.cxx
+i18npool/source/breakiterator/breakiteratorImpl.cxx
+i18npool/source/breakiterator/breakiterator_cjk.cxx
+i18npool/source/breakiterator/breakiterator_th.cxx
+i18npool/source/breakiterator/breakiterator_unicode.cxx
+i18npool/source/breakiterator/gendict.cxx
+i18npool/source/breakiterator/xdictionary.cxx
+i18npool/source/calendar/calendarImpl.cxx
+i18npool/source/calendar/calendar_gregorian.cxx
+i18npool/source/calendar/calendar_hijri.cxx
+i18npool/source/calendar/calendar_jewish.cxx
+i18npool/source/characterclassification/cclass_unicode.cxx
+i18npool/source/characterclassification/cclass_unicode_parser.cxx
+i18npool/source/characterclassification/characterclassificationImpl.cxx
+i18npool/source/characterclassification/unoscripttypedetector.cxx
+i18npool/source/collator/chaptercollator.cxx
+i18npool/source/collator/collatorImpl.cxx
+i18npool/source/collator/collator_unicode.cxx
+i18npool/source/collator/gencoll_rule.cxx
+i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
+i18npool/source/indexentry/data/indexdata_alphanumeric.h
+i18npool/source/indexentry/data/indexdata_ja_phonetic.h
+i18npool/source/indexentry/genindex_data.cxx
+i18npool/source/indexentry/indexentrysupplier.cxx
+i18npool/source/indexentry/indexentrysupplier_asian.cxx
+i18npool/source/indexentry/indexentrysupplier_common.cxx
+i18npool/source/indexentry/indexentrysupplier_default.cxx
+i18npool/source/indexentry/indexentrysupplier_ja_phonetic.cxx
+i18npool/source/inputchecker/inputsequencechecker.cxx
+i18npool/source/inputchecker/inputsequencechecker_hi.cxx
+i18npool/source/inputchecker/inputsequencechecker_th.cxx
+i18npool/source/localedata/LocaleNode.cxx
+i18npool/source/localedata/LocaleNode.hxx
+i18npool/source/localedata/filewriter.cxx
+i18npool/source/localedata/localedata.cxx
+i18npool/source/localedata/saxparser.cxx
+i18npool/source/nativenumber/data/numberchar.h
+i18npool/source/nativenumber/nativenumbersupplier.cxx
+i18npool/source/numberformatcode/numberformatcode.cxx
+i18npool/source/ordinalsuffix/ordinalsuffix.cxx
+i18npool/source/registerservices/registerservices.cxx
+i18npool/source/search/levdis.cxx
+i18npool/source/search/levdis.hxx
+i18npool/source/search/textsearch.cxx
+i18npool/source/search/textsearch.hxx
+i18npool/source/textconversion/genconv_dict.cxx
+i18npool/source/textconversion/textconversion.cxx
+i18npool/source/textconversion/textconversionImpl.cxx
+i18npool/source/textconversion/textconversion_ko.cxx
+i18npool/source/textconversion/textconversion_zh.cxx
+i18npool/source/transliteration/chartonum.cxx
+i18npool/source/transliteration/fullwidthToHalfwidth.cxx
+i18npool/source/transliteration/halfwidthToFullwidth.cxx
+i18npool/source/transliteration/ignoreBaFa_ja_JP.cxx
+i18npool/source/transliteration/ignoreDiacritics_CTL.cxx
+i18npool/source/transliteration/ignoreHyuByu_ja_JP.cxx
+i18npool/source/transliteration/ignoreIandEfollowedByYa_ja_JP.cxx
+i18npool/source/transliteration/ignoreIterationMark_ja_JP.cxx
+i18npool/source/transliteration/ignoreKana.cxx
+i18npool/source/transliteration/ignoreKiKuFollowedBySa_ja_JP.cxx
+i18npool/source/transliteration/ignoreProlongedSoundMark_ja_JP.cxx
+i18npool/source/transliteration/ignoreSize_ja_JP.cxx
+i18npool/source/transliteration/ignoreSpace_ja_JP.cxx
+i18npool/source/transliteration/ignoreTraditionalKanji_ja_JP.cxx
+i18npool/source/transliteration/ignoreWidth.cxx
+i18npool/source/transliteration/numtochar.cxx
+i18npool/source/transliteration/numtotext_cjk.cxx
+i18npool/source/transliteration/textToPronounce_zh.cxx
+i18npool/source/transliteration/texttonum.cxx
+i18npool/source/transliteration/transliterationImpl.cxx
+i18npool/source/transliteration/transliteration_Ignore.cxx
+i18npool/source/transliteration/transliteration_Numeric.cxx
+i18npool/source/transliteration/transliteration_OneToOne.cxx
+i18npool/source/transliteration/transliteration_body.cxx
+i18npool/source/transliteration/transliteration_caseignore.cxx
+i18npool/source/transliteration/transliteration_commonclass.cxx
+i18nutil/source/utility/casefolding.cxx
+i18nutil/source/utility/casefolding_data.h
+i18nutil/source/utility/oneToOneMapping.cxx
+i18nutil/source/utility/paper.cxx
+i18nutil/source/utility/scripttypedetector.cxx
+i18nutil/source/utility/unicode.cxx
+i18nutil/source/utility/unicode_data.h
+i18nutil/source/utility/widthfolding.cxx
+i18nutil/source/utility/widthfolding_data.h
+idl/inc/basobj.hxx
+idl/inc/bastype.hxx
+idl/inc/command.hxx
+idl/inc/database.hxx
+idl/inc/globals.hxx
+idl/inc/hash.hxx
+idl/inc/lex.hxx
+idl/inc/module.hxx
+idl/inc/object.hxx
+idl/inc/parser.hxx
+idl/inc/slot.hxx
+idl/inc/types.hxx
+idl/source/cmptools/hash.cxx
+idl/source/cmptools/lex.cxx
+idl/source/objects/basobj.cxx
+idl/source/objects/bastype.cxx
+idl/source/objects/object.cxx
+idl/source/objects/slot.cxx
+idl/source/objects/types.cxx
+idl/source/prj/command.cxx
+idl/source/prj/database.cxx
+idl/source/prj/globals.cxx
+idl/source/prj/parser.cxx
+idl/source/prj/svidl.cxx
+idlc/inc/astattribute.hxx
+idlc/inc/astbasetype.hxx
+idlc/inc/astconstant.hxx
+idlc/inc/astdeclaration.hxx
+idlc/inc/astexpression.hxx
+idlc/inc/astinterface.hxx
+idlc/inc/astinterfacemember.hxx
+idlc/inc/astmember.hxx
+idlc/inc/astoperation.hxx
+idlc/inc/astparameter.hxx
+idlc/inc/astservice.hxx
+idlc/inc/astservicemember.hxx
+idlc/inc/aststruct.hxx
+idlc/inc/aststructinstance.hxx
+idlc/inc/asttypedef.hxx
+idlc/inc/errorhandler.hxx
+idlc/inc/fehelper.hxx
+idlc/inc/idlc.hxx
+idlc/inc/idlctypes.hxx
+idlc/inc/inheritedinterface.hxx
+idlc/inc/options.hxx
+idlc/source/astconstant.cxx
+idlc/source/astdeclaration.cxx
+idlc/source/astdump.cxx
+idlc/source/astenum.cxx
+idlc/source/astinterface.cxx
+idlc/source/astoperation.cxx
+idlc/source/astscope.cxx
+idlc/source/astservice.cxx
+idlc/source/aststruct.cxx
+idlc/source/aststructinstance.cxx
+idlc/source/errorhandler.cxx
+idlc/source/fehelper.cxx
+idlc/source/idlc.cxx
+idlc/source/idlccompile.cxx
+idlc/source/idlcmain.cxx
+idlc/source/idlcproduce.cxx
+idlc/source/options.cxx
+include/LibreOfficeKit/LibreOfficeKit.h
+include/LibreOfficeKit/LibreOfficeKit.hxx
+include/LibreOfficeKit/LibreOfficeKitEnums.h
+include/LibreOfficeKit/LibreOfficeKitGtk.h
+include/LibreOfficeKit/LibreOfficeKitInit.h
+include/animations/animationnodehelper.hxx
+include/apple_remote/RemoteControl.h
+include/avmedia/MediaControlBase.hxx
+include/avmedia/mediaitem.hxx
+include/avmedia/mediaplayer.hxx
+include/avmedia/mediatoolbox.hxx
+include/avmedia/mediawindow.hxx
+include/basegfx/color/bcolor.hxx
+include/basegfx/color/bcolormodifier.hxx
+include/basegfx/curve/b2dbeziertools.hxx
+include/basegfx/curve/b2dcubicbezier.hxx
+include/basegfx/matrix/b2dhommatrix.hxx
+include/basegfx/matrix/b2dhommatrixtools.hxx
+include/basegfx/matrix/b3dhommatrix.hxx
+include/basegfx/numeric/ftools.hxx
+include/basegfx/pixel/bpixel.hxx
+include/basegfx/point/b2dpoint.hxx
+include/basegfx/point/b2ipoint.hxx
+include/basegfx/point/b3dpoint.hxx
+include/basegfx/polygon/b2dlinegeometry.hxx
+include/basegfx/polygon/b2dpolygon.hxx
+include/basegfx/polygon/b2dpolygonclipper.hxx
+include/basegfx/polygon/b2dpolygoncutandtouch.hxx
+include/basegfx/polygon/b2dpolygontools.hxx
+include/basegfx/polygon/b2dpolygontriangulator.hxx
+include/basegfx/polygon/b2dpolypolygon.hxx
+include/basegfx/polygon/b2dpolypolygoncutter.hxx
+include/basegfx/polygon/b2dpolypolygontools.hxx
+include/basegfx/polygon/b2dtrapezoid.hxx
+include/basegfx/polygon/b3dpolygon.hxx
+include/basegfx/polygon/b3dpolygontools.hxx
+include/basegfx/polygon/b3dpolypolygon.hxx
+include/basegfx/polygon/b3dpolypolygontools.hxx
+include/basegfx/range/b1drange.hxx
+include/basegfx/range/b2dconnectedranges.hxx
+include/basegfx/range/b2dpolyrange.hxx
+include/basegfx/range/b2drange.hxx
+include/basegfx/range/b2drangeclipper.hxx
+include/basegfx/range/b2ibox.hxx
+include/basegfx/range/b2irange.hxx
+include/basegfx/range/b3drange.hxx
+include/basegfx/range/basicbox.hxx
+include/basegfx/range/basicrange.hxx
+include/basegfx/raster/bzpixelraster.hxx
+include/basegfx/raster/rasterconvert3d.hxx
+include/basegfx/tuple/b2dtuple.hxx
+include/basegfx/tuple/b2i64tuple.hxx
+include/basegfx/tuple/b2ituple.hxx
+include/basegfx/tuple/b3dtuple.hxx
+include/basegfx/tuple/b3ituple.hxx
+include/basegfx/utils/b2dclipstate.hxx
+include/basegfx/utils/canvastools.hxx
+include/basegfx/utils/gradienttools.hxx
+include/basegfx/utils/keystoplerp.hxx
+include/basegfx/utils/lerp.hxx
+include/basegfx/utils/rectcliptools.hxx
+include/basegfx/utils/systemdependentdata.hxx
+include/basegfx/utils/tools.hxx
+include/basegfx/utils/unopolypolygon.hxx
+include/basegfx/vector/b2dvector.hxx
+include/basegfx/vector/b2enums.hxx
+include/basegfx/vector/b2ivector.hxx
+include/basegfx/vector/b3dvector.hxx
+include/basic/basicmanagerrepository.hxx
+include/basic/basmgr.hxx
+include/basic/codecompletecache.hxx
+include/basic/modsizeexceeded.hxx
+include/basic/sbdef.hxx
+include/basic/sberrors.hxx
+include/basic/sbmeth.hxx
+include/basic/sbmod.hxx
+include/basic/sbstar.hxx
+include/basic/sbuno.hxx
+include/basic/sbx.hxx
+include/basic/sbxcore.hxx
+include/basic/sbxdef.hxx
+include/basic/sbxmeth.hxx
+include/basic/sbxobj.hxx
+include/basic/sbxvar.hxx
+include/basic/vbahelper.hxx
+include/canvas/canvastools.hxx
+include/canvas/elapsedtime.hxx
+include/codemaker/commoncpp.hxx
+include/codemaker/commonjava.hxx
+include/codemaker/exceptiontree.hxx
+include/codemaker/global.hxx
+include/codemaker/options.hxx
+include/codemaker/typemanager.hxx
+include/codemaker/unotype.hxx
+include/com/sun/star/uno/Any.h
+include/com/sun/star/uno/Any.hxx
+include/com/sun/star/uno/Reference.h
+include/com/sun/star/uno/Reference.hxx
+include/com/sun/star/uno/Sequence.h
+include/com/sun/star/uno/Sequence.hxx
+include/com/sun/star/uno/Type.h
+include/com/sun/star/uno/Type.hxx
+include/com/sun/star/uno/genfunc.hxx
+include/comphelper/ChainablePropertySet.hxx
+include/comphelper/ChainablePropertySetInfo.hxx
+include/comphelper/IdPropArrayHelper.hxx
+include/comphelper/MasterPropertySet.hxx
+include/comphelper/MasterPropertySetInfo.hxx
+include/comphelper/PropertyInfoHash.hxx
+include/comphelper/SelectionMultiplex.hxx
+include/comphelper/accessiblecomponenthelper.hxx
+include/comphelper/accessiblecontexthelper.hxx
+include/comphelper/accessibleeventnotifier.hxx
+include/comphelper/accessiblekeybindinghelper.hxx
+include/comphelper/accessibleselectionhelper.hxx
+include/comphelper/accessibletexthelper.hxx
+include/comphelper/accessiblewrapper.hxx
+include/comphelper/accimplaccess.hxx
+include/comphelper/anycompare.hxx
+include/comphelper/asyncnotification.hxx
+include/comphelper/attributelist.hxx
+include/comphelper/backupfilehelper.hxx
+include/comphelper/basicio.hxx
+include/comphelper/broadcasthelper.hxx
+include/comphelper/classids.hxx
+include/comphelper/componentbase.hxx
+include/comphelper/componentguard.hxx
+include/comphelper/configuration.hxx
+include/comphelper/configurationhelper.hxx
+include/comphelper/configurationlistener.hxx
+include/comphelper/container.hxx
+include/comphelper/containermultiplexer.hxx
+include/comphelper/dispatchcommand.hxx
+include/comphelper/docpasswordhelper.hxx
+include/comphelper/docpasswordrequest.hxx
+include/comphelper/documentconstants.hxx
+include/comphelper/documentinfo.hxx
+include/comphelper/embeddedobjectcontainer.hxx
+include/comphelper/enumhelper.hxx
+include/comphelper/eventattachermgr.hxx
+include/comphelper/evtlistenerhlp.hxx
+include/comphelper/flagguard.hxx
+include/comphelper/guarding.hxx
+include/comphelper/hash.hxx
+include/comphelper/interaction.hxx
+include/comphelper/interfacecontainer2.hxx
+include/comphelper/logging.hxx
+include/comphelper/mimeconfighelper.hxx
+include/comphelper/namedvaluecollection.hxx
+include/comphelper/newarray.hxx
+include/comphelper/numberedcollection.hxx
+include/comphelper/numbers.hxx
+include/comphelper/ofopxmlhelper.hxx
+include/comphelper/oslfile2streamwrap.hxx
+include/comphelper/processfactory.hxx
+include/comphelper/propagg.hxx
+include/comphelper/proparrhlp.hxx
+include/comphelper/property.hxx
+include/comphelper/propertybag.hxx
+include/comphelper/propertycontainer.hxx
+include/comphelper/propertycontainerhelper.hxx
+include/comphelper/propertysequence.hxx
+include/comphelper/propertysethelper.hxx
+include/comphelper/propertysetinfo.hxx
+include/comphelper/propertystatecontainer.hxx
+include/comphelper/propmultiplex.hxx
+include/comphelper/propstate.hxx
+include/comphelper/proxyaggregation.hxx
+include/comphelper/scopeguard.hxx
+include/comphelper/seekableinput.hxx
+include/comphelper/seqstream.hxx
+include/comphelper/sequence.hxx
+include/comphelper/sequenceashashmap.hxx
+include/comphelper/servicedecl.hxx
+include/comphelper/servicehelper.hxx
+include/comphelper/sharedmutex.hxx
+include/comphelper/simplefileaccessinteraction.hxx
+include/comphelper/solarmutex.hxx
+include/comphelper/stillreadwriteinteraction.hxx
+include/comphelper/stl_types.hxx
+include/comphelper/storagehelper.hxx
+include/comphelper/string.hxx
+include/comphelper/synchronousdispatch.hxx
+include/comphelper/syntaxhighlight.hxx
+include/comphelper/threadpool.hxx
+include/comphelper/types.hxx
+include/comphelper/unique_disposing_ptr.hxx
+include/comphelper/uno3.hxx
+include/comphelper/unwrapargs.hxx
+include/comphelper/weak.hxx
+include/comphelper/weakbag.hxx
+include/comphelper/weakeventlistener.hxx
+include/comphelper/windowsStart.hxx
+include/comphelper/windowserrorstring.hxx
+include/comphelper/xmltools.hxx
+include/connectivity/BlobHelper.hxx
+include/connectivity/CommonTools.hxx
+include/connectivity/ConnectionWrapper.hxx
+include/connectivity/DriversConfig.hxx
+include/connectivity/FValue.hxx
+include/connectivity/IParseContext.hxx
+include/connectivity/PColumn.hxx
+include/connectivity/TColumnsHelper.hxx
+include/connectivity/TIndexes.hxx
+include/connectivity/TKeys.hxx
+include/connectivity/TTableHelper.hxx
+include/connectivity/conncleanup.hxx
+include/connectivity/dbcharset.hxx
+include/connectivity/dbconversion.hxx
+include/connectivity/dbexception.hxx
+include/connectivity/dbmetadata.hxx
+include/connectivity/dbtools.hxx
+include/connectivity/filtermanager.hxx
+include/connectivity/formattedcolumnvalue.hxx
+include/connectivity/internalnode.hxx
+include/connectivity/odbc.hxx
+include/connectivity/parameters.hxx
+include/connectivity/paramwrapper.hxx
+include/connectivity/predicateinput.hxx
+include/connectivity/sdbcx/IRefreshable.hxx
+include/connectivity/sdbcx/VCollection.hxx
+include/connectivity/sdbcx/VColumn.hxx
+include/connectivity/sdbcx/VDescriptor.hxx
+include/connectivity/sdbcx/VTable.hxx
+include/connectivity/sdbcx/VView.hxx
+include/connectivity/sqlbison_exports.hxx
+include/connectivity/sqlerror.hxx
+include/connectivity/sqliterator.hxx
+include/connectivity/sqlnode.hxx
+include/connectivity/sqlparse.hxx
+include/connectivity/sqlscan.hxx
+include/connectivity/standardsqlstate.hxx
+include/connectivity/statementcomposer.hxx
+include/connectivity/warningscontainer.hxx
+include/cppcanvas/basegfxfactory.hxx
+include/cppcanvas/bitmap.hxx
+include/cppcanvas/bitmapcanvas.hxx
+include/cppcanvas/canvas.hxx
+include/cppcanvas/canvasgraphic.hxx
+include/cppcanvas/color.hxx
+include/cppcanvas/customsprite.hxx
+include/cppcanvas/polypolygon.hxx
+include/cppcanvas/renderer.hxx
+include/cppcanvas/sprite.hxx
+include/cppcanvas/spritecanvas.hxx
+include/cppcanvas/vclfactory.hxx
+include/cppu/Enterable.hxx
+include/cppu/EnvGuards.hxx
+include/cppu/Map.hxx
+include/cppu/helper/purpenv/Environment.hxx
+include/cppu/helper/purpenv/Mapping.hxx
+include/cppu/macros.hxx
+include/cppu/unotype.hxx
+include/cppuhelper/access_control.hxx
+include/cppuhelper/basemutex.hxx
+include/cppuhelper/bootstrap.hxx
+include/cppuhelper/compbase.hxx
+include/cppuhelper/compbase1.hxx
+include/cppuhelper/compbase10.hxx
+include/cppuhelper/compbase11.hxx
+include/cppuhelper/compbase12.hxx
+include/cppuhelper/compbase2.hxx
+include/cppuhelper/compbase3.hxx
+include/cppuhelper/compbase4.hxx
+include/cppuhelper/compbase5.hxx
+include/cppuhelper/compbase6.hxx
+include/cppuhelper/compbase7.hxx
+include/cppuhelper/compbase8.hxx
+include/cppuhelper/compbase9.hxx
+include/cppuhelper/compbase_ex.hxx
+include/cppuhelper/component.hxx
+include/cppuhelper/component_context.hxx
+include/cppuhelper/factory.hxx
+include/cppuhelper/implbase.hxx
+include/cppuhelper/implbase1.hxx
+include/cppuhelper/implbase10.hxx
+include/cppuhelper/implbase11.hxx
+include/cppuhelper/implbase12.hxx
+include/cppuhelper/implbase13.hxx
+include/cppuhelper/implbase2.hxx
+include/cppuhelper/implbase3.hxx
+include/cppuhelper/implbase4.hxx
+include/cppuhelper/implbase5.hxx
+include/cppuhelper/implbase6.hxx
+include/cppuhelper/implbase7.hxx
+include/cppuhelper/implbase8.hxx
+include/cppuhelper/implbase9.hxx
+include/cppuhelper/implbase_ex.hxx
+include/cppuhelper/implbase_ex_post.hxx
+include/cppuhelper/implbase_ex_pre.hxx
+include/cppuhelper/implementationentry.hxx
+include/cppuhelper/interfacecontainer.h
+include/cppuhelper/interfacecontainer.hxx
+include/cppuhelper/propertysetmixin.hxx
+include/cppuhelper/propshlp.hxx
+include/cppuhelper/proptypehlp.h
+include/cppuhelper/proptypehlp.hxx
+include/cppuhelper/queryinterface.hxx
+include/cppuhelper/shlib.hxx
+include/cppuhelper/supportsservice.hxx
+include/cppuhelper/typeprovider.hxx
+include/cppuhelper/weak.hxx
+include/cppuhelper/weakagg.hxx
+include/cppuhelper/weakref.hxx
+include/cppunittester/protectorfactory.hxx
+include/dbaccess/AsynchronousLink.hxx
+include/dbaccess/IController.hxx
+include/dbaccess/controllerframe.hxx
+include/dbaccess/dataview.hxx
+include/dbaccess/dbaundomanager.hxx
+include/dbaccess/dbsubcomponentcontroller.hxx
+include/dbaccess/genericcontroller.hxx
+include/desktop/crashreport.hxx
+include/drawinglayer/XShapeDumper.hxx
+include/drawinglayer/animation/animationtiming.hxx
+include/drawinglayer/attribute/materialattribute3d.hxx
+include/drawinglayer/attribute/sdrallattribute3d.hxx
+include/drawinglayer/attribute/sdrfillattribute.hxx
+include/drawinglayer/attribute/sdrfillgraphicattribute.hxx
+include/drawinglayer/attribute/sdrlightattribute3d.hxx
+include/drawinglayer/attribute/sdrlightingattribute3d.hxx
+include/drawinglayer/attribute/sdrlineattribute.hxx
+include/drawinglayer/attribute/sdrlinestartendattribute.hxx
+include/drawinglayer/attribute/sdrobjectattribute3d.hxx
+include/drawinglayer/attribute/sdrsceneattribute3d.hxx
+include/drawinglayer/attribute/sdrshadowattribute.hxx
+include/drawinglayer/geometry/viewinformation3d.hxx
+include/drawinglayer/primitive2d/discretebitmapprimitive2d.hxx
+include/drawinglayer/primitive2d/discreteshadowprimitive2d.hxx
+include/drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx
+include/drawinglayer/primitive2d/embedded3dprimitive2d.hxx
+include/drawinglayer/primitive2d/epsprimitive2d.hxx
+include/drawinglayer/primitive2d/fillgradientprimitive2d.hxx
+include/drawinglayer/primitive2d/fillgraphicprimitive2d.hxx
+include/drawinglayer/primitive2d/fillhatchprimitive2d.hxx
+include/drawinglayer/primitive2d/gridprimitive2d.hxx
+include/drawinglayer/primitive2d/groupprimitive2d.hxx
+include/drawinglayer/primitive2d/helplineprimitive2d.hxx
+include/drawinglayer/primitive2d/hiddengeometryprimitive2d.hxx
+include/drawinglayer/primitive2d/invertprimitive2d.hxx
+include/drawinglayer/primitive2d/markerarrayprimitive2d.hxx
+include/drawinglayer/primitive2d/maskprimitive2d.hxx
+include/drawinglayer/primitive2d/mediaprimitive2d.hxx
+include/drawinglayer/primitive2d/metafileprimitive2d.hxx
+include/drawinglayer/primitive2d/modifiedcolorprimitive2d.hxx
+include/drawinglayer/primitive2d/objectinfoprimitive2d.hxx
+include/drawinglayer/primitive2d/pagehierarchyprimitive2d.hxx
+include/drawinglayer/primitive2d/pagepreviewprimitive2d.hxx
+include/drawinglayer/primitive2d/patternfillprimitive2d.hxx
+include/drawinglayer/primitive2d/pointarrayprimitive2d.hxx
+include/drawinglayer/primitive2d/primitivetools2d.hxx
+include/drawinglayer/primitive2d/sceneprimitive2d.hxx
+include/drawinglayer/primitive2d/sdrdecompositiontools2d.hxx
+include/drawinglayer/primitive2d/shadowprimitive2d.hxx
+include/drawinglayer/primitive2d/structuretagprimitive2d.hxx
+include/drawinglayer/primitive2d/svggradientprimitive2d.hxx
+include/drawinglayer/primitive2d/textbreakuphelper.hxx
+include/drawinglayer/primitive2d/textdecoratedprimitive2d.hxx
+include/drawinglayer/primitive2d/textenumsprimitive2d.hxx
+include/drawinglayer/primitive2d/texthierarchyprimitive2d.hxx
+include/drawinglayer/primitive2d/transformprimitive2d.hxx
+include/drawinglayer/primitive2d/transparenceprimitive2d.hxx
+include/drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx
+include/drawinglayer/primitive2d/wrongspellprimitive2d.hxx
+include/drawinglayer/primitive3d/baseprimitive3d.hxx
+include/drawinglayer/primitive3d/drawinglayer_primitivetypes3d.hxx
+include/drawinglayer/primitive3d/groupprimitive3d.hxx
+include/drawinglayer/primitive3d/modifiedcolorprimitive3d.hxx
+include/drawinglayer/primitive3d/polygonprimitive3d.hxx
+include/drawinglayer/primitive3d/polypolygonprimitive3d.hxx
+include/drawinglayer/primitive3d/sdrcubeprimitive3d.hxx
+include/drawinglayer/primitive3d/sdrextrudelathetools3d.hxx
+include/drawinglayer/primitive3d/sdrextrudeprimitive3d.hxx
+include/drawinglayer/primitive3d/sdrlatheprimitive3d.hxx
+include/drawinglayer/primitive3d/sdrpolypolygonprimitive3d.hxx
+include/drawinglayer/primitive3d/sdrprimitive3d.hxx
+include/drawinglayer/primitive3d/sdrsphereprimitive3d.hxx
+include/drawinglayer/primitive3d/transformprimitive3d.hxx
+include/drawinglayer/processor2d/baseprocessor2d.hxx
+include/drawinglayer/processor2d/contourextractor2d.hxx
+include/drawinglayer/processor2d/hittestprocessor2d.hxx
+include/drawinglayer/processor2d/linegeometryextractor2d.hxx
+include/drawinglayer/processor2d/objectinfoextractor2d.hxx
+include/drawinglayer/processor2d/processor2dtools.hxx
+include/drawinglayer/processor2d/processorfromoutputdevice.hxx
+include/drawinglayer/processor2d/textaspolygonextractor2d.hxx
+include/drawinglayer/processor3d/baseprocessor3d.hxx
+include/drawinglayer/processor3d/cutfindprocessor3d.hxx
+include/drawinglayer/tools/primitive2dxmldump.hxx
+include/editeng/AccessibleContextBase.hxx
+include/editeng/AccessibleEditableTextPara.hxx
+include/editeng/AccessibleParaManager.hxx
+include/editeng/AccessibleSelectionBase.hxx
+include/editeng/AccessibleStaticTextBase.hxx
+include/editeng/CustomPropertyField.hxx
+include/editeng/SpellPortions.hxx
+include/editeng/UnoForbiddenCharsTable.hxx
+include/editeng/acorrcfg.hxx
+include/editeng/adjustitem.hxx
+include/editeng/autokernitem.hxx
+include/editeng/blinkitem.hxx
+include/editeng/borderline.hxx
+include/editeng/boxitem.hxx
+include/editeng/brushitem.hxx
+include/editeng/bulletitem.hxx
+include/editeng/charhiddenitem.hxx
+include/editeng/charreliefitem.hxx
+include/editeng/charrotateitem.hxx
+include/editeng/charscaleitem.hxx
+include/editeng/cmapitem.hxx
+include/editeng/colritem.hxx
+include/editeng/contouritem.hxx
+include/editeng/crossedoutitem.hxx
+include/editeng/editdata.hxx
+include/editeng/editeng.hxx
+include/editeng/editobj.hxx
+include/editeng/editstat.hxx
+include/editeng/editview.hxx
+include/editeng/edtdlg.hxx
+include/editeng/eedata.hxx
+include/editeng/eeitem.hxx
+include/editeng/emphasismarkitem.hxx
+include/editeng/escapementitem.hxx
+include/editeng/fhgtitem.hxx
+include/editeng/flditem.hxx
+include/editeng/flstitem.hxx
+include/editeng/fontitem.hxx
+include/editeng/forbiddencharacterstable.hxx
+include/editeng/forbiddenruleitem.hxx
+include/editeng/formatbreakitem.hxx
+include/editeng/frmdiritem.hxx
+include/editeng/hangulhanja.hxx
+include/editeng/hngpnctitem.hxx
+include/editeng/hyphenzoneitem.hxx
+include/editeng/itemtype.hxx
+include/editeng/justifyitem.hxx
+include/editeng/keepitem.hxx
+include/editeng/kernitem.hxx
+include/editeng/langitem.hxx
+include/editeng/legacyitem.hxx
+include/editeng/lineitem.hxx
+include/editeng/lrspitem.hxx
+include/editeng/lspcitem.hxx
+include/editeng/measfld.hxx
+include/editeng/memberids.h
+include/editeng/nhypitem.hxx
+include/editeng/numitem.hxx
+include/editeng/opaqitem.hxx
+include/editeng/optitems.hxx
+include/editeng/orphitem.hxx
+include/editeng/outliner.hxx
+include/editeng/outlobj.hxx
+include/editeng/overflowingtxt.hxx
+include/editeng/paperinf.hxx
+include/editeng/paragraphdata.hxx
+include/editeng/paravertalignitem.hxx
+include/editeng/pbinitem.hxx
+include/editeng/pgrditem.hxx
+include/editeng/pmdlitem.hxx
+include/editeng/postitem.hxx
+include/editeng/prntitem.hxx
+include/editeng/protitem.hxx
+include/editeng/rsiditem.hxx
+include/editeng/scriptspaceitem.hxx
+include/editeng/scripttypeitem.hxx
+include/editeng/shaditem.hxx
+include/editeng/shdditem.hxx
+include/editeng/sizeitem.hxx
+include/editeng/spltitem.hxx
+include/editeng/splwrap.hxx
+include/editeng/svxacorr.hxx
+include/editeng/svxenum.hxx
+include/editeng/svxfont.hxx
+include/editeng/svxrtf.hxx
+include/editeng/swafopt.hxx
+include/editeng/tstpitem.hxx
+include/editeng/twolinesitem.hxx
+include/editeng/txtrange.hxx
+include/editeng/udlnitem.hxx
+include/editeng/ulspitem.hxx
+include/editeng/unoedhlp.hxx
+include/editeng/unoedprx.hxx
+include/editeng/unoedsrc.hxx
+include/editeng/unofield.hxx
+include/editeng/unofored.hxx
+include/editeng/unoforou.hxx
+include/editeng/unoipset.hxx
+include/editeng/unolingu.hxx
+include/editeng/unonames.hxx
+include/editeng/unonrule.hxx
+include/editeng/unoprnms.hxx
+include/editeng/unotext.hxx
+include/editeng/unoviwou.hxx
+include/editeng/wghtitem.hxx
+include/editeng/widwitem.hxx
+include/editeng/writingmodeitem.hxx
+include/editeng/wrlmitem.hxx
+include/editeng/xmlcnitm.hxx
+include/filter/msfilter/classids.hxx
+include/filter/msfilter/countryid.hxx
+include/filter/msfilter/dffpropset.hxx
+include/filter/msfilter/dffrecordheader.hxx
+include/filter/msfilter/escherex.hxx
+include/filter/msfilter/mscodec.hxx
+include/filter/msfilter/msdffimp.hxx
+include/filter/msfilter/msocximex.hxx
+include/filter/msfilter/msoleexp.hxx
+include/filter/msfilter/mstoolbar.hxx
+include/filter/msfilter/msvbahelper.hxx
+include/filter/msfilter/svdfppt.hxx
+include/filter/msfilter/util.hxx
+include/formula/ExternalReferenceHelper.hxx
+include/formula/FormulaCompiler.hxx
+include/formula/FormulaOpCodeMapperObj.hxx
+include/formula/IControlReferenceHandler.hxx
+include/formula/IFunctionDescription.hxx
+include/formula/compiler.hxx
+include/formula/errorcodes.hxx
+include/formula/formdata.hxx
+include/formula/formula.hxx
+include/formula/formulahelper.hxx
+include/formula/funcutl.hxx
+include/formula/grammar.hxx
+include/formula/opcode.hxx
+include/formula/paramclass.hxx
+include/formula/token.hxx
+include/formula/tokenarray.hxx
+include/formula/vectortoken.hxx
+include/framework/ContextChangeEventMultiplexerTunnel.hxx
+include/framework/actiontriggerhelper.hxx
+include/framework/addonsoptions.hxx
+include/framework/configimporter.hxx
+include/framework/desktop.hxx
+include/framework/documentundoguard.hxx
+include/framework/framecontainer.hxx
+include/framework/framelistanalyzer.hxx
+include/framework/gate.hxx
+include/framework/generictoolbarcontroller.hxx
+include/framework/imutex.hxx
+include/framework/sfxhelperfunctions.hxx
+include/framework/titlehelper.hxx
+include/framework/transactionmanager.hxx
+include/framework/undomanagerhelper.hxx
+include/helpcompiler/HelpIndexer.hxx
+include/helpcompiler/HelpSearch.hxx
+include/helpcompiler/compilehelp.hxx
+include/i18nlangtag/applelangid.hxx
+include/i18nlangtag/lang.h
+include/i18nlangtag/languagetag.hxx
+include/i18nlangtag/languagetagicu.hxx
+include/i18nlangtag/mslangid.hxx
+include/i18nutil/casefolding.hxx
+include/i18nutil/oneToOneMapping.hxx
+include/i18nutil/scripttypedetector.hxx
+include/i18nutil/searchopt.hxx
+include/i18nutil/transliteration.hxx
+include/i18nutil/widthfolding.hxx
+include/linguistic/hyphdta.hxx
+include/linguistic/lngprophelp.hxx
+include/linguistic/misc.hxx
+include/linguistic/spelldta.hxx
+include/o3tl/any.hxx
+include/o3tl/char16_t2wchar_t.hxx
+include/o3tl/cow_wrapper.hxx
+include/o3tl/enumarray.hxx
+include/o3tl/enumrange.hxx
+include/o3tl/functional.hxx
+include/o3tl/lazy_update.hxx
+include/o3tl/numeric.hxx
+include/o3tl/safeint.hxx
+include/o3tl/sorted_vector.hxx
+include/o3tl/span.hxx
+include/o3tl/strong_int.hxx
+include/o3tl/typed_flags_set.hxx
+include/o3tl/vector_pool.hxx
+include/onlineupdate/mar.h
+include/onlineupdate/mar_cmdline.h
+include/onlineupdate/mar_private.h
+include/onlineupdate/mozilla/Assertions.h
+include/onlineupdate/mozilla/Attributes.h
+include/onlineupdate/mozilla/Compiler.h
+include/onlineupdate/mozilla/MacroArgs.h
+include/onlineupdate/mozilla/TypeTraits.h
+include/onlineupdate/mozilla/Types.h
+include/onlineupdate/mozilla/nsTraceRefcnt.h
+include/oox/core/binarycodec.hxx
+include/oox/core/contexthandler.hxx
+include/oox/core/contexthandler2.hxx
+include/oox/core/fastparser.hxx
+include/oox/core/fasttokenhandler.hxx
+include/oox/core/filterbase.hxx
+include/oox/core/filterdetect.hxx
+include/oox/core/fragmenthandler.hxx
+include/oox/core/fragmenthandler2.hxx
+include/oox/core/recordparser.hxx
+include/oox/core/relations.hxx
+include/oox/core/relationshandler.hxx
+include/oox/core/xmlfilterbase.hxx
+include/oox/crypto/AgileEngine.hxx
+include/oox/crypto/CryptTools.hxx
+include/oox/crypto/CryptoEngine.hxx
+include/oox/crypto/DocumentDecryption.hxx
+include/oox/crypto/DocumentEncryption.hxx
+include/oox/crypto/Standard2007Engine.hxx
+include/oox/drawingml/chart/chartconverter.hxx
+include/oox/drawingml/chart/datasourcemodel.hxx
+include/oox/drawingml/chart/modelbase.hxx
+include/oox/drawingml/clrscheme.hxx
+include/oox/drawingml/color.hxx
+include/oox/drawingml/connectorshapecontext.hxx
+include/oox/drawingml/diagram/diagram.hxx
+include/oox/drawingml/drawingmltypes.hxx
+include/oox/drawingml/graphicshapecontext.hxx
+include/oox/drawingml/shape.hxx
+include/oox/drawingml/shapecontext.hxx
+include/oox/drawingml/shapegroupcontext.hxx
+include/oox/drawingml/shapepropertymap.hxx
+include/oox/drawingml/theme.hxx
+include/oox/drawingml/themefragmenthandler.hxx
+include/oox/dump/dffdumper.hxx
+include/oox/dump/dumperbase.hxx
+include/oox/dump/oledumper.hxx
+include/oox/dump/pptxdumper.hxx
+include/oox/dump/xlsbdumper.hxx
+include/oox/export/chartexport.hxx
+include/oox/export/drawingml.hxx
+include/oox/export/shapes.hxx
+include/oox/export/utils.hxx
+include/oox/export/vmlexport.hxx
+include/oox/helper/addtosequence.hxx
+include/oox/helper/attributelist.hxx
+include/oox/helper/binaryinputstream.hxx
+include/oox/helper/binaryoutputstream.hxx
+include/oox/helper/binarystreambase.hxx
+include/oox/helper/containerhelper.hxx
+include/oox/helper/grabbagstack.hxx
+include/oox/helper/graphichelper.hxx
+include/oox/helper/helper.hxx
+include/oox/helper/modelobjecthelper.hxx
+include/oox/helper/progressbar.hxx
+include/oox/helper/propertymap.hxx
+include/oox/helper/propertyset.hxx
+include/oox/helper/refmap.hxx
+include/oox/helper/refvector.hxx
+include/oox/helper/storagebase.hxx
+include/oox/helper/textinputstream.hxx
+include/oox/helper/zipstorage.hxx
+include/oox/mathml/export.hxx
+include/oox/mathml/import.hxx
+include/oox/ole/axbinaryreader.hxx
+include/oox/ole/axbinarywriter.hxx
+include/oox/ole/axcontrol.hxx
+include/oox/ole/axcontrolfragment.hxx
+include/oox/ole/axfontdata.hxx
+include/oox/ole/olehelper.hxx
+include/oox/ole/oleobjecthelper.hxx
+include/oox/ole/olestorage.hxx
+include/oox/ole/vbacontrol.hxx
+include/oox/ole/vbaexport.hxx
+include/oox/ole/vbahelper.hxx
+include/oox/ole/vbainputstream.hxx
+include/oox/ole/vbamodule.hxx
+include/oox/ole/vbaproject.hxx
+include/oox/ppt/animationspersist.hxx
+include/oox/ppt/backgroundproperties.hxx
+include/oox/ppt/comments.hxx
+include/oox/ppt/customshowlistcontext.hxx
+include/oox/ppt/headerfooter.hxx
+include/oox/ppt/layoutfragmenthandler.hxx
+include/oox/ppt/pptfilterhelpers.hxx
+include/oox/ppt/pptgraphicshapecontext.hxx
+include/oox/ppt/pptimport.hxx
+include/oox/ppt/pptshape.hxx
+include/oox/ppt/pptshapecontext.hxx
+include/oox/ppt/pptshapegroupcontext.hxx
+include/oox/ppt/pptshapepropertiescontext.hxx
+include/oox/ppt/presentationfragmenthandler.hxx
+include/oox/ppt/slidefragmenthandler.hxx
+include/oox/ppt/slidemastertextstylescontext.hxx
+include/oox/ppt/slidepersist.hxx
+include/oox/ppt/slidetimingcontext.hxx
+include/oox/ppt/slidetransition.hxx
+include/oox/ppt/slidetransitioncontext.hxx
+include/oox/ppt/soundactioncontext.hxx
+include/oox/ppt/timenode.hxx
+include/oox/ppt/timenodelistcontext.hxx
+include/oox/shape/ShapeContextHandler.hxx
+include/oox/shape/ShapeFilterBase.hxx
+include/oox/token/tokenmap.hxx
+include/oox/vml/vmldrawing.hxx
+include/oox/vml/vmldrawingfragment.hxx
+include/oox/vml/vmlformatting.hxx
+include/oox/vml/vmlinputstream.hxx
+include/oox/vml/vmlshape.hxx
+include/oox/vml/vmlshapecontainer.hxx
+include/oox/vml/vmlshapecontext.hxx
+include/oox/vml/vmltextbox.hxx
+include/oox/vml/vmltextboxcontext.hxx
+include/opencl/openclconfig.hxx
+include/opencl/openclwrapper.hxx
+include/opencl/platforminfo.hxx
+include/osl/conditn.h
+include/osl/conditn.hxx
+include/osl/detail/android-bootstrap.h
+include/osl/detail/component-defines.h
+include/osl/detail/component-mapping.h
+include/osl/diagnose.h
+include/osl/diagnose.hxx
+include/osl/endian.h
+include/osl/file.h
+include/osl/file.hxx
+include/osl/interlck.h
+include/osl/module.h
+include/osl/module.hxx
+include/osl/mutex.h
+include/osl/mutex.hxx
+include/osl/nlsupport.h
+include/osl/pipe.h
+include/osl/pipe.hxx
+include/osl/process.h
+include/osl/profile.h
+include/osl/profile.hxx
+include/osl/security.h
+include/osl/security.hxx
+include/osl/security_decl.hxx
+include/osl/signal.h
+include/osl/socket.h
+include/osl/socket.hxx
+include/osl/socket_decl.hxx
+include/osl/test/uniquepipename.hxx
+include/osl/thread.h
+include/osl/thread.hxx
+include/osl/time.h
+include/package/Deflater.hxx
+include/package/Inflater.hxx
+include/registry/reader.hxx
+include/registry/registry.hxx
+include/registry/typereg_reader.hxx
+include/registry/version.h
+include/registry/writer.h
+include/registry/writer.hxx
+include/rtl/alloc.h
+include/rtl/bootstrap.h
+include/rtl/bootstrap.hxx
+include/rtl/byteseq.h
+include/rtl/byteseq.hxx
+include/rtl/cipher.h
+include/rtl/crc.h
+include/rtl/digest.h
+include/rtl/instance.hxx
+include/rtl/locale.h
+include/rtl/malformeduriexception.hxx
+include/rtl/math.h
+include/rtl/math.hxx
+include/rtl/process.h
+include/rtl/random.h
+include/rtl/ref.hxx
+include/rtl/strbuf.h
+include/rtl/strbuf.hxx
+include/rtl/string.h
+include/rtl/string.hxx
+include/rtl/stringconcat.hxx
+include/rtl/stringutils.hxx
+include/rtl/tencinfo.h
+include/rtl/textcvt.h
+include/rtl/textenc.h
+include/rtl/unload.h
+include/rtl/uri.h
+include/rtl/uri.hxx
+include/rtl/ustrbuf.h
+include/rtl/ustrbuf.hxx
+include/rtl/ustring.h
+include/rtl/ustring.hxx
+include/rtl/uuid.h
+include/sal/detail/log.h
+include/sal/log.hxx
+include/sal/macros.h
+include/sal/main.h
+include/sal/mathconf.h
+include/sal/types.h
+include/salhelper/condition.hxx
+include/salhelper/dynload.hxx
+include/salhelper/linkhelper.hxx
+include/salhelper/refobj.hxx
+include/salhelper/simplereferenceobject.hxx
+include/salhelper/singletonref.hxx
+include/salhelper/timer.hxx
+include/sax/fastattribs.hxx
+include/sax/fastparser.hxx
+include/sax/fshelper.hxx
+include/sax/tools/converter.hxx
+include/sax/tools/documenthandleradapter.hxx
+include/sfx2/DocumentMetadataAccess.hxx
+include/sfx2/Metadatable.hxx
+include/sfx2/StyleManager.hxx
+include/sfx2/StylePreviewRenderer.hxx
+include/sfx2/XmlIdRegistry.hxx
+include/sfx2/app.hxx
+include/sfx2/basedlgs.hxx
+include/sfx2/bindings.hxx
+include/sfx2/chalign.hxx
+include/sfx2/charwin.hxx
+include/sfx2/childwin.hxx
+include/sfx2/ctrlitem.hxx
+include/sfx2/dinfdlg.hxx
+include/sfx2/dispatch.hxx
+include/sfx2/docfac.hxx
+include/sfx2/docfile.hxx
+include/sfx2/docfilt.hxx
+include/sfx2/docinf.hxx
+include/sfx2/docinsert.hxx
+include/sfx2/dockwin.hxx
+include/sfx2/docmacromode.hxx
+include/sfx2/docstoragemodifylistener.hxx
+include/sfx2/doctempl.hxx
+include/sfx2/event.hxx
+include/sfx2/evntconf.hxx
+include/sfx2/fcontnr.hxx
+include/sfx2/filedlghelper.hxx
+include/sfx2/frame.hxx
+include/sfx2/frmdescr.hxx
+include/sfx2/frmhtmlw.hxx
+include/sfx2/ipclient.hxx
+include/sfx2/linkmgr.hxx
+include/sfx2/linksrc.hxx
+include/sfx2/lnkbase.hxx
+include/sfx2/lokcomponenthelpers.hxx
+include/sfx2/lokhelper.hxx
+include/sfx2/mailmodelapi.hxx
+include/sfx2/minfitem.hxx
+include/sfx2/module.hxx
+include/sfx2/msg.hxx
+include/sfx2/msgpool.hxx
+include/sfx2/navigat.hxx
+include/sfx2/new.hxx
+include/sfx2/objface.hxx
+include/sfx2/objitem.hxx
+include/sfx2/objsh.hxx
+include/sfx2/opengrf.hxx
+include/sfx2/pageids.hxx
+include/sfx2/passwd.hxx
+include/sfx2/printer.hxx
+include/sfx2/printopt.hxx
+include/sfx2/progress.hxx
+include/sfx2/request.hxx
+include/sfx2/sfxbasecontroller.hxx
+include/sfx2/sfxbasemodel.hxx
+include/sfx2/sfxdlg.hxx
+include/sfx2/sfxhelp.hxx
+include/sfx2/sfxhtml.hxx
+include/sfx2/sfxmodelfactory.hxx
+include/sfx2/sfxstatuslistener.hxx
+include/sfx2/sfxuno.hxx
+include/sfx2/shell.hxx
+include/sfx2/sidebar/ControllerItem.hxx
+include/sfx2/sidebar/FocusManager.hxx
+include/sfx2/sidebar/PanelLayout.hxx
+include/sfx2/sidebar/ResourceManager.hxx
+include/sfx2/sidebar/Sidebar.hxx
+include/sfx2/sidebar/SidebarChildWindow.hxx
+include/sfx2/sidebar/SidebarController.hxx
+include/sfx2/sidebar/SidebarDockingWindow.hxx
+include/sfx2/sidebar/SidebarPanelBase.hxx
+include/sfx2/sidebar/TabBar.hxx
+include/sfx2/sidebar/Theme.hxx
+include/sfx2/stbitem.hxx
+include/sfx2/styfitem.hxx
+include/sfx2/styledlg.hxx
+include/sfx2/tabdlg.hxx
+include/sfx2/tbxctrl.hxx
+include/sfx2/templatelocalview.hxx
+include/sfx2/thumbnailview.hxx
+include/sfx2/thumbnailviewitem.hxx
+include/sfx2/tplpitem.hxx
+include/sfx2/userinputinterception.hxx
+include/sfx2/viewfac.hxx
+include/sfx2/viewfrm.hxx
+include/sfx2/viewsh.hxx
+include/sfx2/watermarkitem.hxx
+include/sfx2/zoomitem.hxx
+include/sot/exchange.hxx
+include/sot/formats.hxx
+include/sot/stg.hxx
+include/sot/storage.hxx
+include/store/store.h
+include/store/store.hxx
+include/store/types.h
+include/svl/PasswordHelper.hxx
+include/svl/SfxBroadcaster.hxx
+include/svl/adrparse.hxx
+include/svl/aeitem.hxx
+include/svl/asiancfg.hxx
+include/svl/broadcast.hxx
+include/svl/cenumitm.hxx
+include/svl/cintitem.hxx
+include/svl/cryptosign.hxx
+include/svl/ctloptions.hxx
+include/svl/custritm.hxx
+include/svl/documentlockfile.hxx
+include/svl/eitem.hxx
+include/svl/filenotation.hxx
+include/svl/flagitem.hxx
+include/svl/fstathelper.hxx
+include/svl/globalnameitem.hxx
+include/svl/hint.hxx
+include/svl/ilstitem.hxx
+include/svl/imageitm.hxx
+include/svl/inethist.hxx
+include/svl/instrm.hxx
+include/svl/int64item.hxx
+include/svl/intitem.hxx
+include/svl/isethint.hxx
+include/svl/itempool.hxx
+include/svl/itemprop.hxx
+include/svl/itemset.hxx
+include/svl/languageoptions.hxx
+include/svl/lckbitem.hxx
+include/svl/legacyitem.hxx
+include/svl/listener.hxx
+include/svl/lngmisc.hxx
+include/svl/lockfilecommon.hxx
+include/svl/lstner.hxx
+include/svl/macitem.hxx
+include/svl/memberid.h
+include/svl/metitem.hxx
+include/svl/nfkeytab.hxx
+include/svl/nfsymbol.hxx
+include/svl/numuno.hxx
+include/svl/ownlist.hxx
+include/svl/pickerhistoryaccess.hxx
+include/svl/poolcach.hxx
+include/svl/poolitem.hxx
+include/svl/ptitem.hxx
+include/svl/rectitem.hxx
+include/svl/rngitem.hxx
+include/svl/sharecontrolfile.hxx
+include/svl/sharedstring.hxx
+include/svl/sigstruct.hxx
+include/svl/slstitm.hxx
+include/svl/srchdefs.hxx
+include/svl/srchitem.hxx
+include/svl/stritem.hxx
+include/svl/style.hxx
+include/svl/stylepool.hxx
+include/svl/svdde.hxx
+include/svl/undo.hxx
+include/svl/urihelper.hxx
+include/svl/urlbmk.hxx
+include/svl/visitem.hxx
+include/svl/zforlist.hxx
+include/svl/zformat.hxx
+include/svtools/DocumentToGraphicRenderer.hxx
+include/svtools/acceleratorexecute.hxx
+include/svtools/accessibilityoptions.hxx
+include/svtools/addresstemplate.hxx
+include/svtools/apearcfg.hxx
+include/svtools/asynclink.hxx
+include/svtools/bindablecontrolhelper.hxx
+include/svtools/borderhelper.hxx
+include/svtools/borderline.hxx
+include/svtools/brwbox.hxx
+include/svtools/brwhead.hxx
+include/svtools/cliplistener.hxx
+include/svtools/colorcfg.hxx
+include/svtools/colrdlg.hxx
+include/svtools/ctrlbox.hxx
+include/svtools/ctrltool.hxx
+include/svtools/dialogclosedlistener.hxx
+include/svtools/editbrowsebox.hxx
+include/svtools/ehdl.hxx
+include/svtools/embedhlp.hxx
+include/svtools/embedtransfer.hxx
+include/svtools/extcolorcfg.hxx
+include/svtools/filechangedchecker.hxx
+include/svtools/fontsubstconfig.hxx
+include/svtools/genericunodialog.hxx
+include/svtools/helpids.h
+include/svtools/helpopt.hxx
+include/svtools/htmlcfg.hxx
+include/svtools/htmlout.hxx
+include/svtools/htmltokn.h
+include/svtools/imagemgr.hxx
+include/svtools/imageresourceaccess.hxx
+include/svtools/inettbc.hxx
+include/svtools/insdlg.hxx
+include/svtools/javacontext.hxx
+include/svtools/javainteractionhandler.hxx
+include/svtools/langhelp.hxx
+include/svtools/langtab.hxx
+include/svtools/miscopt.hxx
+include/svtools/openfiledroptargetlistener.hxx
+include/svtools/optionsdrawinglayer.hxx
+include/svtools/parhtml.hxx
+include/svtools/parrtf.hxx
+include/svtools/place.hxx
+include/svtools/popupmenucontrollerbase.hxx
+include/svtools/printoptions.hxx
+include/svtools/prnsetup.hxx
+include/svtools/restartdialog.hxx
+include/svtools/rtfout.hxx
+include/svtools/rtftoken.h
+include/svtools/ruler.hxx
+include/svtools/scriptedtext.hxx
+include/svtools/sfxecode.hxx
+include/svtools/slidesorterbaropt.hxx
+include/svtools/soerr.hxx
+include/svtools/statusbarcontroller.hxx
+include/svtools/stringtransfer.hxx
+include/svtools/svparser.hxx
+include/svtools/tabbar.hxx
+include/svtools/templatefoldercache.hxx
+include/svtools/toolbarmenu.hxx
+include/svtools/toolboxcontroller.hxx
+include/svtools/unitconv.hxx
+include/svtools/unoevent.hxx
+include/svtools/unoimap.hxx
+include/svtools/urlfilter.hxx
+include/svtools/valueset.hxx
+include/svx/AccessibleControlShape.hxx
+include/svx/AccessibleGraphicShape.hxx
+include/svx/AccessibleOLEShape.hxx
+include/svx/AccessibleShape.hxx
+include/svx/AccessibleShapeInfo.hxx
+include/svx/AccessibleShapeTreeInfo.hxx
+include/svx/ActionDescriptionProvider.hxx
+include/svx/ClassificationField.hxx
+include/svx/ColorSets.hxx
+include/svx/CommonStyleManager.hxx
+include/svx/EnhancedCustomShape2d.hxx
+include/svx/EnhancedCustomShapeFunctionParser.hxx
+include/svx/EnhancedCustomShapeGeometry.hxx
+include/svx/IAccessibleParent.hxx
+include/svx/Palette.hxx
+include/svx/PaletteManager.hxx
+include/svx/ParseContext.hxx
+include/svx/ShapeTypeHandler.hxx
+include/svx/SmartTagItem.hxx
+include/svx/SmartTagMgr.hxx
+include/svx/SvxColorChildWindow.hxx
+include/svx/SvxPresetListBox.hxx
+include/svx/algitem.hxx
+include/svx/anchorid.hxx
+include/svx/autoformathelper.hxx
+include/svx/bmpmask.hxx
+include/svx/charmap.hxx
+include/svx/charthelper.hxx
+include/svx/chrtitem.hxx
+include/svx/clipboardctl.hxx
+include/svx/colorwindow.hxx
+include/svx/compressgraphicdialog.hxx
+include/svx/connctrl.hxx
+include/svx/contdlg.hxx
+include/svx/ctredlin.hxx
+include/svx/cube3d.hxx
+include/svx/dataaccessdescriptor.hxx
+include/svx/databaselocationinput.hxx
+include/svx/databaseregistrationui.hxx
+include/svx/dbaexchange.hxx
+include/svx/dbaobjectex.hxx
+include/svx/deflt3d.hxx
+include/svx/dialcontrol.hxx
+include/svx/dlgctl3d.hxx
+include/svx/dlgctrl.hxx
+include/svx/drawitem.hxx
+include/svx/e3ditem.hxx
+include/svx/e3dundo.hxx
+include/svx/extedit.hxx
+include/svx/fillctrl.hxx
+include/svx/flagsdef.hxx
+include/svx/float3d.hxx
+include/svx/fmdpage.hxx
+include/svx/fmgridcl.hxx
+include/svx/fmgridif.hxx
+include/svx/fmmodel.hxx
+include/svx/fmpage.hxx
+include/svx/fmsearch.hxx
+include/svx/fmshell.hxx
+include/svx/fmsrccfg.hxx
+include/svx/fmsrcimp.hxx
+include/svx/fmtools.hxx
+include/svx/fmview.hxx
+include/svx/fntctrl.hxx
+include/svx/fontwork.hxx
+include/svx/fontworkgallery.hxx
+include/svx/formatpaintbrushctrl.hxx
+include/svx/framebordertype.hxx
+include/svx/framelink.hxx
+include/svx/framelinkarray.hxx
+include/svx/frmsel.hxx
+include/svx/galctrl.hxx
+include/svx/gallery.hxx
+include/svx/gallery1.hxx
+include/svx/galleryitem.hxx
+include/svx/galmisc.hxx
+include/svx/galtheme.hxx
+include/svx/grafctrl.hxx
+include/svx/graphctl.hxx
+include/svx/graphichelper.hxx
+include/svx/grfcrop.hxx
+include/svx/grfflt.hxx
+include/svx/gridctrl.hxx
+include/svx/hdft.hxx
+include/svx/helperhittest3d.hxx
+include/svx/hexcolorcontrol.hxx
+include/svx/hlnkitem.hxx
+include/svx/hyperdlg.hxx
+include/svx/ifaceids.hxx
+include/svx/imapdlg.hxx
+include/svx/itextprovider.hxx
+include/svx/langbox.hxx
+include/svx/lathe3d.hxx
+include/svx/legacyitem.hxx
+include/svx/linectrl.hxx
+include/svx/msdffdef.hxx
+include/svx/nbdtmg.hxx
+include/svx/numfmtsh.hxx
+include/svx/numinf.hxx
+include/svx/numvset.hxx
+include/svx/obj3d.hxx
+include/svx/ofaitem.hxx
+include/svx/optgenrl.hxx
+include/svx/optgrid.hxx
+include/svx/pagectrl.hxx
+include/svx/pageitem.hxx
+include/svx/pagenumberlistbox.hxx
+include/svx/paraprev.hxx
+include/svx/passwd.hxx
+include/svx/polypolygoneditor.hxx
+include/svx/postattr.hxx
+include/svx/pszctrl.hxx
+include/svx/relfld.hxx
+include/svx/rotmodit.hxx
+include/svx/rubydialog.hxx
+include/svx/ruler.hxx
+include/svx/rulritem.hxx
+include/svx/scene3d.hxx
+include/svx/sdangitm.hxx
+include/svx/sdasitm.hxx
+include/svx/sdgcpitm.hxx
+include/svx/sdggaitm.hxx
+include/svx/sdgluitm.hxx
+include/svx/sdgmoitm.hxx
+include/svx/sdmetitm.hxx
+include/svx/sdooitm.hxx
+include/svx/sdprcitm.hxx
+include/svx/diagram/datamodel.hxx
+include/svx/diagram/IDiagramHelper.hxx
+include/svx/sdr/animation/animationstate.hxx
+include/svx/sdr/animation/objectanimator.hxx
+include/svx/sdr/animation/scheduler.hxx
+include/svx/sdr/attribute/sdrallfillattributeshelper.hxx
+include/svx/sdr/contact/displayinfo.hxx
+include/svx/sdr/contact/objectcontact.hxx
+include/svx/sdr/contact/objectcontactofpageview.hxx
+include/svx/sdr/contact/viewcontactofe3dscene.hxx
+include/svx/sdr/contact/viewcontactofsdrobj.hxx
+include/svx/sdr/contact/viewobjectcontact.hxx
+include/svx/sdr/contact/viewobjectcontactredirector.hxx
+include/svx/sdr/overlay/overlayanimatedbitmapex.hxx
+include/svx/sdr/overlay/overlaybitmapex.hxx
+include/svx/sdr/overlay/overlaymanager.hxx
+include/svx/sdr/overlay/overlayobject.hxx
+include/svx/sdr/overlay/overlayobjectlist.hxx
+include/svx/sdr/overlay/overlaypolypolygon.hxx
+include/svx/sdr/overlay/overlayprimitive2dsequenceobject.hxx
+include/svx/sdr/overlay/overlayselection.hxx
+include/svx/sdr/primitive2d/sdrframeborderprimitive2d.hxx
+include/svx/sdr/primitive2d/svx_primitivetypes2d.hxx
+include/svx/sdr/properties/defaultproperties.hxx
+include/svx/sdr/properties/properties.hxx
+include/svx/sdr/table/tablecontroller.hxx
+include/svx/sdrhittesthelper.hxx
+include/svx/sdrmasterpagedescriptor.hxx
+include/svx/sdrobjectfilter.hxx
+include/svx/sdrobjectuser.hxx
+include/svx/sdrpageuser.hxx
+include/svx/sdrpagewindow.hxx
+include/svx/sdrpaintwindow.hxx
+include/svx/sdtaaitm.hxx
+include/svx/sdtacitm.hxx
+include/svx/sdtaditm.hxx
+include/svx/sdtaiitm.hxx
+include/svx/sdtaitm.hxx
+include/svx/sdtakitm.hxx
+include/svx/sdtayitm.hxx
+include/svx/sdtfchim.hxx
+include/svx/sdtfsitm.hxx
+include/svx/sdynitm.hxx
+include/svx/searchcharmap.hxx
+include/svx/selectioncontroller.hxx
+include/svx/shapepropertynotifier.hxx
+include/svx/sidebar/AreaPropertyPanelBase.hxx
+include/svx/sidebar/ContextChangeEventMultiplexer.hxx
+include/svx/sidebar/SelectionAnalyzer.hxx
+include/svx/sidebar/SelectionChangeHandler.hxx
+include/svx/sphere3d.hxx
+include/svx/srchdlg.hxx
+include/svx/svdcrtv.hxx
+include/svx/svddef.hxx
+include/svx/svddrag.hxx
+include/svx/svddrgmt.hxx
+include/svx/svddrgv.hxx
+include/svx/svdedtv.hxx
+include/svx/svdedxv.hxx
+include/svx/svdetc.hxx
+include/svx/svdglev.hxx
+include/svx/svdglue.hxx
+include/svx/svdhdl.hxx
+include/svx/svdhlpln.hxx
+include/svx/svditer.hxx
+include/svx/svdlayer.hxx
+include/svx/svdmark.hxx
+include/svx/svdmodel.hxx
+include/svx/svdmrkv.hxx
+include/svx/svdoashp.hxx
+include/svx/svdoattr.hxx
+include/svx/svdobj.hxx
+include/svx/svdocapt.hxx
+include/svx/svdocirc.hxx
+include/svx/svdoedge.hxx
+include/svx/svdograf.hxx
+include/svx/svdogrp.hxx
+include/svx/svdomeas.hxx
+include/svx/svdomedia.hxx
+include/svx/svdoole2.hxx
+include/svx/svdopage.hxx
+include/svx/svdopath.hxx
+include/svx/svdorect.hxx
+include/svx/svdotable.hxx
+include/svx/svdotext.hxx
+include/svx/svdouno.hxx
+include/svx/svdoutl.hxx
+include/svx/svdpage.hxx
+include/svx/svdpagv.hxx
+include/svx/svdpntv.hxx
+include/svx/svdpoev.hxx
+include/svx/svdpool.hxx
+include/svx/svdsnpv.hxx
+include/svx/svdsob.hxx
+include/svx/svdtrans.hxx
+include/svx/svdundo.hxx
+include/svx/svdview.hxx
+include/svx/svdviter.hxx
+include/svx/svdxcgv.hxx
+include/svx/svx3ditems.hxx
+include/svx/svxdlg.hxx
+include/svx/svxerr.hxx
+include/svx/svxgraphicitem.hxx
+include/svx/swframeexample.hxx
+include/svx/swframeposstrings.hxx
+include/svx/swframevalidation.hxx
+include/svx/sxcecitm.hxx
+include/svx/sxcllitm.hxx
+include/svx/sxctitm.hxx
+include/svx/sxekitm.hxx
+include/svx/sxenditm.hxx
+include/svx/sxmbritm.hxx
+include/svx/sxmtfitm.hxx
+include/svx/sxmtpitm.hxx
+include/svx/sxmtritm.hxx
+include/svx/sxmuitm.hxx
+include/svx/tabarea.hxx
+include/svx/tbcontrl.hxx
+include/svx/tbxcolor.hxx
+include/svx/tbxctl.hxx
+include/svx/transfrmhelper.hxx
+include/svx/txencbox.hxx
+include/svx/ucsubset.hxx
+include/svx/uiobject.hxx
+include/svx/unoapi.hxx
+include/svx/unobrushitemhelper.hxx
+include/svx/unofill.hxx
+include/svx/unomaster.hxx
+include/svx/unomid.hxx
+include/svx/unomod.hxx
+include/svx/unomodel.hxx
+include/svx/unopage.hxx
+include/svx/unopool.hxx
+include/svx/unoprov.hxx
+include/svx/unoshape.hxx
+include/svx/unoshprp.hxx
+include/svx/unoshtxt.hxx
+include/svx/view3d.hxx
+include/svx/viewlayoutitem.hxx
+include/svx/viewpt3d.hxx
+include/svx/xbitmap.hxx
+include/svx/xbtmpit.hxx
+include/svx/xcolit.hxx
+include/svx/xdash.hxx
+include/svx/xdef.hxx
+include/svx/xenum.hxx
+include/svx/xfillit0.hxx
+include/svx/xflasit.hxx
+include/svx/xflbckit.hxx
+include/svx/xflbmpit.hxx
+include/svx/xflbmsli.hxx
+include/svx/xflbmsxy.hxx
+include/svx/xflbmtit.hxx
+include/svx/xflboxy.hxx
+include/svx/xflbstit.hxx
+include/svx/xflbtoxy.hxx
+include/svx/xflclit.hxx
+include/svx/xflftrit.hxx
+include/svx/xflgrit.hxx
+include/svx/xflhtit.hxx
+include/svx/xfltrit.hxx
+include/svx/xftadit.hxx
+include/svx/xftdiit.hxx
+include/svx/xftmrit.hxx
+include/svx/xftouit.hxx
+include/svx/xftshit.hxx
+include/svx/xftshxy.hxx
+include/svx/xftstit.hxx
+include/svx/xgrad.hxx
+include/svx/xgrscit.hxx
+include/svx/xhatch.hxx
+include/svx/xit.hxx
+include/svx/xlineit0.hxx
+include/svx/xlinjoit.hxx
+include/svx/xlnasit.hxx
+include/svx/xlncapit.hxx
+include/svx/xlnclit.hxx
+include/svx/xlndsit.hxx
+include/svx/xlnedcit.hxx
+include/svx/xlnedit.hxx
+include/svx/xlnedwit.hxx
+include/svx/xlnstcit.hxx
+include/svx/xlnstit.hxx
+include/svx/xlnstwit.hxx
+include/svx/xlntrit.hxx
+include/svx/xlnwtit.hxx
+include/svx/xmleohlp.hxx
+include/svx/xmlexchg.hxx
+include/svx/xmlgrhlp.hxx
+include/svx/xmlsecctrl.hxx
+include/svx/xoutbmp.hxx
+include/svx/xpoly.hxx
+include/svx/xsflclit.hxx
+include/svx/xtable.hxx
+include/svx/xtextit0.hxx
+include/svx/zoomsliderctrl.hxx
+include/svx/zoomslideritem.hxx
+include/systools/win32/comtools.hxx
+include/test/sheet/xarealinks.hxx
+include/test/sheet/xcellseries.hxx
+include/test/sheet/xdatapilotdescriptor.hxx
+include/test/sheet/xdatapilotfieldgrouping.hxx
+include/test/sheet/xdatapilottable.hxx
+include/test/sheet/xdatapilottable2.hxx
+include/test/sheet/xprintareas.hxx
+include/test/sheet/xsheetannotations.hxx
+include/test/sheet/xsheetannotationshapesupplier.hxx
+include/test/sheet/xsheetfilterable.hxx
+include/test/sheet/xspreadsheetdocument.hxx
+include/test/sheet/xspreadsheets2.hxx
+include/test/sheet/xuniquecellformatrangessupplier.hxx
+include/test/sheet/xviewsplitable.hxx
+include/test/testinteractionhandler.hxx
+include/test/text/xtextcontent.hxx
+include/test/util/xreplaceable.hxx
+include/test/util/xsearchable.hxx
+include/test/xmldiff.hxx
+include/test/xmltesttools.hxx
+include/toolkit/awt/vclxaccessiblecomponent.hxx
+include/toolkit/awt/vclxdevice.hxx
+include/toolkit/awt/vclxfont.hxx
+include/toolkit/awt/vclxmenu.hxx
+include/toolkit/awt/vclxwindow.hxx
+include/toolkit/awt/vclxwindows.hxx
+include/toolkit/controls/unocontrol.hxx
+include/toolkit/controls/unocontrolbase.hxx
+include/toolkit/controls/unocontrolmodel.hxx
+include/toolkit/controls/unocontrols.hxx
+include/toolkit/helper/accessiblefactory.hxx
+include/toolkit/helper/convert.hxx
+include/toolkit/helper/formpdfexport.hxx
+include/toolkit/helper/listenermultiplexer.hxx
+include/toolkit/helper/macros.hxx
+include/toolkit/helper/mutexandbroadcasthelper.hxx
+include/toolkit/helper/property.hxx
+include/toolkit/helper/vclunohelper.hxx
+include/tools/b3dtrans.hxx
+include/tools/bigint.hxx
+include/tools/color.hxx
+include/tools/config.hxx
+include/tools/cpuid.hxx
+include/tools/date.hxx
+include/tools/datetime.hxx
+include/tools/debug.hxx
+include/tools/diagnose_ex.h
+include/tools/fontenum.hxx
+include/tools/fract.hxx
+include/tools/gen.hxx
+include/tools/globname.hxx
+include/tools/helpers.hxx
+include/tools/inetmime.hxx
+include/tools/inetmsg.hxx
+include/tools/inetstrm.hxx
+include/tools/line.hxx
+include/tools/lineend.hxx
+include/tools/link.hxx
+include/tools/mapunit.hxx
+include/tools/multisel.hxx
+include/tools/poly.hxx
+include/tools/ref.hxx
+include/tools/solar.h
+include/tools/stream.hxx
+include/tools/svborder.hxx
+include/tools/time.hxx
+include/tools/urlobj.hxx
+include/tools/weakbase.h
+include/tools/weakbase.hxx
+include/tools/wintypes.hxx
+include/tools/wldcrd.hxx
+include/tools/zcodec.hxx
+include/typelib/typedescription.h
+include/typelib/typedescription.hxx
+include/ucbhelper/authenticationfallback.hxx
+include/ucbhelper/cancelcommandexecution.hxx
+include/ucbhelper/contenthelper.hxx
+include/ucbhelper/fd_inputstream.hxx
+include/ucbhelper/interactionrequest.hxx
+include/ucbhelper/interceptedinteraction.hxx
+include/ucbhelper/macros.hxx
+include/ucbhelper/propertyvalueset.hxx
+include/ucbhelper/providerhelper.hxx
+include/ucbhelper/proxydecider.hxx
+include/ucbhelper/registerucb.hxx
+include/ucbhelper/resultset.hxx
+include/ucbhelper/resultsethelper.hxx
+include/ucbhelper/resultsetmetadata.hxx
+include/ucbhelper/simpleauthenticationrequest.hxx
+include/ucbhelper/simplecertificatevalidationrequest.hxx
+include/uno/Enterable.h
+include/uno/EnvDcp.h
+include/uno/any2.h
+include/uno/current_context.h
+include/uno/current_context.hxx
+include/uno/data.h
+include/uno/dispatcher.h
+include/uno/dispatcher.hxx
+include/uno/environment.h
+include/uno/environment.hxx
+include/uno/mapping.h
+include/uno/mapping.hxx
+include/uno/sequence2.h
+include/uno/threadpool.h
+include/unoidl/unoidl.hxx
+include/unotest/bootstrapfixturebase.hxx
+include/unotest/filters-test.hxx
+include/unotest/getargument.hxx
+include/unotest/gettestargument.hxx
+include/unotest/officeconnection.hxx
+include/unotest/toabsolutefileurl.hxx
+include/unotools/ZipPackageHelper.hxx
+include/unotools/bootstrap.hxx
+include/unotools/calendarwrapper.hxx
+include/unotools/charclass.hxx
+include/unotools/closeveto.hxx
+include/unotools/collatorwrapper.hxx
+include/unotools/compatibility.hxx
+include/unotools/configitem.hxx
+include/unotools/configmgr.hxx
+include/unotools/confignode.hxx
+include/unotools/configpaths.hxx
+include/unotools/configvaluecontainer.hxx
+include/unotools/datetime.hxx
+include/unotools/desktopterminationobserver.hxx
+include/unotools/digitgroupingiterator.hxx
+include/unotools/dynamicmenuoptions.hxx
+include/unotools/eventcfg.hxx
+include/unotools/eventlisteneradapter.hxx
+include/unotools/extendedsecurityoptions.hxx
+include/unotools/fltrcfg.hxx
+include/unotools/fontcfg.hxx
+include/unotools/fontcvt.hxx
+include/unotools/fontdefs.hxx
+include/unotools/historyoptions.hxx
+include/unotools/intlwrapper.hxx
+include/unotools/itemholderbase.hxx
+include/unotools/lingucfg.hxx
+include/unotools/linguprops.hxx
+include/unotools/localedatawrapper.hxx
+include/unotools/localfilehelper.hxx
+include/unotools/mediadescriptor.hxx
+include/unotools/moduleoptions.hxx
+include/unotools/nativenumberwrapper.hxx
+include/unotools/options.hxx
+include/unotools/optionsdlg.hxx
+include/unotools/pathoptions.hxx
+include/unotools/readwritemutexguard.hxx
+include/unotools/resmgr.hxx
+include/unotools/saveopt.hxx
+include/unotools/searchopt.hxx
+include/unotools/securityoptions.hxx
+include/unotools/sharedunocomponent.hxx
+include/unotools/streamhelper.hxx
+include/unotools/streamwrap.hxx
+include/unotools/syslocale.hxx
+include/unotools/syslocaleoptions.hxx
+include/unotools/tempfile.hxx
+include/unotools/textsearch.hxx
+include/unotools/transliterationwrapper.hxx
+include/unotools/ucbhelper.hxx
+include/unotools/ucbstreamhelper.hxx
+include/unotools/useroptions.hxx
+include/unotools/viewoptions.hxx
+include/unotools/wincodepage.hxx
+include/vbahelper/vbaaccesshelper.hxx
+include/vbahelper/vbaapplicationbase.hxx
+include/vbahelper/vbacollectionimpl.hxx
+include/vbahelper/vbadialogbase.hxx
+include/vbahelper/vbadialogsbase.hxx
+include/vbahelper/vbadocumentbase.hxx
+include/vbahelper/vbadocumentsbase.hxx
+include/vbahelper/vbaeventshelperbase.hxx
+include/vbahelper/vbafontbase.hxx
+include/vbahelper/vbaglobalbase.hxx
+include/vbahelper/vbahelper.hxx
+include/vbahelper/vbahelperinterface.hxx
+include/vbahelper/vbapagesetupbase.hxx
+include/vbahelper/vbapropvalue.hxx
+include/vbahelper/vbareturntypes.hxx
+include/vbahelper/vbashape.hxx
+include/vbahelper/vbashaperange.hxx
+include/vbahelper/vbashapes.hxx
+include/vbahelper/vbatextframe.hxx
+include/vbahelper/vbawindowbase.hxx
+include/vcl/AccessibleBrowseBoxObjType.hxx
+include/vcl/BitmapBuffer.hxx
+include/vcl/BitmapColor.hxx
+include/vcl/BitmapPalette.hxx
+include/vcl/BitmapTools.hxx
+include/vcl/ColorMask.hxx
+include/vcl/EnumContext.hxx
+include/vcl/FilterConfigItem.hxx
+include/vcl/GraphicObject.hxx
+include/vcl/IDialogRenderable.hxx
+include/vcl/ITiledRenderable.hxx
+include/vcl/ImageTree.hxx
+include/vcl/Scanline.hxx
+include/vcl/abstdlg.hxx
+include/vcl/accessiblefactory.hxx
+include/vcl/accessibletable.hxx
+include/vcl/accessibletableprovider.hxx
+include/vcl/alpha.hxx
+include/vcl/bitmap.hxx
+include/vcl/bitmapex.hxx
+include/vcl/builder.hxx
+include/vcl/builderfactory.hxx
+include/vcl/cairo.hxx
+include/vcl/canvastools.hxx
+include/vcl/checksum.hxx
+include/vcl/commandevent.hxx
+include/vcl/commandinfoprovider.hxx
+include/vcl/ctrl.hxx
+include/vcl/cursor.hxx
+include/vcl/cvtgrf.hxx
+include/vcl/decoview.hxx
+include/vcl/dibtools.hxx
+include/vcl/dndhelp.hxx
+include/vcl/dockingarea.hxx
+include/vcl/dockwin.hxx
+include/vcl/embeddedfontshelper.hxx
+include/vcl/errcode.hxx
+include/vcl/errinf.hxx
+include/vcl/event.hxx
+include/vcl/evntpost.hxx
+include/vcl/formatter.hxx
+include/vcl/fntstyle.hxx
+include/vcl/font.hxx
+include/vcl/fontcapabilities.hxx
+include/vcl/fontcharmap.hxx
+include/vcl/gdimtf.hxx
+include/vcl/gfxlink.hxx
+include/vcl/gradient.hxx
+include/vcl/graph.hxx
+include/vcl/graphicfilter.hxx
+include/vcl/graphictools.hxx
+include/vcl/hatch.hxx
+include/vcl/headbar.hxx
+include/vcl/help.hxx
+include/vcl/i18nhelp.hxx
+include/vcl/idle.hxx
+include/vcl/image.hxx
+include/vcl/imap.hxx
+include/vcl/imapcirc.hxx
+include/vcl/imapobj.hxx
+include/vcl/imappoly.hxx
+include/vcl/imaprect.hxx
+include/vcl/inetimg.hxx
+include/vcl/inputctx.hxx
+include/vcl/inputtypes.hxx
+include/vcl/jobset.hxx
+include/vcl/keycod.hxx
+include/vcl/layout.hxx
+include/vcl/lazydelete.hxx
+include/vcl/lineinfo.hxx
+include/vcl/mapmod.hxx
+include/vcl/menu.hxx
+include/vcl/metaact.hxx
+include/vcl/metaactiontypes.hxx
+include/vcl/metric.hxx
+include/vcl/mnemonic.hxx
+include/vcl/notebookbar/notebookbar.hxx
+include/vcl/oldprintadaptor.hxx
+include/vcl/opengl/OpenGLContext.hxx
+include/vcl/opengl/OpenGLHelper.hxx
+include/vcl/outdev.hxx
+include/vcl/pdfextoutdevdata.hxx
+include/vcl/pdfwriter.hxx
+include/vcl/pngwrite.hxx
+include/vcl/print.hxx
+include/vcl/prntypes.hxx
+include/vcl/ptrstyle.hxx
+include/vcl/quickselectionengine.hxx
+include/vcl/region.hxx
+include/vcl/roadmapwizard.hxx
+include/vcl/salctype.hxx
+include/vcl/salgtype.hxx
+include/vcl/salnativewidgets.hxx
+include/vcl/scheduler.hxx
+include/vcl/scopedbitmapaccess.hxx
+include/vcl/scrbar.hxx
+include/vcl/seleng.hxx
+include/vcl/settings.hxx
+include/vcl/split.hxx
+include/vcl/splitwin.hxx
+include/vcl/status.hxx
+include/vcl/stdtext.hxx
+include/vcl/svapp.hxx
+include/vcl/svtaccessiblefactory.hxx
+include/vcl/syschild.hxx
+include/vcl/sysdata.hxx
+include/vcl/syswin.hxx
+include/vcl/tabctrl.hxx
+include/vcl/tabpage.hxx
+include/vcl/task.hxx
+include/vcl/taskpanelist.hxx
+include/vcl/textdata.hxx
+include/vcl/texteng.hxx
+include/vcl/textrectinfo.hxx
+include/vcl/textview.hxx
+include/vcl/threadex.hxx
+include/vcl/timer.hxx
+include/vcl/toolbox.hxx
+include/vcl/toolkit/button.hxx
+include/vcl/toolkit/calendar.hxx
+include/vcl/toolkit/combobox.hxx
+include/vcl/toolkit/dialog.hxx
+include/vcl/toolkit/edit.hxx
+include/vcl/toolkit/field.hxx
+include/vcl/toolkit/fixed.hxx
+include/vcl/toolkit/fixedhyper.hxx
+include/vcl/toolkit/floatwin.hxx
+include/vcl/toolkit/fmtfield.hxx
+include/vcl/toolkit/group.hxx
+include/vcl/toolkit/imgctrl.hxx
+include/vcl/toolkit/ivctrl.hxx
+include/vcl/toolkit/longcurr.hxx
+include/vcl/toolkit/lstbox.hxx
+include/vcl/toolkit/menubtn.hxx
+include/vcl/toolkit/morebtn.hxx
+include/vcl/toolkit/prgsbar.hxx
+include/vcl/toolkit/roadmap.hxx
+include/vcl/toolkit/spin.hxx
+include/vcl/toolkit/spinfld.hxx
+include/vcl/toolkit/svlbitm.hxx
+include/vcl/toolkit/svtabbx.hxx
+include/vcl/toolkit/tabdlg.hxx
+include/vcl/toolkit/throbber.hxx
+include/vcl/toolkit/treelist.hxx
+include/vcl/toolkit/treelistbox.hxx
+include/vcl/toolkit/treelistentry.hxx
+include/vcl/toolkit/unowrap.hxx
+include/vcl/toolkit/vclmedit.hxx
+include/vcl/toolkit/viewdataentry.hxx
+include/vcl/transfer.hxx
+include/vcl/txtattr.hxx
+include/vcl/uitest/uiobject.hxx
+include/vcl/uitest/uitest.hxx
+include/vcl/unohelp.hxx
+include/vcl/unohelp2.hxx
+include/vcl/vclenum.hxx
+include/vcl/vclevent.hxx
+include/vcl/vcllayout.hxx
+include/vcl/vclptr.hxx
+include/vcl/vclreferencebase.hxx
+include/vcl/vectorgraphicdata.hxx
+include/vcl/virdev.hxx
+include/vcl/wall.hxx
+include/vcl/window.hxx
+include/vcl/wizardmachine.hxx
+include/vcl/wmf.hxx
+include/vcl/wrkwin.hxx
+include/vcl/xtextedt.hxx
+include/xmloff/DashStyle.hxx
+include/xmloff/DocumentSettingsContext.hxx
+include/xmloff/EnumPropertyHdl.hxx
+include/xmloff/GradientStyle.hxx
+include/xmloff/HatchStyle.hxx
+include/xmloff/ImageStyle.hxx
+include/xmloff/MarkerStyle.hxx
+include/xmloff/NamedBoolPropertyHdl.hxx
+include/xmloff/ProgressBarHelper.hxx
+include/xmloff/SchXMLImportHelper.hxx
+include/xmloff/SchXMLSeriesHelper.hxx
+include/xmloff/SettingsExportHelper.hxx
+include/xmloff/SinglePropertySetInfoCache.hxx
+include/xmloff/XMLBase64ImportContext.hxx
+include/xmloff/XMLCharContext.hxx
+include/xmloff/XMLConstantsPropertyHandler.hxx
+include/xmloff/XMLEventExport.hxx
+include/xmloff/XMLEventsImportContext.hxx
+include/xmloff/XMLFilterServiceNames.h
+include/xmloff/XMLFontAutoStylePool.hxx
+include/xmloff/XMLFontStylesContext.hxx
+include/xmloff/XMLPageExport.hxx
+include/xmloff/XMLSettingsExportContext.hxx
+include/xmloff/XMLShapeStyleContext.hxx
+include/xmloff/XMLTextListAutoStylePool.hxx
+include/xmloff/XMLTextMasterPageContext.hxx
+include/xmloff/XMLTextMasterPageExport.hxx
+include/xmloff/XMLTextShapeImportHelper.hxx
+include/xmloff/XMLTextShapeStyleContext.hxx
+include/xmloff/XMLTextTableContext.hxx
+include/xmloff/animationexport.hxx
+include/xmloff/attrlist.hxx
+include/xmloff/autolayout.hxx
+include/xmloff/contextid.hxx
+include/xmloff/controlpropertyhdl.hxx
+include/xmloff/families.hxx
+include/xmloff/formlayerexport.hxx
+include/xmloff/formlayerimport.hxx
+include/xmloff/i18nmap.hxx
+include/xmloff/languagetagodf.hxx
+include/xmloff/maptype.hxx
+include/xmloff/namespacemap.hxx
+include/xmloff/numehelp.hxx
+include/xmloff/prstylei.hxx
+include/xmloff/settingsstore.hxx
+include/xmloff/shapeexport.hxx
+include/xmloff/shapeimport.hxx
+include/xmloff/styleexp.hxx
+include/xmloff/table/XMLTableExport.hxx
+include/xmloff/table/XMLTableImport.hxx
+include/xmloff/txtimp.hxx
+include/xmloff/txtimppr.hxx
+include/xmloff/txtparae.hxx
+include/xmloff/txtprmap.hxx
+include/xmloff/txtstyli.hxx
+include/xmloff/unoatrcn.hxx
+include/xmloff/unointerfacetouniqueidentifiermapper.hxx
+include/xmloff/xformsexport.hxx
+include/xmloff/xformsimport.hxx
+include/xmloff/xmlaustp.hxx
+include/xmloff/xmlcnimp.hxx
+include/xmloff/xmlement.hxx
+include/xmloff/xmlerror.hxx
+include/xmloff/xmlevent.hxx
+include/xmloff/xmlexp.hxx
+include/xmloff/xmlexppr.hxx
+include/xmloff/xmlictxt.hxx
+include/xmloff/xmlimp.hxx
+include/xmloff/xmlimppr.hxx
+include/xmloff/xmlmetae.hxx
+include/xmloff/xmlmetai.hxx
+include/xmloff/xmlnamespace.hxx
+include/xmloff/xmlnume.hxx
+include/xmloff/xmlnumfe.hxx
+include/xmloff/xmlnumfi.hxx
+include/xmloff/xmlnumi.hxx
+include/xmloff/xmlprcon.hxx
+include/xmloff/xmlprhdl.hxx
+include/xmloff/xmlprmap.hxx
+include/xmloff/xmlscripti.hxx
+include/xmloff/xmlstyle.hxx
+include/xmloff/xmltkmap.hxx
+include/xmloff/xmltoken.hxx
+include/xmloff/xmltypes.hxx
+include/xmloff/xmluconv.hxx
+include/xmlreader/span.hxx
+include/xmlreader/xmlreader.hxx
+include/xmlscript/xml_helper.hxx
+include/xmlscript/xmldlg_imexp.hxx
+include/xmlscript/xmllib_imexp.hxx
+include/xmlscript/xmlmod_imexp.hxx
+io/qa/textinputstream.cxx
+io/source/TextInputStream/TextInputStream.cxx
+io/source/TextOutputStream/TextOutputStream.cxx
+io/source/acceptor/acc_pipe.cxx
+io/source/acceptor/acc_socket.cxx
+io/source/acceptor/acceptor.cxx
+io/source/acceptor/acceptor.hxx
+io/source/connector/connector.cxx
+io/source/connector/connector.hxx
+io/source/connector/ctr_pipe.cxx
+io/source/connector/ctr_socket.cxx
+io/source/stm/odata.cxx
+io/source/stm/omark.cxx
+io/source/stm/opipe.cxx
+io/source/stm/opump.cxx
+io/source/stm/streamhelper.cxx
+io/source/stm/streamhelper.hxx
+io/test/stm/datatest.cxx
+io/test/stm/marktest.cxx
+io/test/stm/pipetest.cxx
+io/test/stm/pumptest.cxx
+io/test/stm/testfactreg.cxx
+io/test/stm/testfactreg.hxx
+io/test/testcomponent.cxx
+io/test/testconnection.cxx
+ios/source/LibreOfficeKit.c
+ios/source/LibreOfficeKit.h
+javaunohelper/source/bootstrap.cxx
+javaunohelper/source/javaunohelper.cxx
+javaunohelper/source/juhx-export-functions.hxx
+javaunohelper/source/juhx-export-types.hxx
+javaunohelper/source/preload.cxx
+javaunohelper/source/vm.cxx
+javaunohelper/source/vm.hxx
+jurt/source/pipe/com_sun_star_lib_connections_pipe_PipeConnection.c
+jurt/source/pipe/wrapper/wrapper.c
+jvmaccess/source/classpath.cxx
+jvmaccess/source/unovirtualmachine.cxx
+jvmaccess/source/virtualmachine.cxx
+jvmaccess/workbench/javainfo/javainfotest.cxx
+jvmfwk/inc/fwkutil.hxx
+jvmfwk/inc/vendorplugin.hxx
+jvmfwk/plugins/sunmajor/javaenvsetup/javaldx.cxx
+jvmfwk/plugins/sunmajor/pluginlib/otherjre.cxx
+jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
+jvmfwk/plugins/sunmajor/pluginlib/sunjre.cxx
+jvmfwk/plugins/sunmajor/pluginlib/sunversion.cxx
+jvmfwk/plugins/sunmajor/pluginlib/util.cxx
+jvmfwk/plugins/sunmajor/pluginlib/util.hxx
+jvmfwk/plugins/sunmajor/pluginlib/vendorbase.cxx
+jvmfwk/plugins/sunmajor/pluginlib/vendorlist.cxx
+jvmfwk/plugins/sunmajor/pluginlib/vendorlist.hxx
+jvmfwk/qa/unit/sunversion.cxx
+jvmfwk/source/elements.cxx
+jvmfwk/source/framework.cxx
+jvmfwk/source/framework.hxx
+jvmfwk/source/fwkbase.cxx
+jvmfwk/source/fwkutil.cxx
+jvmfwk/source/libxmlutil.cxx
+l10ntools/inc/cfgmerge.hxx
+l10ntools/inc/common.hxx
+l10ntools/inc/export.hxx
+l10ntools/inc/helper.hxx
+l10ntools/inc/helpmerge.hxx
+l10ntools/inc/lngmerge.hxx
+l10ntools/inc/po.hxx
+l10ntools/inc/propmerge.hxx
+l10ntools/inc/tokens.h
+l10ntools/inc/treemerge.hxx
+l10ntools/inc/xmlparse.hxx
+l10ntools/inc/xrmlex.hxx
+l10ntools/inc/xrmmerge.hxx
+l10ntools/source/cfgmerge.cxx
+l10ntools/source/common.cxx
+l10ntools/source/helper.cxx
+l10ntools/source/helpex.cxx
+l10ntools/source/helpmerge.cxx
+l10ntools/source/idxdict/idxdict.cxx
+l10ntools/source/lngmerge.cxx
+l10ntools/source/localize.cxx
+l10ntools/source/merge.cxx
+l10ntools/source/po.cxx
+l10ntools/source/pocheck.cxx
+l10ntools/source/propex.cxx
+l10ntools/source/propmerge.cxx
+l10ntools/source/treemerge.cxx
+l10ntools/source/treex.cxx
+l10ntools/source/xmlparse.cxx
+l10ntools/source/xrmmerge.cxx
+libreofficekit/qa/gtktiledviewer/gtv-application-window.cxx
+libreofficekit/qa/gtktiledviewer/gtv-application-window.hxx
+libreofficekit/qa/gtktiledviewer/gtv-application.cxx
+libreofficekit/qa/gtktiledviewer/gtv-application.hxx
+libreofficekit/qa/gtktiledviewer/gtv-calc-header-bar.cxx
+libreofficekit/qa/gtktiledviewer/gtv-calc-header-bar.hxx
+libreofficekit/qa/gtktiledviewer/gtv-comments-sidebar.cxx
+libreofficekit/qa/gtktiledviewer/gtv-comments-sidebar.hxx
+libreofficekit/qa/gtktiledviewer/gtv-helpers.cxx
+libreofficekit/qa/gtktiledviewer/gtv-helpers.hxx
+libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.cxx
+libreofficekit/qa/gtktiledviewer/gtv-lok-dialog.hxx
+libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.cxx
+libreofficekit/qa/gtktiledviewer/gtv-lokdocview-signal-handlers.hxx
+libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.cxx
+libreofficekit/qa/gtktiledviewer/gtv-main-toolbar.hxx
+libreofficekit/qa/gtktiledviewer/gtv-signal-handlers.cxx
+libreofficekit/qa/tilebench/tilebench.cxx
+libreofficekit/qa/unit/tiledrendering.cxx
+libreofficekit/source/gtk/lokdocview.cxx
+libreofficekit/source/gtk/tilebuffer.cxx
+lingucomponent/source/hyphenator/hyphen/hyphenimp.cxx
+lingucomponent/source/hyphenator/hyphen/hyphenimp.hxx
+lingucomponent/source/languageguessing/guess.cxx
+lingucomponent/source/languageguessing/guess.hxx
+lingucomponent/source/languageguessing/guesslang.cxx
+lingucomponent/source/languageguessing/simpleguesser.cxx
+lingucomponent/source/lingutil/lingutil.cxx
+lingucomponent/source/lingutil/lingutil.hxx
+lingucomponent/source/spellcheck/macosxspell/macspellimp.hxx
+lingucomponent/source/spellcheck/spell/sspellimp.cxx
+lingucomponent/source/spellcheck/spell/sspellimp.hxx
+lingucomponent/source/thesaurus/libnth/nthesdta.cxx
+lingucomponent/source/thesaurus/libnth/nthesdta.hxx
+lingucomponent/source/thesaurus/libnth/nthesimp.cxx
+lingucomponent/source/thesaurus/libnth/nthesimp.hxx
+linguistic/inc/iprcache.hxx
+linguistic/source/convdic.cxx
+linguistic/source/convdic.hxx
+linguistic/source/convdiclist.cxx
+linguistic/source/convdiclist.hxx
+linguistic/source/convdicxml.cxx
+linguistic/source/convdicxml.hxx
+linguistic/source/defs.hxx
+linguistic/source/dicimp.cxx
+linguistic/source/dicimp.hxx
+linguistic/source/dlistimp.cxx
+linguistic/source/dlistimp.hxx
+linguistic/source/gciterator.cxx
+linguistic/source/gciterator.hxx
+linguistic/source/hhconvdic.cxx
+linguistic/source/hyphdsp.cxx
+linguistic/source/hyphdsp.hxx
+linguistic/source/hyphdta.cxx
+linguistic/source/iprcache.cxx
+linguistic/source/lngopt.cxx
+linguistic/source/lngopt.hxx
+linguistic/source/lngprophelp.cxx
+linguistic/source/lngsvcmgr.cxx
+linguistic/source/lngsvcmgr.hxx
+linguistic/source/misc.cxx
+linguistic/source/misc2.cxx
+linguistic/source/spelldsp.cxx
+linguistic/source/spelldsp.hxx
+linguistic/source/spelldta.cxx
+linguistic/source/thesdsp.cxx
+linguistic/source/thesdsp.hxx
+linguistic/workben/sprophelp.cxx
+linguistic/workben/sprophelp.hxx
+linguistic/workben/sreg.cxx
+linguistic/workben/sspellimp.cxx
+linguistic/workben/sspellimp.hxx
+lotuswordpro/inc/lwpcolor.hxx
+lotuswordpro/inc/lwpdefs.hxx
+lotuswordpro/inc/lwpfont.hxx
+lotuswordpro/inc/lwpfoundry.hxx
+lotuswordpro/inc/lwpidxmgr.hxx
+lotuswordpro/inc/lwpobjfactory.hxx
+lotuswordpro/inc/lwpobjhdr.hxx
+lotuswordpro/inc/lwpobjid.hxx
+lotuswordpro/inc/lwpobjtags.hxx
+lotuswordpro/inc/lwpoverride.hxx
+lotuswordpro/inc/lwptools.hxx
+lotuswordpro/inc/xfilter/xfbookmark.hxx
+lotuswordpro/inc/xfilter/xfborders.hxx
+lotuswordpro/inc/xfilter/xfbreaks.hxx
+lotuswordpro/inc/xfilter/xfcell.hxx
+lotuswordpro/inc/xfilter/xfcolor.hxx
+lotuswordpro/inc/xfilter/xfcolumns.hxx
+lotuswordpro/inc/xfilter/xfdocfield.hxx
+lotuswordpro/inc/xfilter/xfdrawlinestyle.hxx
+lotuswordpro/inc/xfilter/xfdrawobj.hxx
+lotuswordpro/inc/xfilter/xfdropcap.hxx
+lotuswordpro/inc/xfilter/xfendnote.hxx
+lotuswordpro/inc/xfilter/xffont.hxx
+lotuswordpro/inc/xfilter/xffootnoteconfig.hxx
+lotuswordpro/inc/xfilter/xfframe.hxx
+lotuswordpro/inc/xfilter/xfframestyle.hxx
+lotuswordpro/inc/xfilter/xfindex.hxx
+lotuswordpro/inc/xfilter/xfinputlist.hxx
+lotuswordpro/inc/xfilter/xflineheight.hxx
+lotuswordpro/inc/xfilter/xflinenumberconfig.hxx
+lotuswordpro/inc/xfilter/xfliststyle.hxx
+lotuswordpro/inc/xfilter/xfmargins.hxx
+lotuswordpro/inc/xfilter/xfnumberstyle.hxx
+lotuswordpro/inc/xfilter/xfnumfmt.hxx
+lotuswordpro/inc/xfilter/xfpadding.hxx
+lotuswordpro/inc/xfilter/xfpagemaster.hxx
+lotuswordpro/inc/xfilter/xfparastyle.hxx
+lotuswordpro/inc/xfilter/xfpoint.hxx
+lotuswordpro/inc/xfilter/xfrect.hxx
+lotuswordpro/inc/xfilter/xfrow.hxx
+lotuswordpro/inc/xfilter/xfsaxstream.hxx
+lotuswordpro/inc/xfilter/xfshadow.hxx
+lotuswordpro/inc/xfilter/xfstylemanager.hxx
+lotuswordpro/inc/xfilter/xftable.hxx
+lotuswordpro/inc/xfilter/xftimestyle.hxx
+lotuswordpro/qa/cppunit/test_lotuswordpro.cxx
+lotuswordpro/source/filter/LotusWordProImportFilter.cxx
+lotuswordpro/source/filter/LotusWordProImportFilter.hxx
+lotuswordpro/source/filter/bencont.cxx
+lotuswordpro/source/filter/benname.cxx
+lotuswordpro/source/filter/bento.hxx
+lotuswordpro/source/filter/benval.cxx
+lotuswordpro/source/filter/clone.hxx
+lotuswordpro/source/filter/explode.cxx
+lotuswordpro/source/filter/lwpborderstuff.cxx
+lotuswordpro/source/filter/lwpborderstuff.hxx
+lotuswordpro/source/filter/lwpbulletstylemgr.cxx
+lotuswordpro/source/filter/lwpbulletstylemgr.hxx
+lotuswordpro/source/filter/lwpcelllayout.cxx
+lotuswordpro/source/filter/lwpcelllayout.hxx
+lotuswordpro/source/filter/lwpcharacterstyle.hxx
+lotuswordpro/source/filter/lwpcontent.hxx
+lotuswordpro/source/filter/lwpdivopts.cxx
+lotuswordpro/source/filter/lwpdocdata.cxx
+lotuswordpro/source/filter/lwpdrawobj.cxx
+lotuswordpro/source/filter/lwpdrawobj.hxx
+lotuswordpro/source/filter/lwpfont.cxx
+lotuswordpro/source/filter/lwpfootnote.hxx
+lotuswordpro/source/filter/lwpfoundry.cxx
+lotuswordpro/source/filter/lwpfribbreaks.hxx
+lotuswordpro/source/filter/lwpfribheader.hxx
+lotuswordpro/source/filter/lwpfribmark.hxx
+lotuswordpro/source/filter/lwpfribptr.cxx
+lotuswordpro/source/filter/lwpfribtext.cxx
+lotuswordpro/source/filter/lwpfribtext.hxx
+lotuswordpro/source/filter/lwpgrfobj.cxx
+lotuswordpro/source/filter/lwpgrfobj.hxx
+lotuswordpro/source/filter/lwpidxmgr.cxx
+lotuswordpro/source/filter/lwplayout.hxx
+lotuswordpro/source/filter/lwplayoutdef.hxx
+lotuswordpro/source/filter/lwplaypiece.cxx
+lotuswordpro/source/filter/lwpmargins.hxx
+lotuswordpro/source/filter/lwpmarker.cxx
+lotuswordpro/source/filter/lwpmarker.hxx
+lotuswordpro/source/filter/lwpnumericfmt.cxx
+lotuswordpro/source/filter/lwpnumericfmt.hxx
+lotuswordpro/source/filter/lwpoleobject.hxx
+lotuswordpro/source/filter/lwppara.cxx
+lotuswordpro/source/filter/lwppara.hxx
+lotuswordpro/source/filter/lwppara1.cxx
+lotuswordpro/source/filter/lwpparaborderoverride.hxx
+lotuswordpro/source/filter/lwpparaproperty.cxx
+lotuswordpro/source/filter/lwpparaproperty.hxx
+lotuswordpro/source/filter/lwpparastyle.cxx
+lotuswordpro/source/filter/lwppiece.hxx
+lotuswordpro/source/filter/lwpproplist.cxx
+lotuswordpro/source/filter/lwprowlayout.cxx
+lotuswordpro/source/filter/lwprowlayout.hxx
+lotuswordpro/source/filter/lwpsdwdrawheader.hxx
+lotuswordpro/source/filter/lwpsdwgrouploaderv0102.cxx
+lotuswordpro/source/filter/lwpsdwrect.cxx
+lotuswordpro/source/filter/lwpshadow.hxx
+lotuswordpro/source/filter/lwpsilverbullet.cxx
+lotuswordpro/source/filter/lwpstory.cxx
+lotuswordpro/source/filter/lwpstyledef.hxx
+lotuswordpro/source/filter/lwptable.hxx
+lotuswordpro/source/filter/lwptablelayout.cxx
+lotuswordpro/source/filter/lwptablelayout.hxx
+lotuswordpro/source/filter/lwptabrack.cxx
+lotuswordpro/source/filter/lwptabrack.hxx
+lotuswordpro/source/filter/lwptblcell.hxx
+lotuswordpro/source/filter/lwptblformula.cxx
+lotuswordpro/source/filter/lwptblformula.hxx
+lotuswordpro/source/filter/lwptoc.cxx
+lotuswordpro/source/filter/lwptools.cxx
+lotuswordpro/source/filter/lwpusewhen.hxx
+lotuswordpro/source/filter/tocread.cxx
+lotuswordpro/source/filter/xfilter/xfbase64.cxx
+lotuswordpro/source/filter/xfilter/xfbgimage.cxx
+lotuswordpro/source/filter/xfilter/xfborders.cxx
+lotuswordpro/source/filter/xfilter/xfcell.cxx
+lotuswordpro/source/filter/xfilter/xfcellstyle.cxx
+lotuswordpro/source/filter/xfilter/xfchange.cxx
+lotuswordpro/source/filter/xfilter/xfcolor.cxx
+lotuswordpro/source/filter/xfilter/xfcolumns.cxx
+lotuswordpro/source/filter/xfilter/xfcontentcontainer.cxx
+lotuswordpro/source/filter/xfilter/xfdate.cxx
+lotuswordpro/source/filter/xfilter/xfdatestyle.cxx
+lotuswordpro/source/filter/xfilter/xfdocfield.cxx
+lotuswordpro/source/filter/xfilter/xfdrawareastyle.hxx
+lotuswordpro/source/filter/xfilter/xfdrawline.cxx
+lotuswordpro/source/filter/xfilter/xfdrawobj.cxx
+lotuswordpro/source/filter/xfilter/xfdrawpath.cxx
+lotuswordpro/source/filter/xfilter/xfdrawpolygon.cxx
+lotuswordpro/source/filter/xfilter/xfdrawpolyline.cxx
+lotuswordpro/source/filter/xfilter/xfdrawstyle.cxx
+lotuswordpro/source/filter/xfilter/xffont.cxx
+lotuswordpro/source/filter/xfilter/xffontworkstyle.hxx
+lotuswordpro/source/filter/xfilter/xfframe.cxx
+lotuswordpro/source/filter/xfilter/xfframestyle.cxx
+lotuswordpro/source/filter/xfilter/xfheaderstyle.cxx
+lotuswordpro/source/filter/xfilter/xfimage.cxx
+lotuswordpro/source/filter/xfilter/xfimagestyle.cxx
+lotuswordpro/source/filter/xfilter/xfindex.cxx
+lotuswordpro/source/filter/xfilter/xfliststyle.cxx
+lotuswordpro/source/filter/xfilter/xfmargins.cxx
+lotuswordpro/source/filter/xfilter/xfnumberstyle.cxx
+lotuswordpro/source/filter/xfilter/xfofficemeta.cxx
+lotuswordpro/source/filter/xfilter/xfpagemaster.cxx
+lotuswordpro/source/filter/xfilter/xfparastyle.cxx
+lotuswordpro/source/filter/xfilter/xfrow.cxx
+lotuswordpro/source/filter/xfilter/xfrowstyle.cxx
+lotuswordpro/source/filter/xfilter/xfsectionstyle.cxx
+lotuswordpro/source/filter/xfilter/xfshadow.cxx
+lotuswordpro/source/filter/xfilter/xfstyle.cxx
+lotuswordpro/source/filter/xfilter/xfstylecont.cxx
+lotuswordpro/source/filter/xfilter/xfstylemanager.cxx
+lotuswordpro/source/filter/xfilter/xftable.cxx
+lotuswordpro/source/filter/xfilter/xftablestyle.cxx
+lotuswordpro/source/filter/xfilter/xftabstyle.cxx
+lotuswordpro/source/filter/xfilter/xftextboxstyle.cxx
+lotuswordpro/source/filter/xfilter/xftextcontent.cxx
+lotuswordpro/source/filter/xfilter/xftextspan.cxx
+lotuswordpro/source/filter/xfilter/xftimestyle.cxx
+lotuswordpro/source/filter/xfilter/xfutil.cxx
+o3tl/qa/cow_wrapper_clients.cxx
+o3tl/qa/cow_wrapper_clients.hxx
+o3tl/qa/test-cow_wrapper.cxx
+o3tl/qa/test-enumarray.cxx
+o3tl/qa/test-sorted_vector.cxx
+o3tl/qa/test-span.cxx
+o3tl/qa/test-typed_flags.cxx
+o3tl/qa/test-vector_pool.cxx
+odk/examples/DevelopersGuide/Components/Addons/ProtocolHandlerAddon_cpp/addon.cxx
+odk/examples/DevelopersGuide/Components/Addons/ProtocolHandlerAddon_cpp/addon.hxx
+odk/examples/DevelopersGuide/Components/Addons/ProtocolHandlerAddon_cpp/component.cxx
+odk/examples/DevelopersGuide/Components/CppComponent/TestCppComponent.cxx
+odk/examples/DevelopersGuide/Components/CppComponent/service1_impl.cxx
+odk/examples/DevelopersGuide/Components/CppComponent/service2_impl.cxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/OSubComponent.hxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/OTypeInfo.hxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SConnection.cxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SConnection.hxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SDatabaseMetaData.cxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SDatabaseMetaData.hxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SDriver.cxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SDriver.hxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SPreparedStatement.cxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SPreparedStatement.hxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SResultSet.cxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SResultSet.hxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SResultSetMetaData.cxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SResultSetMetaData.hxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SServices.cxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SStatement.cxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/SStatement.hxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/propertyids.cxx
+odk/examples/DevelopersGuide/Database/DriverSkeleton/propertyids.hxx
+odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/nativelib/unix/nativeview.c
+odk/examples/DevelopersGuide/OfficeDev/DesktopEnvironment/nativelib/windows/nativeview.c
+odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilterDetection/fdcomp.cxx
+odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilterDetection/filterdetect.cxx
+odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilterDetection/filterdetect.hxx
+odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilter_cpp/FlatXml.cxx
+odk/examples/DevelopersGuide/ProfUNO/CppBinding/office_connect.cxx
+odk/examples/DevelopersGuide/ProfUNO/SimpleBootstrap_cpp/SimpleBootstrap_cpp.cxx
+odk/examples/OLE/activex/SOActiveX.cpp
+odk/examples/OLE/activex/SOActiveX.h
+odk/examples/OLE/activex/SOComWindowPeer.h
+odk/examples/OLE/activex/resource.h
+odk/examples/cpp/DocumentLoader/DocumentLoader.cxx
+odk/examples/cpp/complextoolbarcontrols/ListenerHelper.cxx
+odk/examples/cpp/complextoolbarcontrols/ListenerHelper.h
+odk/examples/cpp/complextoolbarcontrols/MyJob.cxx
+odk/examples/cpp/complextoolbarcontrols/MyJob.h
+odk/examples/cpp/complextoolbarcontrols/MyListener.cxx
+odk/examples/cpp/complextoolbarcontrols/MyListener.h
+odk/examples/cpp/complextoolbarcontrols/MyProtocolHandler.cxx
+odk/examples/cpp/complextoolbarcontrols/MyProtocolHandler.h
+odk/examples/cpp/complextoolbarcontrols/WriterListener.cxx
+odk/examples/cpp/complextoolbarcontrols/exports.cxx
+odk/examples/cpp/counter/counter.cxx
+odk/examples/cpp/counter/countermain.cxx
+odk/examples/cpp/custompanel/ctp_factory.cxx
+odk/examples/cpp/custompanel/ctp_factory.hxx
+odk/examples/cpp/custompanel/ctp_panel.cxx
+odk/examples/cpp/custompanel/ctp_panel.hxx
+odk/examples/cpp/custompanel/ctp_services.cxx
+odk/examples/cpp/remoteclient/remoteclient.cxx
+odk/source/unoapploader/unx/unoapploader.c
+odk/source/unoapploader/win/unoapploader.c
+officecfg/qa/cppheader.cxx
+onlineupdate/inc/Char16.h
+onlineupdate/source/libmar/sign/mar_sign.c
+onlineupdate/source/libmar/sign/nss_secutil.c
+onlineupdate/source/libmar/sign/nss_secutil.h
+onlineupdate/source/libmar/src/mar_create.c
+onlineupdate/source/libmar/src/mar_extract.c
+onlineupdate/source/libmar/src/mar_read.c
+onlineupdate/source/libmar/tool/mar.c
+onlineupdate/source/libmar/verify/MacVerifyCrypto.cpp
+onlineupdate/source/libmar/verify/cryptox.c
+onlineupdate/source/libmar/verify/cryptox.h
+onlineupdate/source/libmar/verify/mar_verify.c
+onlineupdate/source/mbsdiff/bsdiff.cxx
+onlineupdate/source/service/certificatecheck.cxx
+onlineupdate/source/service/certificatecheck.hxx
+onlineupdate/source/service/maintenanceservice.cxx
+onlineupdate/source/service/maintenanceservice.hxx
+onlineupdate/source/service/registrycertificates.cxx
+onlineupdate/source/service/registrycertificates.hxx
+onlineupdate/source/service/resource.hxx
+onlineupdate/source/service/servicebase.cxx
+onlineupdate/source/service/serviceinstall.cxx
+onlineupdate/source/service/serviceinstall.hxx
+onlineupdate/source/service/windowsHelper.hxx
+onlineupdate/source/service/workmonitor.cxx
+onlineupdate/source/update/common/pathhash.cxx
+onlineupdate/source/update/common/pathhash.h
+onlineupdate/source/update/common/readstrings.cxx
+onlineupdate/source/update/common/readstrings.h
+onlineupdate/source/update/common/uachelper.cxx
+onlineupdate/source/update/common/uachelper.h
+onlineupdate/source/update/common/updatedefines.h
+onlineupdate/source/update/common/updatehelper.cxx
+onlineupdate/source/update/common/updatehelper.h
+onlineupdate/source/update/common/updatelogging.cxx
+onlineupdate/source/update/common/updatelogging.h
+onlineupdate/source/update/updater/archivereader.cxx
+onlineupdate/source/update/updater/archivereader.h
+onlineupdate/source/update/updater/bspatch.cxx
+onlineupdate/source/update/updater/loaddlls.cxx
+onlineupdate/source/update/updater/progressui-unused/progressui_gonk.cxx
+onlineupdate/source/update/updater/progressui_gtk.cxx
+onlineupdate/source/update/updater/progressui_gtk_icon.h
+onlineupdate/source/update/updater/progressui_null.cxx
+onlineupdate/source/update/updater/progressui_win.cxx
+onlineupdate/source/update/updater/resource.h
+onlineupdate/source/update/updater/updater.cxx
+onlineupdate/source/update/updater/win_dirent.cxx
+onlineupdate/source/update/updater/xpcom/glue/nsVersionComparator.h
+oox/inc/drawingml/ThemeOverrideFragmentHandler.hxx
+oox/inc/drawingml/chart/axiscontext.hxx
+oox/inc/drawingml/chart/axisconverter.hxx
+oox/inc/drawingml/chart/axismodel.hxx
+oox/inc/drawingml/chart/chartcontextbase.hxx
+oox/inc/drawingml/chart/chartdrawingfragment.hxx
+oox/inc/drawingml/chart/chartspaceconverter.hxx
+oox/inc/drawingml/chart/chartspacefragment.hxx
+oox/inc/drawingml/chart/chartspacemodel.hxx
+oox/inc/drawingml/chart/converterbase.hxx
+oox/inc/drawingml/chart/datasourcecontext.hxx
+oox/inc/drawingml/chart/datasourceconverter.hxx
+oox/inc/drawingml/chart/objectformatter.hxx
+oox/inc/drawingml/chart/plotareacontext.hxx
+oox/inc/drawingml/chart/plotareaconverter.hxx
+oox/inc/drawingml/chart/plotareamodel.hxx
+oox/inc/drawingml/chart/seriescontext.hxx
+oox/inc/drawingml/chart/seriesconverter.hxx
+oox/inc/drawingml/chart/seriesmodel.hxx
+oox/inc/drawingml/chart/titlecontext.hxx
+oox/inc/drawingml/chart/titleconverter.hxx
+oox/inc/drawingml/chart/titlemodel.hxx
+oox/inc/drawingml/chart/typegroupcontext.hxx
+oox/inc/drawingml/chart/typegroupconverter.hxx
+oox/inc/drawingml/chart/typegroupmodel.hxx
+oox/inc/drawingml/clrschemecontext.hxx
+oox/inc/drawingml/colorchoicecontext.hxx
+oox/inc/drawingml/customshapegeometry.hxx
+oox/inc/drawingml/customshapeproperties.hxx
+oox/inc/drawingml/effectpropertiescontext.hxx
+oox/inc/drawingml/embeddedwavaudiofile.hxx
+oox/inc/drawingml/fillproperties.hxx
+oox/inc/drawingml/graphicproperties.hxx
+oox/inc/drawingml/guidcontext.hxx
+oox/inc/drawingml/lineproperties.hxx
+oox/inc/drawingml/linepropertiescontext.hxx
+oox/inc/drawingml/misccontexts.hxx
+oox/inc/drawingml/scene3dcontext.hxx
+oox/inc/drawingml/shape3dproperties.hxx
+oox/inc/drawingml/table/tablebackgroundstylecontext.hxx
+oox/inc/drawingml/table/tablecell.hxx
+oox/inc/drawingml/table/tablepartstylecontext.hxx
+oox/inc/drawingml/table/tableproperties.hxx
+oox/inc/drawingml/table/tablestyle.hxx
+oox/inc/drawingml/table/tablestylecellstylecontext.hxx
+oox/inc/drawingml/table/tablestylecontext.hxx
+oox/inc/drawingml/table/tablestylelist.hxx
+oox/inc/drawingml/table/tablestylelistfragmenthandler.hxx
+oox/inc/drawingml/table/tablestylepart.hxx
+oox/inc/drawingml/table/tablestyletextstylecontext.hxx
+oox/inc/drawingml/textbody.hxx
+oox/inc/drawingml/textbodycontext.hxx
+oox/inc/drawingml/textbodyproperties.hxx
+oox/inc/drawingml/textbodypropertiescontext.hxx
+oox/inc/drawingml/textcharacterproperties.hxx
+oox/inc/drawingml/textcharacterpropertiescontext.hxx
+oox/inc/drawingml/texteffectscontext.hxx
+oox/inc/drawingml/textfield.hxx
+oox/inc/drawingml/textfieldcontext.hxx
+oox/inc/drawingml/textfont.hxx
+oox/inc/drawingml/textliststylecontext.hxx
+oox/inc/drawingml/textparagraph.hxx
+oox/inc/drawingml/textparagraphproperties.hxx
+oox/inc/drawingml/textparagraphpropertiescontext.hxx
+oox/inc/drawingml/textrun.hxx
+oox/inc/drawingml/textspacing.hxx
+oox/inc/drawingml/transform2dcontext.hxx
+oox/qa/token/tokenmap-test.cxx
+oox/qa/unit/vba_compression.cxx
+oox/source/core/binarycodec.cxx
+oox/source/core/contexthandler.cxx
+oox/source/core/contexthandler2.cxx
+oox/source/core/fastparser.cxx
+oox/source/core/fasttokenhandler.cxx
+oox/source/core/filterbase.cxx
+oox/source/core/filterdetect.cxx
+oox/source/core/fragmenthandler.cxx
+oox/source/core/fragmenthandler2.cxx
+oox/source/core/recordparser.cxx
+oox/source/core/relations.cxx
+oox/source/core/relationshandler.cxx
+oox/source/core/xmlfilterbase.cxx
+oox/source/crypto/AgileEngine.cxx
+oox/source/crypto/CryptTools.cxx
+oox/source/crypto/DocumentEncryption.cxx
+oox/source/crypto/Standard2007Engine.cxx
+oox/source/docprop/docprophandler.cxx
+oox/source/docprop/docprophandler.hxx
+oox/source/docprop/ooxmldocpropimport.cxx
+oox/source/docprop/ooxmldocpropimport.hxx
+oox/source/drawingml/ThemeOverrideFragmentHandler.cxx
+oox/source/drawingml/chart/axiscontext.cxx
+oox/source/drawingml/chart/axisconverter.cxx
+oox/source/drawingml/chart/axismodel.cxx
+oox/source/drawingml/chart/chartcontextbase.cxx
+oox/source/drawingml/chart/chartconverter.cxx
+oox/source/drawingml/chart/chartdrawingfragment.cxx
+oox/source/drawingml/chart/chartspaceconverter.cxx
+oox/source/drawingml/chart/chartspacefragment.cxx
+oox/source/drawingml/chart/chartspacemodel.cxx
+oox/source/drawingml/chart/converterbase.cxx
+oox/source/drawingml/chart/datasourcecontext.cxx
+oox/source/drawingml/chart/datasourceconverter.cxx
+oox/source/drawingml/chart/datasourcemodel.cxx
+oox/source/drawingml/chart/modelbase.cxx
+oox/source/drawingml/chart/objectformatter.cxx
+oox/source/drawingml/chart/plotareacontext.cxx
+oox/source/drawingml/chart/plotareaconverter.cxx
+oox/source/drawingml/chart/plotareamodel.cxx
+oox/source/drawingml/chart/seriescontext.cxx
+oox/source/drawingml/chart/seriesconverter.cxx
+oox/source/drawingml/chart/seriesmodel.cxx
+oox/source/drawingml/chart/titlecontext.cxx
+oox/source/drawingml/chart/titleconverter.cxx
+oox/source/drawingml/chart/titlemodel.cxx
+oox/source/drawingml/chart/typegroupcontext.cxx
+oox/source/drawingml/chart/typegroupconverter.cxx
+oox/source/drawingml/chart/typegroupmodel.cxx
+oox/source/drawingml/clrscheme.cxx
+oox/source/drawingml/clrschemecontext.cxx
+oox/source/drawingml/color.cxx
+oox/source/drawingml/colorchoicecontext.cxx
+oox/source/drawingml/connectorshapecontext.cxx
+oox/source/drawingml/customshapegeometry.cxx
+oox/source/drawingml/customshapeproperties.cxx
+oox/source/drawingml/diagram/constraintlistcontext.cxx
+oox/source/drawingml/diagram/constraintlistcontext.hxx
+oox/source/drawingml/diagram/datamodel.cxx
+oox/source/drawingml/diagram/datamodel.hxx
+oox/source/drawingml/diagram/diagramhelper.cxx
+oox/source/drawingml/diagram/diagramhelper.hxx
+oox/source/drawingml/diagram/datamodelcontext.cxx
+oox/source/drawingml/diagram/datamodelcontext.hxx
+oox/source/drawingml/diagram/diagram.cxx
+oox/source/drawingml/diagram/diagram.hxx
+oox/source/drawingml/diagram/diagramdefinitioncontext.cxx
+oox/source/drawingml/diagram/diagramdefinitioncontext.hxx
+oox/source/drawingml/diagram/diagramfragmenthandler.cxx
+oox/source/drawingml/diagram/diagramfragmenthandler.hxx
+oox/source/drawingml/diagram/diagramlayoutatoms.cxx
+oox/source/drawingml/diagram/diagramlayoutatoms.hxx
+oox/source/drawingml/diagram/layoutatomvisitorbase.cxx
+oox/source/drawingml/diagram/layoutatomvisitorbase.hxx
+oox/source/drawingml/diagram/layoutatomvisitors.hxx
+oox/source/drawingml/diagram/layoutnodecontext.cxx
+oox/source/drawingml/diagram/layoutnodecontext.hxx
+oox/source/drawingml/drawingmltypes.cxx
+oox/source/drawingml/effectproperties.cxx
+oox/source/drawingml/effectproperties.hxx
+oox/source/drawingml/effectpropertiescontext.cxx
+oox/source/drawingml/fillproperties.cxx
+oox/source/drawingml/graphicshapecontext.cxx
+oox/source/drawingml/guidcontext.cxx
+oox/source/drawingml/hyperlinkcontext.cxx
+oox/source/drawingml/hyperlinkcontext.hxx
+oox/source/drawingml/lineproperties.cxx
+oox/source/drawingml/linepropertiescontext.cxx
+oox/source/drawingml/misccontexts.cxx
+oox/source/drawingml/objectdefaultcontext.cxx
+oox/source/drawingml/scene3dcontext.cxx
+oox/source/drawingml/shape.cxx
+oox/source/drawingml/shape3dproperties.cxx
+oox/source/drawingml/shapecontext.cxx
+oox/source/drawingml/shapegroupcontext.cxx
+oox/source/drawingml/shapepropertiescontext.cxx
+oox/source/drawingml/shapepropertymap.cxx
+oox/source/drawingml/shapestylecontext.cxx
+oox/source/drawingml/spdefcontext.cxx
+oox/source/drawingml/table/tablebackgroundstylecontext.cxx
+oox/source/drawingml/table/tablecell.cxx
+oox/source/drawingml/table/tablecellcontext.cxx
+oox/source/drawingml/table/tablecontext.cxx
+oox/source/drawingml/table/tablepartstylecontext.cxx
+oox/source/drawingml/table/tableproperties.cxx
+oox/source/drawingml/table/tablerowcontext.cxx
+oox/source/drawingml/table/tablestylecellstylecontext.cxx
+oox/source/drawingml/table/tablestylecontext.cxx
+oox/source/drawingml/table/tablestylelistfragmenthandler.cxx
+oox/source/drawingml/table/tablestyletextstylecontext.cxx
+oox/source/drawingml/textbody.cxx
+oox/source/drawingml/textbodycontext.cxx
+oox/source/drawingml/textbodyproperties.cxx
+oox/source/drawingml/textbodypropertiescontext.cxx
+oox/source/drawingml/textcharacterproperties.cxx
+oox/source/drawingml/textcharacterpropertiescontext.cxx
+oox/source/drawingml/texteffectscontext.cxx
+oox/source/drawingml/textfield.cxx
+oox/source/drawingml/textfieldcontext.cxx
+oox/source/drawingml/textfont.cxx
+oox/source/drawingml/textliststyle.cxx
+oox/source/drawingml/textliststylecontext.cxx
+oox/source/drawingml/textparagraph.cxx
+oox/source/drawingml/textparagraphproperties.cxx
+oox/source/drawingml/textparagraphpropertiescontext.cxx
+oox/source/drawingml/textrun.cxx
+oox/source/drawingml/textspacingcontext.cxx
+oox/source/drawingml/texttabstoplistcontext.cxx
+oox/source/drawingml/texttabstoplistcontext.hxx
+oox/source/drawingml/theme.cxx
+oox/source/drawingml/themeelementscontext.cxx
+oox/source/drawingml/themefragmenthandler.cxx
+oox/source/drawingml/transform2dcontext.cxx
+oox/source/dump/dffdumper.cxx
+oox/source/dump/dumperbase.cxx
+oox/source/dump/oledumper.cxx
+oox/source/dump/pptxdumper.cxx
+oox/source/export/ColorPropertySet.cxx
+oox/source/export/ColorPropertySet.hxx
+oox/source/export/chartexport.cxx
+oox/source/export/drawingml.cxx
+oox/source/export/shapes.cxx
+oox/source/export/vmlexport.cxx
+oox/source/helper/attributelist.cxx
+oox/source/helper/binaryinputstream.cxx
+oox/source/helper/binaryoutputstream.cxx
+oox/source/helper/binarystreambase.cxx
+oox/source/helper/containerhelper.cxx
+oox/source/helper/grabbagstack.cxx
+oox/source/helper/graphichelper.cxx
+oox/source/helper/modelobjecthelper.cxx
+oox/source/helper/progressbar.cxx
+oox/source/helper/propertymap.cxx
+oox/source/helper/propertyset.cxx
+oox/source/helper/storagebase.cxx
+oox/source/helper/textinputstream.cxx
+oox/source/helper/zipstorage.cxx
+oox/source/mathml/import.cxx
+oox/source/mathml/importutils.cxx
+oox/source/ole/axbinaryreader.cxx
+oox/source/ole/axbinarywriter.cxx
+oox/source/ole/axcontrol.cxx
+oox/source/ole/axcontrolfragment.cxx
+oox/source/ole/axfontdata.cxx
+oox/source/ole/olehelper.cxx
+oox/source/ole/oleobjecthelper.cxx
+oox/source/ole/olestorage.cxx
+oox/source/ole/vbacontrol.cxx
+oox/source/ole/vbaexport.cxx
+oox/source/ole/vbahelper.cxx
+oox/source/ole/vbainputstream.cxx
+oox/source/ole/vbamodule.cxx
+oox/source/ole/vbaproject.cxx
+oox/source/ppt/animationspersist.cxx
+oox/source/ppt/animvariantcontext.cxx
+oox/source/ppt/animvariantcontext.hxx
+oox/source/ppt/backgroundproperties.cxx
+oox/source/ppt/buildlistcontext.cxx
+oox/source/ppt/buildlistcontext.hxx
+oox/source/ppt/commonbehaviorcontext.cxx
+oox/source/ppt/commonbehaviorcontext.hxx
+oox/source/ppt/commontimenodecontext.cxx
+oox/source/ppt/commontimenodecontext.hxx
+oox/source/ppt/conditioncontext.cxx
+oox/source/ppt/conditioncontext.hxx
+oox/source/ppt/customshowlistcontext.cxx
+oox/source/ppt/extdrawingfragmenthandler.cxx
+oox/source/ppt/extdrawingfragmenthandler.hxx
+oox/source/ppt/headerfootercontext.cxx
+oox/source/ppt/headerfootercontext.hxx
+oox/source/ppt/layoutfragmenthandler.cxx
+oox/source/ppt/pptfilterhelpers.cxx
+oox/source/ppt/pptgraphicshapecontext.cxx
+oox/source/ppt/pptimport.cxx
+oox/source/ppt/pptshape.cxx
+oox/source/ppt/pptshapecontext.cxx
+oox/source/ppt/pptshapegroupcontext.cxx
+oox/source/ppt/pptshapepropertiescontext.cxx
+oox/source/ppt/presentationfragmenthandler.cxx
+oox/source/ppt/slidefragmenthandler.cxx
+oox/source/ppt/slidemastertextstylescontext.cxx
+oox/source/ppt/slidepersist.cxx
+oox/source/ppt/slidetimingcontext.cxx
+oox/source/ppt/slidetransition.cxx
+oox/source/ppt/slidetransitioncontext.cxx
+oox/source/ppt/soundactioncontext.cxx
+oox/source/ppt/timeanimvaluecontext.cxx
+oox/source/ppt/timeanimvaluecontext.hxx
+oox/source/ppt/timenode.cxx
+oox/source/ppt/timenodelistcontext.cxx
+oox/source/ppt/timetargetelementcontext.cxx
+oox/source/ppt/timetargetelementcontext.hxx
+oox/source/shape/ShapeContextHandler.cxx
+oox/source/shape/ShapeDrawingFragmentHandler.cxx
+oox/source/shape/ShapeDrawingFragmentHandler.hxx
+oox/source/shape/ShapeFilterBase.cxx
+oox/source/token/relationship.cxx
+oox/source/token/tokenmap.cxx
+oox/source/vml/vmldrawing.cxx
+oox/source/vml/vmldrawingfragment.cxx
+oox/source/vml/vmlformatting.cxx
+oox/source/vml/vmlinputstream.cxx
+oox/source/vml/vmlshape.cxx
+oox/source/vml/vmlshapecontainer.cxx
+oox/source/vml/vmlshapecontext.cxx
+oox/source/vml/vmltextbox.cxx
+oox/source/vml/vmltextboxcontext.cxx
+opencl/inc/opencl_device_selection.h
+opencl/source/opencl_device.cxx
+opencl/source/openclconfig.cxx
+opencl/source/openclwrapper.cxx
+opencl/source/platforminfo.cxx
+package/inc/ByteChucker.hxx
+package/inc/ByteGrabber.hxx
+package/inc/CRC32.hxx
+package/inc/EncryptionData.hxx
+package/inc/HashMaps.hxx
+package/inc/ZipFile.hxx
+package/inc/ZipOutputEntry.hxx
+package/inc/ZipOutputStream.hxx
+package/inc/ZipPackage.hxx
+package/inc/ZipPackageBuffer.hxx
+package/inc/ZipPackageEntry.hxx
+package/inc/ZipPackageFolder.hxx
+package/inc/ZipPackageStream.hxx
+package/inc/zipfileaccess.hxx
+package/qa/cppunit/test_package.cxx
+package/source/manifest/ManifestDefines.hxx
+package/source/manifest/ManifestExport.cxx
+package/source/manifest/ManifestExport.hxx
+package/source/manifest/ManifestImport.cxx
+package/source/manifest/ManifestImport.hxx
+package/source/manifest/ManifestReader.cxx
+package/source/manifest/ManifestReader.hxx
+package/source/manifest/ManifestWriter.cxx
+package/source/manifest/ManifestWriter.hxx
+package/source/xstor/disposelistener.cxx
+package/source/xstor/ocompinstream.cxx
+package/source/xstor/ocompinstream.hxx
+package/source/xstor/ohierarchyholder.cxx
+package/source/xstor/ohierarchyholder.hxx
+package/source/xstor/oseekinstream.cxx
+package/source/xstor/oseekinstream.hxx
+package/source/xstor/owriteablestream.cxx
+package/source/xstor/owriteablestream.hxx
+package/source/xstor/selfterminatefilestream.cxx
+package/source/xstor/selfterminatefilestream.hxx
+package/source/xstor/switchpersistencestream.cxx
+package/source/xstor/switchpersistencestream.hxx
+package/source/xstor/xfactory.cxx
+package/source/xstor/xfactory.hxx
+package/source/xstor/xstorage.cxx
+package/source/xstor/xstorage.hxx
+package/source/zipapi/ByteChucker.cxx
+package/source/zipapi/ByteGrabber.cxx
+package/source/zipapi/CRC32.cxx
+package/source/zipapi/Deflater.cxx
+package/source/zipapi/Inflater.cxx
+package/source/zipapi/MemoryByteGrabber.hxx
+package/source/zipapi/XBufferedThreadedStream.cxx
+package/source/zipapi/XBufferedThreadedStream.hxx
+package/source/zipapi/XUnbufferedStream.cxx
+package/source/zipapi/XUnbufferedStream.hxx
+package/source/zipapi/ZipFile.cxx
+package/source/zipapi/ZipOutputEntry.cxx
+package/source/zipapi/ZipOutputStream.cxx
+package/source/zipapi/blowfishcontext.cxx
+package/source/zipapi/blowfishcontext.hxx
+package/source/zipapi/sha1context.cxx
+package/source/zipapi/sha1context.hxx
+package/source/zippackage/ContentInfo.hxx
+package/source/zippackage/ZipPackage.cxx
+package/source/zippackage/ZipPackageBuffer.cxx
+package/source/zippackage/ZipPackageEntry.cxx
+package/source/zippackage/ZipPackageFolder.cxx
+package/source/zippackage/ZipPackageStream.cxx
+package/source/zippackage/wrapstreamforshare.cxx
+package/source/zippackage/wrapstreamforshare.hxx
+package/source/zippackage/zipfileaccess.cxx
+postprocess/qa/services.cxx
+pyuno/inc/pyuno.hxx
+pyuno/source/loader/pyuno_loader.cxx
+pyuno/source/module/pyuno.cxx
+pyuno/source/module/pyuno_adapter.cxx
+pyuno/source/module/pyuno_callable.cxx
+pyuno/source/module/pyuno_dlopenwrapper.c
+pyuno/source/module/pyuno_except.cxx
+pyuno/source/module/pyuno_gc.cxx
+pyuno/source/module/pyuno_impl.hxx
+pyuno/source/module/pyuno_iterator.cxx
+pyuno/source/module/pyuno_module.cxx
+pyuno/source/module/pyuno_runtime.cxx
+pyuno/source/module/pyuno_struct.cxx
+pyuno/source/module/pyuno_type.cxx
+pyuno/source/module/pyuno_util.cxx
+pyuno/zipcore/python.cxx
+registry/inc/regapi.hxx
+registry/source/keyimpl.cxx
+registry/source/keyimpl.hxx
+registry/source/reflcnst.hxx
+registry/source/reflread.cxx
+registry/source/reflread.hxx
+registry/source/reflwrit.cxx
+registry/source/reflwrit.hxx
+registry/source/regimpl.cxx
+registry/source/regimpl.hxx
+registry/source/registry.cxx
+registry/source/regkey.cxx
+registry/source/regkey.hxx
+registry/test/regdiagnose.h
+registry/test/testmerge.cxx
+registry/test/testregcpp.cxx
+registry/tools/options.cxx
+registry/tools/options.hxx
+registry/tools/regmerge.cxx
+registry/tools/regview.cxx
+remotebridges/source/unourl_resolver/unourl_resolver.cxx
+reportdesign/inc/PropertyForward.hxx
+reportdesign/inc/ReportDefinition.hxx
+reportdesign/inc/ReportHelperDefines.hxx
+reportdesign/inc/ReportVisitor.hxx
+reportdesign/inc/RptDef.hxx
+reportdesign/inc/RptModel.hxx
+reportdesign/inc/RptObject.hxx
+reportdesign/inc/RptPage.hxx
+reportdesign/inc/UndoActions.hxx
+reportdesign/inc/UndoEnv.hxx
+reportdesign/inc/conditionalexpression.hxx
+reportdesign/inc/helpids.h
+reportdesign/inc/reportformula.hxx
+reportdesign/inc/strings.hxx
+reportdesign/source/core/api/FixedLine.cxx
+reportdesign/source/core/api/FixedText.cxx
+reportdesign/source/core/api/FormatCondition.cxx
+reportdesign/source/core/api/FormattedField.cxx
+reportdesign/source/core/api/Function.cxx
+reportdesign/source/core/api/Functions.cxx
+reportdesign/source/core/api/Group.cxx
+reportdesign/source/core/api/Groups.cxx
+reportdesign/source/core/api/ImageControl.cxx
+reportdesign/source/core/api/ReportComponent.cxx
+reportdesign/source/core/api/ReportDefinition.cxx
+reportdesign/source/core/api/ReportEngineJFree.cxx
+reportdesign/source/core/api/Section.cxx
+reportdesign/source/core/api/Shape.cxx
+reportdesign/source/core/api/Tools.cxx
+reportdesign/source/core/inc/FixedLine.hxx
+reportdesign/source/core/inc/FixedText.hxx
+reportdesign/source/core/inc/FormatCondition.hxx
+reportdesign/source/core/inc/FormattedField.hxx
+reportdesign/source/core/inc/Function.hxx
+reportdesign/source/core/inc/Functions.hxx
+reportdesign/source/core/inc/Group.hxx
+reportdesign/source/core/inc/Groups.hxx
+reportdesign/source/core/inc/ImageControl.hxx
+reportdesign/source/core/inc/ReportComponent.hxx
+reportdesign/source/core/inc/ReportControlModel.hxx
+reportdesign/source/core/inc/ReportDrawPage.hxx
+reportdesign/source/core/inc/ReportEngineJFree.hxx
+reportdesign/source/core/inc/ReportHelperImpl.hxx
+reportdesign/source/core/inc/ReportUndoFactory.hxx
+reportdesign/source/core/inc/RptObjectListener.hxx
+reportdesign/source/core/inc/Section.hxx
+reportdesign/source/core/inc/Shape.hxx
+reportdesign/source/core/inc/Tools.hxx
+reportdesign/source/core/inc/conditionupdater.hxx
+reportdesign/source/core/misc/conditionalexpression.cxx
+reportdesign/source/core/misc/conditionupdater.cxx
+reportdesign/source/core/misc/reportformula.cxx
+reportdesign/source/core/sdr/PropertyForward.cxx
+reportdesign/source/core/sdr/ReportDrawPage.cxx
+reportdesign/source/core/sdr/ReportUndoFactory.cxx
+reportdesign/source/core/sdr/RptModel.cxx
+reportdesign/source/core/sdr/RptObject.cxx
+reportdesign/source/core/sdr/RptObjectListener.cxx
+reportdesign/source/core/sdr/RptPage.cxx
+reportdesign/source/core/sdr/UndoActions.cxx
+reportdesign/source/core/sdr/UndoEnv.cxx
+reportdesign/source/core/sdr/formatnormalizer.cxx
+reportdesign/source/core/sdr/formatnormalizer.hxx
+reportdesign/source/filter/xml/dbloader2.cxx
+reportdesign/source/filter/xml/dbloader2.hxx
+reportdesign/source/filter/xml/xmlAutoStyle.cxx
+reportdesign/source/filter/xml/xmlAutoStyle.hxx
+reportdesign/source/filter/xml/xmlCell.cxx
+reportdesign/source/filter/xml/xmlCell.hxx
+reportdesign/source/filter/xml/xmlColumn.cxx
+reportdesign/source/filter/xml/xmlColumn.hxx
+reportdesign/source/filter/xml/xmlComponent.cxx
+reportdesign/source/filter/xml/xmlComponent.hxx
+reportdesign/source/filter/xml/xmlCondPrtExpr.cxx
+reportdesign/source/filter/xml/xmlCondPrtExpr.hxx
+reportdesign/source/filter/xml/xmlControlProperty.cxx
+reportdesign/source/filter/xml/xmlControlProperty.hxx
+reportdesign/source/filter/xml/xmlEnums.hxx
+reportdesign/source/filter/xml/xmlExport.cxx
+reportdesign/source/filter/xml/xmlExport.hxx
+reportdesign/source/filter/xml/xmlExportDocumentHandler.cxx
+reportdesign/source/filter/xml/xmlExportDocumentHandler.hxx
+reportdesign/source/filter/xml/xmlFixedContent.cxx
+reportdesign/source/filter/xml/xmlFixedContent.hxx
+reportdesign/source/filter/xml/xmlFormatCondition.cxx
+reportdesign/source/filter/xml/xmlFormatCondition.hxx
+reportdesign/source/filter/xml/xmlFormattedField.cxx
+reportdesign/source/filter/xml/xmlFormattedField.hxx
+reportdesign/source/filter/xml/xmlFunction.cxx
+reportdesign/source/filter/xml/xmlFunction.hxx
+reportdesign/source/filter/xml/xmlGroup.cxx
+reportdesign/source/filter/xml/xmlGroup.hxx
+reportdesign/source/filter/xml/xmlHelper.cxx
+reportdesign/source/filter/xml/xmlHelper.hxx
+reportdesign/source/filter/xml/xmlImage.cxx
+reportdesign/source/filter/xml/xmlImage.hxx
+reportdesign/source/filter/xml/xmlImportDocumentHandler.cxx
+reportdesign/source/filter/xml/xmlImportDocumentHandler.hxx
+reportdesign/source/filter/xml/xmlMasterFields.cxx
+reportdesign/source/filter/xml/xmlMasterFields.hxx
+reportdesign/source/filter/xml/xmlPropertyHandler.hxx
+reportdesign/source/filter/xml/xmlReport.cxx
+reportdesign/source/filter/xml/xmlReport.hxx
+reportdesign/source/filter/xml/xmlReportElement.cxx
+reportdesign/source/filter/xml/xmlReportElement.hxx
+reportdesign/source/filter/xml/xmlReportElementBase.cxx
+reportdesign/source/filter/xml/xmlReportElementBase.hxx
+reportdesign/source/filter/xml/xmlSection.cxx
+reportdesign/source/filter/xml/xmlSection.hxx
+reportdesign/source/filter/xml/xmlStyleImport.cxx
+reportdesign/source/filter/xml/xmlStyleImport.hxx
+reportdesign/source/filter/xml/xmlSubDocument.cxx
+reportdesign/source/filter/xml/xmlSubDocument.hxx
+reportdesign/source/filter/xml/xmlTable.cxx
+reportdesign/source/filter/xml/xmlTable.hxx
+reportdesign/source/filter/xml/xmlfilter.cxx
+reportdesign/source/filter/xml/xmlfilter.hxx
+reportdesign/source/inc/GroupProperties.hxx
+reportdesign/source/ui/dlg/AddField.cxx
+reportdesign/source/ui/dlg/CondFormat.cxx
+reportdesign/source/ui/dlg/Condition.cxx
+reportdesign/source/ui/dlg/Condition.hxx
+reportdesign/source/ui/dlg/DateTime.cxx
+reportdesign/source/ui/dlg/Formula.cxx
+reportdesign/source/ui/dlg/GroupExchange.cxx
+reportdesign/source/ui/dlg/GroupExchange.hxx
+reportdesign/source/ui/dlg/GroupsSorting.cxx
+reportdesign/source/ui/dlg/Navigator.cxx
+reportdesign/source/ui/dlg/PageNumber.cxx
+reportdesign/source/ui/dlg/dlgpage.cxx
+reportdesign/source/ui/inc/AddField.hxx
+reportdesign/source/ui/inc/ColorChanger.hxx
+reportdesign/source/ui/inc/ColorListener.hxx
+reportdesign/source/ui/inc/ColumnInfo.hxx
+reportdesign/source/ui/inc/CondFormat.hxx
+reportdesign/source/ui/inc/DataProviderHandler.hxx
+reportdesign/source/ui/inc/DateTime.hxx
+reportdesign/source/ui/inc/DefaultInspection.hxx
+reportdesign/source/ui/inc/DesignView.hxx
+reportdesign/source/ui/inc/EndMarker.hxx
+reportdesign/source/ui/inc/FixedTextColor.hxx
+reportdesign/source/ui/inc/FormattedFieldBeautifier.hxx
+reportdesign/source/ui/inc/Formula.hxx
+reportdesign/source/ui/inc/FunctionHelper.hxx
+reportdesign/source/ui/inc/GeometryHandler.hxx
+reportdesign/source/ui/inc/GroupsSorting.hxx
+reportdesign/source/ui/inc/IReportControllerObserver.hxx
+reportdesign/source/ui/inc/MarkedSection.hxx
+reportdesign/source/ui/inc/Navigator.hxx
+reportdesign/source/ui/inc/PageNumber.hxx
+reportdesign/source/ui/inc/ReportComponentHandler.hxx
+reportdesign/source/ui/inc/ReportController.hxx
+reportdesign/source/ui/inc/ReportControllerObserver.hxx
+reportdesign/source/ui/inc/ReportDefines.hxx
+reportdesign/source/ui/inc/ReportSection.hxx
+reportdesign/source/ui/inc/ReportWindow.hxx
+reportdesign/source/ui/inc/RptUndo.hxx
+reportdesign/source/ui/inc/ScrollHelper.hxx
+reportdesign/source/ui/inc/SectionView.hxx
+reportdesign/source/ui/inc/SectionWindow.hxx
+reportdesign/source/ui/inc/StartMarker.hxx
+reportdesign/source/ui/inc/UITools.hxx
+reportdesign/source/ui/inc/ViewsWindow.hxx
+reportdesign/source/ui/inc/dlgedfunc.hxx
+reportdesign/source/ui/inc/metadata.hxx
+reportdesign/source/ui/inc/propbrw.hxx
+reportdesign/source/ui/inc/statusbarcontroller.hxx
+reportdesign/source/ui/inspection/DataProviderHandler.cxx
+reportdesign/source/ui/inspection/DefaultInspection.cxx
+reportdesign/source/ui/inspection/GeometryHandler.cxx
+reportdesign/source/ui/inspection/ReportComponentHandler.cxx
+reportdesign/source/ui/inspection/metadata.cxx
+reportdesign/source/ui/misc/ColorListener.cxx
+reportdesign/source/ui/misc/FunctionHelper.cxx
+reportdesign/source/ui/misc/RptUndo.cxx
+reportdesign/source/ui/misc/UITools.cxx
+reportdesign/source/ui/misc/statusbarcontroller.cxx
+reportdesign/source/ui/report/DesignView.cxx
+reportdesign/source/ui/report/EndMarker.cxx
+reportdesign/source/ui/report/FixedTextColor.cxx
+reportdesign/source/ui/report/FormattedFieldBeautifier.cxx
+reportdesign/source/ui/report/ReportController.cxx
+reportdesign/source/ui/report/ReportControllerObserver.cxx
+reportdesign/source/ui/report/ReportSection.cxx
+reportdesign/source/ui/report/ReportWindow.cxx
+reportdesign/source/ui/report/ScrollHelper.cxx
+reportdesign/source/ui/report/SectionView.cxx
+reportdesign/source/ui/report/SectionWindow.cxx
+reportdesign/source/ui/report/StartMarker.cxx
+reportdesign/source/ui/report/ViewsWindow.cxx
+reportdesign/source/ui/report/dlgedclip.cxx
+reportdesign/source/ui/report/dlgedfac.cxx
+reportdesign/source/ui/report/dlgedfunc.cxx
+reportdesign/source/ui/report/propbrw.cxx
+sal/android/libreofficekit-jni.c
+sal/android/lo-bootstrap.c
+sal/android/uthash.h
+sal/cppunittester/cppunittester.cxx
+sal/inc/signalshared.hxx
+sal/osl/all/compat.cxx
+sal/osl/all/debugbase.cxx
+sal/osl/all/filepath.cxx
+sal/osl/all/loadmodulerelative.cxx
+sal/osl/all/log.cxx
+sal/osl/all/utility.cxx
+sal/osl/unx/backtrace.c
+sal/osl/unx/backtrace.h
+sal/osl/unx/backtraceapi.cxx
+sal/osl/unx/conditn.cxx
+sal/osl/unx/file.cxx
+sal/osl/unx/file_impl.hxx
+sal/osl/unx/file_misc.cxx
+sal/osl/unx/file_path_helper.cxx
+sal/osl/unx/file_path_helper.hxx
+sal/osl/unx/file_stat.cxx
+sal/osl/unx/file_url.cxx
+sal/osl/unx/file_url.hxx
+sal/osl/unx/file_volume.cxx
+sal/osl/unx/interlck.cxx
+sal/osl/unx/module.cxx
+sal/osl/unx/mutex.cxx
+sal/osl/unx/nlsupport.cxx
+sal/osl/unx/osxlocale.cxx
+sal/osl/unx/pipe.cxx
+sal/osl/unx/process.cxx
+sal/osl/unx/process_impl.cxx
+sal/osl/unx/profile.cxx
+sal/osl/unx/readwrite_helper.cxx
+sal/osl/unx/salinit.cxx
+sal/osl/unx/security.cxx
+sal/osl/unx/signal.cxx
+sal/osl/unx/socket.cxx
+sal/osl/unx/sockimpl.hxx
+sal/osl/unx/system.cxx
+sal/osl/unx/system.hxx
+sal/osl/unx/tempfile.cxx
+sal/osl/unx/thread.cxx
+sal/osl/unx/time.cxx
+sal/osl/unx/uunxapi.cxx
+sal/osl/unx/uunxapi.hxx
+sal/osl/w32/backtrace.cxx
+sal/osl/w32/conditn.cxx
+sal/osl/w32/dllentry.cxx
+sal/osl/w32/file.cxx
+sal/osl/w32/file_dirvol.cxx
+sal/osl/w32/file_error.cxx
+sal/osl/w32/file_url.cxx
+sal/osl/w32/file_url.hxx
+sal/osl/w32/memory.cxx
+sal/osl/w32/module.cxx
+sal/osl/w32/nlsupport.cxx
+sal/osl/w32/path_helper.cxx
+sal/osl/w32/path_helper.hxx
+sal/osl/w32/pipe.cxx
+sal/osl/w32/process.cxx
+sal/osl/w32/procimpl.cxx
+sal/osl/w32/profile.cxx
+sal/osl/w32/salinit.cxx
+sal/osl/w32/security.cxx
+sal/osl/w32/socket.cxx
+sal/osl/w32/sockimpl.hxx
+sal/osl/w32/tempfile.cxx
+sal/osl/w32/thread.cxx
+sal/osl/w32/time.cxx
+sal/qa/ByteSequence/ByteSequence.cxx
+sal/qa/OStringBuffer/rtl_OStringBuffer.cxx
+sal/qa/OStringBuffer/rtl_String_Const.h
+sal/qa/OStringBuffer/rtl_String_Utils_Const.h
+sal/qa/inc/valueequal.hxx
+sal/qa/osl/condition/osl_Condition.cxx
+sal/qa/osl/file/osl_File.cxx
+sal/qa/osl/file/osl_File_Const.h
+sal/qa/osl/file/osl_old_test_file.cxx
+sal/qa/osl/file/test_cpy_wrt_file.cxx
+sal/qa/osl/getsystempathfromfileurl/test-getsystempathfromfileurl.cxx
+sal/qa/osl/module/osl_Module.cxx
+sal/qa/osl/module/osl_Module_Const.h
+sal/qa/osl/mutex/osl_Mutex.cxx
+sal/qa/osl/pipe/osl_Pipe.cxx
+sal/qa/osl/process/osl_Thread.cxx
+sal/qa/osl/process/osl_process.cxx
+sal/qa/osl/process/osl_process_child.cxx
+sal/qa/osl/profile/osl_old_testprofile.cxx
+sal/qa/osl/security/TODO.h
+sal/qa/osl/security/osl_Security.cxx
+sal/qa/osl/setthreadname/test-setthreadname.cxx
+sal/qa/osl/thread/test_thread.cxx
+sal/qa/rtl/alloc/rtl_alloc.cxx
+sal/qa/rtl/bootstrap/expand.cxx
+sal/qa/rtl/cipher/rtl_cipher.cxx
+sal/qa/rtl/crc32/rtl_crc32.cxx
+sal/qa/rtl/digest/rtl_digest.cxx
+sal/qa/rtl/doublelock/rtl_doublelocking.cxx
+sal/qa/rtl/locale/rtl_locale.cxx
+sal/qa/rtl/math/test-rtl-math.cxx
+sal/qa/rtl/ostring/rtl_OString2.cxx
+sal/qa/rtl/ostring/rtl_str.cxx
+sal/qa/rtl/ostring/rtl_string.cxx
+sal/qa/rtl/oustring/rtl_OUString2.cxx
+sal/qa/rtl/oustring/rtl_ustr.cxx
+sal/qa/rtl/oustringbuffer/test_oustringbuffer_appendchar.cxx
+sal/qa/rtl/oustringbuffer/test_oustringbuffer_appenduninitialized.cxx
+sal/qa/rtl/oustringbuffer/test_oustringbuffer_tostring.cxx
+sal/qa/rtl/oustringbuffer/test_oustringbuffer_utf32.cxx
+sal/qa/rtl/process/child_process.cxx
+sal/qa/rtl/process/rtl_Process.cxx
+sal/qa/rtl/random/rtl_random.cxx
+sal/qa/rtl/ref/rtl_ref.cxx
+sal/qa/rtl/strings/test_ostring.cxx
+sal/qa/rtl/strings/test_ostring_concat.cxx
+sal/qa/rtl/strings/test_ostring_stringliterals.cxx
+sal/qa/rtl/strings/test_oustring_compare.cxx
+sal/qa/rtl/strings/test_oustring_concat.cxx
+sal/qa/rtl/strings/test_oustring_convert.cxx
+sal/qa/rtl/strings/test_oustring_endswith.cxx
+sal/qa/rtl/strings/test_oustring_startswith.cxx
+sal/qa/rtl/strings/test_oustring_stringliterals.cxx
+sal/qa/rtl/strings/test_strings_replace.cxx
+sal/qa/rtl/strings/test_strings_toint.cxx
+sal/qa/rtl/strings/test_strings_valuex.cxx
+sal/qa/rtl/textenc/rtl_tencinfo.cxx
+sal/qa/rtl/textenc/rtl_textcvt.cxx
+sal/qa/rtl/uri/rtl_Uri.cxx
+sal/qa/rtl/uri/rtl_testuri.cxx
+sal/qa/rtl/uuid/rtl_Uuid.cxx
+sal/qa/sal/test_types.cxx
+sal/qa/systools/test_comtools.cxx
+sal/rtl/alloc_arena.cxx
+sal/rtl/alloc_arena.hxx
+sal/rtl/alloc_cache.cxx
+sal/rtl/alloc_cache.hxx
+sal/rtl/alloc_fini.cxx
+sal/rtl/alloc_global.cxx
+sal/rtl/alloc_impl.hxx
+sal/rtl/bootstrap.cxx
+sal/rtl/byteseq.cxx
+sal/rtl/cipher.cxx
+sal/rtl/cmdargs.cxx
+sal/rtl/crc.cxx
+sal/rtl/digest.cxx
+sal/rtl/hash.cxx
+sal/rtl/hash.hxx
+sal/rtl/locale.cxx
+sal/rtl/math.cxx
+sal/rtl/random.cxx
+sal/rtl/rtl_process.cxx
+sal/rtl/strbuf.cxx
+sal/rtl/strimp.cxx
+sal/rtl/strimp.hxx
+sal/rtl/string.cxx
+sal/rtl/strtmpl.hxx
+sal/rtl/uri.cxx
+sal/rtl/ustrbuf.cxx
+sal/rtl/ustring.cxx
+sal/rtl/uuid.cxx
+sal/test/testbootstrap.cxx
+sal/textenc/convertbig5hkscs.cxx
+sal/textenc/convertbig5hkscs.hxx
+sal/textenc/converter.cxx
+sal/textenc/converter.hxx
+sal/textenc/converteuctw.cxx
+sal/textenc/converteuctw.hxx
+sal/textenc/convertgb18030.cxx
+sal/textenc/convertgb18030.hxx
+sal/textenc/convertisciidevangari.cxx
+sal/textenc/convertisciidevangari.hxx
+sal/textenc/convertiso2022cn.cxx
+sal/textenc/convertiso2022cn.hxx
+sal/textenc/convertiso2022jp.cxx
+sal/textenc/convertiso2022jp.hxx
+sal/textenc/convertiso2022kr.cxx
+sal/textenc/convertiso2022kr.hxx
+sal/textenc/convertsimple.cxx
+sal/textenc/convertsimple.hxx
+sal/textenc/convertsinglebytetobmpunicode.cxx
+sal/textenc/convertsinglebytetobmpunicode.hxx
+sal/textenc/handleundefinedunicodetotextchar.cxx
+sal/textenc/handleundefinedunicodetotextchar.hxx
+sal/textenc/tables.cxx
+sal/textenc/tcvtbyte.cxx
+sal/textenc/tcvtbyte.hxx
+sal/textenc/tcvtmb.cxx
+sal/textenc/tcvtutf7.cxx
+sal/textenc/tcvtutf8.cxx
+sal/textenc/tcvtutf8.hxx
+sal/textenc/tenchelp.hxx
+sal/textenc/tencinfo.cxx
+sal/textenc/textcvt.cxx
+sal/textenc/textenc.cxx
+salhelper/qa/test_api.cxx
+salhelper/source/condition.cxx
+salhelper/source/dynload.cxx
+salhelper/source/simplereferenceobject.cxx
+salhelper/source/thread.cxx
+salhelper/source/timer.cxx
+salhelper/test/Symbols/loader.cxx
+salhelper/test/Symbols/samplelib.cxx
+salhelper/test/dynamicloader/loader.cxx
+salhelper/test/dynamicloader/samplelib.cxx
+salhelper/test/rtti/samplelibrtti.cxx
+sax/inc/xml2utf.hxx
+sax/qa/cppunit/attributes.cxx
+sax/qa/cppunit/parser.cxx
+sax/qa/cppunit/test_converter.cxx
+sax/qa/cppunit/xmlimport.cxx
+sax/source/expatwrap/sax_expat.cxx
+sax/source/expatwrap/xml2utf.cxx
+sax/source/fastparser/fastparser.cxx
+sax/source/fastparser/legacyfastparser.cxx
+sax/source/tools/CachedOutputStream.hxx
+sax/source/tools/converter.cxx
+sax/source/tools/fastattribs.cxx
+sax/source/tools/fastserializer.cxx
+sax/source/tools/fastserializer.hxx
+sax/source/tools/fshelper.cxx
+sax/test/sax/factory.hxx
+sax/test/sax/testsax.cxx
+sax/test/sax/testwriter.cxx
+sax/test/saxdemo.cxx
+sax/test/testcomponent.cxx
+sc/inc/ChartTools.hxx
+sc/inc/NumberFormatControl.hxx
+sc/inc/PivotTableDataProvider.hxx
+sc/inc/PivotTableDataSequence.hxx
+sc/inc/PivotTableDataSource.hxx
+sc/inc/TablePivotChart.hxx
+sc/inc/TablePivotCharts.hxx
+sc/inc/ViewSettingsSequenceDefines.hxx
+sc/inc/addincfg.hxx
+sc/inc/addincol.hxx
+sc/inc/address.hxx
+sc/inc/addruno.hxx
+sc/inc/afmtuno.hxx
+sc/inc/appluno.hxx
+sc/inc/appoptio.hxx
+sc/inc/arealink.hxx
+sc/inc/attarray.hxx
+sc/inc/attrib.hxx
+sc/inc/autoform.hxx
+sc/inc/autonamecache.hxx
+sc/inc/bigrange.hxx
+sc/inc/brdcst.hxx
+sc/inc/calcmacros.hxx
+sc/inc/callform.hxx
+sc/inc/cellform.hxx
+sc/inc/cellsuno.hxx
+sc/inc/cellvalue.hxx
+sc/inc/chart2uno.hxx
+sc/inc/charthelper.hxx
+sc/inc/chartlis.hxx
+sc/inc/chartlock.hxx
+sc/inc/chartpos.hxx
+sc/inc/chartuno.hxx
+sc/inc/chgtrack.hxx
+sc/inc/chgviset.hxx
+sc/inc/clipcontext.hxx
+sc/inc/clipparam.hxx
+sc/inc/colcontainer.hxx
+sc/inc/colorscale.hxx
+sc/inc/column.hxx
+sc/inc/columnspanset.hxx
+sc/inc/compare.hxx
+sc/inc/compiler.hxx
+sc/inc/compressedarray.hxx
+sc/inc/conditio.hxx
+sc/inc/confuno.hxx
+sc/inc/consoli.hxx
+sc/inc/convuno.hxx
+sc/inc/cursuno.hxx
+sc/inc/dapiuno.hxx
+sc/inc/datauno.hxx
+sc/inc/dbdata.hxx
+sc/inc/dbdocutl.hxx
+sc/inc/defaultsoptions.hxx
+sc/inc/defltuno.hxx
+sc/inc/detdata.hxx
+sc/inc/detfunc.hxx
+sc/inc/dispuno.hxx
+sc/inc/dociter.hxx
+sc/inc/docoptio.hxx
+sc/inc/docparam.hxx
+sc/inc/docpool.hxx
+sc/inc/document.hxx
+sc/inc/documentimport.hxx
+sc/inc/documentlinkmgr.hxx
+sc/inc/docuno.hxx
+sc/inc/dpcache.hxx
+sc/inc/dpdimsave.hxx
+sc/inc/dpglobal.hxx
+sc/inc/dpgroup.hxx
+sc/inc/dpitemdata.hxx
+sc/inc/dpnumgroupinfo.hxx
+sc/inc/dpobject.hxx
+sc/inc/dpoutput.hxx
+sc/inc/dpoutputgeometry.hxx
+sc/inc/dpsave.hxx
+sc/inc/dpsdbtab.hxx
+sc/inc/dpshttab.hxx
+sc/inc/dptabdat.hxx
+sc/inc/dptabres.hxx
+sc/inc/dptabsrc.hxx
+sc/inc/dputil.hxx
+sc/inc/dragdata.hxx
+sc/inc/drdefuno.hxx
+sc/inc/drwlayer.hxx
+sc/inc/editdataarray.hxx
+sc/inc/editsrc.hxx
+sc/inc/editutil.hxx
+sc/inc/eventuno.hxx
+sc/inc/externalrefmgr.hxx
+sc/inc/fielduno.hxx
+sc/inc/fillinfo.hxx
+sc/inc/filter.hxx
+sc/inc/filterentries.hxx
+sc/inc/filtopt.hxx
+sc/inc/filtuno.hxx
+sc/inc/fmtuno.hxx
+sc/inc/fonthelper.hxx
+sc/inc/forbiuno.hxx
+sc/inc/formulacell.hxx
+sc/inc/formulagroup.hxx
+sc/inc/formulalogger.hxx
+sc/inc/formulaopt.hxx
+sc/inc/formulaparserpool.hxx
+sc/inc/formularesult.hxx
+sc/inc/fstalgorithm.hxx
+sc/inc/funcdesc.hxx
+sc/inc/funcuno.hxx
+sc/inc/global.hxx
+sc/inc/grouparealistener.hxx
+sc/inc/helpids.h
+sc/inc/hints.hxx
+sc/inc/importfilterdata.hxx
+sc/inc/inputopt.hxx
+sc/inc/linkuno.hxx
+sc/inc/listenercalls.hxx
+sc/inc/listenerqueryids.hxx
+sc/inc/lookupcache.hxx
+sc/inc/markarr.hxx
+sc/inc/markdata.hxx
+sc/inc/markmulti.hxx
+sc/inc/math.hxx
+sc/inc/matrixoperators.hxx
+sc/inc/miscuno.hxx
+sc/inc/mtvcellfunc.hxx
+sc/inc/mtvelements.hxx
+sc/inc/mtvfunctions.hxx
+sc/inc/nameuno.hxx
+sc/inc/navicfg.hxx
+sc/inc/notesuno.hxx
+sc/inc/olinetab.hxx
+sc/inc/optuno.hxx
+sc/inc/optutil.hxx
+sc/inc/orcusfilters.hxx
+sc/inc/orcusxml.hxx
+sc/inc/pagepar.hxx
+sc/inc/paramisc.hxx
+sc/inc/patattr.hxx
+sc/inc/pivot.hxx
+sc/inc/postit.hxx
+sc/inc/printopt.hxx
+sc/inc/prnsave.hxx
+sc/inc/progress.hxx
+sc/inc/queryentry.hxx
+sc/inc/queryiter.hxx
+sc/inc/queryparam.hxx
+sc/inc/rangelst.hxx
+sc/inc/rangenam.hxx
+sc/inc/rangeseq.hxx
+sc/inc/rangeutl.hxx
+sc/inc/rechead.hxx
+sc/inc/recursionhelper.hxx
+sc/inc/refdata.hxx
+sc/inc/refhint.hxx
+sc/inc/refreshtimer.hxx
+sc/inc/reftokenhelper.hxx
+sc/inc/reordermap.hxx
+sc/inc/rowheightcontext.hxx
+sc/inc/scabstdlg.hxx
+sc/inc/scdll.hxx
+sc/inc/scerrors.hxx
+sc/inc/scextopt.hxx
+sc/inc/scfuncs.hxx
+sc/inc/scitems.hxx
+sc/inc/scmatrix.hxx
+sc/inc/scmod.hxx
+sc/inc/servuno.hxx
+sc/inc/shapeuno.hxx
+sc/inc/sharedformula.hxx
+sc/inc/sheetdata.hxx
+sc/inc/sheetevents.hxx
+sc/inc/shellids.hxx
+sc/inc/simpleformulacalc.hxx
+sc/inc/sortparam.hxx
+sc/inc/srchuno.hxx
+sc/inc/stlalgorithm.hxx
+sc/inc/stlpool.hxx
+sc/inc/stlsheet.hxx
+sc/inc/strings.hxx
+sc/inc/stringutil.hxx
+sc/inc/styleuno.hxx
+sc/inc/subtotal.hxx
+sc/inc/subtotalparam.hxx
+sc/inc/table.hxx
+sc/inc/tablink.hxx
+sc/inc/tabopparams.hxx
+sc/inc/tabprotection.hxx
+sc/inc/targuno.hxx
+sc/inc/textuno.hxx
+sc/inc/token.hxx
+sc/inc/tokenarray.hxx
+sc/inc/tokenuno.hxx
+sc/inc/typedstrdata.hxx
+sc/inc/types.hxx
+sc/inc/unonames.hxx
+sc/inc/unoreflist.hxx
+sc/inc/unowids.hxx
+sc/inc/userdat.hxx
+sc/inc/validat.hxx
+sc/inc/viewopti.hxx
+sc/inc/viewuno.hxx
+sc/inc/waitoff.hxx
+sc/inc/xmlwrap.hxx
+sc/qa/extras/check_data_pilot_table.cxx
+sc/qa/extras/check_xcell_ranges_query.cxx
+sc/qa/extras/htmlexporttest.cxx
+sc/qa/extras/macros-test.cxx
+sc/qa/extras/new_cond_format.cxx
+sc/qa/extras/regression-test.cxx
+sc/qa/extras/scannotationsobj.cxx
+sc/qa/extras/sccellcursorobj.cxx
+sc/qa/extras/scdatabaserangeobj.cxx
+sc/qa/extras/scdatapilottableobj.cxx
+sc/qa/extras/scnamedrangeobj.cxx
+sc/qa/extras/sctablesheetobj.cxx
+sc/qa/perf/scperfobj.cxx
+sc/qa/unit/bugfix-test.cxx
+sc/qa/unit/copy_paste_test.cxx
+sc/qa/unit/datatransformation_test.cxx
+sc/qa/unit/filters-test.cxx
+sc/qa/unit/functions_addin.cxx
+sc/qa/unit/functions_array.cxx
+sc/qa/unit/functions_database.cxx
+sc/qa/unit/functions_datetime.cxx
+sc/qa/unit/functions_financial.cxx
+sc/qa/unit/functions_information.cxx
+sc/qa/unit/functions_logical.cxx
+sc/qa/unit/functions_mathematical.cxx
+sc/qa/unit/functions_spreadsheet.cxx
+sc/qa/unit/functions_statistical.cxx
+sc/qa/unit/functions_test.cxx
+sc/qa/unit/functions_test.hxx
+sc/qa/unit/functions_test_old.cxx
+sc/qa/unit/functions_text.cxx
+sc/qa/unit/helper/csv_handler.hxx
+sc/qa/unit/helper/qahelper.cxx
+sc/qa/unit/helper/qahelper.hxx
+sc/qa/unit/helper/shared_test_impl.hxx
+sc/qa/unit/helper/sorthelper.hxx
+sc/qa/unit/helper/xpath.cxx
+sc/qa/unit/helper/xpath.hxx
+sc/qa/unit/mark_test.cxx
+sc/qa/unit/opencl-test.cxx
+sc/qa/unit/parallelism.cxx
+sc/qa/unit/range.cxx
+sc/qa/unit/rangelst_test.cxx
+sc/qa/unit/screenshots/screenshots.cxx
+sc/qa/unit/subsequent_filters_test.cxx
+sc/qa/unit/tiledrendering/tiledrendering.cxx
+sc/qa/unit/ucalc.cxx
+sc/qa/unit/ucalc_column.cxx
+sc/qa/unit/ucalc_condformat.cxx
+sc/qa/unit/ucalc_formula.cxx
+sc/qa/unit/ucalc_pivottable.cxx
+sc/qa/unit/ucalc_sharedformula.cxx
+sc/qa/unit/ucalc_sort.cxx
+sc/source/core/data/attarray.cxx
+sc/source/core/data/attrib.cxx
+sc/source/core/data/autonamecache.cxx
+sc/source/core/data/bcaslot.cxx
+sc/source/core/data/bigrange.cxx
+sc/source/core/data/celltextattr.cxx
+sc/source/core/data/cellvalue.cxx
+sc/source/core/data/cellvalues.cxx
+sc/source/core/data/clipcontext.cxx
+sc/source/core/data/clipparam.cxx
+sc/source/core/data/colcontainer.cxx
+sc/source/core/data/colorscale.cxx
+sc/source/core/data/column.cxx
+sc/source/core/data/column2.cxx
+sc/source/core/data/column3.cxx
+sc/source/core/data/column4.cxx
+sc/source/core/data/columniterator.cxx
+sc/source/core/data/columnset.cxx
+sc/source/core/data/columnspanset.cxx
+sc/source/core/data/compressedarray.cxx
+sc/source/core/data/conditio.cxx
+sc/source/core/data/dbdocutl.cxx
+sc/source/core/data/dociter.cxx
+sc/source/core/data/docparam.cxx
+sc/source/core/data/docpool.cxx
+sc/source/core/data/documen2.cxx
+sc/source/core/data/documen3.cxx
+sc/source/core/data/documen4.cxx
+sc/source/core/data/documen5.cxx
+sc/source/core/data/documen6.cxx
+sc/source/core/data/documen7.cxx
+sc/source/core/data/documen8.cxx
+sc/source/core/data/documen9.cxx
+sc/source/core/data/document.cxx
+sc/source/core/data/document10.cxx
+sc/source/core/data/documentimport.cxx
+sc/source/core/data/documentstreamaccess.cxx
+sc/source/core/data/dpcache.cxx
+sc/source/core/data/dpdimsave.cxx
+sc/source/core/data/dpfilteredcache.cxx
+sc/source/core/data/dpglobal.cxx
+sc/source/core/data/dpgroup.cxx
+sc/source/core/data/dpitemdata.cxx
+sc/source/core/data/dpnumgroupinfo.cxx
+sc/source/core/data/dpobject.cxx
+sc/source/core/data/dpoutput.cxx
+sc/source/core/data/dpoutputgeometry.cxx
+sc/source/core/data/dpresfilter.cxx
+sc/source/core/data/dpsave.cxx
+sc/source/core/data/dpsdbtab.cxx
+sc/source/core/data/dpshttab.cxx
+sc/source/core/data/dptabdat.cxx
+sc/source/core/data/dptabres.cxx
+sc/source/core/data/dptabsrc.cxx
+sc/source/core/data/dputil.cxx
+sc/source/core/data/drawpage.cxx
+sc/source/core/data/drwlayer.cxx
+sc/source/core/data/edittextiterator.cxx
+sc/source/core/data/fillinfo.cxx
+sc/source/core/data/formulacell.cxx
+sc/source/core/data/formulaiter.cxx
+sc/source/core/data/funcdesc.cxx
+sc/source/core/data/global.cxx
+sc/source/core/data/global2.cxx
+sc/source/core/data/globalx.cxx
+sc/source/core/data/grouptokenconverter.cxx
+sc/source/core/data/listenercontext.cxx
+sc/source/core/data/markarr.cxx
+sc/source/core/data/markdata.cxx
+sc/source/core/data/markmulti.cxx
+sc/source/core/data/mtvcellfunc.cxx
+sc/source/core/data/mtvelements.cxx
+sc/source/core/data/olinetab.cxx
+sc/source/core/data/pagepar.cxx
+sc/source/core/data/patattr.cxx
+sc/source/core/data/pivot2.cxx
+sc/source/core/data/poolhelp.cxx
+sc/source/core/data/postit.cxx
+sc/source/core/data/queryiter.cxx
+sc/source/core/data/refupdatecontext.cxx
+sc/source/core/data/rowheightcontext.cxx
+sc/source/core/data/segmenttree.cxx
+sc/source/core/data/sheetevents.cxx
+sc/source/core/data/simpleformulacalc.cxx
+sc/source/core/data/sortparam.cxx
+sc/source/core/data/stlpool.cxx
+sc/source/core/data/stlsheet.cxx
+sc/source/core/data/subtotalparam.cxx
+sc/source/core/data/tabbgcolor.cxx
+sc/source/core/data/table1.cxx
+sc/source/core/data/table2.cxx
+sc/source/core/data/table3.cxx
+sc/source/core/data/table4.cxx
+sc/source/core/data/table6.cxx
+sc/source/core/data/table7.cxx
+sc/source/core/data/tabprotection.cxx
+sc/source/core/data/types.cxx
+sc/source/core/data/userdat.cxx
+sc/source/core/data/validat.cxx
+sc/source/core/inc/addinhelpid.hxx
+sc/source/core/inc/addinlis.hxx
+sc/source/core/inc/adiasync.hxx
+sc/source/core/inc/bcaslot.hxx
+sc/source/core/inc/ddelink.hxx
+sc/source/core/inc/formulagroupcl.hxx
+sc/source/core/inc/grouptokenconverter.hxx
+sc/source/core/inc/interpre.hxx
+sc/source/core/inc/jumpmatrix.hxx
+sc/source/core/inc/parclass.hxx
+sc/source/core/inc/poolhelp.hxx
+sc/source/core/inc/refupdat.hxx
+sc/source/core/opencl/formulagroupcl.cxx
+sc/source/core/opencl/op_addin.cxx
+sc/source/core/opencl/op_addin.hxx
+sc/source/core/opencl/op_array.cxx
+sc/source/core/opencl/op_array.hxx
+sc/source/core/opencl/op_database.cxx
+sc/source/core/opencl/op_database.hxx
+sc/source/core/opencl/op_financial.cxx
+sc/source/core/opencl/op_financial.hxx
+sc/source/core/opencl/op_logical.cxx
+sc/source/core/opencl/op_logical.hxx
+sc/source/core/opencl/op_math.cxx
+sc/source/core/opencl/op_math.hxx
+sc/source/core/opencl/op_spreadsheet.cxx
+sc/source/core/opencl/op_spreadsheet.hxx
+sc/source/core/opencl/op_statistical.cxx
+sc/source/core/opencl/op_statistical.hxx
+sc/source/core/opencl/opbase.cxx
+sc/source/core/opencl/opbase.hxx
+sc/source/core/opencl/opinlinefun_finacial.cxx
+sc/source/core/opencl/opinlinefun_math.hxx
+sc/source/core/opencl/opinlinefun_statistical.cxx
+sc/source/core/tool/addincol.cxx
+sc/source/core/tool/addinhelpid.cxx
+sc/source/core/tool/addinlis.cxx
+sc/source/core/tool/address.cxx
+sc/source/core/tool/adiasync.cxx
+sc/source/core/tool/appoptio.cxx
+sc/source/core/tool/autoform.cxx
+sc/source/core/tool/brdcst.cxx
+sc/source/core/tool/bulkdatahint.cxx
+sc/source/core/tool/calcconfig.cxx
+sc/source/core/tool/callform.cxx
+sc/source/core/tool/cellform.cxx
+sc/source/core/tool/cellkeytranslator.cxx
+sc/source/core/tool/cellkeywords.inl
+sc/source/core/tool/chartarr.cxx
+sc/source/core/tool/charthelper.cxx
+sc/source/core/tool/chartlis.cxx
+sc/source/core/tool/chartlock.cxx
+sc/source/core/tool/chartpos.cxx
+sc/source/core/tool/chgtrack.cxx
+sc/source/core/tool/chgviset.cxx
+sc/source/core/tool/compare.cxx
+sc/source/core/tool/compiler.cxx
+sc/source/core/tool/consoli.cxx
+sc/source/core/tool/dbdata.cxx
+sc/source/core/tool/ddelink.cxx
+sc/source/core/tool/defaultsoptions.cxx
+sc/source/core/tool/detdata.cxx
+sc/source/core/tool/detfunc.cxx
+sc/source/core/tool/docoptio.cxx
+sc/source/core/tool/doubleref.cxx
+sc/source/core/tool/editdataarray.cxx
+sc/source/core/tool/editutil.cxx
+sc/source/core/tool/filtopt.cxx
+sc/source/core/tool/formulagroup.cxx
+sc/source/core/tool/formulalogger.cxx
+sc/source/core/tool/formulaopt.cxx
+sc/source/core/tool/formulaparserpool.cxx
+sc/source/core/tool/formularesult.cxx
+sc/source/core/tool/grouparealistener.cxx
+sc/source/core/tool/hints.cxx
+sc/source/core/tool/inputopt.cxx
+sc/source/core/tool/interpr1.cxx
+sc/source/core/tool/interpr2.cxx
+sc/source/core/tool/interpr3.cxx
+sc/source/core/tool/interpr4.cxx
+sc/source/core/tool/interpr5.cxx
+sc/source/core/tool/interpr6.cxx
+sc/source/core/tool/interpr7.cxx
+sc/source/core/tool/interpr8.cxx
+sc/source/core/tool/jumpmatrix.cxx
+sc/source/core/tool/listenerquery.cxx
+sc/source/core/tool/lookupcache.cxx
+sc/source/core/tool/navicfg.cxx
+sc/source/core/tool/numformat.cxx
+sc/source/core/tool/odffmap.cxx
+sc/source/core/tool/optutil.cxx
+sc/source/core/tool/orcusxml.cxx
+sc/source/core/tool/parclass.cxx
+sc/source/core/tool/printopt.cxx
+sc/source/core/tool/prnsave.cxx
+sc/source/core/tool/progress.cxx
+sc/source/core/tool/queryentry.cxx
+sc/source/core/tool/queryparam.cxx
+sc/source/core/tool/rangelst.cxx
+sc/source/core/tool/rangenam.cxx
+sc/source/core/tool/rangeseq.cxx
+sc/source/core/tool/rangeutl.cxx
+sc/source/core/tool/rechead.cxx
+sc/source/core/tool/recursionhelper.cxx
+sc/source/core/tool/refdata.cxx
+sc/source/core/tool/reffind.cxx
+sc/source/core/tool/refhint.cxx
+sc/source/core/tool/refreshtimer.cxx
+sc/source/core/tool/reftokenhelper.cxx
+sc/source/core/tool/refupdat.cxx
+sc/source/core/tool/scmatrix.cxx
+sc/source/core/tool/scopetools.cxx
+sc/source/core/tool/sharedformula.cxx
+sc/source/core/tool/stringutil.cxx
+sc/source/core/tool/stylehelper.cxx
+sc/source/core/tool/token.cxx
+sc/source/core/tool/tokenstringcontext.cxx
+sc/source/core/tool/typedstrdata.cxx
+sc/source/core/tool/unitconv.cxx
+sc/source/core/tool/userlist.cxx
+sc/source/core/tool/viewopti.cxx
+sc/source/core/tool/zforauto.cxx
+sc/source/filter/dif/difexp.cxx
+sc/source/filter/dif/difimp.cxx
+sc/source/filter/excel/colrowst.cxx
+sc/source/filter/excel/excdoc.cxx
+sc/source/filter/excel/excel.cxx
+sc/source/filter/excel/excform.cxx
+sc/source/filter/excel/excform8.cxx
+sc/source/filter/excel/excimp8.cxx
+sc/source/filter/excel/excrecds.cxx
+sc/source/filter/excel/exctools.cxx
+sc/source/filter/excel/expop2.cxx
+sc/source/filter/excel/fontbuff.cxx
+sc/source/filter/excel/frmbase.cxx
+sc/source/filter/excel/impop.cxx
+sc/source/filter/excel/namebuff.cxx
+sc/source/filter/excel/read.cxx
+sc/source/filter/excel/tokstack.cxx
+sc/source/filter/excel/xechart.cxx
+sc/source/filter/excel/xecontent.cxx
+sc/source/filter/excel/xedbdata.cxx
+sc/source/filter/excel/xeescher.cxx
+sc/source/filter/excel/xeextlst.cxx
+sc/source/filter/excel/xeformula.cxx
+sc/source/filter/excel/xehelper.cxx
+sc/source/filter/excel/xelink.cxx
+sc/source/filter/excel/xename.cxx
+sc/source/filter/excel/xepage.cxx
+sc/source/filter/excel/xepivot.cxx
+sc/source/filter/excel/xepivotxml.cxx
+sc/source/filter/excel/xerecord.cxx
+sc/source/filter/excel/xeroot.cxx
+sc/source/filter/excel/xestream.cxx
+sc/source/filter/excel/xestring.cxx
+sc/source/filter/excel/xestyle.cxx
+sc/source/filter/excel/xetable.cxx
+sc/source/filter/excel/xeview.cxx
+sc/source/filter/excel/xichart.cxx
+sc/source/filter/excel/xicontent.cxx
+sc/source/filter/excel/xiescher.cxx
+sc/source/filter/excel/xiformula.cxx
+sc/source/filter/excel/xihelper.cxx
+sc/source/filter/excel/xilink.cxx
+sc/source/filter/excel/xiname.cxx
+sc/source/filter/excel/xipage.cxx
+sc/source/filter/excel/xipivot.cxx
+sc/source/filter/excel/xiroot.cxx
+sc/source/filter/excel/xistream.cxx
+sc/source/filter/excel/xistring.cxx
+sc/source/filter/excel/xistyle.cxx
+sc/source/filter/excel/xiview.cxx
+sc/source/filter/excel/xladdress.cxx
+sc/source/filter/excel/xlchart.cxx
+sc/source/filter/excel/xlescher.cxx
+sc/source/filter/excel/xlformula.cxx
+sc/source/filter/excel/xlpage.cxx
+sc/source/filter/excel/xlpivot.cxx
+sc/source/filter/excel/xlroot.cxx
+sc/source/filter/excel/xlstyle.cxx
+sc/source/filter/excel/xltoolbar.cxx
+sc/source/filter/excel/xltoolbar.hxx
+sc/source/filter/excel/xltools.cxx
+sc/source/filter/excel/xlview.cxx
+sc/source/filter/ftools/fapihelper.cxx
+sc/source/filter/ftools/fprogressbar.cxx
+sc/source/filter/ftools/ftools.cxx
+sc/source/filter/ftools/sharedformulagroups.cxx
+sc/source/filter/html/htmlexp.cxx
+sc/source/filter/html/htmlexp2.cxx
+sc/source/filter/html/htmlimp.cxx
+sc/source/filter/html/htmlpars.cxx
+sc/source/filter/importfilterdata.cxx
+sc/source/filter/inc/XclExpChangeTrack.hxx
+sc/source/filter/inc/XclImpChangeTrack.hxx
+sc/source/filter/inc/addressconverter.hxx
+sc/source/filter/inc/autofilterbuffer.hxx
+sc/source/filter/inc/autofiltercontext.hxx
+sc/source/filter/inc/biffhelper.hxx
+sc/source/filter/inc/chartsheetfragment.hxx
+sc/source/filter/inc/colrowst.hxx
+sc/source/filter/inc/commentsbuffer.hxx
+sc/source/filter/inc/commentsfragment.hxx
+sc/source/filter/inc/condformatbuffer.hxx
+sc/source/filter/inc/condformatcontext.hxx
+sc/source/filter/inc/connectionsbuffer.hxx
+sc/source/filter/inc/connectionsfragment.hxx
+sc/source/filter/inc/decl.h
+sc/source/filter/inc/defnamesbuffer.hxx
+sc/source/filter/inc/dif.hxx
+sc/source/filter/inc/drawingbase.hxx
+sc/source/filter/inc/drawingfragment.hxx
+sc/source/filter/inc/eeimport.hxx
+sc/source/filter/inc/eeparser.hxx
+sc/source/filter/inc/excdefs.hxx
+sc/source/filter/inc/excdoc.hxx
+sc/source/filter/inc/excelchartconverter.hxx
+sc/source/filter/inc/excelfilter.hxx
+sc/source/filter/inc/excelhandlers.hxx
+sc/source/filter/inc/excelvbaproject.hxx
+sc/source/filter/inc/excform.hxx
+sc/source/filter/inc/excimp8.hxx
+sc/source/filter/inc/excrecds.hxx
+sc/source/filter/inc/excscen.hxx
+sc/source/filter/inc/exp_op.hxx
+sc/source/filter/inc/expbase.hxx
+sc/source/filter/inc/externallinkbuffer.hxx
+sc/source/filter/inc/externallinkfragment.hxx
+sc/source/filter/inc/extlstcontext.hxx
+sc/source/filter/inc/fapihelper.hxx
+sc/source/filter/inc/flttypes.hxx
+sc/source/filter/inc/formel.hxx
+sc/source/filter/inc/formulabase.hxx
+sc/source/filter/inc/formulabuffer.hxx
+sc/source/filter/inc/formulaparser.hxx
+sc/source/filter/inc/fprogressbar.hxx
+sc/source/filter/inc/ftools.hxx
+sc/source/filter/inc/htmlexp.hxx
+sc/source/filter/inc/htmlimp.hxx
+sc/source/filter/inc/htmlpars.hxx
+sc/source/filter/inc/imp_op.hxx
+sc/source/filter/inc/lotattr.hxx
+sc/source/filter/inc/lotfntbf.hxx
+sc/source/filter/inc/lotform.hxx
+sc/source/filter/inc/lotimpop.hxx
+sc/source/filter/inc/lotrange.hxx
+sc/source/filter/inc/namebuff.hxx
+sc/source/filter/inc/numberformatsbuffer.hxx
+sc/source/filter/inc/ooxformulaparser.hxx
+sc/source/filter/inc/op.h
+sc/source/filter/inc/orcusinterface.hxx
+sc/source/filter/inc/otlnbuff.hxx
+sc/source/filter/inc/pagesettings.hxx
+sc/source/filter/inc/pivotcachebuffer.hxx
+sc/source/filter/inc/pivotcachefragment.hxx
+sc/source/filter/inc/pivottablebuffer.hxx
+sc/source/filter/inc/pivottablefragment.hxx
+sc/source/filter/inc/qprostyle.hxx
+sc/source/filter/inc/querytablebuffer.hxx
+sc/source/filter/inc/querytablefragment.hxx
+sc/source/filter/inc/revisionfragment.hxx
+sc/source/filter/inc/richstring.hxx
+sc/source/filter/inc/richstringcontext.hxx
+sc/source/filter/inc/root.hxx
+sc/source/filter/inc/rtfexp.hxx
+sc/source/filter/inc/rtfparse.hxx
+sc/source/filter/inc/scenariobuffer.hxx
+sc/source/filter/inc/scenariocontext.hxx
+sc/source/filter/inc/scfobj.hxx
+sc/source/filter/inc/sharedstringsbuffer.hxx
+sc/source/filter/inc/sharedstringsfragment.hxx
+sc/source/filter/inc/sheetdatabuffer.hxx
+sc/source/filter/inc/sheetdatacontext.hxx
+sc/source/filter/inc/stylesbuffer.hxx
+sc/source/filter/inc/stylesfragment.hxx
+sc/source/filter/inc/tablebuffer.hxx
+sc/source/filter/inc/tablecolumnsbuffer.hxx
+sc/source/filter/inc/tablecolumnscontext.hxx
+sc/source/filter/inc/tablefragment.hxx
+sc/source/filter/inc/themebuffer.hxx
+sc/source/filter/inc/tokstack.hxx
+sc/source/filter/inc/tool.h
+sc/source/filter/inc/unitconverter.hxx
+sc/source/filter/inc/viewsettings.hxx
+sc/source/filter/inc/workbookfragment.hxx
+sc/source/filter/inc/workbookhelper.hxx
+sc/source/filter/inc/workbooksettings.hxx
+sc/source/filter/inc/worksheetbuffer.hxx
+sc/source/filter/inc/worksheetfragment.hxx
+sc/source/filter/inc/worksheethelper.hxx
+sc/source/filter/inc/worksheetsettings.hxx
+sc/source/filter/inc/xcl97esc.hxx
+sc/source/filter/inc/xcl97rec.hxx
+sc/source/filter/inc/xechart.hxx
+sc/source/filter/inc/xecontent.hxx
+sc/source/filter/inc/xedbdata.hxx
+sc/source/filter/inc/xeescher.hxx
+sc/source/filter/inc/xeextlst.hxx
+sc/source/filter/inc/xeformula.hxx
+sc/source/filter/inc/xehelper.hxx
+sc/source/filter/inc/xelink.hxx
+sc/source/filter/inc/xename.hxx
+sc/source/filter/inc/xepage.hxx
+sc/source/filter/inc/xepivot.hxx
+sc/source/filter/inc/xerecord.hxx
+sc/source/filter/inc/xeroot.hxx
+sc/source/filter/inc/xestream.hxx
+sc/source/filter/inc/xestring.hxx
+sc/source/filter/inc/xestyle.hxx
+sc/source/filter/inc/xetable.hxx
+sc/source/filter/inc/xeview.hxx
+sc/source/filter/inc/xichart.hxx
+sc/source/filter/inc/xicontent.hxx
+sc/source/filter/inc/xiescher.hxx
+sc/source/filter/inc/xiformula.hxx
+sc/source/filter/inc/xihelper.hxx
+sc/source/filter/inc/xilink.hxx
+sc/source/filter/inc/xiname.hxx
+sc/source/filter/inc/xipage.hxx
+sc/source/filter/inc/xipivot.hxx
+sc/source/filter/inc/xiroot.hxx
+sc/source/filter/inc/xistream.hxx
+sc/source/filter/inc/xistring.hxx
+sc/source/filter/inc/xistyle.hxx
+sc/source/filter/inc/xiview.hxx
+sc/source/filter/inc/xladdress.hxx
+sc/source/filter/inc/xlchart.hxx
+sc/source/filter/inc/xlconst.hxx
+sc/source/filter/inc/xlcontent.hxx
+sc/source/filter/inc/xlescher.hxx
+sc/source/filter/inc/xlformula.hxx
+sc/source/filter/inc/xllink.hxx
+sc/source/filter/inc/xlname.hxx
+sc/source/filter/inc/xlpage.hxx
+sc/source/filter/inc/xlpivot.hxx
+sc/source/filter/inc/xlroot.hxx
+sc/source/filter/inc/xlstream.hxx
+sc/source/filter/inc/xlstring.hxx
+sc/source/filter/inc/xlstyle.hxx
+sc/source/filter/inc/xltable.hxx
+sc/source/filter/inc/xltools.hxx
+sc/source/filter/inc/xltracer.hxx
+sc/source/filter/inc/xlview.hxx
+sc/source/filter/lotus/filter.cxx
+sc/source/filter/lotus/lotattr.cxx
+sc/source/filter/lotus/lotfilter.hxx
+sc/source/filter/lotus/lotform.cxx
+sc/source/filter/lotus/lotimpop.cxx
+sc/source/filter/lotus/lotread.cxx
+sc/source/filter/lotus/lotus.cxx
+sc/source/filter/lotus/op.cxx
+sc/source/filter/lotus/optab.cxx
+sc/source/filter/lotus/tool.cxx
+sc/source/filter/oox/addressconverter.cxx
+sc/source/filter/oox/autofilterbuffer.cxx
+sc/source/filter/oox/autofiltercontext.cxx
+sc/source/filter/oox/biffhelper.cxx
+sc/source/filter/oox/chartsheetfragment.cxx
+sc/source/filter/oox/commentsbuffer.cxx
+sc/source/filter/oox/commentsfragment.cxx
+sc/source/filter/oox/condformatbuffer.cxx
+sc/source/filter/oox/condformatcontext.cxx
+sc/source/filter/oox/connectionsbuffer.cxx
+sc/source/filter/oox/connectionsfragment.cxx
+sc/source/filter/oox/defnamesbuffer.cxx
+sc/source/filter/oox/drawingbase.cxx
+sc/source/filter/oox/drawingfragment.cxx
+sc/source/filter/oox/excelchartconverter.cxx
+sc/source/filter/oox/excelfilter.cxx
+sc/source/filter/oox/excelhandlers.cxx
+sc/source/filter/oox/excelvbaproject.cxx
+sc/source/filter/oox/externallinkbuffer.cxx
+sc/source/filter/oox/externallinkfragment.cxx
+sc/source/filter/oox/extlstcontext.cxx
+sc/source/filter/oox/formulabase.cxx
+sc/source/filter/oox/formulabuffer.cxx
+sc/source/filter/oox/formulaparser.cxx
+sc/source/filter/oox/numberformatsbuffer.cxx
+sc/source/filter/oox/ooxformulaparser.cxx
+sc/source/filter/oox/pagesettings.cxx
+sc/source/filter/oox/pivotcachebuffer.cxx
+sc/source/filter/oox/pivotcachefragment.cxx
+sc/source/filter/oox/pivottablebuffer.cxx
+sc/source/filter/oox/pivottablefragment.cxx
+sc/source/filter/oox/querytablebuffer.cxx
+sc/source/filter/oox/querytablefragment.cxx
+sc/source/filter/oox/revisionfragment.cxx
+sc/source/filter/oox/richstring.cxx
+sc/source/filter/oox/richstringcontext.cxx
+sc/source/filter/oox/scenariobuffer.cxx
+sc/source/filter/oox/scenariocontext.cxx
+sc/source/filter/oox/sharedstringsbuffer.cxx
+sc/source/filter/oox/sharedstringsfragment.cxx
+sc/source/filter/oox/sheetdatabuffer.cxx
+sc/source/filter/oox/sheetdatacontext.cxx
+sc/source/filter/oox/stylesbuffer.cxx
+sc/source/filter/oox/stylesfragment.cxx
+sc/source/filter/oox/tablebuffer.cxx
+sc/source/filter/oox/tablecolumnsbuffer.cxx
+sc/source/filter/oox/tablecolumnscontext.cxx
+sc/source/filter/oox/tablefragment.cxx
+sc/source/filter/oox/themebuffer.cxx
+sc/source/filter/oox/unitconverter.cxx
+sc/source/filter/oox/viewsettings.cxx
+sc/source/filter/oox/workbookfragment.cxx
+sc/source/filter/oox/workbookhelper.cxx
+sc/source/filter/oox/workbooksettings.cxx
+sc/source/filter/oox/worksheetbuffer.cxx
+sc/source/filter/oox/worksheetfragment.cxx
+sc/source/filter/oox/worksheethelper.cxx
+sc/source/filter/oox/worksheetsettings.cxx
+sc/source/filter/orcus/filterdetect.cxx
+sc/source/filter/orcus/interface.cxx
+sc/source/filter/orcus/xmlcontext.cxx
+sc/source/filter/qpro/qpro.cxx
+sc/source/filter/qpro/qproform.cxx
+sc/source/filter/qpro/qprostyle.cxx
+sc/source/filter/rtf/eeimpars.cxx
+sc/source/filter/rtf/expbase.cxx
+sc/source/filter/rtf/rtfexp.cxx
+sc/source/filter/rtf/rtfimp.cxx
+sc/source/filter/rtf/rtfparse.cxx
+sc/source/filter/xcl97/XclExpChangeTrack.cxx
+sc/source/filter/xcl97/XclImpChangeTrack.cxx
+sc/source/filter/xcl97/xcl97esc.cxx
+sc/source/filter/xcl97/xcl97rec.cxx
+sc/source/filter/xml/XMLCalculationSettingsContext.cxx
+sc/source/filter/xml/XMLCalculationSettingsContext.hxx
+sc/source/filter/xml/XMLCellRangeSourceContext.cxx
+sc/source/filter/xml/XMLCellRangeSourceContext.hxx
+sc/source/filter/xml/XMLChangeTrackingExportHelper.cxx
+sc/source/filter/xml/XMLChangeTrackingImportHelper.cxx
+sc/source/filter/xml/XMLChangeTrackingImportHelper.hxx
+sc/source/filter/xml/XMLCodeNameProvider.cxx
+sc/source/filter/xml/XMLCodeNameProvider.hxx
+sc/source/filter/xml/XMLColumnRowGroupExport.cxx
+sc/source/filter/xml/XMLColumnRowGroupExport.hxx
+sc/source/filter/xml/XMLConsolidationContext.cxx
+sc/source/filter/xml/XMLConsolidationContext.hxx
+sc/source/filter/xml/XMLConverter.cxx
+sc/source/filter/xml/XMLConverter.hxx
+sc/source/filter/xml/XMLDDELinksContext.cxx
+sc/source/filter/xml/XMLDDELinksContext.hxx
+sc/source/filter/xml/XMLDetectiveContext.cxx
+sc/source/filter/xml/XMLDetectiveContext.hxx
+sc/source/filter/xml/XMLEmptyContext.cxx
+sc/source/filter/xml/XMLExportDDELinks.cxx
+sc/source/filter/xml/XMLExportDDELinks.hxx
+sc/source/filter/xml/XMLExportDataPilot.cxx
+sc/source/filter/xml/XMLExportDataPilot.hxx
+sc/source/filter/xml/XMLExportDatabaseRanges.cxx
+sc/source/filter/xml/XMLExportIterator.cxx
+sc/source/filter/xml/XMLExportIterator.hxx
+sc/source/filter/xml/XMLExportSharedData.cxx
+sc/source/filter/xml/XMLExportSharedData.hxx
+sc/source/filter/xml/XMLStylesExportHelper.cxx
+sc/source/filter/xml/XMLStylesExportHelper.hxx
+sc/source/filter/xml/XMLStylesImportHelper.cxx
+sc/source/filter/xml/XMLStylesImportHelper.hxx
+sc/source/filter/xml/XMLTableHeaderFooterContext.cxx
+sc/source/filter/xml/XMLTableHeaderFooterContext.hxx
+sc/source/filter/xml/XMLTableMasterPageExport.cxx
+sc/source/filter/xml/XMLTableMasterPageExport.hxx
+sc/source/filter/xml/XMLTableShapeImportHelper.cxx
+sc/source/filter/xml/XMLTableShapeImportHelper.hxx
+sc/source/filter/xml/XMLTableShapeResizer.cxx
+sc/source/filter/xml/XMLTableShapeResizer.hxx
+sc/source/filter/xml/XMLTableShapesContext.cxx
+sc/source/filter/xml/XMLTableShapesContext.hxx
+sc/source/filter/xml/XMLTableSourceContext.cxx
+sc/source/filter/xml/XMLTableSourceContext.hxx
+sc/source/filter/xml/XMLTrackedChangesContext.cxx
+sc/source/filter/xml/cachedattraccess.cxx
+sc/source/filter/xml/cachedattraccess.hxx
+sc/source/filter/xml/celltextparacontext.cxx
+sc/source/filter/xml/celltextparacontext.hxx
+sc/source/filter/xml/datastreamimport.cxx
+sc/source/filter/xml/datastreamimport.hxx
+sc/source/filter/xml/editattributemap.cxx
+sc/source/filter/xml/importcontext.cxx
+sc/source/filter/xml/pivotsource.cxx
+sc/source/filter/xml/sheetdata.cxx
+sc/source/filter/xml/xmlannoi.cxx
+sc/source/filter/xml/xmlannoi.hxx
+sc/source/filter/xml/xmlbodyi.cxx
+sc/source/filter/xml/xmlbodyi.hxx
+sc/source/filter/xml/xmlcelli.cxx
+sc/source/filter/xml/xmlcelli.hxx
+sc/source/filter/xml/xmlcoli.cxx
+sc/source/filter/xml/xmlcoli.hxx
+sc/source/filter/xml/xmlcondformat.cxx
+sc/source/filter/xml/xmlcondformat.hxx
+sc/source/filter/xml/xmlconti.cxx
+sc/source/filter/xml/xmlconti.hxx
+sc/source/filter/xml/xmlcvali.cxx
+sc/source/filter/xml/xmldpimp.cxx
+sc/source/filter/xml/xmldpimp.hxx
+sc/source/filter/xml/xmldrani.cxx
+sc/source/filter/xml/xmldrani.hxx
+sc/source/filter/xml/xmlexprt.cxx
+sc/source/filter/xml/xmlexprt.hxx
+sc/source/filter/xml/xmlexternaltabi.cxx
+sc/source/filter/xml/xmlexternaltabi.hxx
+sc/source/filter/xml/xmlfilti.cxx
+sc/source/filter/xml/xmlfilti.hxx
+sc/source/filter/xml/xmlfonte.cxx
+sc/source/filter/xml/xmlimprt.cxx
+sc/source/filter/xml/xmlimprt.hxx
+sc/source/filter/xml/xmllabri.cxx
+sc/source/filter/xml/xmllabri.hxx
+sc/source/filter/xml/xmlmappingi.cxx
+sc/source/filter/xml/xmlmappingi.hxx
+sc/source/filter/xml/xmlnexpi.cxx
+sc/source/filter/xml/xmlnexpi.hxx
+sc/source/filter/xml/xmlrowi.cxx
+sc/source/filter/xml/xmlrowi.hxx
+sc/source/filter/xml/xmlsceni.cxx
+sc/source/filter/xml/xmlsceni.hxx
+sc/source/filter/xml/xmlsorti.cxx
+sc/source/filter/xml/xmlsorti.hxx
+sc/source/filter/xml/xmlstyle.cxx
+sc/source/filter/xml/xmlstyle.hxx
+sc/source/filter/xml/xmlstyli.cxx
+sc/source/filter/xml/xmlstyli.hxx
+sc/source/filter/xml/xmlsubti.cxx
+sc/source/filter/xml/xmlsubti.hxx
+sc/source/filter/xml/xmltabi.cxx
+sc/source/filter/xml/xmltabi.hxx
+sc/source/filter/xml/xmlwrap.cxx
+sc/source/ui/Accessibility/AccessibilityHints.cxx
+sc/source/ui/Accessibility/AccessibleCell.cxx
+sc/source/ui/Accessibility/AccessibleCellBase.cxx
+sc/source/ui/Accessibility/AccessibleContextBase.cxx
+sc/source/ui/Accessibility/AccessibleCsvControl.cxx
+sc/source/ui/Accessibility/AccessibleDocument.cxx
+sc/source/ui/Accessibility/AccessibleDocumentPagePreview.cxx
+sc/source/ui/Accessibility/AccessibleEditObject.cxx
+sc/source/ui/Accessibility/AccessiblePageHeader.cxx
+sc/source/ui/Accessibility/AccessiblePageHeaderArea.cxx
+sc/source/ui/Accessibility/AccessiblePreviewCell.cxx
+sc/source/ui/Accessibility/AccessiblePreviewHeaderCell.cxx
+sc/source/ui/Accessibility/AccessiblePreviewTable.cxx
+sc/source/ui/Accessibility/AccessibleSpreadsheet.cxx
+sc/source/ui/Accessibility/AccessibleTableBase.cxx
+sc/source/ui/Accessibility/AccessibleText.cxx
+sc/source/ui/Accessibility/DrawModelBroadcaster.cxx
+sc/source/ui/StatisticsDialogs/AnalysisOfVarianceDialog.cxx
+sc/source/ui/StatisticsDialogs/ChiSquareTestDialog.cxx
+sc/source/ui/StatisticsDialogs/CorrelationDialog.cxx
+sc/source/ui/StatisticsDialogs/CovarianceDialog.cxx
+sc/source/ui/StatisticsDialogs/DescriptiveStatisticsDialog.cxx
+sc/source/ui/StatisticsDialogs/ExponentialSmoothingDialog.cxx
+sc/source/ui/StatisticsDialogs/FTestDialog.cxx
+sc/source/ui/StatisticsDialogs/MatrixComparisonGenerator.cxx
+sc/source/ui/StatisticsDialogs/MovingAverageDialog.cxx
+sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx
+sc/source/ui/StatisticsDialogs/RegressionDialog.cxx
+sc/source/ui/StatisticsDialogs/SamplingDialog.cxx
+sc/source/ui/StatisticsDialogs/StatisticsInputOutputDialog.cxx
+sc/source/ui/StatisticsDialogs/StatisticsTwoVariableDialog.cxx
+sc/source/ui/StatisticsDialogs/TTestDialog.cxx
+sc/source/ui/StatisticsDialogs/TableFillingAndNavigationTools.cxx
+sc/source/ui/StatisticsDialogs/ZTestDialog.cxx
+sc/source/ui/app/client.cxx
+sc/source/ui/app/drwtrans.cxx
+sc/source/ui/app/inputhdl.cxx
+sc/source/ui/app/inputwin.cxx
+sc/source/ui/app/lnktrans.cxx
+sc/source/ui/app/msgpool.cxx
+sc/source/ui/app/rfindlst.cxx
+sc/source/ui/app/scdll.cxx
+sc/source/ui/app/scmod.cxx
+sc/source/ui/app/seltrans.cxx
+sc/source/ui/app/transobj.cxx
+sc/source/ui/app/uiitems.cxx
+sc/source/ui/attrdlg/attrdlg.cxx
+sc/source/ui/attrdlg/scabstdlg.cxx
+sc/source/ui/attrdlg/scdlgfact.cxx
+sc/source/ui/attrdlg/scdlgfact.hxx
+sc/source/ui/attrdlg/tabpages.cxx
+sc/source/ui/cctrl/cbuttonw.cxx
+sc/source/ui/cctrl/checklistmenu.cxx
+sc/source/ui/cctrl/dpcontrol.cxx
+sc/source/ui/cctrl/editfield.cxx
+sc/source/ui/cctrl/tbzoomsliderctrl.cxx
+sc/source/ui/condformat/colorformat.cxx
+sc/source/ui/condformat/condformatdlg.cxx
+sc/source/ui/condformat/condformatdlgentry.cxx
+sc/source/ui/condformat/condformatdlgitem.cxx
+sc/source/ui/condformat/condformathelper.cxx
+sc/source/ui/condformat/condformatmgr.cxx
+sc/source/ui/dataprovider/csvdataprovider.cxx
+sc/source/ui/dataprovider/dataprovider.cxx
+sc/source/ui/dataprovider/datatransformation.cxx
+sc/source/ui/dataprovider/htmldataprovider.cxx
+sc/source/ui/dbgui/PivotLayoutDialog.cxx
+sc/source/ui/dbgui/PivotLayoutTreeListBase.cxx
+sc/source/ui/dbgui/PivotLayoutTreeListData.cxx
+sc/source/ui/dbgui/PivotLayoutTreeListLabel.cxx
+sc/source/ui/dbgui/asciiopt.cxx
+sc/source/ui/dbgui/consdlg.cxx
+sc/source/ui/dbgui/csvcontrol.cxx
+sc/source/ui/dbgui/csvgrid.cxx
+sc/source/ui/dbgui/csvruler.cxx
+sc/source/ui/dbgui/csvsplits.cxx
+sc/source/ui/dbgui/csvtablebox.cxx
+sc/source/ui/dbgui/dapidata.cxx
+sc/source/ui/dbgui/dapitype.cxx
+sc/source/ui/dbgui/dbnamdlg.cxx
+sc/source/ui/dbgui/dpgroupdlg.cxx
+sc/source/ui/dbgui/filtdlg.cxx
+sc/source/ui/dbgui/foptmgr.cxx
+sc/source/ui/dbgui/imoptdlg.cxx
+sc/source/ui/dbgui/pfiltdlg.cxx
+sc/source/ui/dbgui/pvfundlg.cxx
+sc/source/ui/dbgui/scendlg.cxx
+sc/source/ui/dbgui/scuiasciiopt.cxx
+sc/source/ui/dbgui/scuiimoptdlg.cxx
+sc/source/ui/dbgui/sfiltdlg.cxx
+sc/source/ui/dbgui/sortdlg.cxx
+sc/source/ui/dbgui/sortkeydlg.cxx
+sc/source/ui/dbgui/subtdlg.cxx
+sc/source/ui/dbgui/textimportoptions.cxx
+sc/source/ui/dbgui/tpsort.cxx
+sc/source/ui/dbgui/tpsubt.cxx
+sc/source/ui/dbgui/validate.cxx
+sc/source/ui/dialogs/searchresults.cxx
+sc/source/ui/docshell/arealink.cxx
+sc/source/ui/docshell/autostyl.cxx
+sc/source/ui/docshell/datastream.cxx
+sc/source/ui/docshell/dbdocfun.cxx
+sc/source/ui/docshell/dbdocimp.cxx
+sc/source/ui/docshell/docfunc.cxx
+sc/source/ui/docshell/docfuncutil.cxx
+sc/source/ui/docshell/docsh.cxx
+sc/source/ui/docshell/docsh2.cxx
+sc/source/ui/docshell/docsh3.cxx
+sc/source/ui/docshell/docsh4.cxx
+sc/source/ui/docshell/docsh5.cxx
+sc/source/ui/docshell/docsh6.cxx
+sc/source/ui/docshell/docsh8.cxx
+sc/source/ui/docshell/docshimp.hxx
+sc/source/ui/docshell/documentlinkmgr.cxx
+sc/source/ui/docshell/editable.cxx
+sc/source/ui/docshell/externalrefmgr.cxx
+sc/source/ui/docshell/impex.cxx
+sc/source/ui/docshell/macromgr.cxx
+sc/source/ui/docshell/olinefun.cxx
+sc/source/ui/docshell/pagedata.cxx
+sc/source/ui/docshell/pntlock.cxx
+sc/source/ui/docshell/servobj.cxx
+sc/source/ui/docshell/sizedev.cxx
+sc/source/ui/docshell/tablink.cxx
+sc/source/ui/docshell/tpstat.cxx
+sc/source/ui/drawfunc/chartsh.cxx
+sc/source/ui/drawfunc/drawsh.cxx
+sc/source/ui/drawfunc/drawsh2.cxx
+sc/source/ui/drawfunc/drawsh4.cxx
+sc/source/ui/drawfunc/drawsh5.cxx
+sc/source/ui/drawfunc/drformsh.cxx
+sc/source/ui/drawfunc/drtxtob.cxx
+sc/source/ui/drawfunc/drtxtob1.cxx
+sc/source/ui/drawfunc/drtxtob2.cxx
+sc/source/ui/drawfunc/fuconarc.cxx
+sc/source/ui/drawfunc/fuconcustomshape.cxx
+sc/source/ui/drawfunc/fuconpol.cxx
+sc/source/ui/drawfunc/fuconrec.cxx
+sc/source/ui/drawfunc/fuconstr.cxx
+sc/source/ui/drawfunc/fuconuno.cxx
+sc/source/ui/drawfunc/fudraw.cxx
+sc/source/ui/drawfunc/fuins1.cxx
+sc/source/ui/drawfunc/fuins2.cxx
+sc/source/ui/drawfunc/fupoor.cxx
+sc/source/ui/drawfunc/fusel.cxx
+sc/source/ui/drawfunc/fusel2.cxx
+sc/source/ui/drawfunc/futext.cxx
+sc/source/ui/drawfunc/futext3.cxx
+sc/source/ui/drawfunc/graphsh.cxx
+sc/source/ui/drawfunc/oleobjsh.cxx
+sc/source/ui/formdlg/dwfunctr.cxx
+sc/source/ui/formdlg/formula.cxx
+sc/source/ui/inc/AccessibilityHints.hxx
+sc/source/ui/inc/AccessibleCell.hxx
+sc/source/ui/inc/AccessibleCellBase.hxx
+sc/source/ui/inc/AccessibleContextBase.hxx
+sc/source/ui/inc/AccessibleCsvControl.hxx
+sc/source/ui/inc/AccessibleDocument.hxx
+sc/source/ui/inc/AccessibleDocumentPagePreview.hxx
+sc/source/ui/inc/AccessibleEditObject.hxx
+sc/source/ui/inc/AccessiblePageHeader.hxx
+sc/source/ui/inc/AccessiblePageHeaderArea.hxx
+sc/source/ui/inc/AccessiblePreviewCell.hxx
+sc/source/ui/inc/AccessiblePreviewHeaderCell.hxx
+sc/source/ui/inc/AccessiblePreviewTable.hxx
+sc/source/ui/inc/AccessibleSpreadsheet.hxx
+sc/source/ui/inc/AccessibleTableBase.hxx
+sc/source/ui/inc/AccessibleText.hxx
+sc/source/ui/inc/AnalysisOfVarianceDialog.hxx
+sc/source/ui/inc/ChartRangeSelectionListener.hxx
+sc/source/ui/inc/ChiSquareTestDialog.hxx
+sc/source/ui/inc/ChildWindowWrapper.hxx
+sc/source/ui/inc/CorrelationDialog.hxx
+sc/source/ui/inc/CovarianceDialog.hxx
+sc/source/ui/inc/DescriptiveStatisticsDialog.hxx
+sc/source/ui/inc/DrawModelBroadcaster.hxx
+sc/source/ui/inc/ExponentialSmoothingDialog.hxx
+sc/source/ui/inc/FTestDialog.hxx
+sc/source/ui/inc/MatrixComparisonGenerator.hxx
+sc/source/ui/inc/MovingAverageDialog.hxx
+sc/source/ui/inc/PivotLayoutDialog.hxx
+sc/source/ui/inc/RandomNumberGeneratorDialog.hxx
+sc/source/ui/inc/RegressionDialog.hxx
+sc/source/ui/inc/SamplingDialog.hxx
+sc/source/ui/inc/StatisticsInputOutputDialog.hxx
+sc/source/ui/inc/StatisticsTwoVariableDialog.hxx
+sc/source/ui/inc/TTestDialog.hxx
+sc/source/ui/inc/TableFillingAndNavigationTools.hxx
+sc/source/ui/inc/ZTestDialog.hxx
+sc/source/ui/inc/acredlin.hxx
+sc/source/ui/inc/anyrefdg.hxx
+sc/source/ui/inc/areasave.hxx
+sc/source/ui/inc/areasdlg.hxx
+sc/source/ui/inc/asciiopt.hxx
+sc/source/ui/inc/autofmt.hxx
+sc/source/ui/inc/autostyl.hxx
+sc/source/ui/inc/cbutton.hxx
+sc/source/ui/inc/cellmergeoption.hxx
+sc/source/ui/inc/cellsh.hxx
+sc/source/ui/inc/checklistmenu.hxx
+sc/source/ui/inc/client.hxx
+sc/source/ui/inc/cliputil.hxx
+sc/source/ui/inc/colrowba.hxx
+sc/source/ui/inc/condformatdlg.hxx
+sc/source/ui/inc/condformatdlgentry.hxx
+sc/source/ui/inc/condformathelper.hxx
+sc/source/ui/inc/condformatmgr.hxx
+sc/source/ui/inc/condformatuno.hxx
+sc/source/ui/inc/conflictsdlg.hxx
+sc/source/ui/inc/consdlg.hxx
+sc/source/ui/inc/content.hxx
+sc/source/ui/inc/crnrdlg.hxx
+sc/source/ui/inc/csvcontrol.hxx
+sc/source/ui/inc/csvgrid.hxx
+sc/source/ui/inc/csvruler.hxx
+sc/source/ui/inc/csvsplits.hxx
+sc/source/ui/inc/csvtablebox.hxx
+sc/source/ui/inc/datafdlg.hxx
+sc/source/ui/inc/dataprovider.hxx
+sc/source/ui/inc/datastream.hxx
+sc/source/ui/inc/datatransformation.hxx
+sc/source/ui/inc/dbdocfun.hxx
+sc/source/ui/inc/dbfunc.hxx
+sc/source/ui/inc/dbnamdlg.hxx
+sc/source/ui/inc/docfunc.hxx
+sc/source/ui/inc/docfuncutil.hxx
+sc/source/ui/inc/docsh.hxx
+sc/source/ui/inc/dpcontrol.hxx
+sc/source/ui/inc/dpgroupdlg.hxx
+sc/source/ui/inc/drawsh.hxx
+sc/source/ui/inc/drawutil.hxx
+sc/source/ui/inc/drawview.hxx
+sc/source/ui/inc/drtxtob.hxx
+sc/source/ui/inc/drwtrans.hxx
+sc/source/ui/inc/dwfunctr.hxx
+sc/source/ui/inc/editable.hxx
+sc/source/ui/inc/editsh.hxx
+sc/source/ui/inc/filldlg.hxx
+sc/source/ui/inc/filtdlg.hxx
+sc/source/ui/inc/foptmgr.hxx
+sc/source/ui/inc/formatsh.hxx
+sc/source/ui/inc/formdata.hxx
+sc/source/ui/inc/formula.hxx
+sc/source/ui/inc/fuconarc.hxx
+sc/source/ui/inc/fuconcustomshape.hxx
+sc/source/ui/inc/fuconpol.hxx
+sc/source/ui/inc/fuconrec.hxx
+sc/source/ui/inc/fuconstr.hxx
+sc/source/ui/inc/fuconuno.hxx
+sc/source/ui/inc/fuinsert.hxx
+sc/source/ui/inc/fupoor.hxx
+sc/source/ui/inc/fusel.hxx
+sc/source/ui/inc/futext.hxx
+sc/source/ui/inc/graphsh.hxx
+sc/source/ui/inc/gridmerg.hxx
+sc/source/ui/inc/gridwin.hxx
+sc/source/ui/inc/hdrcont.hxx
+sc/source/ui/inc/hfedtdlg.hxx
+sc/source/ui/inc/highred.hxx
+sc/source/ui/inc/hiranges.hxx
+sc/source/ui/inc/imoptdlg.hxx
+sc/source/ui/inc/impex.hxx
+sc/source/ui/inc/inputhdl.hxx
+sc/source/ui/inc/inputwin.hxx
+sc/source/ui/inc/inscodlg.hxx
+sc/source/ui/inc/instbdlg.hxx
+sc/source/ui/inc/invmerge.hxx
+sc/source/ui/inc/linkarea.hxx
+sc/source/ui/inc/lnktrans.hxx
+sc/source/ui/inc/msgpool.hxx
+sc/source/ui/inc/mtrindlg.hxx
+sc/source/ui/inc/mvtabdlg.hxx
+sc/source/ui/inc/namemgrtable.hxx
+sc/source/ui/inc/navcitem.hxx
+sc/source/ui/inc/navipi.hxx
+sc/source/ui/inc/navsett.hxx
+sc/source/ui/inc/notemark.hxx
+sc/source/ui/inc/olinefun.hxx
+sc/source/ui/inc/olinewin.hxx
+sc/source/ui/inc/opredlin.hxx
+sc/source/ui/inc/optsolver.hxx
+sc/source/ui/inc/output.hxx
+sc/source/ui/inc/overlayobject.hxx
+sc/source/ui/inc/pagedata.hxx
+sc/source/ui/inc/pfiltdlg.hxx
+sc/source/ui/inc/pfuncache.hxx
+sc/source/ui/inc/pntlock.hxx
+sc/source/ui/inc/preview.hxx
+sc/source/ui/inc/prevloc.hxx
+sc/source/ui/inc/prevwsh.hxx
+sc/source/ui/inc/printfun.hxx
+sc/source/ui/inc/pvfundlg.hxx
+sc/source/ui/inc/redcom.hxx
+sc/source/ui/inc/reffact.hxx
+sc/source/ui/inc/refundo.hxx
+sc/source/ui/inc/rfindlst.hxx
+sc/source/ui/inc/scendlg.hxx
+sc/source/ui/inc/scui_def.hxx
+sc/source/ui/inc/scuiasciiopt.hxx
+sc/source/ui/inc/scuiautofmt.hxx
+sc/source/ui/inc/scuiimoptdlg.hxx
+sc/source/ui/inc/scuitphfedit.hxx
+sc/source/ui/inc/searchresults.hxx
+sc/source/ui/inc/select.hxx
+sc/source/ui/inc/selectionstate.hxx
+sc/source/ui/inc/seltrans.hxx
+sc/source/ui/inc/servobj.hxx
+sc/source/ui/inc/sharedocdlg.hxx
+sc/source/ui/inc/simpref.hxx
+sc/source/ui/inc/sizedev.hxx
+sc/source/ui/inc/solveroptions.hxx
+sc/source/ui/inc/solverutil.hxx
+sc/source/ui/inc/solvrdlg.hxx
+sc/source/ui/inc/sortdlg.hxx
+sc/source/ui/inc/spelldialog.hxx
+sc/source/ui/inc/spelleng.hxx
+sc/source/ui/inc/spellparam.hxx
+sc/source/ui/inc/strindlg.hxx
+sc/source/ui/inc/styledlg.hxx
+sc/source/ui/inc/tabbgcolordlg.hxx
+sc/source/ui/inc/tabcont.hxx
+sc/source/ui/inc/tabopdlg.hxx
+sc/source/ui/inc/tabpages.hxx
+sc/source/ui/inc/tabsplit.hxx
+sc/source/ui/inc/tabview.hxx
+sc/source/ui/inc/tabvwsh.hxx
+sc/source/ui/inc/target.hxx
+sc/source/ui/inc/tbzoomsliderctrl.hxx
+sc/source/ui/inc/tpcalc.hxx
+sc/source/ui/inc/tpcompatibility.hxx
+sc/source/ui/inc/tpdefaults.hxx
+sc/source/ui/inc/tphf.hxx
+sc/source/ui/inc/tphfedit.hxx
+sc/source/ui/inc/tpprint.hxx
+sc/source/ui/inc/tpsort.hxx
+sc/source/ui/inc/tpstat.hxx
+sc/source/ui/inc/tpsubt.hxx
+sc/source/ui/inc/tptable.hxx
+sc/source/ui/inc/tpusrlst.hxx
+sc/source/ui/inc/tpview.hxx
+sc/source/ui/inc/transobj.hxx
+sc/source/ui/inc/uiitems.hxx
+sc/source/ui/inc/undobase.hxx
+sc/source/ui/inc/undoblk.hxx
+sc/source/ui/inc/undocell.hxx
+sc/source/ui/inc/undodat.hxx
+sc/source/ui/inc/undodraw.hxx
+sc/source/ui/inc/undoolk.hxx
+sc/source/ui/inc/undosort.hxx
+sc/source/ui/inc/undostyl.hxx
+sc/source/ui/inc/undotab.hxx
+sc/source/ui/inc/undoutil.hxx
+sc/source/ui/inc/validate.hxx
+sc/source/ui/inc/viewdata.hxx
+sc/source/ui/inc/viewfunc.hxx
+sc/source/ui/inc/viewutil.hxx
+sc/source/ui/miscdlgs/acredlin.cxx
+sc/source/ui/miscdlgs/anyrefdg.cxx
+sc/source/ui/miscdlgs/autofmt.cxx
+sc/source/ui/miscdlgs/conflictsdlg.cxx
+sc/source/ui/miscdlgs/crnrdlg.cxx
+sc/source/ui/miscdlgs/datafdlg.cxx
+sc/source/ui/miscdlgs/dataproviderdlg.cxx
+sc/source/ui/miscdlgs/datatableview.cxx
+sc/source/ui/miscdlgs/delcodlg.cxx
+sc/source/ui/miscdlgs/filldlg.cxx
+sc/source/ui/miscdlgs/groupdlg.cxx
+sc/source/ui/miscdlgs/highred.cxx
+sc/source/ui/miscdlgs/inscodlg.cxx
+sc/source/ui/miscdlgs/instbdlg.cxx
+sc/source/ui/miscdlgs/lbseldlg.cxx
+sc/source/ui/miscdlgs/linkarea.cxx
+sc/source/ui/miscdlgs/mtrindlg.cxx
+sc/source/ui/miscdlgs/optsolver.cxx
+sc/source/ui/miscdlgs/protectiondlg.cxx
+sc/source/ui/miscdlgs/redcom.cxx
+sc/source/ui/miscdlgs/scuiautofmt.cxx
+sc/source/ui/miscdlgs/sharedocdlg.cxx
+sc/source/ui/miscdlgs/simpref.cxx
+sc/source/ui/miscdlgs/solveroptions.cxx
+sc/source/ui/miscdlgs/solverutil.cxx
+sc/source/ui/miscdlgs/solvrdlg.cxx
+sc/source/ui/miscdlgs/strindlg.cxx
+sc/source/ui/miscdlgs/tabbgcolordlg.cxx
+sc/source/ui/miscdlgs/tabopdlg.cxx
+sc/source/ui/miscdlgs/textdlgs.cxx
+sc/source/ui/namedlg/namedefdlg.cxx
+sc/source/ui/namedlg/namedlg.cxx
+sc/source/ui/navipi/content.cxx
+sc/source/ui/navipi/navcitem.cxx
+sc/source/ui/navipi/navipi.cxx
+sc/source/ui/navipi/scenwnd.cxx
+sc/source/ui/optdlg/calcoptionsdlg.cxx
+sc/source/ui/optdlg/opredlin.cxx
+sc/source/ui/optdlg/tpcalc.cxx
+sc/source/ui/optdlg/tpcompatibility.cxx
+sc/source/ui/optdlg/tpdefaults.cxx
+sc/source/ui/optdlg/tpformula.cxx
+sc/source/ui/optdlg/tpprint.cxx
+sc/source/ui/optdlg/tpusrlst.cxx
+sc/source/ui/optdlg/tpview.cxx
+sc/source/ui/pagedlg/areasdlg.cxx
+sc/source/ui/pagedlg/hfedtdlg.cxx
+sc/source/ui/pagedlg/scuitphfedit.cxx
+sc/source/ui/pagedlg/tphf.cxx
+sc/source/ui/pagedlg/tphfedit.cxx
+sc/source/ui/pagedlg/tptable.cxx
+sc/source/ui/sidebar/AlignmentPropertyPanel.cxx
+sc/source/ui/sidebar/AlignmentPropertyPanel.hxx
+sc/source/ui/sidebar/CellAppearancePropertyPanel.cxx
+sc/source/ui/sidebar/CellAppearancePropertyPanel.hxx
+sc/source/ui/sidebar/CellBorderStyleControl.cxx
+sc/source/ui/sidebar/CellLineStyleControl.cxx
+sc/source/ui/sidebar/CellLineStyleValueSet.cxx
+sc/source/ui/sidebar/NumberFormatControl.cxx
+sc/source/ui/sidebar/NumberFormatPropertyPanel.cxx
+sc/source/ui/sidebar/NumberFormatPropertyPanel.hxx
+sc/source/ui/sidebar/ScPanelFactory.cxx
+sc/source/ui/sidebar/ScPanelFactory.hxx
+sc/source/ui/styleui/styledlg.cxx
+sc/source/ui/uitest/uiobject.cxx
+sc/source/ui/undo/areasave.cxx
+sc/source/ui/undo/refundo.cxx
+sc/source/ui/undo/undobase.cxx
+sc/source/ui/undo/undoblk.cxx
+sc/source/ui/undo/undoblk2.cxx
+sc/source/ui/undo/undoblk3.cxx
+sc/source/ui/undo/undocell.cxx
+sc/source/ui/undo/undocell2.cxx
+sc/source/ui/undo/undoconvert.cxx
+sc/source/ui/undo/undodat.cxx
+sc/source/ui/undo/undodraw.cxx
+sc/source/ui/undo/undorangename.cxx
+sc/source/ui/undo/undosort.cxx
+sc/source/ui/undo/undostyl.cxx
+sc/source/ui/undo/undotab.cxx
+sc/source/ui/undo/undoutil.cxx
+sc/source/ui/unoobj/ChartRangeSelectionListener.cxx
+sc/source/ui/unoobj/ChartTools.cxx
+sc/source/ui/unoobj/PivotTableDataProvider.cxx
+sc/source/ui/unoobj/PivotTableDataSequence.cxx
+sc/source/ui/unoobj/PivotTableDataSource.cxx
+sc/source/ui/unoobj/TablePivotChart.cxx
+sc/source/ui/unoobj/TablePivotCharts.cxx
+sc/source/ui/unoobj/addruno.cxx
+sc/source/ui/unoobj/afmtuno.cxx
+sc/source/ui/unoobj/appluno.cxx
+sc/source/ui/unoobj/celllistsource.cxx
+sc/source/ui/unoobj/celllistsource.hxx
+sc/source/ui/unoobj/cellsuno.cxx
+sc/source/ui/unoobj/cellvaluebinding.cxx
+sc/source/ui/unoobj/cellvaluebinding.hxx
+sc/source/ui/unoobj/chart2uno.cxx
+sc/source/ui/unoobj/chartuno.cxx
+sc/source/ui/unoobj/condformatuno.cxx
+sc/source/ui/unoobj/confuno.cxx
+sc/source/ui/unoobj/cursuno.cxx
+sc/source/ui/unoobj/dapiuno.cxx
+sc/source/ui/unoobj/datauno.cxx
+sc/source/ui/unoobj/defltuno.cxx
+sc/source/ui/unoobj/dispuno.cxx
+sc/source/ui/unoobj/docuno.cxx
+sc/source/ui/unoobj/drdefuno.cxx
+sc/source/ui/unoobj/editsrc.cxx
+sc/source/ui/unoobj/eventuno.cxx
+sc/source/ui/unoobj/exceldetect.cxx
+sc/source/ui/unoobj/fielduno.cxx
+sc/source/ui/unoobj/filtuno.cxx
+sc/source/ui/unoobj/fmtuno.cxx
+sc/source/ui/unoobj/forbiuno.cxx
+sc/source/ui/unoobj/funcuno.cxx
+sc/source/ui/unoobj/linkuno.cxx
+sc/source/ui/unoobj/miscuno.cxx
+sc/source/ui/unoobj/nameuno.cxx
+sc/source/ui/unoobj/notesuno.cxx
+sc/source/ui/unoobj/optuno.cxx
+sc/source/ui/unoobj/pageuno.cxx
+sc/source/ui/unoobj/scdetect.cxx
+sc/source/ui/unoobj/scdetect.hxx
+sc/source/ui/unoobj/servuno.cxx
+sc/source/ui/unoobj/shapeuno.cxx
+sc/source/ui/unoobj/srchuno.cxx
+sc/source/ui/unoobj/styleuno.cxx
+sc/source/ui/unoobj/targuno.cxx
+sc/source/ui/unoobj/textuno.cxx
+sc/source/ui/unoobj/tokenuno.cxx
+sc/source/ui/unoobj/unodoc.cxx
+sc/source/ui/unoobj/unoreflist.cxx
+sc/source/ui/unoobj/viewuno.cxx
+sc/source/ui/unoobj/warnpassword.cxx
+sc/source/ui/vba/excelvbahelper.cxx
+sc/source/ui/vba/excelvbahelper.hxx
+sc/source/ui/vba/helperdecl.hxx
+sc/source/ui/vba/vbaapplication.cxx
+sc/source/ui/vba/vbaapplication.hxx
+sc/source/ui/vba/vbaassistant.cxx
+sc/source/ui/vba/vbaassistant.hxx
+sc/source/ui/vba/vbaaxes.cxx
+sc/source/ui/vba/vbaaxes.hxx
+sc/source/ui/vba/vbaaxis.cxx
+sc/source/ui/vba/vbaaxis.hxx
+sc/source/ui/vba/vbaaxistitle.cxx
+sc/source/ui/vba/vbaaxistitle.hxx
+sc/source/ui/vba/vbaborders.cxx
+sc/source/ui/vba/vbaborders.hxx
+sc/source/ui/vba/vbacharacters.cxx
+sc/source/ui/vba/vbacharacters.hxx
+sc/source/ui/vba/vbachart.cxx
+sc/source/ui/vba/vbachart.hxx
+sc/source/ui/vba/vbachartobject.cxx
+sc/source/ui/vba/vbachartobject.hxx
+sc/source/ui/vba/vbachartobjects.cxx
+sc/source/ui/vba/vbachartobjects.hxx
+sc/source/ui/vba/vbacharttitle.cxx
+sc/source/ui/vba/vbacharttitle.hxx
+sc/source/ui/vba/vbacomment.cxx
+sc/source/ui/vba/vbacomment.hxx
+sc/source/ui/vba/vbacomments.cxx
+sc/source/ui/vba/vbacomments.hxx
+sc/source/ui/vba/vbacondition.hxx
+sc/source/ui/vba/vbadialog.cxx
+sc/source/ui/vba/vbadialog.hxx
+sc/source/ui/vba/vbadialogs.cxx
+sc/source/ui/vba/vbadialogs.hxx
+sc/source/ui/vba/vbaeventshelper.cxx
+sc/source/ui/vba/vbaeventshelper.hxx
+sc/source/ui/vba/vbafiledialog.cxx
+sc/source/ui/vba/vbafiledialog.hxx
+sc/source/ui/vba/vbafiledialogitems.cxx
+sc/source/ui/vba/vbafiledialogitems.hxx
+sc/source/ui/vba/vbafont.cxx
+sc/source/ui/vba/vbaformat.cxx
+sc/source/ui/vba/vbaformat.hxx
+sc/source/ui/vba/vbaformatcondition.cxx
+sc/source/ui/vba/vbaformatcondition.hxx
+sc/source/ui/vba/vbaformatconditions.cxx
+sc/source/ui/vba/vbaformatconditions.hxx
+sc/source/ui/vba/vbaglobals.cxx
+sc/source/ui/vba/vbaglobals.hxx
+sc/source/ui/vba/vbahyperlink.cxx
+sc/source/ui/vba/vbahyperlink.hxx
+sc/source/ui/vba/vbahyperlinks.cxx
+sc/source/ui/vba/vbahyperlinks.hxx
+sc/source/ui/vba/vbainterior.cxx
+sc/source/ui/vba/vbainterior.hxx
+sc/source/ui/vba/vbalineshape.cxx
+sc/source/ui/vba/vbalineshape.hxx
+sc/source/ui/vba/vbamenu.cxx
+sc/source/ui/vba/vbamenu.hxx
+sc/source/ui/vba/vbamenubar.cxx
+sc/source/ui/vba/vbamenubar.hxx
+sc/source/ui/vba/vbamenubars.cxx
+sc/source/ui/vba/vbamenubars.hxx
+sc/source/ui/vba/vbamenuitem.cxx
+sc/source/ui/vba/vbamenuitem.hxx
+sc/source/ui/vba/vbamenuitems.cxx
+sc/source/ui/vba/vbamenuitems.hxx
+sc/source/ui/vba/vbamenus.cxx
+sc/source/ui/vba/vbamenus.hxx
+sc/source/ui/vba/vbaname.cxx
+sc/source/ui/vba/vbaname.hxx
+sc/source/ui/vba/vbanames.cxx
+sc/source/ui/vba/vbanames.hxx
+sc/source/ui/vba/vbaoleobject.cxx
+sc/source/ui/vba/vbaoleobject.hxx
+sc/source/ui/vba/vbaoleobjects.cxx
+sc/source/ui/vba/vbaoutline.cxx
+sc/source/ui/vba/vbaoutline.hxx
+sc/source/ui/vba/vbaovalshape.cxx
+sc/source/ui/vba/vbaovalshape.hxx
+sc/source/ui/vba/vbapagebreak.cxx
+sc/source/ui/vba/vbapagebreak.hxx
+sc/source/ui/vba/vbapagebreaks.cxx
+sc/source/ui/vba/vbapagesetup.cxx
+sc/source/ui/vba/vbapalette.cxx
+sc/source/ui/vba/vbapalette.hxx
+sc/source/ui/vba/vbapane.cxx
+sc/source/ui/vba/vbapane.hxx
+sc/source/ui/vba/vbapivotcache.cxx
+sc/source/ui/vba/vbapivotcache.hxx
+sc/source/ui/vba/vbapivottable.cxx
+sc/source/ui/vba/vbapivottables.cxx
+sc/source/ui/vba/vbapivottables.hxx
+sc/source/ui/vba/vbarange.cxx
+sc/source/ui/vba/vbarange.hxx
+sc/source/ui/vba/vbasheetobject.cxx
+sc/source/ui/vba/vbasheetobject.hxx
+sc/source/ui/vba/vbasheetobjects.cxx
+sc/source/ui/vba/vbasheetobjects.hxx
+sc/source/ui/vba/vbastyle.cxx
+sc/source/ui/vba/vbastyle.hxx
+sc/source/ui/vba/vbastyles.cxx
+sc/source/ui/vba/vbastyles.hxx
+sc/source/ui/vba/vbatextboxshape.cxx
+sc/source/ui/vba/vbatextboxshape.hxx
+sc/source/ui/vba/vbatextframe.cxx
+sc/source/ui/vba/vbatitle.hxx
+sc/source/ui/vba/vbavalidation.cxx
+sc/source/ui/vba/vbavalidation.hxx
+sc/source/ui/vba/vbawindow.cxx
+sc/source/ui/vba/vbawindow.hxx
+sc/source/ui/vba/vbawindows.cxx
+sc/source/ui/vba/vbawindows.hxx
+sc/source/ui/vba/vbaworkbook.cxx
+sc/source/ui/vba/vbaworkbook.hxx
+sc/source/ui/vba/vbaworkbooks.cxx
+sc/source/ui/vba/vbaworkbooks.hxx
+sc/source/ui/vba/vbaworksheet.cxx
+sc/source/ui/vba/vbaworksheet.hxx
+sc/source/ui/vba/vbaworksheets.cxx
+sc/source/ui/vba/vbaworksheets.hxx
+sc/source/ui/vba/vbawsfunction.cxx
+sc/source/ui/vba/vbawsfunction.hxx
+sc/source/ui/view/auditsh.cxx
+sc/source/ui/view/cellmergeoption.cxx
+sc/source/ui/view/cellsh.cxx
+sc/source/ui/view/cellsh1.cxx
+sc/source/ui/view/cellsh2.cxx
+sc/source/ui/view/cellsh3.cxx
+sc/source/ui/view/cellsh4.cxx
+sc/source/ui/view/cliputil.cxx
+sc/source/ui/view/colrowba.cxx
+sc/source/ui/view/dbfunc.cxx
+sc/source/ui/view/dbfunc2.cxx
+sc/source/ui/view/dbfunc3.cxx
+sc/source/ui/view/drawutil.cxx
+sc/source/ui/view/drawvie3.cxx
+sc/source/ui/view/drawvie4.cxx
+sc/source/ui/view/drawview.cxx
+sc/source/ui/view/editsh.cxx
+sc/source/ui/view/formatsh.cxx
+sc/source/ui/view/gridmerg.cxx
+sc/source/ui/view/gridwin.cxx
+sc/source/ui/view/gridwin2.cxx
+sc/source/ui/view/gridwin3.cxx
+sc/source/ui/view/gridwin4.cxx
+sc/source/ui/view/gridwin5.cxx
+sc/source/ui/view/gridwin_dbgutil.cxx
+sc/source/ui/view/hdrcont.cxx
+sc/source/ui/view/hintwin.cxx
+sc/source/ui/view/imapwrap.cxx
+sc/source/ui/view/imapwrap.hxx
+sc/source/ui/view/invmerge.cxx
+sc/source/ui/view/notemark.cxx
+sc/source/ui/view/olinewin.cxx
+sc/source/ui/view/output.cxx
+sc/source/ui/view/output2.cxx
+sc/source/ui/view/output3.cxx
+sc/source/ui/view/overlayobject.cxx
+sc/source/ui/view/pfuncache.cxx
+sc/source/ui/view/pivotsh.cxx
+sc/source/ui/view/preview.cxx
+sc/source/ui/view/prevloc.cxx
+sc/source/ui/view/prevwsh.cxx
+sc/source/ui/view/prevwsh2.cxx
+sc/source/ui/view/printfun.cxx
+sc/source/ui/view/reffact.cxx
+sc/source/ui/view/scextopt.cxx
+sc/source/ui/view/select.cxx
+sc/source/ui/view/selectionstate.cxx
+sc/source/ui/view/spellcheckcontext.cxx
+sc/source/ui/view/spelldialog.cxx
+sc/source/ui/view/spelleng.cxx
+sc/source/ui/view/tabcont.cxx
+sc/source/ui/view/tabsplit.cxx
+sc/source/ui/view/tabview.cxx
+sc/source/ui/view/tabview2.cxx
+sc/source/ui/view/tabview3.cxx
+sc/source/ui/view/tabview4.cxx
+sc/source/ui/view/tabview5.cxx
+sc/source/ui/view/tabvwsh.cxx
+sc/source/ui/view/tabvwsh2.cxx
+sc/source/ui/view/tabvwsh3.cxx
+sc/source/ui/view/tabvwsh4.cxx
+sc/source/ui/view/tabvwsh5.cxx
+sc/source/ui/view/tabvwsh8.cxx
+sc/source/ui/view/tabvwsh9.cxx
+sc/source/ui/view/tabvwsha.cxx
+sc/source/ui/view/tabvwshb.cxx
+sc/source/ui/view/tabvwshc.cxx
+sc/source/ui/view/tabvwshe.cxx
+sc/source/ui/view/tabvwshf.cxx
+sc/source/ui/view/tabvwshg.cxx
+sc/source/ui/view/tabvwshh.cxx
+sc/source/ui/view/viewdata.cxx
+sc/source/ui/view/viewfun2.cxx
+sc/source/ui/view/viewfun3.cxx
+sc/source/ui/view/viewfun4.cxx
+sc/source/ui/view/viewfun5.cxx
+sc/source/ui/view/viewfun6.cxx
+sc/source/ui/view/viewfun7.cxx
+sc/source/ui/view/viewfunc.cxx
+sc/source/ui/view/viewutil.cxx
+sc/source/ui/view/waitoff.cxx
+sc/source/ui/xmlsource/xmlsourcedlg.cxx
+scaddins/source/analysis/analysis.cxx
+scaddins/source/analysis/analysis.hxx
+scaddins/source/analysis/analysisdefs.hxx
+scaddins/source/analysis/analysishelper.cxx
+scaddins/source/analysis/analysishelper.hxx
+scaddins/source/analysis/bessel.cxx
+scaddins/source/analysis/deffuncname.hxx
+scaddins/source/analysis/financial.cxx
+scaddins/source/datefunc/datefunc.cxx
+scaddins/source/datefunc/datefunc.hxx
+scaddins/source/datefunc/deffuncname.hxx
+scaddins/source/pricing/black_scholes.cxx
+scaddins/source/pricing/black_scholes.hxx
+scaddins/source/pricing/pricing.cxx
+scaddins/source/pricing/pricing.hxx
+sccomp/qa/unit/solver.cxx
+sccomp/source/solver/CoinMPSolver.cxx
+sccomp/source/solver/LpsolveSolver.cxx
+sccomp/source/solver/SolverComponent.cxx
+sccomp/source/solver/SolverComponent.hxx
+scripting/source/basprov/baslibnode.cxx
+scripting/source/basprov/baslibnode.hxx
+scripting/source/basprov/basmethnode.cxx
+scripting/source/basprov/basmethnode.hxx
+scripting/source/basprov/basmodnode.cxx
+scripting/source/basprov/basmodnode.hxx
+scripting/source/basprov/basprov.cxx
+scripting/source/basprov/basprov.hxx
+scripting/source/basprov/basscript.cxx
+scripting/source/basprov/basscript.hxx
+scripting/source/dlgprov/DialogModelProvider.cxx
+scripting/source/dlgprov/DialogModelProvider.hxx
+scripting/source/dlgprov/dlgevtatt.cxx
+scripting/source/dlgprov/dlgevtatt.hxx
+scripting/source/dlgprov/dlgprov.cxx
+scripting/source/dlgprov/dlgprov.hxx
+scripting/source/inc/bcholder.hxx
+scripting/source/inc/util/MiscUtils.hxx
+scripting/source/protocolhandler/scripthandler.cxx
+scripting/source/protocolhandler/scripthandler.hxx
+scripting/source/provider/ActiveMSPList.cxx
+scripting/source/provider/ActiveMSPList.hxx
+scripting/source/provider/BrowseNodeFactoryImpl.cxx
+scripting/source/provider/BrowseNodeFactoryImpl.hxx
+scripting/source/provider/MasterScriptProvider.cxx
+scripting/source/provider/MasterScriptProvider.hxx
+scripting/source/provider/MasterScriptProviderFactory.cxx
+scripting/source/provider/MasterScriptProviderFactory.hxx
+scripting/source/provider/ProviderCache.cxx
+scripting/source/provider/ProviderCache.hxx
+scripting/source/provider/URIHelper.cxx
+scripting/source/provider/URIHelper.hxx
+scripting/source/stringresource/stringresource.cxx
+scripting/source/stringresource/stringresource.hxx
+scripting/source/vbaevents/eventhelper.cxx
+sd/inc/Annotation.hxx
+sd/inc/CustomAnimationEffect.hxx
+sd/inc/CustomAnimationPreset.hxx
+sd/inc/EffectMigration.hxx
+sd/inc/FactoryIds.hxx
+sd/inc/OutlinerIterator.hxx
+sd/inc/TransitionPreset.hxx
+sd/inc/animations.hxx
+sd/inc/anminfo.hxx
+sd/inc/createunocustomshow.hxx
+sd/inc/customshowlist.hxx
+sd/inc/drawdoc.hxx
+sd/inc/glob.hxx
+sd/inc/helpids.h
+sd/inc/misc/scopelock.hxx
+sd/inc/notifydocumentevent.hxx
+sd/inc/pglink.hxx
+sd/inc/sdabstdlg.hxx
+sd/inc/sdcgmfilter.hxx
+sd/inc/sdcommands.h
+sd/inc/sddll.hxx
+sd/inc/sderror.hxx
+sd/inc/sdfilter.hxx
+sd/inc/sdiocmpt.hxx
+sd/inc/sdmod.hxx
+sd/inc/sdpage.hxx
+sd/inc/sdpptwrp.hxx
+sd/inc/sdundo.hxx
+sd/inc/sdxmlwrp.hxx
+sd/inc/shapelist.hxx
+sd/inc/stlfamily.hxx
+sd/inc/stlpool.hxx
+sd/inc/stlsheet.hxx
+sd/inc/strings.hxx
+sd/inc/textapi.hxx
+sd/inc/undo/undofactory.hxx
+sd/inc/undo/undomanager.hxx
+sd/qa/unit/SVGExportTests.cxx
+sd/qa/unit/activex-controls-tests.cxx
+sd/qa/unit/dialogs-test.cxx
+sd/qa/unit/export-tests-ooxml1.cxx
+sd/qa/unit/export-tests-ooxml2.cxx
+sd/qa/unit/export-tests.cxx
+sd/qa/unit/filters-test.cxx
+sd/qa/unit/import-tests.cxx
+sd/qa/unit/misc-tests.cxx
+sd/qa/unit/sdmodeltestbase.hxx
+sd/qa/unit/tiledrendering/tiledrendering.cxx
+sd/qa/unit/uimpress.cxx
+sd/source/core/CustomAnimationCloner.cxx
+sd/source/core/CustomAnimationEffect.cxx
+sd/source/core/CustomAnimationPreset.cxx
+sd/source/core/EffectMigration.cxx
+sd/source/core/PageListWatcher.cxx
+sd/source/core/PageListWatcher.hxx
+sd/source/core/TransitionPreset.cxx
+sd/source/core/anminfo.cxx
+sd/source/core/annotations/Annotation.cxx
+sd/source/core/annotations/AnnotationEnumeration.cxx
+sd/source/core/cusshow.cxx
+sd/source/core/drawdoc.cxx
+sd/source/core/drawdoc2.cxx
+sd/source/core/drawdoc3.cxx
+sd/source/core/drawdoc4.cxx
+sd/source/core/pglink.cxx
+sd/source/core/sdiocmpt.cxx
+sd/source/core/sdpage.cxx
+sd/source/core/sdpage2.cxx
+sd/source/core/sdpage_animations.cxx
+sd/source/core/shapelist.cxx
+sd/source/core/stlfamily.cxx
+sd/source/core/stlpool.cxx
+sd/source/core/stlsheet.cxx
+sd/source/core/text/textapi.cxx
+sd/source/core/undo/undofactory.cxx
+sd/source/core/undo/undomanager.cxx
+sd/source/core/undo/undoobjects.cxx
+sd/source/core/undoanim.cxx
+sd/source/filter/cgm/sdcgmfilter.cxx
+sd/source/filter/eppt/eppt.cxx
+sd/source/filter/eppt/eppt.hxx
+sd/source/filter/eppt/epptbase.hxx
+sd/source/filter/eppt/epptdef.hxx
+sd/source/filter/eppt/epptooxml.hxx
+sd/source/filter/eppt/epptso.cxx
+sd/source/filter/eppt/escherex.cxx
+sd/source/filter/eppt/escherex.hxx
+sd/source/filter/eppt/grouptable.hxx
+sd/source/filter/eppt/pptexanimations.cxx
+sd/source/filter/eppt/pptexanimations.hxx
+sd/source/filter/eppt/pptexsoundcollection.cxx
+sd/source/filter/eppt/pptexsoundcollection.hxx
+sd/source/filter/eppt/pptx-epptbase.cxx
+sd/source/filter/eppt/pptx-epptooxml.cxx
+sd/source/filter/eppt/pptx-grouptable.cxx
+sd/source/filter/eppt/pptx-stylesheet.cxx
+sd/source/filter/eppt/pptx-text.cxx
+sd/source/filter/eppt/text.hxx
+sd/source/filter/grf/sdgrffilter.cxx
+sd/source/filter/html/HtmlOptionsDialog.cxx
+sd/source/filter/html/buttonset.cxx
+sd/source/filter/html/htmlattr.cxx
+sd/source/filter/html/htmlattr.hxx
+sd/source/filter/html/htmlex.cxx
+sd/source/filter/html/htmlex.hxx
+sd/source/filter/html/pubdlg.cxx
+sd/source/filter/ppt/ppt97animations.cxx
+sd/source/filter/ppt/ppt97animations.hxx
+sd/source/filter/ppt/pptanimations.hxx
+sd/source/filter/ppt/pptatom.cxx
+sd/source/filter/ppt/pptin.cxx
+sd/source/filter/ppt/pptin.hxx
+sd/source/filter/ppt/pptinanimations.cxx
+sd/source/filter/ppt/pptinanimations.hxx
+sd/source/filter/ppt/propread.cxx
+sd/source/filter/ppt/propread.hxx
+sd/source/filter/sdfilter.cxx
+sd/source/filter/sdpptwrp.cxx
+sd/source/filter/xml/sdtransform.cxx
+sd/source/filter/xml/sdxmlwrp.cxx
+sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx
+sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx
+sd/source/ui/accessibility/AccessibleOutlineEditSource.cxx
+sd/source/ui/accessibility/AccessibleOutlineView.cxx
+sd/source/ui/accessibility/AccessiblePageShape.cxx
+sd/source/ui/accessibility/AccessibleSlideSorterObject.cxx
+sd/source/ui/accessibility/AccessibleSlideSorterView.cxx
+sd/source/ui/accessibility/SdShapeTypes.cxx
+sd/source/ui/animations/CustomAnimationDialog.cxx
+sd/source/ui/animations/CustomAnimationDialog.hxx
+sd/source/ui/animations/CustomAnimationList.cxx
+sd/source/ui/animations/CustomAnimationPane.cxx
+sd/source/ui/animations/STLPropertySet.cxx
+sd/source/ui/animations/STLPropertySet.hxx
+sd/source/ui/animations/SlideTransitionPane.cxx
+sd/source/ui/animations/motionpathtag.cxx
+sd/source/ui/animations/motionpathtag.hxx
+sd/source/ui/annotations/annotationmanager.cxx
+sd/source/ui/annotations/annotationmanagerimpl.hxx
+sd/source/ui/annotations/annotationtag.cxx
+sd/source/ui/annotations/annotationtag.hxx
+sd/source/ui/annotations/annotationwindow.cxx
+sd/source/ui/annotations/annotationwindow.hxx
+sd/source/ui/app/optsitem.cxx
+sd/source/ui/app/sddll.cxx
+sd/source/ui/app/sdmod.cxx
+sd/source/ui/app/sdmod1.cxx
+sd/source/ui/app/sdmod2.cxx
+sd/source/ui/app/sdpopup.cxx
+sd/source/ui/app/sdxfer.cxx
+sd/source/ui/app/tmplctrl.cxx
+sd/source/ui/controller/displaymodecontroller.cxx
+sd/source/ui/controller/slidelayoutcontroller.cxx
+sd/source/ui/dlg/AnimationChildWindow.cxx
+sd/source/ui/dlg/LayerTabBar.cxx
+sd/source/ui/dlg/NavigatorChildWindow.cxx
+sd/source/ui/dlg/PaneChildWindows.cxx
+sd/source/ui/dlg/PaneDockingWindow.cxx
+sd/source/ui/dlg/PaneShells.cxx
+sd/source/ui/dlg/PhotoAlbumDialog.cxx
+sd/source/ui/dlg/PhotoAlbumDialog.hxx
+sd/source/ui/dlg/RemoteDialogClientBox.cxx
+sd/source/ui/dlg/RemoteDialogClientBox.hxx
+sd/source/ui/dlg/SpellDialogChildWindow.cxx
+sd/source/ui/dlg/TemplateScanner.cxx
+sd/source/ui/dlg/animobjs.cxx
+sd/source/ui/dlg/assclass.cxx
+sd/source/ui/dlg/brkdlg.cxx
+sd/source/ui/dlg/copydlg.cxx
+sd/source/ui/dlg/custsdlg.cxx
+sd/source/ui/dlg/diactrl.cxx
+sd/source/ui/dlg/dlgchar.cxx
+sd/source/ui/dlg/dlgfield.cxx
+sd/source/ui/dlg/dlgolbul.cxx
+sd/source/ui/dlg/dlgsnap.cxx
+sd/source/ui/dlg/filedlg.cxx
+sd/source/ui/dlg/gluectrl.cxx
+sd/source/ui/dlg/headerfooterdlg.cxx
+sd/source/ui/dlg/inspagob.cxx
+sd/source/ui/dlg/layeroptionsdlg.cxx
+sd/source/ui/dlg/masterlayoutdlg.cxx
+sd/source/ui/dlg/morphdlg.cxx
+sd/source/ui/dlg/navigatr.cxx
+sd/source/ui/dlg/paragr.cxx
+sd/source/ui/dlg/present.cxx
+sd/source/ui/dlg/prltempl.cxx
+sd/source/ui/dlg/prntopts.cxx
+sd/source/ui/dlg/sddlgfact.cxx
+sd/source/ui/dlg/sddlgfact.hxx
+sd/source/ui/dlg/sdpreslt.cxx
+sd/source/ui/dlg/sdtreelb.cxx
+sd/source/ui/dlg/tabtempl.cxx
+sd/source/ui/dlg/titledockwin.cxx
+sd/source/ui/dlg/tpaction.cxx
+sd/source/ui/dlg/tpoption.cxx
+sd/source/ui/dlg/unchss.cxx
+sd/source/ui/dlg/vectdlg.cxx
+sd/source/ui/docshell/docshel2.cxx
+sd/source/ui/docshell/docshel3.cxx
+sd/source/ui/docshell/docshel4.cxx
+sd/source/ui/docshell/docshell.cxx
+sd/source/ui/docshell/sdclient.cxx
+sd/source/ui/framework/configuration/ChangeRequestQueueProcessor.cxx
+sd/source/ui/framework/configuration/Configuration.cxx
+sd/source/ui/framework/configuration/ConfigurationClassifier.cxx
+sd/source/ui/framework/configuration/ConfigurationController.cxx
+sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.cxx
+sd/source/ui/framework/configuration/ConfigurationControllerBroadcaster.hxx
+sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.cxx
+sd/source/ui/framework/configuration/ConfigurationControllerResourceManager.hxx
+sd/source/ui/framework/configuration/ConfigurationTracer.cxx
+sd/source/ui/framework/configuration/ConfigurationUpdater.cxx
+sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.cxx
+sd/source/ui/framework/configuration/GenericConfigurationChangeRequest.hxx
+sd/source/ui/framework/configuration/ResourceFactoryManager.cxx
+sd/source/ui/framework/configuration/ResourceFactoryManager.hxx
+sd/source/ui/framework/configuration/ResourceId.cxx
+sd/source/ui/framework/configuration/UpdateRequest.hxx
+sd/source/ui/framework/factories/BasicPaneFactory.cxx
+sd/source/ui/framework/factories/BasicPaneFactory.hxx
+sd/source/ui/framework/factories/BasicToolBarFactory.cxx
+sd/source/ui/framework/factories/BasicToolBarFactory.hxx
+sd/source/ui/framework/factories/BasicViewFactory.cxx
+sd/source/ui/framework/factories/BasicViewFactory.hxx
+sd/source/ui/framework/factories/ChildWindowPane.cxx
+sd/source/ui/framework/factories/ChildWindowPane.hxx
+sd/source/ui/framework/factories/FullScreenPane.cxx
+sd/source/ui/framework/factories/FullScreenPane.hxx
+sd/source/ui/framework/factories/Pane.cxx
+sd/source/ui/framework/factories/PresentationFactory.cxx
+sd/source/ui/framework/factories/ViewShellWrapper.cxx
+sd/source/ui/framework/module/CenterViewFocusModule.cxx
+sd/source/ui/framework/module/ImpressModule.cxx
+sd/source/ui/framework/module/ModuleController.cxx
+sd/source/ui/framework/module/ShellStackGuard.cxx
+sd/source/ui/framework/module/SlideSorterModule.cxx
+sd/source/ui/framework/module/SlideSorterModule.hxx
+sd/source/ui/framework/module/ToolBarModule.cxx
+sd/source/ui/framework/module/ToolBarModule.hxx
+sd/source/ui/framework/module/ViewTabBarModule.cxx
+sd/source/ui/framework/module/ViewTabBarModule.hxx
+sd/source/ui/framework/tools/FrameworkHelper.cxx
+sd/source/ui/func/bulmaper.cxx
+sd/source/ui/func/fuarea.cxx
+sd/source/ui/func/fubullet.cxx
+sd/source/ui/func/fuchar.cxx
+sd/source/ui/func/fucon3d.cxx
+sd/source/ui/func/fuconarc.cxx
+sd/source/ui/func/fuconbez.cxx
+sd/source/ui/func/fuconcs.cxx
+sd/source/ui/func/fuconnct.cxx
+sd/source/ui/func/fuconrec.cxx
+sd/source/ui/func/fuconstr.cxx
+sd/source/ui/func/fuconuno.cxx
+sd/source/ui/func/fucopy.cxx
+sd/source/ui/func/fucushow.cxx
+sd/source/ui/func/fudraw.cxx
+sd/source/ui/func/fudspord.cxx
+sd/source/ui/func/fuediglu.cxx
+sd/source/ui/func/fuexpand.cxx
+sd/source/ui/func/fuformatpaintbrush.cxx
+sd/source/ui/func/fuhhconv.cxx
+sd/source/ui/func/fuinsert.cxx
+sd/source/ui/func/fuinsfil.cxx
+sd/source/ui/func/fuline.cxx
+sd/source/ui/func/fulinend.cxx
+sd/source/ui/func/fulink.cxx
+sd/source/ui/func/fumeasur.cxx
+sd/source/ui/func/fumorph.cxx
+sd/source/ui/func/funavig.cxx
+sd/source/ui/func/fuoaprms.cxx
+sd/source/ui/func/fuolbull.cxx
+sd/source/ui/func/fuoltext.cxx
+sd/source/ui/func/fupage.cxx
+sd/source/ui/func/fuparagr.cxx
+sd/source/ui/func/fupoor.cxx
+sd/source/ui/func/fuprlout.cxx
+sd/source/ui/func/fuprobjs.cxx
+sd/source/ui/func/fuscale.cxx
+sd/source/ui/func/fusearch.cxx
+sd/source/ui/func/fusel.cxx
+sd/source/ui/func/fusldlg.cxx
+sd/source/ui/func/fusnapln.cxx
+sd/source/ui/func/fusumry.cxx
+sd/source/ui/func/futempl.cxx
+sd/source/ui/func/futext.cxx
+sd/source/ui/func/futhes.cxx
+sd/source/ui/func/futransf.cxx
+sd/source/ui/func/futxtatt.cxx
+sd/source/ui/func/fuvect.cxx
+sd/source/ui/func/fuzoom.cxx
+sd/source/ui/func/smarttag.cxx
+sd/source/ui/func/undoback.cxx
+sd/source/ui/func/undoheaderfooter.cxx
+sd/source/ui/func/undolayer.cxx
+sd/source/ui/func/undopage.cxx
+sd/source/ui/func/unmovss.cxx
+sd/source/ui/func/unoaprms.cxx
+sd/source/ui/func/unprlout.cxx
+sd/source/ui/inc/AccessibleDocumentViewBase.hxx
+sd/source/ui/inc/AccessibleDrawDocumentView.hxx
+sd/source/ui/inc/AccessibleOutlineEditSource.hxx
+sd/source/ui/inc/AccessibleOutlineView.hxx
+sd/source/ui/inc/AccessiblePageShape.hxx
+sd/source/ui/inc/AccessiblePresentationGraphicShape.hxx
+sd/source/ui/inc/AccessiblePresentationOLEShape.hxx
+sd/source/ui/inc/AccessiblePresentationShape.hxx
+sd/source/ui/inc/AccessibleSlideSorterObject.hxx
+sd/source/ui/inc/AccessibleSlideSorterView.hxx
+sd/source/ui/inc/AnimationChildWindow.hxx
+sd/source/ui/inc/CustomAnimationList.hxx
+sd/source/ui/inc/CustomAnimationPane.hxx
+sd/source/ui/inc/DocumentRenderer.hxx
+sd/source/ui/inc/DrawController.hxx
+sd/source/ui/inc/DrawDocShell.hxx
+sd/source/ui/inc/DrawSubController.hxx
+sd/source/ui/inc/DrawViewShell.hxx
+sd/source/ui/inc/FrameView.hxx
+sd/source/ui/inc/GraphicObjectBar.hxx
+sd/source/ui/inc/LayerTabBar.hxx
+sd/source/ui/inc/MediaObjectBar.hxx
+sd/source/ui/inc/NavigatorChildWindow.hxx
+sd/source/ui/inc/OutlineView.hxx
+sd/source/ui/inc/OutlineViewShell.hxx
+sd/source/ui/inc/OutlinerIteratorImpl.hxx
+sd/source/ui/inc/PaneChildWindows.hxx
+sd/source/ui/inc/PaneDockingWindow.hxx
+sd/source/ui/inc/PreviewRenderer.hxx
+sd/source/ui/inc/RemoteServer.hxx
+sd/source/ui/inc/Ruler.hxx
+sd/source/ui/inc/SdUnoDrawView.hxx
+sd/source/ui/inc/SdUnoOutlineView.hxx
+sd/source/ui/inc/SdUnoSlideView.hxx
+sd/source/ui/inc/SlideSorter.hxx
+sd/source/ui/inc/SlideSorterViewShell.hxx
+sd/source/ui/inc/SlideTransitionPane.hxx
+sd/source/ui/inc/TabControl.hxx
+sd/source/ui/inc/TableDesignPane.hxx
+sd/source/ui/inc/TextObjectBar.hxx
+sd/source/ui/inc/ToolBarManager.hxx
+sd/source/ui/inc/View.hxx
+sd/source/ui/inc/ViewShell.hxx
+sd/source/ui/inc/ViewShellBase.hxx
+sd/source/ui/inc/ViewTabBar.hxx
+sd/source/ui/inc/animobjs.hxx
+sd/source/ui/inc/assclass.hxx
+sd/source/ui/inc/custsdlg.hxx
+sd/source/ui/inc/dlgfield.hxx
+sd/source/ui/inc/dlgpage.hxx
+sd/source/ui/inc/dlgsnap.hxx
+sd/source/ui/inc/drawview.hxx
+sd/source/ui/inc/framework/Configuration.hxx
+sd/source/ui/inc/framework/ConfigurationController.hxx
+sd/source/ui/inc/framework/FrameworkHelper.hxx
+sd/source/ui/inc/framework/ModuleController.hxx
+sd/source/ui/inc/framework/Pane.hxx
+sd/source/ui/inc/framework/PresentationFactory.hxx
+sd/source/ui/inc/framework/ResourceId.hxx
+sd/source/ui/inc/framework/ViewShellWrapper.hxx
+sd/source/ui/inc/fuarea.hxx
+sd/source/ui/inc/fubullet.hxx
+sd/source/ui/inc/fuchar.hxx
+sd/source/ui/inc/fucon3d.hxx
+sd/source/ui/inc/fuconarc.hxx
+sd/source/ui/inc/fuconbez.hxx
+sd/source/ui/inc/fuconcs.hxx
+sd/source/ui/inc/fuconnct.hxx
+sd/source/ui/inc/fuconrec.hxx
+sd/source/ui/inc/fuconstr.hxx
+sd/source/ui/inc/fuconuno.hxx
+sd/source/ui/inc/fucopy.hxx
+sd/source/ui/inc/fucushow.hxx
+sd/source/ui/inc/fudraw.hxx
+sd/source/ui/inc/fudspord.hxx
+sd/source/ui/inc/fuediglu.hxx
+sd/source/ui/inc/fuexpand.hxx
+sd/source/ui/inc/fuformatpaintbrush.hxx
+sd/source/ui/inc/fuhhconv.hxx
+sd/source/ui/inc/fuinsert.hxx
+sd/source/ui/inc/fuinsfil.hxx
+sd/source/ui/inc/fuline.hxx
+sd/source/ui/inc/fulinend.hxx
+sd/source/ui/inc/fulink.hxx
+sd/source/ui/inc/fumeasur.hxx
+sd/source/ui/inc/fumorph.hxx
+sd/source/ui/inc/funavig.hxx
+sd/source/ui/inc/fuoaprms.hxx
+sd/source/ui/inc/fuolbull.hxx
+sd/source/ui/inc/fuoltext.hxx
+sd/source/ui/inc/fupage.hxx
+sd/source/ui/inc/fuparagr.hxx
+sd/source/ui/inc/fupoor.hxx
+sd/source/ui/inc/fuprlout.hxx
+sd/source/ui/inc/fuprobjs.hxx
+sd/source/ui/inc/fuscale.hxx
+sd/source/ui/inc/fusearch.hxx
+sd/source/ui/inc/fusel.hxx
+sd/source/ui/inc/fusldlg.hxx
+sd/source/ui/inc/fusnapln.hxx
+sd/source/ui/inc/fusumry.hxx
+sd/source/ui/inc/futempl.hxx
+sd/source/ui/inc/futext.hxx
+sd/source/ui/inc/futhes.hxx
+sd/source/ui/inc/futransf.hxx
+sd/source/ui/inc/futxtatt.hxx
+sd/source/ui/inc/fuvect.hxx
+sd/source/ui/inc/fuzoom.hxx
+sd/source/ui/inc/headerfooterdlg.hxx
+sd/source/ui/inc/inspagob.hxx
+sd/source/ui/inc/layeroptionsdlg.hxx
+sd/source/ui/inc/masterlayoutdlg.hxx
+sd/source/ui/inc/morphdlg.hxx
+sd/source/ui/inc/navigatr.hxx
+sd/source/ui/inc/optsitem.hxx
+sd/source/ui/inc/present.hxx
+sd/source/ui/inc/prltempl.hxx
+sd/source/ui/inc/sdpopup.hxx
+sd/source/ui/inc/sdpreslt.hxx
+sd/source/ui/inc/sdtreelb.hxx
+sd/source/ui/inc/sdundogr.hxx
+sd/source/ui/inc/sdxfer.hxx
+sd/source/ui/inc/slideshow.hxx
+sd/source/ui/inc/tabtempl.hxx
+sd/source/ui/inc/tmplctrl.hxx
+sd/source/ui/inc/titledockwin.hxx
+sd/source/ui/inc/tools/ConfigurationAccess.hxx
+sd/source/ui/inc/tools/IdleDetection.hxx
+sd/source/ui/inc/tools/PropertySet.hxx
+sd/source/ui/inc/tools/SlotStateListener.hxx
+sd/source/ui/inc/tools/TimerBasedTaskExecution.hxx
+sd/source/ui/inc/tpaction.hxx
+sd/source/ui/inc/tpoption.hxx
+sd/source/ui/inc/undoback.hxx
+sd/source/ui/inc/undoheaderfooter.hxx
+sd/source/ui/inc/undolayer.hxx
+sd/source/ui/inc/undopage.hxx
+sd/source/ui/inc/unmodpg.hxx
+sd/source/ui/inc/unmovss.hxx
+sd/source/ui/inc/unoaprms.hxx
+sd/source/ui/inc/unomodel.hxx
+sd/source/ui/inc/unopage.hxx
+sd/source/ui/inc/unoprnms.hxx
+sd/source/ui/inc/unosrch.hxx
+sd/source/ui/inc/unprlout.hxx
+sd/source/ui/inc/vectdlg.hxx
+sd/source/ui/presenter/CanvasUpdateRequester.cxx
+sd/source/ui/presenter/PresenterCanvas.cxx
+sd/source/ui/presenter/PresenterCanvas.hxx
+sd/source/ui/presenter/PresenterHelper.cxx
+sd/source/ui/presenter/PresenterHelper.hxx
+sd/source/ui/presenter/PresenterPreviewCache.cxx
+sd/source/ui/presenter/PresenterPreviewCache.hxx
+sd/source/ui/presenter/PresenterTextView.cxx
+sd/source/ui/presenter/PresenterTextView.hxx
+sd/source/ui/presenter/SlideRenderer.cxx
+sd/source/ui/presenter/SlideRenderer.hxx
+sd/source/ui/remotecontrol/AvahiNetworkService.cxx
+sd/source/ui/remotecontrol/AvahiNetworkService.hxx
+sd/source/ui/remotecontrol/BluetoothServer.cxx
+sd/source/ui/remotecontrol/BluetoothServer.hxx
+sd/source/ui/remotecontrol/BluetoothServiceRecord.hxx
+sd/source/ui/remotecontrol/BufferedStreamSocket.cxx
+sd/source/ui/remotecontrol/BufferedStreamSocket.hxx
+sd/source/ui/remotecontrol/Communicator.cxx
+sd/source/ui/remotecontrol/Communicator.hxx
+sd/source/ui/remotecontrol/DiscoveryService.cxx
+sd/source/ui/remotecontrol/DiscoveryService.hxx
+sd/source/ui/remotecontrol/IBluetoothSocket.hxx
+sd/source/ui/remotecontrol/ImagePreparer.cxx
+sd/source/ui/remotecontrol/ImagePreparer.hxx
+sd/source/ui/remotecontrol/Listener.cxx
+sd/source/ui/remotecontrol/Listener.hxx
+sd/source/ui/remotecontrol/OSXBluetooth.h
+sd/source/ui/remotecontrol/OSXBluetoothWrapper.hxx
+sd/source/ui/remotecontrol/OSXNetworkService.hxx
+sd/source/ui/remotecontrol/Receiver.cxx
+sd/source/ui/remotecontrol/Receiver.hxx
+sd/source/ui/remotecontrol/Server.cxx
+sd/source/ui/remotecontrol/Transmitter.cxx
+sd/source/ui/remotecontrol/Transmitter.hxx
+sd/source/ui/remotecontrol/WINNetworkService.cxx
+sd/source/ui/remotecontrol/WINNetworkService.hxx
+sd/source/ui/remotecontrol/ZeroconfService.hxx
+sd/source/ui/sidebar/AllMasterPagesSelector.cxx
+sd/source/ui/sidebar/AllMasterPagesSelector.hxx
+sd/source/ui/sidebar/CurrentMasterPagesSelector.cxx
+sd/source/ui/sidebar/CurrentMasterPagesSelector.hxx
+sd/source/ui/sidebar/DocumentHelper.cxx
+sd/source/ui/sidebar/DocumentHelper.hxx
+sd/source/ui/sidebar/LayoutMenu.cxx
+sd/source/ui/sidebar/MasterPageContainer.cxx
+sd/source/ui/sidebar/MasterPageContainerFiller.cxx
+sd/source/ui/sidebar/MasterPageContainerProviders.cxx
+sd/source/ui/sidebar/MasterPageContainerQueue.cxx
+sd/source/ui/sidebar/MasterPageContainerQueue.hxx
+sd/source/ui/sidebar/MasterPageDescriptor.cxx
+sd/source/ui/sidebar/MasterPageDescriptor.hxx
+sd/source/ui/sidebar/MasterPageObserver.cxx
+sd/source/ui/sidebar/MasterPagesSelector.cxx
+sd/source/ui/sidebar/MasterPagesSelector.hxx
+sd/source/ui/sidebar/NavigatorWrapper.cxx
+sd/source/ui/sidebar/NavigatorWrapper.hxx
+sd/source/ui/sidebar/PageMarginUtils.hxx
+sd/source/ui/sidebar/PanelFactory.cxx
+sd/source/ui/sidebar/PanelFactory.hxx
+sd/source/ui/sidebar/PreviewValueSet.cxx
+sd/source/ui/sidebar/RecentMasterPagesSelector.cxx
+sd/source/ui/sidebar/RecentMasterPagesSelector.hxx
+sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx
+sd/source/ui/sidebar/RecentlyUsedMasterPages.hxx
+sd/source/ui/sidebar/SlideBackground.cxx
+sd/source/ui/sidebar/SlideBackground.hxx
+sd/source/ui/sidebar/SlideTransitionPanel.cxx
+sd/source/ui/sidebar/SlideTransitionPanel.hxx
+sd/source/ui/slideshow/SlideShowRestarter.cxx
+sd/source/ui/slideshow/showwin.cxx
+sd/source/ui/slideshow/showwindow.hxx
+sd/source/ui/slideshow/slideshow.cxx
+sd/source/ui/slideshow/slideshowimpl.cxx
+sd/source/ui/slideshow/slideshowimpl.hxx
+sd/source/ui/slideshow/slideshowviewimpl.cxx
+sd/source/ui/slideshow/slideshowviewimpl.hxx
+sd/source/ui/slidesorter/cache/SlsBitmapCache.cxx
+sd/source/ui/slidesorter/cache/SlsBitmapCompressor.cxx
+sd/source/ui/slidesorter/cache/SlsBitmapFactory.cxx
+sd/source/ui/slidesorter/cache/SlsCacheCompactor.cxx
+sd/source/ui/slidesorter/cache/SlsCacheCompactor.hxx
+sd/source/ui/slidesorter/cache/SlsCacheConfiguration.cxx
+sd/source/ui/slidesorter/cache/SlsGenericPageCache.cxx
+sd/source/ui/slidesorter/cache/SlsGenericPageCache.hxx
+sd/source/ui/slidesorter/cache/SlsPageCache.cxx
+sd/source/ui/slidesorter/cache/SlsPageCacheManager.cxx
+sd/source/ui/slidesorter/cache/SlsQueueProcessor.cxx
+sd/source/ui/slidesorter/cache/SlsQueueProcessor.hxx
+sd/source/ui/slidesorter/cache/SlsRequestFactory.cxx
+sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx
+sd/source/ui/slidesorter/controller/SlideSorterController.cxx
+sd/source/ui/slidesorter/controller/SlsAnimationFunction.cxx
+sd/source/ui/slidesorter/controller/SlsAnimator.cxx
+sd/source/ui/slidesorter/controller/SlsClipboard.cxx
+sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx
+sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx
+sd/source/ui/slidesorter/controller/SlsFocusManager.cxx
+sd/source/ui/slidesorter/controller/SlsInsertionIndicatorHandler.cxx
+sd/source/ui/slidesorter/controller/SlsListener.cxx
+sd/source/ui/slidesorter/controller/SlsListener.hxx
+sd/source/ui/slidesorter/controller/SlsPageSelector.cxx
+sd/source/ui/slidesorter/controller/SlsProperties.cxx
+sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx
+sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx
+sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx
+sd/source/ui/slidesorter/controller/SlsSlotManager.cxx
+sd/source/ui/slidesorter/controller/SlsTransferableData.cxx
+sd/source/ui/slidesorter/controller/SlsVisibleAreaManager.cxx
+sd/source/ui/slidesorter/inc/cache/SlsPageCacheManager.hxx
+sd/source/ui/slidesorter/inc/controller/SlsAnimationFunction.hxx
+sd/source/ui/slidesorter/inc/controller/SlsAnimator.hxx
+sd/source/ui/slidesorter/inc/controller/SlsClipboard.hxx
+sd/source/ui/slidesorter/inc/controller/SlsInsertionIndicatorHandler.hxx
+sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx
+sd/source/ui/slidesorter/inc/controller/SlsTransferableData.hxx
+sd/source/ui/slidesorter/inc/model/SlsPageDescriptor.hxx
+sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx
+sd/source/ui/slidesorter/inc/view/SlsILayerPainter.hxx
+sd/source/ui/slidesorter/inc/view/SlsInsertionIndicatorOverlay.hxx
+sd/source/ui/slidesorter/inc/view/SlsLayouter.hxx
+sd/source/ui/slidesorter/inc/view/SlsPageObjectLayouter.hxx
+sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx
+sd/source/ui/slidesorter/inc/view/SlsTheme.hxx
+sd/source/ui/slidesorter/model/SlideSorterModel.cxx
+sd/source/ui/slidesorter/model/SlsPageDescriptor.cxx
+sd/source/ui/slidesorter/model/SlsPageEnumeration.cxx
+sd/source/ui/slidesorter/model/SlsPageEnumerationProvider.cxx
+sd/source/ui/slidesorter/shell/SlideSorter.cxx
+sd/source/ui/slidesorter/shell/SlideSorterService.cxx
+sd/source/ui/slidesorter/shell/SlideSorterService.hxx
+sd/source/ui/slidesorter/shell/SlideSorterViewShell.cxx
+sd/source/ui/slidesorter/view/SlideSorterView.cxx
+sd/source/ui/slidesorter/view/SlsFramePainter.cxx
+sd/source/ui/slidesorter/view/SlsFramePainter.hxx
+sd/source/ui/slidesorter/view/SlsInsertAnimator.cxx
+sd/source/ui/slidesorter/view/SlsInsertionIndicatorOverlay.cxx
+sd/source/ui/slidesorter/view/SlsLayeredDevice.cxx
+sd/source/ui/slidesorter/view/SlsLayeredDevice.hxx
+sd/source/ui/slidesorter/view/SlsLayouter.cxx
+sd/source/ui/slidesorter/view/SlsPageObjectLayouter.cxx
+sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx
+sd/source/ui/slidesorter/view/SlsTheme.cxx
+sd/source/ui/slidesorter/view/SlsToolTip.cxx
+sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx
+sd/source/ui/table/TableDesignPane.cxx
+sd/source/ui/table/tablefunction.cxx
+sd/source/ui/table/tableobjectbar.cxx
+sd/source/ui/table/tableobjectbar.hxx
+sd/source/ui/tools/ConfigurationAccess.cxx
+sd/source/ui/tools/EventMultiplexer.cxx
+sd/source/ui/tools/IdleDetection.cxx
+sd/source/ui/tools/PreviewRenderer.cxx
+sd/source/ui/tools/PropertySet.cxx
+sd/source/ui/tools/SdGlobalResourceContainer.cxx
+sd/source/ui/tools/SlotStateListener.cxx
+sd/source/ui/tools/TimerBasedTaskExecution.cxx
+sd/source/ui/unoidl/DrawController.cxx
+sd/source/ui/unoidl/SdUnoDrawView.cxx
+sd/source/ui/unoidl/SdUnoOutlineView.cxx
+sd/source/ui/unoidl/SdUnoSlideView.cxx
+sd/source/ui/unoidl/UnoDocumentSettings.cxx
+sd/source/ui/unoidl/randomnode.cxx
+sd/source/ui/unoidl/sddetect.cxx
+sd/source/ui/unoidl/sddetect.hxx
+sd/source/ui/unoidl/unocpres.cxx
+sd/source/ui/unoidl/unocpres.hxx
+sd/source/ui/unoidl/unodoc.cxx
+sd/source/ui/unoidl/unolayer.cxx
+sd/source/ui/unoidl/unolayer.hxx
+sd/source/ui/unoidl/unomodel.cxx
+sd/source/ui/unoidl/unomodule.cxx
+sd/source/ui/unoidl/unomodule.hxx
+sd/source/ui/unoidl/unoobj.cxx
+sd/source/ui/unoidl/unoobj.hxx
+sd/source/ui/unoidl/unopage.cxx
+sd/source/ui/unoidl/unopback.cxx
+sd/source/ui/unoidl/unopback.hxx
+sd/source/ui/unoidl/unopool.cxx
+sd/source/ui/unoidl/unosrch.cxx
+sd/source/ui/unoidl/unowcntr.cxx
+sd/source/ui/unoidl/unowcntr.hxx
+sd/source/ui/view/DocumentRenderer.cxx
+sd/source/ui/view/FormShellManager.cxx
+sd/source/ui/view/GraphicObjectBar.cxx
+sd/source/ui/view/ImpressViewShellBase.cxx
+sd/source/ui/view/OutlineViewShellBase.cxx
+sd/source/ui/view/Outliner.cxx
+sd/source/ui/view/OutlinerIterator.cxx
+sd/source/ui/view/PresentationViewShellBase.cxx
+sd/source/ui/view/SlideSorterViewShellBase.cxx
+sd/source/ui/view/ToolBarManager.cxx
+sd/source/ui/view/ViewClipboard.cxx
+sd/source/ui/view/ViewShellBase.cxx
+sd/source/ui/view/ViewShellImplementation.cxx
+sd/source/ui/view/ViewShellManager.cxx
+sd/source/ui/view/ViewTabBar.cxx
+sd/source/ui/view/WindowUpdater.cxx
+sd/source/ui/view/drawview.cxx
+sd/source/ui/view/drbezob.cxx
+sd/source/ui/view/drtxtob.cxx
+sd/source/ui/view/drtxtob1.cxx
+sd/source/ui/view/drviews1.cxx
+sd/source/ui/view/drviews2.cxx
+sd/source/ui/view/drviews3.cxx
+sd/source/ui/view/drviews4.cxx
+sd/source/ui/view/drviews5.cxx
+sd/source/ui/view/drviews6.cxx
+sd/source/ui/view/drviews7.cxx
+sd/source/ui/view/drviews8.cxx
+sd/source/ui/view/drviews9.cxx
+sd/source/ui/view/drviewsa.cxx
+sd/source/ui/view/drviewsb.cxx
+sd/source/ui/view/drviewsc.cxx
+sd/source/ui/view/drviewsd.cxx
+sd/source/ui/view/drviewse.cxx
+sd/source/ui/view/drviewsf.cxx
+sd/source/ui/view/drviewsg.cxx
+sd/source/ui/view/drviewsh.cxx
+sd/source/ui/view/drviewsi.cxx
+sd/source/ui/view/drviewsj.cxx
+sd/source/ui/view/drviewsk.cxx
+sd/source/ui/view/frmview.cxx
+sd/source/ui/view/grviewsh.cxx
+sd/source/ui/view/outlnvs2.cxx
+sd/source/ui/view/outlnvsh.cxx
+sd/source/ui/view/outlview.cxx
+sd/source/ui/view/presvish.cxx
+sd/source/ui/view/sdruler.cxx
+sd/source/ui/view/sdview.cxx
+sd/source/ui/view/sdview2.cxx
+sd/source/ui/view/sdview3.cxx
+sd/source/ui/view/sdview4.cxx
+sd/source/ui/view/sdview5.cxx
+sd/source/ui/view/sdwindow.cxx
+sd/source/ui/view/tabcontr.cxx
+sd/source/ui/view/unmodpg.cxx
+sd/source/ui/view/viewoverlaymanager.cxx
+sd/source/ui/view/viewshe2.cxx
+sd/source/ui/view/viewshe3.cxx
+sd/source/ui/view/viewshel.cxx
+sd/workben/custompanel/ctp_panel.cxx
+sd/workben/custompanel/ctp_panel.hxx
+sdext/source/minimizer/configurationaccess.cxx
+sdext/source/minimizer/configurationaccess.hxx
+sdext/source/minimizer/fileopendialog.cxx
+sdext/source/minimizer/fileopendialog.hxx
+sdext/source/minimizer/graphiccollector.cxx
+sdext/source/minimizer/graphiccollector.hxx
+sdext/source/minimizer/impoptimizer.cxx
+sdext/source/minimizer/impoptimizer.hxx
+sdext/source/minimizer/informationdialog.cxx
+sdext/source/minimizer/informationdialog.hxx
+sdext/source/minimizer/optimizationstats.cxx
+sdext/source/minimizer/optimizationstats.hxx
+sdext/source/minimizer/optimizerdialog.cxx
+sdext/source/minimizer/optimizerdialog.hxx
+sdext/source/minimizer/optimizerdialogcontrols.cxx
+sdext/source/minimizer/pagecollector.cxx
+sdext/source/minimizer/pagecollector.hxx
+sdext/source/minimizer/pppoptimizerdialog.cxx
+sdext/source/minimizer/pppoptimizerdialog.hxx
+sdext/source/minimizer/pppoptimizertoken.cxx
+sdext/source/minimizer/unodialog.cxx
+sdext/source/minimizer/unodialog.hxx
+sdext/source/pdfimport/filterdet.cxx
+sdext/source/pdfimport/filterdet.hxx
+sdext/source/pdfimport/inc/contentsink.hxx
+sdext/source/pdfimport/inc/genericelements.hxx
+sdext/source/pdfimport/inc/imagecontainer.hxx
+sdext/source/pdfimport/inc/odfemitter.hxx
+sdext/source/pdfimport/inc/pdfihelper.hxx
+sdext/source/pdfimport/inc/pdfiprocessor.hxx
+sdext/source/pdfimport/inc/pdfparse.hxx
+sdext/source/pdfimport/inc/saxemitter.hxx
+sdext/source/pdfimport/inc/treevisiting.hxx
+sdext/source/pdfimport/inc/treevisitorfactory.hxx
+sdext/source/pdfimport/inc/wrapper.hxx
+sdext/source/pdfimport/inc/xmlemitter.hxx
+sdext/source/pdfimport/misc/pdfihelper.cxx
+sdext/source/pdfimport/misc/pwdinteract.cxx
+sdext/source/pdfimport/odf/odfemitter.cxx
+sdext/source/pdfimport/pdfiadaptor.cxx
+sdext/source/pdfimport/pdfiadaptor.hxx
+sdext/source/pdfimport/pdfparse/pdfentries.cxx
+sdext/source/pdfimport/pdfparse/pdfparse.cxx
+sdext/source/pdfimport/sax/emitcontext.cxx
+sdext/source/pdfimport/sax/emitcontext.hxx
+sdext/source/pdfimport/sax/saxattrlist.cxx
+sdext/source/pdfimport/sax/saxattrlist.hxx
+sdext/source/pdfimport/test/outputwrap.hxx
+sdext/source/pdfimport/test/pdf2xml.cxx
+sdext/source/pdfimport/test/pdfunzip.cxx
+sdext/source/pdfimport/test/tests.cxx
+sdext/source/pdfimport/tree/drawtreevisiting.cxx
+sdext/source/pdfimport/tree/drawtreevisiting.hxx
+sdext/source/pdfimport/tree/genericelements.cxx
+sdext/source/pdfimport/tree/imagecontainer.cxx
+sdext/source/pdfimport/tree/pdfiprocessor.cxx
+sdext/source/pdfimport/tree/style.cxx
+sdext/source/pdfimport/tree/style.hxx
+sdext/source/pdfimport/tree/treevisitorfactory.cxx
+sdext/source/pdfimport/tree/writertreevisiting.cxx
+sdext/source/pdfimport/tree/writertreevisiting.hxx
+sdext/source/pdfimport/wrapper/wrapper.cxx
+sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx
+sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx
+sdext/source/pdfimport/xpdfwrapper/pnghelper.cxx
+sdext/source/pdfimport/xpdfwrapper/pnghelper.hxx
+sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx
+sdext/source/presenter/PresenterAccessibility.cxx
+sdext/source/presenter/PresenterAccessibility.hxx
+sdext/source/presenter/PresenterBitmapContainer.cxx
+sdext/source/presenter/PresenterBitmapContainer.hxx
+sdext/source/presenter/PresenterButton.cxx
+sdext/source/presenter/PresenterButton.hxx
+sdext/source/presenter/PresenterCanvasHelper.cxx
+sdext/source/presenter/PresenterCanvasHelper.hxx
+sdext/source/presenter/PresenterConfigurationAccess.cxx
+sdext/source/presenter/PresenterConfigurationAccess.hxx
+sdext/source/presenter/PresenterController.cxx
+sdext/source/presenter/PresenterController.hxx
+sdext/source/presenter/PresenterCurrentSlideObserver.cxx
+sdext/source/presenter/PresenterCurrentSlideObserver.hxx
+sdext/source/presenter/PresenterFrameworkObserver.cxx
+sdext/source/presenter/PresenterFrameworkObserver.hxx
+sdext/source/presenter/PresenterGeometryHelper.cxx
+sdext/source/presenter/PresenterGeometryHelper.hxx
+sdext/source/presenter/PresenterHelpView.cxx
+sdext/source/presenter/PresenterHelpView.hxx
+sdext/source/presenter/PresenterHelper.cxx
+sdext/source/presenter/PresenterNotesView.cxx
+sdext/source/presenter/PresenterNotesView.hxx
+sdext/source/presenter/PresenterPaintManager.cxx
+sdext/source/presenter/PresenterPaintManager.hxx
+sdext/source/presenter/PresenterPane.cxx
+sdext/source/presenter/PresenterPaneBase.cxx
+sdext/source/presenter/PresenterPaneBase.hxx
+sdext/source/presenter/PresenterPaneBorderPainter.cxx
+sdext/source/presenter/PresenterPaneBorderPainter.hxx
+sdext/source/presenter/PresenterPaneContainer.cxx
+sdext/source/presenter/PresenterPaneContainer.hxx
+sdext/source/presenter/PresenterPaneFactory.cxx
+sdext/source/presenter/PresenterPaneFactory.hxx
+sdext/source/presenter/PresenterProtocolHandler.cxx
+sdext/source/presenter/PresenterProtocolHandler.hxx
+sdext/source/presenter/PresenterScreen.cxx
+sdext/source/presenter/PresenterScreen.hxx
+sdext/source/presenter/PresenterScrollBar.cxx
+sdext/source/presenter/PresenterScrollBar.hxx
+sdext/source/presenter/PresenterSlidePreview.cxx
+sdext/source/presenter/PresenterSlidePreview.hxx
+sdext/source/presenter/PresenterSlideShowView.cxx
+sdext/source/presenter/PresenterSlideShowView.hxx
+sdext/source/presenter/PresenterSlideSorter.cxx
+sdext/source/presenter/PresenterSlideSorter.hxx
+sdext/source/presenter/PresenterSprite.cxx
+sdext/source/presenter/PresenterSpritePane.cxx
+sdext/source/presenter/PresenterTextView.cxx
+sdext/source/presenter/PresenterTextView.hxx
+sdext/source/presenter/PresenterTheme.cxx
+sdext/source/presenter/PresenterTheme.hxx
+sdext/source/presenter/PresenterTimer.cxx
+sdext/source/presenter/PresenterTimer.hxx
+sdext/source/presenter/PresenterToolBar.cxx
+sdext/source/presenter/PresenterToolBar.hxx
+sdext/source/presenter/PresenterUIPainter.cxx
+sdext/source/presenter/PresenterViewFactory.cxx
+sdext/source/presenter/PresenterViewFactory.hxx
+sdext/source/presenter/PresenterWindowManager.cxx
+sdext/source/presenter/PresenterWindowManager.hxx
+setup_native/source/win32/customactions/indexingfilter/restartindexingservice.cxx
+setup_native/source/win32/customactions/quickstarter/quickstarter.cxx
+setup_native/source/win32/customactions/quickstarter/shutdown_quickstart.cxx
+setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx
+setup_native/source/win32/customactions/regactivex/regactivex.cxx
+setup_native/source/win32/customactions/sellang/sellang.cxx
+setup_native/source/win32/customactions/shellextensions/checkpatches.cxx
+setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx
+setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx
+setup_native/source/win32/customactions/shellextensions/shlxtmsi.hxx
+setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx
+setup_native/source/win32/customactions/shellextensions/upgrade.cxx
+setup_native/source/win32/customactions/tools/checkversion.cxx
+setup_native/source/win32/customactions/tools/seterror.cxx
+setup_native/source/win32/customactions/tools/seterror.hxx
+sfx2/inc/bitset.hxx
+sfx2/inc/bluthsndapi.hxx
+sfx2/inc/charmapcontrol.hxx
+sfx2/inc/emojiviewitem.hxx
+sfx2/inc/guisaveas.hxx
+sfx2/inc/inettbc.hxx
+sfx2/inc/notebookbar/NotebookbarTabControl.hxx
+sfx2/inc/preventduplicateinteraction.hxx
+sfx2/inc/recentdocsview.hxx
+sfx2/inc/sidebar/Accessible.hxx
+sfx2/inc/sidebar/ContextChangeBroadcaster.hxx
+sfx2/inc/sidebar/ContextList.hxx
+sfx2/inc/sidebar/ControllerFactory.hxx
+sfx2/inc/sidebar/DeckLayouter.hxx
+sfx2/inc/sidebar/PanelDescriptor.hxx
+sfx2/inc/sidebar/PanelTitleBar.hxx
+sfx2/inc/sidebar/SidebarToolBox.hxx
+sfx2/inc/sidebar/TitleBar.hxx
+sfx2/inc/sidebar/Tools.hxx
+sfx2/inc/sidebar/UnoDeck.hxx
+sfx2/inc/sidebar/UnoDecks.hxx
+sfx2/inc/sidebar/UnoPanel.hxx
+sfx2/inc/sidebar/UnoPanels.hxx
+sfx2/inc/sidebar/UnoSidebar.hxx
+sfx2/inc/sorgitm.hxx
+sfx2/inc/srchdlg.hxx
+sfx2/inc/templateviewitem.hxx
+sfx2/inc/unoctitm.hxx
+sfx2/qa/cppunit/test_classification.cxx
+sfx2/qa/cppunit/test_controlleritem.cxx
+sfx2/qa/cppunit/test_metadatable.cxx
+sfx2/qa/cppunit/test_misc.cxx
+sfx2/source/appl/app.cxx
+sfx2/source/appl/appbas.cxx
+sfx2/source/appl/appbaslib.cxx
+sfx2/source/appl/appcfg.cxx
+sfx2/source/appl/appchild.cxx
+sfx2/source/appl/appdata.cxx
+sfx2/source/appl/appdde.cxx
+sfx2/source/appl/appdispatchprovider.cxx
+sfx2/source/appl/appinit.cxx
+sfx2/source/appl/appmain.cxx
+sfx2/source/appl/appmisc.cxx
+sfx2/source/appl/appopen.cxx
+sfx2/source/appl/appreg.cxx
+sfx2/source/appl/appserv.cxx
+sfx2/source/appl/appuno.cxx
+sfx2/source/appl/childwin.cxx
+sfx2/source/appl/fileobj.cxx
+sfx2/source/appl/fileobj.hxx
+sfx2/source/appl/flatpak.cxx
+sfx2/source/appl/fwkhelper.cxx
+sfx2/source/appl/getbasctlfunction.cxx
+sfx2/source/appl/helpdispatch.cxx
+sfx2/source/appl/helpdispatch.hxx
+sfx2/source/appl/helpinterceptor.cxx
+sfx2/source/appl/helpinterceptor.hxx
+sfx2/source/appl/impldde.cxx
+sfx2/source/appl/impldde.hxx
+sfx2/source/appl/linkmgr2.cxx
+sfx2/source/appl/linksrc.cxx
+sfx2/source/appl/lnkbase2.cxx
+sfx2/source/appl/macroloader.cxx
+sfx2/source/appl/module.cxx
+sfx2/source/appl/newhelp.cxx
+sfx2/source/appl/newhelp.hxx
+sfx2/source/appl/opengrf.cxx
+sfx2/source/appl/openuriexternally.cxx
+sfx2/source/appl/preventduplicateinteraction.cxx
+sfx2/source/appl/sfxhelp.cxx
+sfx2/source/appl/sfxpicklist.cxx
+sfx2/source/appl/shutdownicon.cxx
+sfx2/source/appl/shutdownicon.hxx
+sfx2/source/appl/shutdowniconw32.cxx
+sfx2/source/appl/workwin.cxx
+sfx2/source/appl/xpackcreator.cxx
+sfx2/source/bastyp/bitset.cxx
+sfx2/source/bastyp/fltfnc.cxx
+sfx2/source/bastyp/fltlst.cxx
+sfx2/source/bastyp/fltlst.hxx
+sfx2/source/bastyp/frmhtml.cxx
+sfx2/source/bastyp/frmhtmlw.cxx
+sfx2/source/bastyp/helper.cxx
+sfx2/source/bastyp/mieclip.cxx
+sfx2/source/bastyp/progress.cxx
+sfx2/source/bastyp/sfxhtml.cxx
+sfx2/source/config/evntconf.cxx
+sfx2/source/control/bindings.cxx
+sfx2/source/control/charmapcontrol.cxx
+sfx2/source/control/ctrlitem.cxx
+sfx2/source/control/dispatch.cxx
+sfx2/source/control/emojicontrol.cxx
+sfx2/source/control/emojiview.cxx
+sfx2/source/control/emojiviewitem.cxx
+sfx2/source/control/minfitem.cxx
+sfx2/source/control/msg.cxx
+sfx2/source/control/msgpool.cxx
+sfx2/source/control/objface.cxx
+sfx2/source/control/recentdocsview.cxx
+sfx2/source/control/recentdocsviewitem.cxx
+sfx2/source/control/recentdocsviewitem.hxx
+sfx2/source/control/request.cxx
+sfx2/source/control/sfxstatuslistener.cxx
+sfx2/source/control/shell.cxx
+sfx2/source/control/sorgitm.cxx
+sfx2/source/control/statcach.cxx
+sfx2/source/control/templatedefaultview.cxx
+sfx2/source/control/templatelocalview.cxx
+sfx2/source/control/templatesearchview.cxx
+sfx2/source/control/templateviewitem.cxx
+sfx2/source/control/thumbnailview.cxx
+sfx2/source/control/thumbnailviewacc.cxx
+sfx2/source/control/thumbnailviewacc.hxx
+sfx2/source/control/thumbnailviewitem.cxx
+sfx2/source/control/unoctitm.cxx
+sfx2/source/dialog/backingcomp.cxx
+sfx2/source/dialog/backingwindow.cxx
+sfx2/source/dialog/basedlgs.cxx
+sfx2/source/dialog/bluthsnd.cxx
+sfx2/source/dialog/checkin.cxx
+sfx2/source/dialog/dinfdlg.cxx
+sfx2/source/dialog/dockwin.cxx
+sfx2/source/dialog/documentfontsdialog.cxx
+sfx2/source/dialog/filedlghelper.cxx
+sfx2/source/dialog/filedlgimpl.hxx
+sfx2/source/dialog/filtergrouping.cxx
+sfx2/source/dialog/filtergrouping.hxx
+sfx2/source/dialog/mailmodel.cxx
+sfx2/source/dialog/mgetempl.cxx
+sfx2/source/dialog/mgetempl.hxx
+sfx2/source/dialog/navigat.cxx
+sfx2/source/dialog/newstyle.cxx
+sfx2/source/dialog/partwnd.cxx
+sfx2/source/dialog/passwd.cxx
+sfx2/source/dialog/printopt.cxx
+sfx2/source/dialog/recfloat.cxx
+sfx2/source/dialog/securitypage.cxx
+sfx2/source/dialog/splitwin.cxx
+sfx2/source/dialog/srchdlg.cxx
+sfx2/source/dialog/styledlg.cxx
+sfx2/source/dialog/tabdlg.cxx
+sfx2/source/dialog/templdlg.cxx
+sfx2/source/dialog/tplcitem.cxx
+sfx2/source/dialog/tplpitem.cxx
+sfx2/source/dialog/versdlg.cxx
+sfx2/source/doc/DocumentMetadataAccess.cxx
+sfx2/source/doc/Metadatable.cxx
+sfx2/source/doc/SfxDocumentMetaData.cxx
+sfx2/source/doc/docfac.cxx
+sfx2/source/doc/docfile.cxx
+sfx2/source/doc/docfilt.cxx
+sfx2/source/doc/docinf.cxx
+sfx2/source/doc/docinsert.cxx
+sfx2/source/doc/docmacromode.cxx
+sfx2/source/doc/docstoragemodifylistener.cxx
+sfx2/source/doc/doctempl.cxx
+sfx2/source/doc/doctemplates.cxx
+sfx2/source/doc/doctemplateslocal.cxx
+sfx2/source/doc/doctemplateslocal.hxx
+sfx2/source/doc/docundomanager.cxx
+sfx2/source/doc/frmdescr.cxx
+sfx2/source/doc/graphhelp.cxx
+sfx2/source/doc/graphhelp.hxx
+sfx2/source/doc/guisaveas.cxx
+sfx2/source/doc/iframe.cxx
+sfx2/source/doc/new.cxx
+sfx2/source/doc/objcont.cxx
+sfx2/source/doc/objembed.cxx
+sfx2/source/doc/objitem.cxx
+sfx2/source/doc/objmisc.cxx
+sfx2/source/doc/objserv.cxx
+sfx2/source/doc/objstor.cxx
+sfx2/source/doc/objxtor.cxx
+sfx2/source/doc/oleprops.cxx
+sfx2/source/doc/oleprops.hxx
+sfx2/source/doc/ownsubfilterservice.cxx
+sfx2/source/doc/printhelper.cxx
+sfx2/source/doc/printhelper.hxx
+sfx2/source/doc/saveastemplatedlg.cxx
+sfx2/source/doc/sfxbasemodel.cxx
+sfx2/source/doc/sfxmodelfactory.cxx
+sfx2/source/doc/syspathw32.cxx
+sfx2/source/doc/templatedlg.cxx
+sfx2/source/doc/watermarkitem.cxx
+sfx2/source/doc/zoomitem.cxx
+sfx2/source/explorer/nochaos.cxx
+sfx2/source/inc/appbaslib.hxx
+sfx2/source/inc/appdata.hxx
+sfx2/source/inc/docundomanager.hxx
+sfx2/source/inc/eventsupplier.hxx
+sfx2/source/inc/fltoptint.hxx
+sfx2/source/inc/helpids.h
+sfx2/source/inc/hintpost.hxx
+sfx2/source/inc/macroloader.hxx
+sfx2/source/inc/objshimp.hxx
+sfx2/source/inc/partwnd.hxx
+sfx2/source/inc/recfloat.hxx
+sfx2/source/inc/sfxurlrelocator.hxx
+sfx2/source/inc/slotserv.hxx
+sfx2/source/inc/splitwin.hxx
+sfx2/source/inc/statcach.hxx
+sfx2/source/inc/templatesearchview.hxx
+sfx2/source/inc/templdgi.hxx
+sfx2/source/inc/tplcitem.hxx
+sfx2/source/inc/workwin.hxx
+sfx2/source/inet/inettbc.cxx
+sfx2/source/notebookbar/NotebookbarTabControl.cxx
+sfx2/source/notebookbar/SfxNotebookBar.cxx
+sfx2/source/notify/eventsupplier.cxx
+sfx2/source/notify/globalevents.cxx
+sfx2/source/notify/openurlhint.cxx
+sfx2/source/sidebar/Accessible.cxx
+sfx2/source/sidebar/AsynchronousCall.cxx
+sfx2/source/sidebar/Context.cxx
+sfx2/source/sidebar/ContextChangeBroadcaster.cxx
+sfx2/source/sidebar/ContextList.cxx
+sfx2/source/sidebar/ControllerFactory.cxx
+sfx2/source/sidebar/ControllerItem.cxx
+sfx2/source/sidebar/Deck.cxx
+sfx2/source/sidebar/DeckDescriptor.cxx
+sfx2/source/sidebar/DeckLayouter.cxx
+sfx2/source/sidebar/DeckTitleBar.cxx
+sfx2/source/sidebar/FocusManager.cxx
+sfx2/source/sidebar/IContextChangeReceiver.cxx
+sfx2/source/sidebar/ILayoutableWindow.cxx
+sfx2/source/sidebar/Panel.cxx
+sfx2/source/sidebar/PanelDescriptor.cxx
+sfx2/source/sidebar/PanelLayout.cxx
+sfx2/source/sidebar/PanelTitleBar.cxx
+sfx2/source/sidebar/ResourceManager.cxx
+sfx2/source/sidebar/Sidebar.cxx
+sfx2/source/sidebar/SidebarChildWindow.cxx
+sfx2/source/sidebar/SidebarController.cxx
+sfx2/source/sidebar/SidebarDockingWindow.cxx
+sfx2/source/sidebar/SidebarPanelBase.cxx
+sfx2/source/sidebar/SidebarToolBox.cxx
+sfx2/source/sidebar/TabBar.cxx
+sfx2/source/sidebar/Theme.cxx
+sfx2/source/sidebar/TitleBar.cxx
+sfx2/source/sidebar/Tools.cxx
+sfx2/source/sidebar/UnoDeck.cxx
+sfx2/source/sidebar/UnoDecks.cxx
+sfx2/source/sidebar/UnoPanel.cxx
+sfx2/source/sidebar/UnoPanels.cxx
+sfx2/source/statbar/stbitem.cxx
+sfx2/source/toolbox/tbxitem.cxx
+sfx2/source/view/classificationcontroller.cxx
+sfx2/source/view/classificationhelper.cxx
+sfx2/source/view/frame.cxx
+sfx2/source/view/frame2.cxx
+sfx2/source/view/frmload.cxx
+sfx2/source/view/impframe.hxx
+sfx2/source/view/impviewframe.hxx
+sfx2/source/view/ipclient.cxx
+sfx2/source/view/lokcharthelper.cxx
+sfx2/source/view/lokhelper.cxx
+sfx2/source/view/printer.cxx
+sfx2/source/view/prnmon.hxx
+sfx2/source/view/sfxbasecontroller.cxx
+sfx2/source/view/userinputinterception.cxx
+sfx2/source/view/viewfac.cxx
+sfx2/source/view/viewfrm.cxx
+sfx2/source/view/viewfrm2.cxx
+sfx2/source/view/viewprn.cxx
+sfx2/source/view/viewsh.cxx
+shell/inc/basereader.hxx
+shell/inc/columninfo.hxx
+shell/inc/config.hxx
+shell/inc/contentreader.hxx
+shell/inc/fileextensions.hxx
+shell/inc/i_xml_parser_event_handler.hxx
+shell/inc/infotips.hxx
+shell/inc/propertyhdl.hxx
+shell/inc/propsheets.hxx
+shell/inc/registry.hxx
+shell/inc/resource.h
+shell/inc/thumbviewer.hxx
+shell/source/all/xml_parser.cxx
+shell/source/backends/desktopbe/desktopbackend.cxx
+shell/source/backends/localebe/localebackend.cxx
+shell/source/backends/localebe/localebackend.hxx
+shell/source/backends/macbe/macbackend.hxx
+shell/source/backends/wininetbe/wininetbackend.cxx
+shell/source/backends/wininetbe/wininetbackend.hxx
+shell/source/cmdmail/cmdmailmsg.cxx
+shell/source/cmdmail/cmdmailmsg.hxx
+shell/source/cmdmail/cmdmailsuppl.cxx
+shell/source/cmdmail/cmdmailsuppl.hxx
+shell/source/sessioninstall/SyncDbusSessionHelper.cxx
+shell/source/sessioninstall/SyncDbusSessionHelper.hxx
+shell/source/tools/lngconvex/lngconvex.cxx
+shell/source/tools/regsvrex/regsvrex.cxx
+shell/source/unix/exec/shellexec.cxx
+shell/source/unix/exec/shellexec.hxx
+shell/source/unix/misc/uri-encode.c
+shell/source/win32/SysShExec.cxx
+shell/source/win32/SysShExec.hxx
+shell/source/win32/ooofilereader/autostyletag.cxx
+shell/source/win32/ooofilereader/autostyletag.hxx
+shell/source/win32/ooofilereader/basereader.cxx
+shell/source/win32/ooofilereader/contentreader.cxx
+shell/source/win32/ooofilereader/dummytag.hxx
+shell/source/win32/ooofilereader/itag.hxx
+shell/source/win32/ooofilereader/keywordstag.hxx
+shell/source/win32/ooofilereader/metainforeader.cxx
+shell/source/win32/ooofilereader/simpletag.cxx
+shell/source/win32/ooofilereader/simpletag.hxx
+shell/source/win32/shlxthandler/classfactory.cxx
+shell/source/win32/shlxthandler/classfactory.hxx
+shell/source/win32/shlxthandler/columninfo/columninfo.cxx
+shell/source/win32/shlxthandler/infotips/infotips.cxx
+shell/source/win32/shlxthandler/ooofilt/ooofilt.cxx
+shell/source/win32/shlxthandler/ooofilt/ooofilt.hxx
+shell/source/win32/shlxthandler/ooofilt/propspec.cxx
+shell/source/win32/shlxthandler/ooofilt/propspec.hxx
+shell/source/win32/shlxthandler/ooofilt/stream_helper.cxx
+shell/source/win32/shlxthandler/prophdl/propertyhdl.cxx
+shell/source/win32/shlxthandler/propsheets/document_statistic.cxx
+shell/source/win32/shlxthandler/propsheets/document_statistic.hxx
+shell/source/win32/shlxthandler/propsheets/listviewbuilder.cxx
+shell/source/win32/shlxthandler/propsheets/listviewbuilder.hxx
+shell/source/win32/shlxthandler/propsheets/propsheets.cxx
+shell/source/win32/shlxthandler/shlxthdl.cxx
+shell/source/win32/shlxthandler/thumbviewer/thumbviewer.cxx
+shell/source/win32/shlxthandler/util/fileextensions.cxx
+shell/source/win32/shlxthandler/util/iso8601_converter.cxx
+shell/source/win32/shlxthandler/util/registry.cxx
+shell/source/win32/shlxthandler/util/utilities.cxx
+shell/source/win32/simplemail/senddoc.cxx
+shell/source/win32/simplemail/smplmailclient.cxx
+shell/source/win32/simplemail/smplmailclient.hxx
+shell/source/win32/simplemail/smplmailmsg.cxx
+shell/source/win32/simplemail/smplmailmsg.hxx
+shell/source/win32/simplemail/smplmailsuppl.cxx
+shell/source/win32/simplemail/smplmailsuppl.hxx
+shell/source/win32/spsupp/COMOpenDocuments.cxx
+shell/source/win32/spsupp/registrar.cxx
+shell/source/win32/spsupp/spsuppClassFactory.cxx
+shell/source/win32/spsupp/spsuppServ.cxx
+shell/source/win32/workbench/TestSmplMail.cxx
+shell/source/win32/workbench/TestSysShExec.cxx
+shell/source/win32/zipfile/zipexcptn.cxx
+shell/source/win32/zipfile/zipfile.cxx
+slideshow/source/engine/activities/accumulation.hxx
+slideshow/source/engine/activities/activitiesfactory.cxx
+slideshow/source/engine/activities/activitybase.cxx
+slideshow/source/engine/activities/activitybase.hxx
+slideshow/source/engine/activities/activityparameters.hxx
+slideshow/source/engine/activities/continuousactivitybase.cxx
+slideshow/source/engine/activities/continuousactivitybase.hxx
+slideshow/source/engine/activities/continuouskeytimeactivitybase.cxx
+slideshow/source/engine/activities/continuouskeytimeactivitybase.hxx
+slideshow/source/engine/activities/discreteactivitybase.cxx
+slideshow/source/engine/activities/discreteactivitybase.hxx
+slideshow/source/engine/activities/interpolation.hxx
+slideshow/source/engine/activities/simplecontinuousactivitybase.cxx
+slideshow/source/engine/activities/simplecontinuousactivitybase.hxx
+slideshow/source/engine/activitiesqueue.cxx
+slideshow/source/engine/animatedsprite.cxx
+slideshow/source/engine/animationfactory.cxx
+slideshow/source/engine/animationnodes/animationaudionode.cxx
+slideshow/source/engine/animationnodes/animationaudionode.hxx
+slideshow/source/engine/animationnodes/animationbasenode.cxx
+slideshow/source/engine/animationnodes/animationbasenode.hxx
+slideshow/source/engine/animationnodes/animationcolornode.cxx
+slideshow/source/engine/animationnodes/animationcolornode.hxx
+slideshow/source/engine/animationnodes/animationcommandnode.cxx
+slideshow/source/engine/animationnodes/animationcommandnode.hxx
+slideshow/source/engine/animationnodes/animationnodefactory.cxx
+slideshow/source/engine/animationnodes/animationpathmotionnode.cxx
+slideshow/source/engine/animationnodes/animationpathmotionnode.hxx
+slideshow/source/engine/animationnodes/animationsetnode.cxx
+slideshow/source/engine/animationnodes/animationsetnode.hxx
+slideshow/source/engine/animationnodes/animationtransformnode.cxx
+slideshow/source/engine/animationnodes/animationtransformnode.hxx
+slideshow/source/engine/animationnodes/animationtransitionfilternode.cxx
+slideshow/source/engine/animationnodes/animationtransitionfilternode.hxx
+slideshow/source/engine/animationnodes/basecontainernode.cxx
+slideshow/source/engine/animationnodes/basenode.cxx
+slideshow/source/engine/animationnodes/generateevent.cxx
+slideshow/source/engine/animationnodes/generateevent.hxx
+slideshow/source/engine/animationnodes/nodetools.cxx
+slideshow/source/engine/animationnodes/nodetools.hxx
+slideshow/source/engine/animationnodes/paralleltimecontainer.cxx
+slideshow/source/engine/animationnodes/paralleltimecontainer.hxx
+slideshow/source/engine/animationnodes/propertyanimationnode.cxx
+slideshow/source/engine/animationnodes/propertyanimationnode.hxx
+slideshow/source/engine/animationnodes/sequentialtimecontainer.cxx
+slideshow/source/engine/animationnodes/sequentialtimecontainer.hxx
+slideshow/source/engine/animationnodes/setactivity.hxx
+slideshow/source/engine/attributemap.cxx
+slideshow/source/engine/color.cxx
+slideshow/source/engine/delayevent.cxx
+slideshow/source/engine/effectrewinder.cxx
+slideshow/source/engine/effectrewinder.hxx
+slideshow/source/engine/eventmultiplexer.cxx
+slideshow/source/engine/eventqueue.cxx
+slideshow/source/engine/expressionnodefactory.cxx
+slideshow/source/engine/opengl/Operation.cxx
+slideshow/source/engine/opengl/Operation.hxx
+slideshow/source/engine/opengl/TransitionImpl.cxx
+slideshow/source/engine/opengl/TransitionImpl.hxx
+slideshow/source/engine/opengl/TransitionerImpl.cxx
+slideshow/source/engine/pointersymbol.cxx
+slideshow/source/engine/pointersymbol.hxx
+slideshow/source/engine/rehearsetimingsactivity.cxx
+slideshow/source/engine/rehearsetimingsactivity.hxx
+slideshow/source/engine/screenupdater.cxx
+slideshow/source/engine/shapeattributelayer.cxx
+slideshow/source/engine/shapes/appletshape.cxx
+slideshow/source/engine/shapes/appletshape.hxx
+slideshow/source/engine/shapes/backgroundshape.cxx
+slideshow/source/engine/shapes/backgroundshape.hxx
+slideshow/source/engine/shapes/drawinglayeranimation.cxx
+slideshow/source/engine/shapes/drawinglayeranimation.hxx
+slideshow/source/engine/shapes/drawshape.cxx
+slideshow/source/engine/shapes/drawshape.hxx
+slideshow/source/engine/shapes/drawshapesubsetting.cxx
+slideshow/source/engine/shapes/drawshapesubsetting.hxx
+slideshow/source/engine/shapes/externalshapebase.cxx
+slideshow/source/engine/shapes/externalshapebase.hxx
+slideshow/source/engine/shapes/gdimtftools.cxx
+slideshow/source/engine/shapes/gdimtftools.hxx
+slideshow/source/engine/shapes/intrinsicanimationactivity.cxx
+slideshow/source/engine/shapes/intrinsicanimationactivity.hxx
+slideshow/source/engine/shapes/mediashape.cxx
+slideshow/source/engine/shapes/mediashape.hxx
+slideshow/source/engine/shapes/shapeimporter.cxx
+slideshow/source/engine/shapes/viewappletshape.cxx
+slideshow/source/engine/shapes/viewappletshape.hxx
+slideshow/source/engine/shapes/viewbackgroundshape.cxx
+slideshow/source/engine/shapes/viewbackgroundshape.hxx
+slideshow/source/engine/shapes/viewmediashape.cxx
+slideshow/source/engine/shapes/viewmediashape.hxx
+slideshow/source/engine/shapes/viewshape.cxx
+slideshow/source/engine/shapes/viewshape.hxx
+slideshow/source/engine/shapesubset.cxx
+slideshow/source/engine/slide/layer.cxx
+slideshow/source/engine/slide/layer.hxx
+slideshow/source/engine/slide/layermanager.cxx
+slideshow/source/engine/slide/layermanager.hxx
+slideshow/source/engine/slide/shapemanagerimpl.cxx
+slideshow/source/engine/slide/shapemanagerimpl.hxx
+slideshow/source/engine/slide/slideanimations.cxx
+slideshow/source/engine/slide/slideanimations.hxx
+slideshow/source/engine/slide/slideimpl.cxx
+slideshow/source/engine/slide/targetpropertiescreator.cxx
+slideshow/source/engine/slide/targetpropertiescreator.hxx
+slideshow/source/engine/slide/userpaintoverlay.cxx
+slideshow/source/engine/slide/userpaintoverlay.hxx
+slideshow/source/engine/slidebitmap.cxx
+slideshow/source/engine/slideshowcontext.cxx
+slideshow/source/engine/slideshowimpl.cxx
+slideshow/source/engine/slideview.cxx
+slideshow/source/engine/smilfunctionparser.cxx
+slideshow/source/engine/soundplayer.cxx
+slideshow/source/engine/tools.cxx
+slideshow/source/engine/transitions/barndoorwipe.cxx
+slideshow/source/engine/transitions/barwipepolypolygon.cxx
+slideshow/source/engine/transitions/barwipepolypolygon.hxx
+slideshow/source/engine/transitions/boxwipe.cxx
+slideshow/source/engine/transitions/boxwipe.hxx
+slideshow/source/engine/transitions/checkerboardwipe.cxx
+slideshow/source/engine/transitions/checkerboardwipe.hxx
+slideshow/source/engine/transitions/clippingfunctor.cxx
+slideshow/source/engine/transitions/clippingfunctor.hxx
+slideshow/source/engine/transitions/clockwipe.cxx
+slideshow/source/engine/transitions/combtransition.cxx
+slideshow/source/engine/transitions/combtransition.hxx
+slideshow/source/engine/transitions/doublediamondwipe.cxx
+slideshow/source/engine/transitions/ellipsewipe.cxx
+slideshow/source/engine/transitions/ellipsewipe.hxx
+slideshow/source/engine/transitions/fanwipe.cxx
+slideshow/source/engine/transitions/fanwipe.hxx
+slideshow/source/engine/transitions/figurewipe.cxx
+slideshow/source/engine/transitions/figurewipe.hxx
+slideshow/source/engine/transitions/fourboxwipe.cxx
+slideshow/source/engine/transitions/fourboxwipe.hxx
+slideshow/source/engine/transitions/parametricpolypolygon.hxx
+slideshow/source/engine/transitions/parametricpolypolygonfactory.cxx
+slideshow/source/engine/transitions/parametricpolypolygonfactory.hxx
+slideshow/source/engine/transitions/pinwheelwipe.cxx
+slideshow/source/engine/transitions/pinwheelwipe.hxx
+slideshow/source/engine/transitions/randomwipe.cxx
+slideshow/source/engine/transitions/shapetransitionfactory.cxx
+slideshow/source/engine/transitions/slidechangebase.cxx
+slideshow/source/engine/transitions/slidechangebase.hxx
+slideshow/source/engine/transitions/slidetransitionfactory.cxx
+slideshow/source/engine/transitions/snakewipe.cxx
+slideshow/source/engine/transitions/snakewipe.hxx
+slideshow/source/engine/transitions/spiralwipe.cxx
+slideshow/source/engine/transitions/spiralwipe.hxx
+slideshow/source/engine/transitions/sweepwipe.cxx
+slideshow/source/engine/transitions/sweepwipe.hxx
+slideshow/source/engine/transitions/transitionfactorytab.cxx
+slideshow/source/engine/transitions/transitiontools.cxx
+slideshow/source/engine/transitions/veewipe.cxx
+slideshow/source/engine/transitions/waterfallwipe.cxx
+slideshow/source/engine/transitions/waterfallwipe.hxx
+slideshow/source/engine/transitions/zigzagwipe.cxx
+slideshow/source/engine/transitions/zigzagwipe.hxx
+slideshow/source/engine/unoviewcontainer.cxx
+slideshow/source/engine/usereventqueue.cxx
+slideshow/source/engine/waitsymbol.cxx
+slideshow/source/engine/waitsymbol.hxx
+slideshow/source/engine/wakeupevent.cxx
+slideshow/source/inc/activitiesfactory.hxx
+slideshow/source/inc/activitiesqueue.hxx
+slideshow/source/inc/activity.hxx
+slideshow/source/inc/animatableshape.hxx
+slideshow/source/inc/animatedsprite.hxx
+slideshow/source/inc/animation.hxx
+slideshow/source/inc/animationactivity.hxx
+slideshow/source/inc/animationeventhandler.hxx
+slideshow/source/inc/animationfactory.hxx
+slideshow/source/inc/animationnodefactory.hxx
+slideshow/source/inc/attributableshape.hxx
+slideshow/source/inc/attributemap.hxx
+slideshow/source/inc/basecontainernode.hxx
+slideshow/source/inc/basenode.hxx
+slideshow/source/inc/boolanimation.hxx
+slideshow/source/inc/coloranimation.hxx
+slideshow/source/inc/cursormanager.hxx
+slideshow/source/inc/delayevent.hxx
+slideshow/source/inc/disposable.hxx
+slideshow/source/inc/doctreenode.hxx
+slideshow/source/inc/doctreenodesupplier.hxx
+slideshow/source/inc/enumanimation.hxx
+slideshow/source/inc/eventhandler.hxx
+slideshow/source/inc/eventmultiplexer.hxx
+slideshow/source/inc/eventqueue.hxx
+slideshow/source/inc/expressionnode.hxx
+slideshow/source/inc/expressionnodefactory.hxx
+slideshow/source/inc/hslcolor.hxx
+slideshow/source/inc/hslcoloranimation.hxx
+slideshow/source/inc/hyperlinkarea.hxx
+slideshow/source/inc/iexternalmediashapebase.hxx
+slideshow/source/inc/interruptabledelayevent.hxx
+slideshow/source/inc/intrinsicanimationeventhandler.hxx
+slideshow/source/inc/listenercontainer.hxx
+slideshow/source/inc/mouseeventhandler.hxx
+slideshow/source/inc/numberanimation.hxx
+slideshow/source/inc/pairanimation.hxx
+slideshow/source/inc/pauseeventhandler.hxx
+slideshow/source/inc/rgbcolor.hxx
+slideshow/source/inc/screenupdater.hxx
+slideshow/source/inc/shape.hxx
+slideshow/source/inc/shapeattributelayer.hxx
+slideshow/source/inc/shapeattributelayerholder.hxx
+slideshow/source/inc/shapeimporter.hxx
+slideshow/source/inc/shapelistenereventhandler.hxx
+slideshow/source/inc/shapemanager.hxx
+slideshow/source/inc/shapemaps.hxx
+slideshow/source/inc/shapesubset.hxx
+slideshow/source/inc/slide.hxx
+slideshow/source/inc/slidebitmap.hxx
+slideshow/source/inc/slideshowcontext.hxx
+slideshow/source/inc/slideshowexceptions.hxx
+slideshow/source/inc/slideview.hxx
+slideshow/source/inc/smilfunctionparser.hxx
+slideshow/source/inc/soundplayer.hxx
+slideshow/source/inc/stringanimation.hxx
+slideshow/source/inc/subsettableshapemanager.hxx
+slideshow/source/inc/tools.hxx
+slideshow/source/inc/transitionfactory.hxx
+slideshow/source/inc/transitioninfo.hxx
+slideshow/source/inc/unoview.hxx
+slideshow/source/inc/unoviewcontainer.hxx
+slideshow/source/inc/usereventqueue.hxx
+slideshow/source/inc/view.hxx
+slideshow/source/inc/vieweventhandler.hxx
+slideshow/source/inc/viewlayer.hxx
+slideshow/source/inc/viewupdate.hxx
+slideshow/source/inc/wakeupevent.hxx
+slideshow/test/slidetest.cxx
+slideshow/test/tests.hxx
+slideshow/test/testshape.cxx
+slideshow/test/testview.cxx
+slideshow/test/views.cxx
+smoketest/smoketest.cxx
+solenv/bin/concat-deps.c
+solenv/gbuildtojson/gbuildtojson.cxx
+solenv/gcc-wrappers/wrapper.cxx
+solenv/lockfile/autoconf.h.in
+solenv/lockfile/dotlockfile.c
+solenv/lockfile/lockfile.c
+solenv/lockfile/lockfile.h
+solenv/lockfile/maillock.h
+soltools/cpp/_eval.c
+soltools/cpp/_getopt.c
+soltools/cpp/_include.c
+soltools/cpp/_lex.c
+soltools/cpp/_macro.c
+soltools/cpp/_mcrvalid.c
+soltools/cpp/_nlist.c
+soltools/cpp/_tokens.c
+soltools/cpp/_unix.c
+soltools/cpp/cpp.h
+soltools/mkdepend/collectdircontent.cxx
+soltools/mkdepend/collectdircontent.hxx
+soltools/mkdepend/cppsetup.c
+soltools/mkdepend/def.h
+soltools/mkdepend/ifparser.c
+soltools/mkdepend/ifparser.h
+soltools/mkdepend/imakemdep.h
+soltools/mkdepend/include.c
+soltools/mkdepend/main.c
+soltools/mkdepend/parse.c
+soltools/mkdepend/pr.c
+sot/inc/sysformats.hxx
+sot/qa/cppunit/test_sot.cxx
+sot/source/base/exchange.cxx
+sot/source/base/filelist.cxx
+sot/source/base/formats.cxx
+sot/source/sdstor/stg.cxx
+sot/source/sdstor/stgavl.cxx
+sot/source/sdstor/stgavl.hxx
+sot/source/sdstor/stgcache.cxx
+sot/source/sdstor/stgcache.hxx
+sot/source/sdstor/stgdir.cxx
+sot/source/sdstor/stgdir.hxx
+sot/source/sdstor/stgelem.cxx
+sot/source/sdstor/stgelem.hxx
+sot/source/sdstor/stgio.cxx
+sot/source/sdstor/stgio.hxx
+sot/source/sdstor/stgole.cxx
+sot/source/sdstor/stgole.hxx
+sot/source/sdstor/stgstrms.cxx
+sot/source/sdstor/stgstrms.hxx
+sot/source/sdstor/storage.cxx
+sot/source/sdstor/storinfo.cxx
+sot/source/sdstor/ucbstorage.cxx
+sot/source/unoolestorage/xolesimplestorage.cxx
+sot/source/unoolestorage/xolesimplestorage.hxx
+starmath/inc/ElementsDockingWindow.hxx
+starmath/inc/dialog.hxx
+starmath/inc/document.hxx
+starmath/inc/format.hxx
+starmath/inc/helpids.h
+starmath/inc/node.hxx
+starmath/inc/parse.hxx
+starmath/inc/rect.hxx
+starmath/inc/smmod.hxx
+starmath/inc/symbol.hxx
+starmath/inc/unomodel.hxx
+starmath/inc/utility.hxx
+starmath/inc/view.hxx
+starmath/inc/visitors.hxx
+starmath/qa/cppunit/mock-visitor.hxx
+starmath/qa/cppunit/test_node.cxx
+starmath/qa/cppunit/test_parse.cxx
+starmath/qa/cppunit/test_starmath.cxx
+starmath/source/ElementsDockingWindow.cxx
+starmath/source/accessibility.cxx
+starmath/source/accessibility.hxx
+starmath/source/action.cxx
+starmath/source/caret.cxx
+starmath/source/cfgitem.cxx
+starmath/source/cursor.cxx
+starmath/source/dialog.cxx
+starmath/source/document.cxx
+starmath/source/edit.cxx
+starmath/source/eqnolefilehdr.cxx
+starmath/source/eqnolefilehdr.hxx
+starmath/source/format.cxx
+starmath/source/mathtype.cxx
+starmath/source/mathtype.hxx
+starmath/source/node.cxx
+starmath/source/ooxmlexport.cxx
+starmath/source/ooxmlimport.cxx
+starmath/source/ooxmlimport.hxx
+starmath/source/parse.cxx
+starmath/source/rect.cxx
+starmath/source/smdetect.cxx
+starmath/source/smdetect.hxx
+starmath/source/smdll.cxx
+starmath/source/smmod.cxx
+starmath/source/symbol.cxx
+starmath/source/tmpdevice.cxx
+starmath/source/uiobject.cxx
+starmath/source/uiobject.hxx
+starmath/source/unodoc.cxx
+starmath/source/unomodel.cxx
+starmath/source/utility.cxx
+starmath/source/view.cxx
+starmath/source/visitors.cxx
+stoc/source/corereflection/base.hxx
+stoc/source/corereflection/crarray.cxx
+stoc/source/corereflection/crbase.cxx
+stoc/source/corereflection/crcomp.cxx
+stoc/source/corereflection/crefl.cxx
+stoc/source/corereflection/crenum.cxx
+stoc/source/corereflection/criface.cxx
+stoc/source/corereflection/lrucache.hxx
+stoc/source/defaultregistry/defaultregistry.cxx
+stoc/source/implementationregistration/implreg.cxx
+stoc/source/implementationregistration/mergekeys.cxx
+stoc/source/implementationregistration/mergekeys.hxx
+stoc/source/inspect/introspection.cxx
+stoc/source/invocation/invocation.cxx
+stoc/source/invocation_adapterfactory/iafactory.cxx
+stoc/source/javaloader/javaloader.cxx
+stoc/source/javavm/interact.cxx
+stoc/source/javavm/interact.hxx
+stoc/source/javavm/javavm.cxx
+stoc/source/javavm/javavm.hxx
+stoc/source/javavm/jvmargs.hxx
+stoc/source/loader/dllcomponentloader.cxx
+stoc/source/namingservice/namingservice.cxx
+stoc/source/proxy_factory/proxyfac.cxx
+stoc/source/security/access_controller.cxx
+stoc/source/security/file_policy.cxx
+stoc/source/security/lru_cache.h
+stoc/source/security/permissions.cxx
+stoc/source/security/permissions.h
+stoc/source/servicemanager/servicemanager.cxx
+stoc/source/simpleregistry/simpleregistry.cxx
+stoc/source/typeconv/convert.cxx
+stoc/source/uriproc/ExternalUriReferenceTranslator.cxx
+stoc/source/uriproc/UriReference.cxx
+stoc/source/uriproc/UriReference.hxx
+stoc/source/uriproc/UriReferenceFactory.cxx
+stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTexpand.cxx
+stoc/source/uriproc/UriSchemeParser_vndDOTsunDOTstarDOTscript.cxx
+stoc/source/uriproc/VndSunStarPkgUrlReferenceFactory.cxx
+stoc/test/javavm/jvm_interaction/interactionhandler.cxx
+stoc/test/javavm/testjavavm.cxx
+stoc/test/registry_tdprovider/testregistrytdprovider.cxx
+stoc/test/tdmanager/testtdmanager.cxx
+stoc/test/testconv.cxx
+stoc/test/testcorefl.cxx
+stoc/test/testiadapter.cxx
+stoc/test/testintrosp.cxx
+stoc/test/testloader.cxx
+stoc/test/testproxyfac.cxx
+stoc/test/testregistry.cxx
+stoc/test/testsmgr2.cxx
+stoc/test/testsmgr_cpnt.cxx
+stoc/test/uriproc/test_uriproc.cxx
+store/source/lockbyte.cxx
+store/source/lockbyte.hxx
+store/source/storbase.cxx
+store/source/storbase.hxx
+store/source/storbios.cxx
+store/source/storbios.hxx
+store/source/storcach.cxx
+store/source/storcach.hxx
+store/source/stordata.cxx
+store/source/stordata.hxx
+store/source/stordir.cxx
+store/source/stordir.hxx
+store/source/store.cxx
+store/source/storlckb.cxx
+store/source/storlckb.hxx
+store/source/storpage.cxx
+store/source/storpage.hxx
+store/source/stortree.cxx
+store/source/stortree.hxx
+svgio/inc/svganode.hxx
+svgio/inc/svgcharacternode.hxx
+svgio/inc/svgcirclenode.hxx
+svgio/inc/svgclippathnode.hxx
+svgio/inc/svgdocument.hxx
+svgio/inc/svgdocumenthandler.hxx
+svgio/inc/svgellipsenode.hxx
+svgio/inc/svggnode.hxx
+svgio/inc/svggradientnode.hxx
+svgio/inc/svggradientstopnode.hxx
+svgio/inc/svgimagenode.hxx
+svgio/inc/svglinenode.hxx
+svgio/inc/svgmarkernode.hxx
+svgio/inc/svgmasknode.hxx
+svgio/inc/svgnode.hxx
+svgio/inc/SvgNumber.hxx
+svgio/inc/svgpaint.hxx
+svgio/inc/svgpathnode.hxx
+svgio/inc/svgpatternnode.hxx
+svgio/inc/svgpolynode.hxx
+svgio/inc/svgrectnode.hxx
+svgio/inc/svgstyleattributes.hxx
+svgio/inc/svgstylenode.hxx
+svgio/inc/svgsvgnode.hxx
+svgio/inc/svgsymbolnode.hxx
+svgio/inc/svgtextnode.hxx
+svgio/inc/svgtextpathnode.hxx
+svgio/inc/svgtitledescnode.hxx
+svgio/inc/svgtoken.hxx
+svgio/inc/svgtools.hxx
+svgio/inc/svgtrefnode.hxx
+svgio/inc/svgtspannode.hxx
+svgio/inc/svgusenode.hxx
+svgio/qa/cppunit/SvgImportTest.cxx
+svgio/source/svgreader/svganode.cxx
+svgio/source/svgreader/svgcharacternode.cxx
+svgio/source/svgreader/svgcirclenode.cxx
+svgio/source/svgreader/svgclippathnode.cxx
+svgio/source/svgreader/svgdocument.cxx
+svgio/source/svgreader/svgdocumenthandler.cxx
+svgio/source/svgreader/svgellipsenode.cxx
+svgio/source/svgreader/svggnode.cxx
+svgio/source/svgreader/svggradientnode.cxx
+svgio/source/svgreader/svggradientstopnode.cxx
+svgio/source/svgreader/svgimagenode.cxx
+svgio/source/svgreader/svglinenode.cxx
+svgio/source/svgreader/svgmarkernode.cxx
+svgio/source/svgreader/svgmasknode.cxx
+svgio/source/svgreader/svgnode.cxx
+svgio/source/svgreader/SvgNumber.cxx
+svgio/source/svgreader/svgpathnode.cxx
+svgio/source/svgreader/svgpatternnode.cxx
+svgio/source/svgreader/svgpolynode.cxx
+svgio/source/svgreader/svgrectnode.cxx
+svgio/source/svgreader/svgstyleattributes.cxx
+svgio/source/svgreader/svgstylenode.cxx
+svgio/source/svgreader/svgsvgnode.cxx
+svgio/source/svgreader/svgsymbolnode.cxx
+svgio/source/svgreader/svgtextnode.cxx
+svgio/source/svgreader/svgtextpathnode.cxx
+svgio/source/svgreader/svgtitledescnode.cxx
+svgio/source/svgreader/svgtoken.cxx
+svgio/source/svgreader/svgtools.cxx
+svgio/source/svgreader/svgtrefnode.cxx
+svgio/source/svgreader/svgtspannode.cxx
+svgio/source/svgreader/svgusenode.cxx
+svgio/source/svguno/xsvgparser.cxx
+svl/qa/unit/items/test_IndexedStyleSheets.cxx
+svl/qa/unit/items/test_itempool.cxx
+svl/qa/unit/svl.cxx
+svl/qa/unit/test_INetContentType.cxx
+svl/qa/unit/test_URIHelper.cxx
+svl/source/config/asiancfg.cxx
+svl/source/config/cjkoptions.cxx
+svl/source/config/ctloptions.cxx
+svl/source/config/itemholder2.cxx
+svl/source/config/itemholder2.hxx
+svl/source/config/languageoptions.cxx
+svl/source/crypto/cryptosign.cxx
+svl/source/filepicker/pickerhistory.cxx
+svl/source/fsstor/fsfactory.cxx
+svl/source/fsstor/fsstorage.cxx
+svl/source/fsstor/fsstorage.hxx
+svl/source/fsstor/oinputstreamcontainer.cxx
+svl/source/fsstor/oinputstreamcontainer.hxx
+svl/source/fsstor/ostreamcontainer.cxx
+svl/source/fsstor/ostreamcontainer.hxx
+svl/source/inc/fsfactory.hxx
+svl/source/inc/poolio.hxx
+svl/source/items/IndexedStyleSheets.cxx
+svl/source/items/aeitem.cxx
+svl/source/items/cenumitm.cxx
+svl/source/items/cintitem.cxx
+svl/source/items/custritm.cxx
+svl/source/items/flagitem.cxx
+svl/source/items/globalnameitem.cxx
+svl/source/items/ilstitem.cxx
+svl/source/items/imageitm.cxx
+svl/source/items/int64item.cxx
+svl/source/items/intitem.cxx
+svl/source/items/itempool.cxx
+svl/source/items/itemprop.cxx
+svl/source/items/itemset.cxx
+svl/source/items/lckbitem.cxx
+svl/source/items/legacyitem.cxx
+svl/source/items/macitem.cxx
+svl/source/items/poolcach.cxx
+svl/source/items/poolio.cxx
+svl/source/items/ptitem.cxx
+svl/source/items/rectitem.cxx
+svl/source/items/rngitem.cxx
+svl/source/items/sitem.cxx
+svl/source/items/slstitm.cxx
+svl/source/items/srchitem.cxx
+svl/source/items/stritem.cxx
+svl/source/items/style.cxx
+svl/source/items/stylepool.cxx
+svl/source/items/visitem.cxx
+svl/source/items/whiter.cxx
+svl/source/misc/PasswordHelper.cxx
+svl/source/misc/adrparse.cxx
+svl/source/misc/documentlockfile.cxx
+svl/source/misc/filenotation.cxx
+svl/source/misc/fstathelper.cxx
+svl/source/misc/gridprinter.cxx
+svl/source/misc/inethist.cxx
+svl/source/misc/inettype.cxx
+svl/source/misc/lngmisc.cxx
+svl/source/misc/lockfilecommon.cxx
+svl/source/misc/ownlist.cxx
+svl/source/misc/sharecontrolfile.cxx
+svl/source/misc/sharedstring.cxx
+svl/source/misc/strmadpt.cxx
+svl/source/misc/urihelper.cxx
+svl/source/notify/broadcast.cxx
+svl/source/notify/listener.cxx
+svl/source/notify/lstner.cxx
+svl/source/numbers/currencytable.cxx
+svl/source/numbers/numfmuno.cxx
+svl/source/numbers/numfmuno.hxx
+svl/source/numbers/numuno.cxx
+svl/source/numbers/supservs.cxx
+svl/source/numbers/supservs.hxx
+svl/source/numbers/zforfind.cxx
+svl/source/numbers/zforfind.hxx
+svl/source/numbers/zforlist.cxx
+svl/source/numbers/zformat.cxx
+svl/source/numbers/zforscan.cxx
+svl/source/numbers/zforscan.hxx
+svl/source/passwordcontainer/passwordcontainer.cxx
+svl/source/passwordcontainer/passwordcontainer.hxx
+svl/source/passwordcontainer/syscreds.cxx
+svl/source/passwordcontainer/syscreds.hxx
+svl/source/svdde/ddecli.cxx
+svl/source/svdde/ddedata.cxx
+svl/source/svdde/ddeimp.hxx
+svl/source/svdde/ddestrg.cxx
+svl/source/svdde/ddesvr.cxx
+svl/source/undo/undo.cxx
+svl/source/uno/pathservice.cxx
+svl/unx/source/svdde/ddedummy.cxx
+svtools/inc/strings.hxx
+svtools/inc/framestatuslistener.hxx
+svtools/inc/table/defaultinputhandler.hxx
+svtools/inc/table/gridtablerenderer.hxx
+svtools/inc/table/tablecontrol.hxx
+svtools/inc/table/tablecontrolinterface.hxx
+svtools/inc/table/tableinputhandler.hxx
+svtools/inc/table/tablemodel.hxx
+svtools/inc/table/tablerenderer.hxx
+svtools/inc/table/tablesort.hxx
+svtools/inc/table/tabletypes.hxx
+svtools/langsupport/langsupport.cxx
+svtools/source/brwbox/brwbox1.cxx
+svtools/source/brwbox/brwbox2.cxx
+svtools/source/brwbox/brwbox3.cxx
+svtools/source/brwbox/brwhead.cxx
+svtools/source/brwbox/brwimpl.hxx
+svtools/source/brwbox/datwin.cxx
+svtools/source/brwbox/datwin.hxx
+svtools/source/brwbox/ebbcontrols.cxx
+svtools/source/brwbox/editbrowsebox.cxx
+svtools/source/brwbox/editbrowsebox2.cxx
+svtools/source/brwbox/editbrowseboximpl.hxx
+svtools/source/config/accessibilityoptions.cxx
+svtools/source/config/apearcfg.cxx
+svtools/source/config/colorcfg.cxx
+svtools/source/config/extcolorcfg.cxx
+svtools/source/config/fontsubstconfig.cxx
+svtools/source/config/helpopt.cxx
+svtools/source/config/htmlcfg.cxx
+svtools/source/config/itemholder2.cxx
+svtools/source/config/itemholder2.hxx
+svtools/source/config/menuoptions.cxx
+svtools/source/config/miscopt.cxx
+svtools/source/config/optionsdrawinglayer.cxx
+svtools/source/config/printoptions.cxx
+svtools/source/config/slidesorterbaropt.cxx
+svtools/source/config/test/test.cxx
+svtools/source/control/accessibleruler.cxx
+svtools/source/control/accessibleruler.hxx
+svtools/source/control/asynclink.cxx
+svtools/source/control/ctrlbox.cxx
+svtools/source/control/ctrltool.cxx
+svtools/source/control/indexentryres.cxx
+svtools/source/control/inettbc.cxx
+svtools/source/control/ruler.cxx
+svtools/source/control/scriptedtext.cxx
+svtools/source/control/tabbar.cxx
+svtools/source/control/toolbarmenu.cxx
+svtools/source/control/valueacc.cxx
+svtools/source/control/valueimp.hxx
+svtools/source/control/valueset.cxx
+svtools/source/dialogs/PlaceEditDialog.cxx
+svtools/source/dialogs/ServerDetailsControls.cxx
+svtools/source/dialogs/ServerDetailsControls.hxx
+svtools/source/dialogs/addresstemplate.cxx
+svtools/source/dialogs/colrdlg.cxx
+svtools/source/dialogs/insdlg.cxx
+svtools/source/dialogs/prnsetup.cxx
+svtools/source/dialogs/restartdialog.cxx
+svtools/source/filter/DocumentToGraphicRenderer.cxx
+svtools/source/filter/SvFilterOptionsDialog.cxx
+svtools/source/filter/exportdialog.cxx
+svtools/source/filter/exportdialog.hxx
+svtools/source/graphic/renderer.cxx
+svtools/source/java/javacontext.cxx
+svtools/source/java/javainteractionhandler.cxx
+svtools/source/misc/acceleratorexecute.cxx
+svtools/source/misc/bindablecontrolhelper.cxx
+svtools/source/misc/cliplistener.cxx
+svtools/source/misc/dialogclosedlistener.cxx
+svtools/source/misc/ehdl.cxx
+svtools/source/misc/embedhlp.cxx
+svtools/source/misc/embedtransfer.cxx
+svtools/source/misc/filechangedchecker.cxx
+svtools/source/misc/imagemgr.cxx
+svtools/source/misc/imageresourceaccess.cxx
+svtools/source/misc/langhelp.cxx
+svtools/source/misc/langtab.cxx
+svtools/source/misc/openfiledroptargetlistener.cxx
+svtools/source/misc/sampletext.cxx
+svtools/source/misc/stringtransfer.cxx
+svtools/source/misc/templatefoldercache.cxx
+svtools/source/misc/unitconv.cxx
+svtools/source/svhtml/HtmlWriter.cxx
+svtools/source/svhtml/htmlkywd.cxx
+svtools/source/svhtml/htmlout.cxx
+svtools/source/svhtml/htmlsupp.cxx
+svtools/source/svhtml/parhtml.cxx
+svtools/source/svrtf/parrtf.cxx
+svtools/source/svrtf/rtfkeywd.cxx
+svtools/source/svrtf/rtfout.cxx
+svtools/source/svrtf/svparser.cxx
+svtools/source/table/cellvalueconversion.cxx
+svtools/source/table/cellvalueconversion.hxx
+svtools/source/table/defaultinputhandler.cxx
+svtools/source/table/gridtablerenderer.cxx
+svtools/source/table/mousefunction.cxx
+svtools/source/table/mousefunction.hxx
+svtools/source/table/tablecontrol.cxx
+svtools/source/table/tablecontrol_impl.cxx
+svtools/source/table/tablecontrol_impl.hxx
+svtools/source/table/tabledatawindow.cxx
+svtools/source/table/tabledatawindow.hxx
+svtools/source/table/tablegeometry.cxx
+svtools/source/table/tablegeometry.hxx
+svtools/source/uno/addrtempuno.cxx
+svtools/source/uno/fpicker.cxx
+svtools/source/uno/fpicker.hxx
+svtools/source/uno/framestatuslistener.cxx
+svtools/source/uno/genericunodialog.cxx
+svtools/source/uno/miscservices.cxx
+svtools/source/uno/popupmenucontrollerbase.cxx
+svtools/source/uno/popupwindowcontroller.cxx
+svtools/source/uno/statusbarcontroller.cxx
+svtools/source/uno/svtxgridcontrol.cxx
+svtools/source/uno/svtxgridcontrol.hxx
+svtools/source/uno/toolboxcontroller.cxx
+svtools/source/uno/unocontroltablemodel.cxx
+svtools/source/uno/unocontroltablemodel.hxx
+svtools/source/uno/unoevent.cxx
+svtools/source/uno/unogridcolumnfacade.cxx
+svtools/source/uno/unogridcolumnfacade.hxx
+svtools/source/uno/unoiface.cxx
+svtools/source/uno/unoimap.cxx
+svtools/source/uno/wizard/unowizard.cxx
+svtools/source/uno/wizard/wizardpagecontroller.cxx
+svtools/source/uno/wizard/wizardpagecontroller.hxx
+svtools/source/uno/wizard/wizardshell.cxx
+svtools/source/uno/wizard/wizardshell.hxx
+svx/inc/AccessibleTableShape.hxx
+svx/inc/XPropertyTable.hxx
+svx/inc/colrctrl.hxx
+svx/inc/dragmt3d.hxx
+svx/inc/extrud3d.hxx
+svx/inc/galbrws2.hxx
+svx/inc/galobj.hxx
+svx/inc/helpids.h
+svx/inc/palettes.hxx
+svx/inc/sdgcoitm.hxx
+svx/inc/sdginitm.hxx
+svx/inc/sdgtritm.hxx
+svx/inc/sdr/attribute/sdreffectstextattribute.hxx
+svx/inc/sdr/attribute/sdrfilltextattribute.hxx
+svx/inc/sdr/attribute/sdrformtextattribute.hxx
+svx/inc/sdr/attribute/sdrformtextoutlineattribute.hxx
+svx/inc/sdr/attribute/sdrlineeffectstextattribute.hxx
+svx/inc/sdr/attribute/sdrlinefilleffectstextattribute.hxx
+svx/inc/sdr/attribute/sdrtextattribute.hxx
+svx/inc/sdr/contact/objectcontactofobjlistpainter.hxx
+svx/inc/sdr/contact/viewcontactofe3dcube.hxx
+svx/inc/sdr/contact/viewcontactofe3dextrude.hxx
+svx/inc/sdr/contact/viewcontactofe3dlathe.hxx
+svx/inc/sdr/contact/viewcontactofe3dpolygon.hxx
+svx/inc/sdr/contact/viewcontactofe3dsphere.hxx
+svx/inc/sdr/contact/viewcontactofgraphic.hxx
+svx/inc/sdr/contact/viewcontactofgroup.hxx
+svx/inc/sdr/contact/viewcontactofmasterpagedescriptor.hxx
+svx/inc/sdr/contact/viewcontactofsdrcaptionobj.hxx
+svx/inc/sdr/contact/viewcontactofsdrcircobj.hxx
+svx/inc/sdr/contact/viewcontactofsdredgeobj.hxx
+svx/inc/sdr/contact/viewcontactofsdrmeasureobj.hxx
+svx/inc/sdr/contact/viewcontactofsdrobjcustomshape.hxx
+svx/inc/sdr/contact/viewcontactofsdrpage.hxx
+svx/inc/sdr/contact/viewcontactofsdrpathobj.hxx
+svx/inc/sdr/contact/viewcontactofunocontrol.hxx
+svx/inc/sdr/contact/viewobjectcontactofe3d.hxx
+svx/inc/sdr/contact/viewobjectcontactofe3dscene.hxx
+svx/inc/sdr/contact/viewobjectcontactofgraphic.hxx
+svx/inc/sdr/contact/viewobjectcontactofgroup.hxx
+svx/inc/sdr/contact/viewobjectcontactofmasterpagedescriptor.hxx
+svx/inc/sdr/contact/viewobjectcontactofsdrmediaobj.hxx
+svx/inc/sdr/contact/viewobjectcontactofsdrpage.hxx
+svx/inc/sdr/contact/viewobjectcontactofunocontrol.hxx
+svx/inc/sdr/overlay/overlaycrosshair.hxx
+svx/inc/sdr/overlay/overlayhandle.hxx
+svx/inc/sdr/overlay/overlayhelpline.hxx
+svx/inc/sdr/overlay/overlayline.hxx
+svx/inc/sdr/overlay/overlaymanagerbuffered.hxx
+svx/inc/sdr/overlay/overlayobjectcell.hxx
+svx/inc/sdr/overlay/overlayrectangle.hxx
+svx/inc/sdr/overlay/overlayrollingrectangle.hxx
+svx/inc/sdr/overlay/overlaytools.hxx
+svx/inc/sdr/overlay/overlaytriangle.hxx
+svx/inc/sdr/primitive2d/sdrattributecreator.hxx
+svx/inc/sdr/primitive2d/sdrcaptionprimitive2d.hxx
+svx/inc/sdr/primitive2d/sdrconnectorprimitive2d.hxx
+svx/inc/sdr/primitive2d/sdrcustomshapeprimitive2d.hxx
+svx/inc/sdr/primitive2d/sdrdecompositiontools.hxx
+svx/inc/sdr/primitive2d/sdrellipseprimitive2d.hxx
+svx/inc/sdr/primitive2d/sdrmeasureprimitive2d.hxx
+svx/inc/sdr/primitive2d/sdrole2primitive2d.hxx
+svx/inc/sdr/primitive2d/sdrolecontentprimitive2d.hxx
+svx/inc/sdr/primitive2d/sdrpathprimitive2d.hxx
+svx/inc/sdr/primitive2d/sdrrectangleprimitive2d.hxx
+svx/inc/sdr/primitive2d/sdrtextprimitive2d.hxx
+svx/inc/sdr/primitive3d/sdrattributecreator3d.hxx
+svx/inc/sdr/properties/attributeproperties.hxx
+svx/inc/sdr/properties/captionproperties.hxx
+svx/inc/sdr/properties/circleproperties.hxx
+svx/inc/sdr/properties/connectorproperties.hxx
+svx/inc/sdr/properties/customshapeproperties.hxx
+svx/inc/sdr/properties/e3dcompoundproperties.hxx
+svx/inc/sdr/properties/e3dextrudeproperties.hxx
+svx/inc/sdr/properties/e3dlatheproperties.hxx
+svx/inc/sdr/properties/e3dproperties.hxx
+svx/inc/sdr/properties/e3dsceneproperties.hxx
+svx/inc/sdr/properties/e3dsphereproperties.hxx
+svx/inc/sdr/properties/emptyproperties.hxx
+svx/inc/sdr/properties/graphicproperties.hxx
+svx/inc/sdr/properties/groupproperties.hxx
+svx/inc/sdr/properties/itemsettools.hxx
+svx/inc/sdr/properties/measureproperties.hxx
+svx/inc/sdr/properties/oleproperties.hxx
+svx/inc/sdr/properties/pageproperties.hxx
+svx/inc/sdr/properties/rectangleproperties.hxx
+svx/inc/sdr/properties/textproperties.hxx
+svx/inc/strings.hxx
+svx/inc/sxallitm.hxx
+svx/inc/sxcikitm.hxx
+svx/inc/sxfiitm.hxx
+svx/inc/sxlayitm.hxx
+svx/inc/sxlogitm.hxx
+svx/inc/sxmfsitm.hxx
+svx/inc/sxmkitm.hxx
+svx/inc/sxmovitm.hxx
+svx/inc/sxmtaitm.hxx
+svx/inc/sxoneitm.hxx
+svx/inc/sxopitm.hxx
+svx/inc/sxreaitm.hxx
+svx/inc/sxreoitm.hxx
+svx/inc/sxrooitm.hxx
+svx/inc/sxsalitm.hxx
+svx/inc/sxsiitm.hxx
+svx/inc/sxsoitm.hxx
+svx/inc/sxtraitm.hxx
+svx/inc/tbxcolorupdate.hxx
+svx/inc/textchaincursor.hxx
+svx/inc/xpolyimp.hxx
+svx/source/accessibility/AccessibleControlShape.cxx
+svx/source/accessibility/AccessibleEmptyEditSource.cxx
+svx/source/accessibility/AccessibleEmptyEditSource.hxx
+svx/source/accessibility/AccessibleFrameSelector.cxx
+svx/source/accessibility/AccessibleGraphicShape.cxx
+svx/source/accessibility/AccessibleOLEShape.cxx
+svx/source/accessibility/AccessibleShape.cxx
+svx/source/accessibility/AccessibleShapeInfo.cxx
+svx/source/accessibility/AccessibleShapeTreeInfo.cxx
+svx/source/accessibility/AccessibleTextEventQueue.cxx
+svx/source/accessibility/AccessibleTextEventQueue.hxx
+svx/source/accessibility/AccessibleTextHelper.cxx
+svx/source/accessibility/ChildrenManager.cxx
+svx/source/accessibility/ChildrenManagerImpl.cxx
+svx/source/accessibility/ChildrenManagerImpl.hxx
+svx/source/accessibility/GraphCtlAccessibleContext.cxx
+svx/source/accessibility/ShapeTypeHandler.cxx
+svx/source/accessibility/SvxShapeTypes.cxx
+svx/source/accessibility/charmapacc.cxx
+svx/source/accessibility/svxpixelctlaccessiblecontext.cxx
+svx/source/accessibility/svxrectctaccessiblecontext.cxx
+svx/source/core/extedit.cxx
+svx/source/core/graphichelper.cxx
+svx/source/customshapes/EnhancedCustomShape2d.cxx
+svx/source/customshapes/EnhancedCustomShape3d.cxx
+svx/source/customshapes/EnhancedCustomShape3d.hxx
+svx/source/customshapes/EnhancedCustomShapeEngine.cxx
+svx/source/customshapes/EnhancedCustomShapeFontWork.cxx
+svx/source/customshapes/EnhancedCustomShapeFontWork.hxx
+svx/source/customshapes/EnhancedCustomShapeFunctionParser.cxx
+svx/source/customshapes/EnhancedCustomShapeGeometry.cxx
+svx/source/customshapes/EnhancedCustomShapeHandle.cxx
+svx/source/customshapes/EnhancedCustomShapeHandle.hxx
+svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx
+svx/source/diagram/datamodel.cxx
+svx/source/diagram/IDiagramHelper.cxx
+svx/source/dialog/ClassificationDialog.cxx
+svx/source/dialog/ClassificationEditView.cxx
+svx/source/dialog/ClassificationEditView.hxx
+svx/source/dialog/SafeModeDialog.cxx
+svx/source/dialog/SafeModeUI.cxx
+svx/source/dialog/SpellDialogChildWindow.cxx
+svx/source/dialog/_bmpmask.cxx
+svx/source/dialog/_contdlg.cxx
+svx/source/dialog/charmap.cxx
+svx/source/dialog/compressgraphicdialog.cxx
+svx/source/dialog/connctrl.cxx
+svx/source/dialog/contimp.hxx
+svx/source/dialog/contwnd.cxx
+svx/source/dialog/contwnd.hxx
+svx/source/dialog/crashreportui.cxx
+svx/source/dialog/ctredlin.cxx
+svx/source/dialog/databaseregistrationui.cxx
+svx/source/dialog/dialcontrol.cxx
+svx/source/dialog/dlgctl3d.cxx
+svx/source/dialog/dlgctrl.cxx
+svx/source/dialog/dlgutil.cxx
+svx/source/dialog/docrecovery.cxx
+svx/source/dialog/fntctrl.cxx
+svx/source/dialog/fontwork.cxx
+svx/source/dialog/framelink.cxx
+svx/source/dialog/framelinkarray.cxx
+svx/source/dialog/frmsel.cxx
+svx/source/dialog/graphctl.cxx
+svx/source/dialog/grfflt.cxx
+svx/source/dialog/hdft.cxx
+svx/source/dialog/hyperdlg.cxx
+svx/source/dialog/imapdlg.cxx
+svx/source/dialog/imapimp.hxx
+svx/source/dialog/imapwnd.cxx
+svx/source/dialog/imapwnd.hxx
+svx/source/dialog/langbox.cxx
+svx/source/dialog/optgrid.cxx
+svx/source/dialog/pagectrl.cxx
+svx/source/dialog/papersizelistbox.cxx
+svx/source/dialog/paraprev.cxx
+svx/source/dialog/passwd.cxx
+svx/source/dialog/relfld.cxx
+svx/source/dialog/rlrcitem.cxx
+svx/source/dialog/rlrcitem.hxx
+svx/source/dialog/rulritem.cxx
+svx/source/dialog/samecontentlistbox.cxx
+svx/source/dialog/searchcharmap.cxx
+svx/source/dialog/spacinglistbox.cxx
+svx/source/dialog/srchctrl.cxx
+svx/source/dialog/srchdlg.cxx
+svx/source/dialog/svxbmpnumvalueset.cxx
+svx/source/dialog/svxgraphicitem.cxx
+svx/source/dialog/svxruler.cxx
+svx/source/dialog/swframeexample.cxx
+svx/source/dialog/swframeposstrings.cxx
+svx/source/dialog/txencbox.cxx
+svx/source/engine3d/cube3d.cxx
+svx/source/engine3d/dragmt3d.cxx
+svx/source/engine3d/e3dsceneupdater.cxx
+svx/source/engine3d/e3dundo.cxx
+svx/source/engine3d/extrud3d.cxx
+svx/source/engine3d/float3d.cxx
+svx/source/engine3d/helperhittest3d.cxx
+svx/source/engine3d/helperminimaldepth3d.cxx
+svx/source/engine3d/lathe3d.cxx
+svx/source/engine3d/obj3d.cxx
+svx/source/engine3d/objfac3d.cxx
+svx/source/engine3d/scene3d.cxx
+svx/source/engine3d/sphere3d.cxx
+svx/source/engine3d/view3d.cxx
+svx/source/engine3d/view3d1.cxx
+svx/source/engine3d/viewpt3d2.cxx
+svx/source/fmcomp/dbaexchange.cxx
+svx/source/fmcomp/dbaobjectex.cxx
+svx/source/fmcomp/fmgridcl.cxx
+svx/source/fmcomp/fmgridif.cxx
+svx/source/fmcomp/gridcell.cxx
+svx/source/fmcomp/gridcols.cxx
+svx/source/fmcomp/gridctrl.cxx
+svx/source/fmcomp/xmlexchg.cxx
+svx/source/form/ParseContext.cxx
+svx/source/form/dataaccessdescriptor.cxx
+svx/source/form/databaselocationinput.cxx
+svx/source/form/datalistener.cxx
+svx/source/form/datanavi.cxx
+svx/source/form/dbcharsethelper.cxx
+svx/source/form/delayedevent.cxx
+svx/source/form/filtnav.cxx
+svx/source/form/fmPropBrw.cxx
+svx/source/form/fmcontrolbordermanager.cxx
+svx/source/form/fmcontrollayout.cxx
+svx/source/form/fmdmod.cxx
+svx/source/form/fmdocumentclassification.cxx
+svx/source/form/fmdpage.cxx
+svx/source/form/fmexch.cxx
+svx/source/form/fmexpl.cxx
+svx/source/form/fmmodel.cxx
+svx/source/form/fmobj.cxx
+svx/source/form/fmobjfac.cxx
+svx/source/form/fmpage.cxx
+svx/source/form/fmpgeimp.cxx
+svx/source/form/fmscriptingenv.cxx
+svx/source/form/fmservs.cxx
+svx/source/form/fmshell.cxx
+svx/source/form/fmshimp.cxx
+svx/source/form/fmsrccfg.cxx
+svx/source/form/fmsrcimp.cxx
+svx/source/form/fmtextcontroldialogs.cxx
+svx/source/form/fmtextcontrolfeature.cxx
+svx/source/form/fmtextcontrolshell.cxx
+svx/source/form/fmtools.cxx
+svx/source/form/fmundo.cxx
+svx/source/form/fmview.cxx
+svx/source/form/fmvwimp.cxx
+svx/source/form/formcontrolfactory.cxx
+svx/source/form/formcontroller.cxx
+svx/source/form/formcontrolling.cxx
+svx/source/form/formdispatchinterceptor.cxx
+svx/source/form/formfeaturedispatcher.cxx
+svx/source/form/formtoolbars.cxx
+svx/source/form/legacyformcontroller.cxx
+svx/source/form/navigatortree.cxx
+svx/source/form/navigatortreemodel.cxx
+svx/source/form/sdbdatacolumn.cxx
+svx/source/form/sqlparserclient.cxx
+svx/source/form/tabwin.cxx
+svx/source/form/tbxform.cxx
+svx/source/form/xfm_addcondition.cxx
+svx/source/gallery2/GalleryControl.cxx
+svx/source/gallery2/codec.cxx
+svx/source/gallery2/galbrws1.cxx
+svx/source/gallery2/galbrws1.hxx
+svx/source/gallery2/galbrws2.cxx
+svx/source/gallery2/galctrl.cxx
+svx/source/gallery2/galexpl.cxx
+svx/source/gallery2/galini.cxx
+svx/source/gallery2/gallery1.cxx
+svx/source/gallery2/galmisc.cxx
+svx/source/gallery2/galobj.cxx
+svx/source/gallery2/galtheme.cxx
+svx/source/gengal/gengal.cxx
+svx/source/inc/AccessibleFrameSelector.hxx
+svx/source/inc/DefaultShapesPanel.hxx
+svx/source/inc/GraphCtlAccessibleContext.hxx
+svx/source/inc/ShapesUtil.hxx
+svx/source/inc/cell.hxx
+svx/source/inc/charmapacc.hxx
+svx/source/inc/datalistener.hxx
+svx/source/inc/datanavi.hxx
+svx/source/inc/delayedevent.hxx
+svx/source/inc/docrecovery.hxx
+svx/source/inc/filtnav.hxx
+svx/source/inc/fmPropBrw.hxx
+svx/source/inc/fmcontrolbordermanager.hxx
+svx/source/inc/fmcontrollayout.hxx
+svx/source/inc/fmdocumentclassification.hxx
+svx/source/inc/fmexch.hxx
+svx/source/inc/fmexpl.hxx
+svx/source/inc/fmobj.hxx
+svx/source/inc/fmpgeimp.hxx
+svx/source/inc/fmprop.hxx
+svx/source/inc/fmscriptingenv.hxx
+svx/source/inc/fmservs.hxx
+svx/source/inc/fmshimp.hxx
+svx/source/inc/fmtextcontroldialogs.hxx
+svx/source/inc/fmtextcontrolfeature.hxx
+svx/source/inc/fmtextcontrolshell.hxx
+svx/source/inc/fmundo.hxx
+svx/source/inc/fmurl.hxx
+svx/source/inc/fmvwimp.hxx
+svx/source/inc/formcontrolfactory.hxx
+svx/source/inc/formcontroller.hxx
+svx/source/inc/formcontrolling.hxx
+svx/source/inc/formdispatchinterceptor.hxx
+svx/source/inc/formfeaturedispatcher.hxx
+svx/source/inc/formtoolbars.hxx
+svx/source/inc/frmselimpl.hxx
+svx/source/inc/gridcell.hxx
+svx/source/inc/gridcols.hxx
+svx/source/inc/sdbdatacolumn.hxx
+svx/source/inc/sqlparserclient.hxx
+svx/source/inc/svdobjplusdata.hxx
+svx/source/inc/svdoutlinercache.hxx
+svx/source/inc/svxpixelctlaccessiblecontext.hxx
+svx/source/inc/svxrectctaccessiblecontext.hxx
+svx/source/inc/tablemodel.hxx
+svx/source/inc/tabwin.hxx
+svx/source/inc/treevisitor.hxx
+svx/source/inc/xfm_addcondition.hxx
+svx/source/inc/xmlxtexp.hxx
+svx/source/inc/xmlxtimp.hxx
+svx/source/items/SmartTagItem.cxx
+svx/source/items/algitem.cxx
+svx/source/items/autoformathelper.cxx
+svx/source/items/chrtitem.cxx
+svx/source/items/clipfmtitem.cxx
+svx/source/items/customshapeitem.cxx
+svx/source/items/drawitem.cxx
+svx/source/items/e3ditem.cxx
+svx/source/items/galleryitem.cxx
+svx/source/items/grfitem.cxx
+svx/source/items/hlnkitem.cxx
+svx/source/items/legacyitem.cxx
+svx/source/items/numinf.cxx
+svx/source/items/ofaitem.cxx
+svx/source/items/pageitem.cxx
+svx/source/items/postattr.cxx
+svx/source/items/rotmodit.cxx
+svx/source/items/svxerr.cxx
+svx/source/items/viewlayoutitem.cxx
+svx/source/items/zoomslideritem.cxx
+svx/source/mnuctrls/clipboardctl.cxx
+svx/source/mnuctrls/smarttagmenu.cxx
+svx/source/sdr/animation/animationstate.cxx
+svx/source/sdr/animation/objectanimator.cxx
+svx/source/sdr/animation/scheduler.cxx
+svx/source/sdr/attribute/sdrallfillattributeshelper.cxx
+svx/source/sdr/attribute/sdreffectstextattribute.cxx
+svx/source/sdr/attribute/sdrfilltextattribute.cxx
+svx/source/sdr/attribute/sdrformtextattribute.cxx
+svx/source/sdr/attribute/sdrformtextoutlineattribute.cxx
+svx/source/sdr/attribute/sdrlineeffectstextattribute.cxx
+svx/source/sdr/attribute/sdrlinefilleffectstextattribute.cxx
+svx/source/sdr/attribute/sdrtextattribute.cxx
+svx/source/sdr/contact/displayinfo.cxx
+svx/source/sdr/contact/objectcontact.cxx
+svx/source/sdr/contact/objectcontactofobjlistpainter.cxx
+svx/source/sdr/contact/objectcontactofpageview.cxx
+svx/source/sdr/contact/sdrmediawindow.cxx
+svx/source/sdr/contact/sdrmediawindow.hxx
+svx/source/sdr/contact/viewcontactofe3d.cxx
+svx/source/sdr/contact/viewcontactofe3dcube.cxx
+svx/source/sdr/contact/viewcontactofe3dextrude.cxx
+svx/source/sdr/contact/viewcontactofe3dlathe.cxx
+svx/source/sdr/contact/viewcontactofe3dpolygon.cxx
+svx/source/sdr/contact/viewcontactofe3dscene.cxx
+svx/source/sdr/contact/viewcontactofe3dsphere.cxx
+svx/source/sdr/contact/viewcontactofgraphic.cxx
+svx/source/sdr/contact/viewcontactofgroup.cxx
+svx/source/sdr/contact/viewcontactofmasterpagedescriptor.cxx
+svx/source/sdr/contact/viewcontactofsdrcaptionobj.cxx
+svx/source/sdr/contact/viewcontactofsdrcircobj.cxx
+svx/source/sdr/contact/viewcontactofsdredgeobj.cxx
+svx/source/sdr/contact/viewcontactofsdrmeasureobj.cxx
+svx/source/sdr/contact/viewcontactofsdrmediaobj.cxx
+svx/source/sdr/contact/viewcontactofsdrobj.cxx
+svx/source/sdr/contact/viewcontactofsdrobjcustomshape.cxx
+svx/source/sdr/contact/viewcontactofsdrole2obj.cxx
+svx/source/sdr/contact/viewcontactofsdrpage.cxx
+svx/source/sdr/contact/viewcontactofsdrpathobj.cxx
+svx/source/sdr/contact/viewcontactofsdrrectobj.cxx
+svx/source/sdr/contact/viewcontactofunocontrol.cxx
+svx/source/sdr/contact/viewcontactofvirtobj.cxx
+svx/source/sdr/contact/viewobjectcontact.cxx
+svx/source/sdr/contact/viewobjectcontactofe3d.cxx
+svx/source/sdr/contact/viewobjectcontactofe3dscene.cxx
+svx/source/sdr/contact/viewobjectcontactofgraphic.cxx
+svx/source/sdr/contact/viewobjectcontactofgroup.cxx
+svx/source/sdr/contact/viewobjectcontactofmasterpagedescriptor.cxx
+svx/source/sdr/contact/viewobjectcontactofpageobj.cxx
+svx/source/sdr/contact/viewobjectcontactofsdrmediaobj.cxx
+svx/source/sdr/contact/viewobjectcontactofsdrobj.cxx
+svx/source/sdr/contact/viewobjectcontactofsdrole2obj.cxx
+svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx
+svx/source/sdr/contact/viewobjectcontactofunocontrol.cxx
+svx/source/sdr/overlay/overlayanimatedbitmapex.cxx
+svx/source/sdr/overlay/overlaybitmapex.cxx
+svx/source/sdr/overlay/overlaycrosshair.cxx
+svx/source/sdr/overlay/overlayhandle.cxx
+svx/source/sdr/overlay/overlayhelpline.cxx
+svx/source/sdr/overlay/overlayline.cxx
+svx/source/sdr/overlay/overlaymanager.cxx
+svx/source/sdr/overlay/overlaymanagerbuffered.cxx
+svx/source/sdr/overlay/overlayobject.cxx
+svx/source/sdr/overlay/overlayobjectcell.cxx
+svx/source/sdr/overlay/overlayobjectlist.cxx
+svx/source/sdr/overlay/overlaypolypolygon.cxx
+svx/source/sdr/overlay/overlayprimitive2dsequenceobject.cxx
+svx/source/sdr/overlay/overlayrectangle.cxx
+svx/source/sdr/overlay/overlayrollingrectangle.cxx
+svx/source/sdr/overlay/overlayselection.cxx
+svx/source/sdr/overlay/overlaytools.cxx
+svx/source/sdr/overlay/overlaytriangle.cxx
+svx/source/sdr/primitive2d/primitivefactory2d.cxx
+svx/source/sdr/primitive2d/sdrattributecreator.cxx
+svx/source/sdr/primitive2d/sdrcaptionprimitive2d.cxx
+svx/source/sdr/primitive2d/sdrconnectorprimitive2d.cxx
+svx/source/sdr/primitive2d/sdrcustomshapeprimitive2d.cxx
+svx/source/sdr/primitive2d/sdrdecompositiontools.cxx
+svx/source/sdr/primitive2d/sdrellipseprimitive2d.cxx
+svx/source/sdr/primitive2d/sdrframeborderprimitive2d.cxx
+svx/source/sdr/primitive2d/sdrmeasureprimitive2d.cxx
+svx/source/sdr/primitive2d/sdrole2primitive2d.cxx
+svx/source/sdr/primitive2d/sdrolecontentprimitive2d.cxx
+svx/source/sdr/primitive2d/sdrpathprimitive2d.cxx
+svx/source/sdr/primitive2d/sdrprimitivetools.cxx
+svx/source/sdr/primitive2d/sdrrectangleprimitive2d.cxx
+svx/source/sdr/primitive2d/sdrtextprimitive2d.cxx
+svx/source/sdr/primitive3d/sdrattributecreator3d.cxx
+svx/source/sdr/properties/attributeproperties.cxx
+svx/source/sdr/properties/captionproperties.cxx
+svx/source/sdr/properties/circleproperties.cxx
+svx/source/sdr/properties/connectorproperties.cxx
+svx/source/sdr/properties/customshapeproperties.cxx
+svx/source/sdr/properties/defaultproperties.cxx
+svx/source/sdr/properties/e3dcompoundproperties.cxx
+svx/source/sdr/properties/e3dextrudeproperties.cxx
+svx/source/sdr/properties/e3dlatheproperties.cxx
+svx/source/sdr/properties/e3dproperties.cxx
+svx/source/sdr/properties/e3dsceneproperties.cxx
+svx/source/sdr/properties/e3dsphereproperties.cxx
+svx/source/sdr/properties/emptyproperties.cxx
+svx/source/sdr/properties/graphicproperties.cxx
+svx/source/sdr/properties/groupproperties.cxx
+svx/source/sdr/properties/itemsettools.cxx
+svx/source/sdr/properties/measureproperties.cxx
+svx/source/sdr/properties/oleproperties.cxx
+svx/source/sdr/properties/pageproperties.cxx
+svx/source/sdr/properties/properties.cxx
+svx/source/sdr/properties/rectangleproperties.cxx
+svx/source/sdr/properties/textproperties.cxx
+svx/source/sidebar/ContextChangeEventMultiplexer.cxx
+svx/source/sidebar/PanelFactory.cxx
+svx/source/sidebar/SelectionChangeHandler.cxx
+svx/source/sidebar/area/AreaPropertyPanel.cxx
+svx/source/sidebar/area/AreaPropertyPanel.hxx
+svx/source/sidebar/area/AreaPropertyPanelBase.cxx
+svx/source/sidebar/area/AreaTransparencyGradientPopup.cxx
+svx/source/sidebar/graphic/GraphicPropertyPanel.cxx
+svx/source/sidebar/graphic/GraphicPropertyPanel.hxx
+svx/source/sidebar/line/LinePropertyPanel.cxx
+svx/source/sidebar/line/LinePropertyPanel.hxx
+svx/source/sidebar/line/LinePropertyPanelBase.cxx
+svx/source/sidebar/line/LineWidthValueSet.cxx
+svx/source/sidebar/line/LineWidthValueSet.hxx
+svx/source/sidebar/media/MediaPlaybackPanel.cxx
+svx/source/sidebar/media/MediaPlaybackPanel.hxx
+svx/source/sidebar/nbdtmg.cxx
+svx/source/sidebar/paragraph/ParaLineSpacingControl.cxx
+svx/source/sidebar/paragraph/ParaPropertyPanel.cxx
+svx/source/sidebar/paragraph/ParaPropertyPanel.hxx
+svx/source/sidebar/paragraph/ParaSpacingControl.cxx
+svx/source/sidebar/paragraph/ParaSpacingWindow.cxx
+svx/source/sidebar/possize/PosSizePropertyPanel.cxx
+svx/source/sidebar/possize/PosSizePropertyPanel.hxx
+svx/source/sidebar/shadow/ShadowPropertyPanel.cxx
+svx/source/sidebar/shadow/ShadowPropertyPanel.hxx
+svx/source/sidebar/shapes/DefaultShapesPanel.cxx
+svx/source/sidebar/shapes/ShapesUtil.cxx
+svx/source/sidebar/styles/StylesPropertyPanel.cxx
+svx/source/sidebar/styles/StylesPropertyPanel.hxx
+svx/source/sidebar/text/TextCharacterSpacingControl.cxx
+svx/source/sidebar/text/TextCharacterSpacingControl.hxx
+svx/source/sidebar/text/TextPropertyPanel.cxx
+svx/source/sidebar/text/TextPropertyPanel.hxx
+svx/source/sidebar/text/TextUnderlineControl.cxx
+svx/source/sidebar/tools/ValueSetWithTextControl.cxx
+svx/source/smarttags/SmartTagMgr.cxx
+svx/source/stbctrls/insctrl.cxx
+svx/source/stbctrls/modctrl.cxx
+svx/source/stbctrls/pszctrl.cxx
+svx/source/stbctrls/selctrl.cxx
+svx/source/stbctrls/stbctrls.h
+svx/source/stbctrls/xmlsecctrl.cxx
+svx/source/stbctrls/zoomctrl.cxx
+svx/source/stbctrls/zoomsliderctrl.cxx
+svx/source/styles/ColorSets.cxx
+svx/source/styles/CommonStyleManager.cxx
+svx/source/styles/CommonStylePreviewRenderer.cxx
+svx/source/svdraw/ActionDescriptionProvider.cxx
+svx/source/svdraw/charthelper.cxx
+svx/source/svdraw/clonelist.cxx
+svx/source/svdraw/gradtrns.cxx
+svx/source/svdraw/gradtrns.hxx
+svx/source/svdraw/polypolygoneditor.cxx
+svx/source/svdraw/sdrhittesthelper.cxx
+svx/source/svdraw/sdrmasterpagedescriptor.cxx
+svx/source/svdraw/sdrpagewindow.cxx
+svx/source/svdraw/sdrpaintwindow.cxx
+svx/source/svdraw/selectioncontroller.cxx
+svx/source/svdraw/svdattr.cxx
+svx/source/svdraw/svdcrtv.cxx
+svx/source/svdraw/svddrag.cxx
+svx/source/svdraw/svddrgm1.hxx
+svx/source/svdraw/svddrgmt.cxx
+svx/source/svdraw/svddrgv.cxx
+svx/source/svdraw/svdedtv.cxx
+svx/source/svdraw/svdedtv1.cxx
+svx/source/svdraw/svdedtv2.cxx
+svx/source/svdraw/svdetc.cxx
+svx/source/svdraw/svdfmtf.cxx
+svx/source/svdraw/svdfmtf.hxx
+svx/source/svdraw/svdglev.cxx
+svx/source/svdraw/svdglue.cxx
+svx/source/svdraw/svdhdl.cxx
+svx/source/svdraw/svdhlpln.cxx
+svx/source/svdraw/svditer.cxx
+svx/source/svdraw/svdlayer.cxx
+svx/source/svdraw/svdmark.cxx
+svx/source/svdraw/svdmodel.cxx
+svx/source/svdraw/svdmrkv.cxx
+svx/source/svdraw/svdmrkv1.cxx
+svx/source/svdraw/svdoashp.cxx
+svx/source/svdraw/svdobj.cxx
+svx/source/svdraw/svdobjplusdata.cxx
+svx/source/svdraw/svdobjuserdatalist.cxx
+svx/source/svdraw/svdocapt.cxx
+svx/source/svdraw/svdocirc.cxx
+svx/source/svdraw/svdoedge.cxx
+svx/source/svdraw/svdograf.cxx
+svx/source/svdraw/svdogrp.cxx
+svx/source/svdraw/svdomeas.cxx
+svx/source/svdraw/svdomedia.cxx
+svx/source/svdraw/svdoole2.cxx
+svx/source/svdraw/svdopage.cxx
+svx/source/svdraw/svdopath.cxx
+svx/source/svdraw/svdorect.cxx
+svx/source/svdraw/svdotext.cxx
+svx/source/svdraw/svdotextdecomposition.cxx
+svx/source/svdraw/svdotextpathdecomposition.cxx
+svx/source/svdraw/svdotxat.cxx
+svx/source/svdraw/svdotxdr.cxx
+svx/source/svdraw/svdotxed.cxx
+svx/source/svdraw/svdotxfl.cxx
+svx/source/svdraw/svdotxln.cxx
+svx/source/svdraw/svdotxtr.cxx
+svx/source/svdraw/svdouno.cxx
+svx/source/svdraw/svdoutl.cxx
+svx/source/svdraw/svdoutlinercache.cxx
+svx/source/svdraw/svdovirt.cxx
+svx/source/svdraw/svdpage.cxx
+svx/source/svdraw/svdpagv.cxx
+svx/source/svdraw/svdpntv.cxx
+svx/source/svdraw/svdpoev.cxx
+svx/source/svdraw/svdsnpv.cxx
+svx/source/svdraw/svdtext.cxx
+svx/source/svdraw/svdtrans.cxx
+svx/source/svdraw/svdundo.cxx
+svx/source/svdraw/svdview.cxx
+svx/source/svdraw/svdxcgv.cxx
+svx/source/svdraw/textchain.cxx
+svx/source/svdraw/textchaincursor.cxx
+svx/source/svdraw/textchainflow.cxx
+svx/source/table/accessiblecell.cxx
+svx/source/table/accessiblecell.hxx
+svx/source/table/accessibletableshape.cxx
+svx/source/table/cell.cxx
+svx/source/table/cellcursor.cxx
+svx/source/table/cellcursor.hxx
+svx/source/table/cellrange.cxx
+svx/source/table/cellrange.hxx
+svx/source/table/propertyset.cxx
+svx/source/table/propertyset.hxx
+svx/source/table/svdotable.cxx
+svx/source/table/tablecolumn.cxx
+svx/source/table/tablecolumn.hxx
+svx/source/table/tablecolumns.cxx
+svx/source/table/tablecolumns.hxx
+svx/source/table/tablecontroller.cxx
+svx/source/table/tabledesign.cxx
+svx/source/table/tablehandles.cxx
+svx/source/table/tablehandles.hxx
+svx/source/table/tablelayouter.cxx
+svx/source/table/tablelayouter.hxx
+svx/source/table/tablemodel.cxx
+svx/source/table/tablerow.cxx
+svx/source/table/tablerow.hxx
+svx/source/table/tablerows.cxx
+svx/source/table/tablertfexporter.cxx
+svx/source/table/tablertfimporter.cxx
+svx/source/table/tableundo.cxx
+svx/source/table/tableundo.hxx
+svx/source/table/viewcontactoftableobj.cxx
+svx/source/table/viewcontactoftableobj.hxx
+svx/source/tbxctrls/Palette.cxx
+svx/source/tbxctrls/PaletteManager.cxx
+svx/source/tbxctrls/SvxColorChildWindow.cxx
+svx/source/tbxctrls/SvxColorValueSet.cxx
+svx/source/tbxctrls/bulletsnumbering.cxx
+svx/source/tbxctrls/colrctrl.cxx
+svx/source/tbxctrls/extrusioncontrols.cxx
+svx/source/tbxctrls/extrusioncontrols.hxx
+svx/source/tbxctrls/fillctrl.cxx
+svx/source/tbxctrls/fontworkgallery.cxx
+svx/source/tbxctrls/formatpaintbrushctrl.cxx
+svx/source/tbxctrls/grafctrl.cxx
+svx/source/tbxctrls/itemwin.cxx
+svx/source/tbxctrls/layctrl.cxx
+svx/source/tbxctrls/lboxctrl.cxx
+svx/source/tbxctrls/linectrl.cxx
+svx/source/tbxctrls/linemetricbox.hxx
+svx/source/tbxctrls/linewidthctrl.cxx
+svx/source/tbxctrls/tbcontrl.cxx
+svx/source/tbxctrls/tbunocontroller.cxx
+svx/source/tbxctrls/tbunosearchcontrollers.cxx
+svx/source/tbxctrls/tbxcolor.cxx
+svx/source/tbxctrls/tbxcolorupdate.cxx
+svx/source/tbxctrls/tbxdrctl.cxx
+svx/source/toolbars/extrusionbar.cxx
+svx/source/toolbars/fontworkbar.cxx
+svx/source/uitest/uiobject.cxx
+svx/source/unodialogs/textconversiondlgs/chinese_dictionarydialog.cxx
+svx/source/unodialogs/textconversiondlgs/chinese_dictionarydialog.hxx
+svx/source/unodialogs/textconversiondlgs/chinese_translation_unodialog.cxx
+svx/source/unodialogs/textconversiondlgs/chinese_translation_unodialog.hxx
+svx/source/unodialogs/textconversiondlgs/chinese_translationdialog.cxx
+svx/source/unodraw/UnoGraphicExporter.cxx
+svx/source/unodraw/UnoNameItemTable.cxx
+svx/source/unodraw/UnoNameItemTable.hxx
+svx/source/unodraw/UnoNamespaceMap.cxx
+svx/source/unodraw/XPropertyTable.cxx
+svx/source/unodraw/gluepts.cxx
+svx/source/unodraw/recoveryui.cxx
+svx/source/unodraw/shapeimpl.hxx
+svx/source/unodraw/shapepropertynotifier.cxx
+svx/source/unodraw/tableshape.cxx
+svx/source/unodraw/unobrushitemhelper.cxx
+svx/source/unodraw/unobtabl.cxx
+svx/source/unodraw/unoctabl.cxx
+svx/source/unodraw/unohtabl.cxx
+svx/source/unodraw/unomlstr.cxx
+svx/source/unodraw/unomod.cxx
+svx/source/unodraw/unomtabl.cxx
+svx/source/unodraw/unopage.cxx
+svx/source/unodraw/unopool.cxx
+svx/source/unodraw/unoprov.cxx
+svx/source/unodraw/unoshap2.cxx
+svx/source/unodraw/unoshap3.cxx
+svx/source/unodraw/unoshap4.cxx
+svx/source/unodraw/unoshape.cxx
+svx/source/unodraw/unoshcol.cxx
+svx/source/unodraw/unoshtxt.cxx
+svx/source/unogallery/unogalitem.cxx
+svx/source/unogallery/unogalitem.hxx
+svx/source/unogallery/unogaltheme.cxx
+svx/source/unogallery/unogaltheme.hxx
+svx/source/unogallery/unogalthemeprovider.cxx
+svx/source/xml/xmleohlp.cxx
+svx/source/xml/xmlexport.cxx
+svx/source/xml/xmlgrhlp.cxx
+svx/source/xml/xmlxtexp.cxx
+svx/source/xml/xmlxtimp.cxx
+svx/source/xoutdev/_xoutbmp.cxx
+svx/source/xoutdev/_xpoly.cxx
+svx/source/xoutdev/xattr.cxx
+svx/source/xoutdev/xattr2.cxx
+svx/source/xoutdev/xattrbmp.cxx
+svx/source/xoutdev/xpool.cxx
+svx/source/xoutdev/xtabbtmp.cxx
+svx/source/xoutdev/xtabcolr.cxx
+svx/source/xoutdev/xtabdash.cxx
+svx/source/xoutdev/xtabgrdt.cxx
+svx/source/xoutdev/xtabhtch.cxx
+svx/source/xoutdev/xtable.cxx
+svx/source/xoutdev/xtablend.cxx
+svx/source/xoutdev/xtabptrn.cxx
+sw/inc/AnnotationWin.hxx
+sw/inc/EnhancedPDFExportHelper.hxx
+sw/inc/IDocumentContentOperations.hxx
+sw/inc/IDocumentExternalData.hxx
+sw/inc/IDocumentFieldsAccess.hxx
+sw/inc/IDocumentLayoutAccess.hxx
+sw/inc/IDocumentLinksAdministration.hxx
+sw/inc/IDocumentListItems.hxx
+sw/inc/IDocumentListsAccess.hxx
+sw/inc/IDocumentMarkAccess.hxx
+sw/inc/IDocumentOutlineNodes.hxx
+sw/inc/IDocumentRedlineAccess.hxx
+sw/inc/IDocumentUndoRedo.hxx
+sw/inc/IMark.hxx
+sw/inc/PostItMgr.hxx
+sw/inc/SwAppletImpl.hxx
+sw/inc/SwStyleNameMapper.hxx
+sw/inc/SwUndoField.hxx
+sw/inc/SwXMLSectionList.hxx
+sw/inc/TextCursorHelper.hxx
+sw/inc/ToxLinkProcessor.hxx
+sw/inc/ToxTabStopTokenHandler.hxx
+sw/inc/ToxTextGenerator.hxx
+sw/inc/accessibilityoptions.hxx
+sw/inc/accmap.hxx
+sw/inc/acmplwrd.hxx
+sw/inc/anchoreddrawobject.hxx
+sw/inc/anchoredobject.hxx
+sw/inc/authfld.hxx
+sw/inc/authratr.hxx
+sw/inc/bparr.hxx
+sw/inc/breakit.hxx
+sw/inc/calbck.hxx
+sw/inc/calc.hxx
+sw/inc/ccoll.hxx
+sw/inc/cellatr.hxx
+sw/inc/cellfml.hxx
+sw/inc/charatr.hxx
+sw/inc/charfmt.hxx
+sw/inc/chpfld.hxx
+sw/inc/cmdid.h
+sw/inc/comcore.hxx
+sw/inc/crsrsh.hxx
+sw/inc/crstate.hxx
+sw/inc/cshtyp.hxx
+sw/inc/dbfld.hxx
+sw/inc/dbmgr.hxx
+sw/inc/dcontact.hxx
+sw/inc/ddefld.hxx
+sw/inc/dlelstnr.hxx
+sw/inc/doc.hxx
+sw/inc/docary.hxx
+sw/inc/docsh.hxx
+sw/inc/docstat.hxx
+sw/inc/docstyle.hxx
+sw/inc/docufld.hxx
+sw/inc/dpage.hxx
+sw/inc/edglbldc.hxx
+sw/inc/edimp.hxx
+sw/inc/editsh.hxx
+sw/inc/expfld.hxx
+sw/inc/extinput.hxx
+sw/inc/fchrfmt.hxx
+sw/inc/fesh.hxx
+sw/inc/finalthreadmanager.hxx
+sw/inc/fldbas.hxx
+sw/inc/flddat.hxx
+sw/inc/flyenum.hxx
+sw/inc/flypos.hxx
+sw/inc/fmtanchr.hxx
+sw/inc/fmtautofmt.hxx
+sw/inc/fmtclbl.hxx
+sw/inc/fmtclds.hxx
+sw/inc/fmtcnct.hxx
+sw/inc/fmtcntnt.hxx
+sw/inc/fmtcol.hxx
+sw/inc/fmtcolfunc.hxx
+sw/inc/fmteiro.hxx
+sw/inc/fmtflcnt.hxx
+sw/inc/fmtfld.hxx
+sw/inc/fmtfollowtextflow.hxx
+sw/inc/fmtfordr.hxx
+sw/inc/fmtfsize.hxx
+sw/inc/fmtftn.hxx
+sw/inc/fmtftntx.hxx
+sw/inc/fmthdft.hxx
+sw/inc/fmtinfmt.hxx
+sw/inc/fmtline.hxx
+sw/inc/fmtlsplt.hxx
+sw/inc/fmtmeta.hxx
+sw/inc/fmtornt.hxx
+sw/inc/fmtpdsc.hxx
+sw/inc/fmtrfmrk.hxx
+sw/inc/fmtrowsplt.hxx
+sw/inc/fmtruby.hxx
+sw/inc/fmtsrnd.hxx
+sw/inc/fmturl.hxx
+sw/inc/fmtwrapinfluenceonobjpos.hxx
+sw/inc/format.hxx
+sw/inc/frmatr.hxx
+sw/inc/frmfmt.hxx
+sw/inc/ftnidx.hxx
+sw/inc/ftninfo.hxx
+sw/inc/globdoc.hxx
+sw/inc/gotodlg.hxx
+sw/inc/grfatr.hxx
+sw/inc/helpids.h
+sw/inc/hfspacingitem.hxx
+sw/inc/hhcwrp.hxx
+sw/inc/hints.hxx
+sw/inc/htmltbl.hxx
+sw/inc/index.hxx
+sw/inc/init.hxx
+sw/inc/iodetect.hxx
+sw/inc/istyleaccess.hxx
+sw/inc/itabenum.hxx
+sw/inc/legacyitem.hxx
+sw/inc/lineinfo.hxx
+sw/inc/list.hxx
+sw/inc/mdiexp.hxx
+sw/inc/modcfg.hxx
+sw/inc/modeltoviewhelper.hxx
+sw/inc/ndarr.hxx
+sw/inc/ndgrf.hxx
+sw/inc/ndhints.hxx
+sw/inc/ndindex.hxx
+sw/inc/ndnotxt.hxx
+sw/inc/ndole.hxx
+sw/inc/ndtxt.hxx
+sw/inc/ndtyp.hxx
+sw/inc/node.hxx
+sw/inc/numrule.hxx
+sw/inc/pagedesc.hxx
+sw/inc/pagepreviewlayout.hxx
+sw/inc/pam.hxx
+sw/inc/paratr.hxx
+sw/inc/poolfmt.hxx
+sw/inc/postithelper.hxx
+sw/inc/printdata.hxx
+sw/inc/proofreadingiterator.hxx
+sw/inc/pvprtdat.hxx
+sw/inc/rdfhelper.hxx
+sw/inc/redline.hxx
+sw/inc/reffld.hxx
+sw/inc/ring.hxx
+sw/inc/rubylist.hxx
+sw/inc/section.hxx
+sw/inc/shellid.hxx
+sw/inc/shellio.hxx
+sw/inc/shellres.hxx
+sw/inc/sortopt.hxx
+sw/inc/splargs.hxx
+sw/inc/swabstdlg.hxx
+sw/inc/swacorr.hxx
+sw/inc/swatrset.hxx
+sw/inc/swbaslnk.hxx
+sw/inc/swcalwrp.hxx
+sw/inc/swcrsr.hxx
+sw/inc/swdbdata.hxx
+sw/inc/swerror.h
+sw/inc/swevent.hxx
+sw/inc/swfltopt.hxx
+sw/inc/swmodule.hxx
+sw/inc/swrect.hxx
+sw/inc/swregion.hxx
+sw/inc/swscanner.hxx
+sw/inc/swserv.hxx
+sw/inc/swtable.hxx
+sw/inc/swtblfmt.hxx
+sw/inc/swtypes.hxx
+sw/inc/swundo.hxx
+sw/inc/swunohelper.hxx
+sw/inc/swurl.hxx
+sw/inc/swwait.hxx
+sw/inc/tabcol.hxx
+sw/inc/tblafmt.hxx
+sw/inc/tblenum.hxx
+sw/inc/tblsel.hxx
+sw/inc/tgrditem.hxx
+sw/inc/tox.hxx
+sw/inc/toxwrap.hxx
+sw/inc/txatbase.hxx
+sw/inc/txatritr.hxx
+sw/inc/txtannotationfld.hxx
+sw/inc/txtatr.hxx
+sw/inc/txtflcnt.hxx
+sw/inc/txtfld.hxx
+sw/inc/txtftn.hxx
+sw/inc/txtinet.hxx
+sw/inc/txtrfmrk.hxx
+sw/inc/txttxmrk.hxx
+sw/inc/undobj.hxx
+sw/inc/unobaseclass.hxx
+sw/inc/unochart.hxx
+sw/inc/unocoll.hxx
+sw/inc/unocrsr.hxx
+sw/inc/unocrsrhelper.hxx
+sw/inc/unodraw.hxx
+sw/inc/unofieldcoll.hxx
+sw/inc/unoframe.hxx
+sw/inc/unoidxcoll.hxx
+sw/inc/unomap.hxx
+sw/inc/unomid.h
+sw/inc/unoparagraph.hxx
+sw/inc/unoredline.hxx
+sw/inc/unoredlines.hxx
+sw/inc/unosett.hxx
+sw/inc/unosrch.hxx
+sw/inc/unostyle.hxx
+sw/inc/unotbl.hxx
+sw/inc/unotext.hxx
+sw/inc/unotextbodyhf.hxx
+sw/inc/unotextcursor.hxx
+sw/inc/unotextrange.hxx
+sw/inc/unotxdoc.hxx
+sw/inc/usrfld.hxx
+sw/inc/view.hxx
+sw/inc/viewopt.hxx
+sw/inc/viewsh.hxx
+sw/inc/viscrs.hxx
+sw/inc/wdocsh.hxx
+sw/qa/core/Test-BigPtrArray.cxx
+sw/qa/core/filters-test.cxx
+sw/qa/core/macros-test.cxx
+sw/qa/core/test_ToxLinkProcessor.cxx
+sw/qa/core/test_ToxTextGenerator.cxx
+sw/qa/core/uwriter.cxx
+sw/qa/extras/docbookexport/docbookexport.cxx
+sw/qa/extras/globalfilter/globalfilter.cxx
+sw/qa/extras/htmlimport/htmlimport.cxx
+sw/qa/extras/mailmerge/mailmerge.cxx
+sw/qa/extras/odfexport/odfexport.cxx
+sw/qa/extras/odfexport/odfexport2.cxx
+sw/qa/extras/odfimport/odfimport.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport10.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport11.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport15.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport17.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport18.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport2.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport3.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport4.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport5.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport6.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport7.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
+sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
+sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx
+sw/qa/extras/ooxmlexport/ooxmlw14export.cxx
+sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+sw/qa/extras/tiledrendering/tiledrendering.cxx
+sw/qa/extras/txtencexport/txtencexport.cxx
+sw/qa/extras/uiwriter/uiwriter.cxx
+sw/qa/extras/ww8export/ww8export.cxx
+sw/qa/extras/ww8export/ww8export2.cxx
+sw/qa/extras/ww8export/ww8export3.cxx
+sw/qa/extras/ww8export/ww8export4.cxx
+sw/qa/extras/ww8import/ww8import.cxx
+sw/qa/inc/bordertest.hxx
+sw/qa/inc/swmodeltestbase.hxx
+sw/qa/unit/sw-dialogs-test.cxx
+sw/qa/unit/sw-dialogs-test_2.cxx
+sw/source/core/SwNumberTree/SwNodeNum.cxx
+sw/source/core/SwNumberTree/SwNumberTree.cxx
+sw/source/core/access/acccell.cxx
+sw/source/core/access/acccell.hxx
+sw/source/core/access/acccontext.cxx
+sw/source/core/access/acccontext.hxx
+sw/source/core/access/accdoc.cxx
+sw/source/core/access/accdoc.hxx
+sw/source/core/access/accembedded.cxx
+sw/source/core/access/accembedded.hxx
+sw/source/core/access/accfootnote.cxx
+sw/source/core/access/accfootnote.hxx
+sw/source/core/access/accframe.cxx
+sw/source/core/access/accframe.hxx
+sw/source/core/access/accframebase.cxx
+sw/source/core/access/accframebase.hxx
+sw/source/core/access/accfrmobj.cxx
+sw/source/core/access/accfrmobj.hxx
+sw/source/core/access/accfrmobjmap.cxx
+sw/source/core/access/accfrmobjmap.hxx
+sw/source/core/access/accfrmobjslist.cxx
+sw/source/core/access/accfrmobjslist.hxx
+sw/source/core/access/accgraphic.cxx
+sw/source/core/access/accgraphic.hxx
+sw/source/core/access/accheaderfooter.cxx
+sw/source/core/access/acchyperlink.cxx
+sw/source/core/access/acchyperlink.hxx
+sw/source/core/access/acchypertextdata.cxx
+sw/source/core/access/acchypertextdata.hxx
+sw/source/core/access/accmap.cxx
+sw/source/core/access/accnotextframe.cxx
+sw/source/core/access/accnotextframe.hxx
+sw/source/core/access/accnotexthyperlink.cxx
+sw/source/core/access/accnotexthyperlink.hxx
+sw/source/core/access/accpage.cxx
+sw/source/core/access/accpage.hxx
+sw/source/core/access/accpara.cxx
+sw/source/core/access/accpara.hxx
+sw/source/core/access/accportions.cxx
+sw/source/core/access/accportions.hxx
+sw/source/core/access/accpreview.cxx
+sw/source/core/access/accpreview.hxx
+sw/source/core/access/accselectionhelper.cxx
+sw/source/core/access/accselectionhelper.hxx
+sw/source/core/access/acctable.cxx
+sw/source/core/access/acctable.hxx
+sw/source/core/access/acctextframe.cxx
+sw/source/core/access/acctextframe.hxx
+sw/source/core/access/parachangetrackinginfo.cxx
+sw/source/core/access/parachangetrackinginfo.hxx
+sw/source/core/access/textmarkuphelper.cxx
+sw/source/core/access/textmarkuphelper.hxx
+sw/source/core/attr/calbck.cxx
+sw/source/core/attr/cellatr.cxx
+sw/source/core/attr/fmtwrapinfluenceonobjpos.cxx
+sw/source/core/attr/format.cxx
+sw/source/core/attr/hints.cxx
+sw/source/core/attr/swatrset.cxx
+sw/source/core/bastyp/bparr.cxx
+sw/source/core/bastyp/breakit.cxx
+sw/source/core/bastyp/calc.cxx
+sw/source/core/bastyp/index.cxx
+sw/source/core/bastyp/init.cxx
+sw/source/core/bastyp/swcache.cxx
+sw/source/core/bastyp/swrect.cxx
+sw/source/core/bastyp/swregion.cxx
+sw/source/core/bastyp/tabcol.cxx
+sw/source/core/crsr/BlockCursor.hxx
+sw/source/core/crsr/annotationmark.cxx
+sw/source/core/crsr/bookmark.cxx
+sw/source/core/crsr/callnk.cxx
+sw/source/core/crsr/callnk.hxx
+sw/source/core/crsr/crbm.cxx
+sw/source/core/crsr/crossrefbookmark.cxx
+sw/source/core/crsr/crsrsh.cxx
+sw/source/core/crsr/crstrvl.cxx
+sw/source/core/crsr/crstrvl1.cxx
+sw/source/core/crsr/findattr.cxx
+sw/source/core/crsr/findcoll.cxx
+sw/source/core/crsr/findfmt.cxx
+sw/source/core/crsr/findtxt.cxx
+sw/source/core/crsr/overlayrangesoutline.cxx
+sw/source/core/crsr/overlayrangesoutline.hxx
+sw/source/core/crsr/pam.cxx
+sw/source/core/crsr/paminit.cxx
+sw/source/core/crsr/swcrsr.cxx
+sw/source/core/crsr/trvlcol.cxx
+sw/source/core/crsr/trvlfnfl.cxx
+sw/source/core/crsr/trvlreg.cxx
+sw/source/core/crsr/trvltbl.cxx
+sw/source/core/crsr/viscrs.cxx
+sw/source/core/doc/CntntIdxStore.cxx
+sw/source/core/doc/DocumentChartDataProviderManager.cxx
+sw/source/core/doc/DocumentContentOperationsManager.cxx
+sw/source/core/doc/DocumentDeviceManager.cxx
+sw/source/core/doc/DocumentDrawModelManager.cxx
+sw/source/core/doc/DocumentExternalDataManager.cxx
+sw/source/core/doc/DocumentFieldsManager.cxx
+sw/source/core/doc/DocumentLayoutManager.cxx
+sw/source/core/doc/DocumentLinksAdministrationManager.cxx
+sw/source/core/doc/DocumentListItemsManager.cxx
+sw/source/core/doc/DocumentListsManager.cxx
+sw/source/core/doc/DocumentOutlineNodesManager.cxx
+sw/source/core/doc/DocumentRedlineManager.cxx
+sw/source/core/doc/DocumentSettingManager.cxx
+sw/source/core/doc/DocumentStateManager.cxx
+sw/source/core/doc/DocumentStatisticsManager.cxx
+sw/source/core/doc/DocumentStylePoolManager.cxx
+sw/source/core/doc/DocumentTimerManager.cxx
+sw/source/core/doc/SwDocIdle.cxx
+sw/source/core/doc/SwStyleNameMapper.cxx
+sw/source/core/doc/acmplwrd.cxx
+sw/source/core/doc/dbgoutsw.cxx
+sw/source/core/doc/doc.cxx
+sw/source/core/doc/docbasic.cxx
+sw/source/core/doc/docbm.cxx
+sw/source/core/doc/docchart.cxx
+sw/source/core/doc/doccomp.cxx
+sw/source/core/doc/doccorr.cxx
+sw/source/core/doc/docdesc.cxx
+sw/source/core/doc/docdraw.cxx
+sw/source/core/doc/docedt.cxx
+sw/source/core/doc/docfld.cxx
+sw/source/core/doc/docfly.cxx
+sw/source/core/doc/docfmt.cxx
+sw/source/core/doc/docftn.cxx
+sw/source/core/doc/docglbl.cxx
+sw/source/core/doc/docglos.cxx
+sw/source/core/doc/doclay.cxx
+sw/source/core/doc/docnew.cxx
+sw/source/core/doc/docnum.cxx
+sw/source/core/doc/docredln.cxx
+sw/source/core/doc/docruby.cxx
+sw/source/core/doc/docsort.cxx
+sw/source/core/doc/docstat.cxx
+sw/source/core/doc/doctxm.cxx
+sw/source/core/doc/docxforms.cxx
+sw/source/core/doc/extinput.cxx
+sw/source/core/doc/fmtcol.cxx
+sw/source/core/doc/ftnidx.cxx
+sw/source/core/doc/gctable.cxx
+sw/source/core/doc/htmltbl.cxx
+sw/source/core/doc/lineinfo.cxx
+sw/source/core/doc/list.cxx
+sw/source/core/doc/notxtfrm.cxx
+sw/source/core/doc/number.cxx
+sw/source/core/doc/poolfmt.cxx
+sw/source/core/doc/rdfhelper.cxx
+sw/source/core/doc/sortopt.cxx
+sw/source/core/doc/swserv.cxx
+sw/source/core/doc/swstylemanager.cxx
+sw/source/core/doc/tblafmt.cxx
+sw/source/core/doc/tblcpy.cxx
+sw/source/core/doc/tblrwcl.cxx
+sw/source/core/doc/visiturl.cxx
+sw/source/core/docnode/cancellablejob.cxx
+sw/source/core/docnode/finalthreadmanager.cxx
+sw/source/core/docnode/ndcopy.cxx
+sw/source/core/docnode/ndnotxt.cxx
+sw/source/core/docnode/ndnum.cxx
+sw/source/core/docnode/ndsect.cxx
+sw/source/core/docnode/ndtbl.cxx
+sw/source/core/docnode/ndtbl1.cxx
+sw/source/core/docnode/node.cxx
+sw/source/core/docnode/node2lay.cxx
+sw/source/core/docnode/nodes.cxx
+sw/source/core/docnode/observablethread.cxx
+sw/source/core/docnode/retrievedinputstreamdata.cxx
+sw/source/core/docnode/retrieveinputstream.cxx
+sw/source/core/docnode/retrieveinputstreamconsumer.cxx
+sw/source/core/docnode/section.cxx
+sw/source/core/docnode/swbaslnk.cxx
+sw/source/core/docnode/swthreadmanager.cxx
+sw/source/core/docnode/threadlistener.cxx
+sw/source/core/docnode/threadmanager.cxx
+sw/source/core/docnode/threadmanager.hxx
+sw/source/core/draw/dcontact.cxx
+sw/source/core/draw/dflyobj.cxx
+sw/source/core/draw/dobjfac.cxx
+sw/source/core/draw/dpage.cxx
+sw/source/core/draw/drawdoc.cxx
+sw/source/core/draw/dview.cxx
+sw/source/core/edit/acorrect.cxx
+sw/source/core/edit/autofmt.cxx
+sw/source/core/edit/edatmisc.cxx
+sw/source/core/edit/edattr.cxx
+sw/source/core/edit/eddel.cxx
+sw/source/core/edit/edfcol.cxx
+sw/source/core/edit/edfld.cxx
+sw/source/core/edit/edfmt.cxx
+sw/source/core/edit/edglbldc.cxx
+sw/source/core/edit/edglss.cxx
+sw/source/core/edit/editsh.cxx
+sw/source/core/edit/edlingu.cxx
+sw/source/core/edit/ednumber.cxx
+sw/source/core/edit/edredln.cxx
+sw/source/core/edit/edsect.cxx
+sw/source/core/edit/edtab.cxx
+sw/source/core/edit/edtox.cxx
+sw/source/core/edit/edundo.cxx
+sw/source/core/edit/edws.cxx
+sw/source/core/fields/authfld.cxx
+sw/source/core/fields/cellfml.cxx
+sw/source/core/fields/chpfld.cxx
+sw/source/core/fields/dbfld.cxx
+sw/source/core/fields/ddefld.cxx
+sw/source/core/fields/ddetbl.cxx
+sw/source/core/fields/docufld.cxx
+sw/source/core/fields/expfld.cxx
+sw/source/core/fields/fldbas.cxx
+sw/source/core/fields/flddat.cxx
+sw/source/core/fields/flddropdown.cxx
+sw/source/core/fields/fldlst.cxx
+sw/source/core/fields/macrofld.cxx
+sw/source/core/fields/postithelper.cxx
+sw/source/core/fields/reffld.cxx
+sw/source/core/fields/scrptfld.cxx
+sw/source/core/fields/tblcalc.cxx
+sw/source/core/fields/textapi.cxx
+sw/source/core/fields/usrfld.cxx
+sw/source/core/frmedt/fecopy.cxx
+sw/source/core/frmedt/fedesc.cxx
+sw/source/core/frmedt/fefly1.cxx
+sw/source/core/frmedt/feflyole.cxx
+sw/source/core/frmedt/feshview.cxx
+sw/source/core/frmedt/fetab.cxx
+sw/source/core/frmedt/fews.cxx
+sw/source/core/frmedt/tblsel.cxx
+sw/source/core/graphic/grfatr.cxx
+sw/source/core/graphic/ndgrf.cxx
+sw/source/core/inc/DocumentChartDataProviderManager.hxx
+sw/source/core/inc/DocumentContentOperationsManager.hxx
+sw/source/core/inc/DocumentFieldsManager.hxx
+sw/source/core/inc/DocumentLayoutManager.hxx
+sw/source/core/inc/DocumentLinksAdministrationManager.hxx
+sw/source/core/inc/DocumentListItemsManager.hxx
+sw/source/core/inc/DocumentListsManager.hxx
+sw/source/core/inc/DocumentOutlineNodesManager.hxx
+sw/source/core/inc/DocumentRedlineManager.hxx
+sw/source/core/inc/DocumentSettingManager.hxx
+sw/source/core/inc/DocumentStateManager.hxx
+sw/source/core/inc/DocumentStylePoolManager.hxx
+sw/source/core/inc/GetMetricVal.hxx
+sw/source/core/inc/MarkManager.hxx
+sw/source/core/inc/SwPortionHandler.hxx
+sw/source/core/inc/SwUndoFmt.hxx
+sw/source/core/inc/SwUndoPageDesc.hxx
+sw/source/core/inc/SwXMLBlockExport.hxx
+sw/source/core/inc/SwXMLBlockImport.hxx
+sw/source/core/inc/SwXMLTextBlocks.hxx
+sw/source/core/inc/SwXTextDefaults.hxx
+sw/source/core/inc/UndoAttribute.hxx
+sw/source/core/inc/UndoCore.hxx
+sw/source/core/inc/UndoDelete.hxx
+sw/source/core/inc/UndoInsert.hxx
+sw/source/core/inc/UndoManager.hxx
+sw/source/core/inc/UndoNumbering.hxx
+sw/source/core/inc/UndoOverwrite.hxx
+sw/source/core/inc/UndoRedline.hxx
+sw/source/core/inc/UndoSection.hxx
+sw/source/core/inc/UndoSort.hxx
+sw/source/core/inc/UndoSplitMove.hxx
+sw/source/core/inc/UndoTable.hxx
+sw/source/core/inc/acorrect.hxx
+sw/source/core/inc/anchoredobjectposition.hxx
+sw/source/core/inc/annotationmark.hxx
+sw/source/core/inc/ascharanchoredobjectposition.hxx
+sw/source/core/inc/bodyfrm.hxx
+sw/source/core/inc/bookmark.hxx
+sw/source/core/inc/cellfrm.hxx
+sw/source/core/inc/cntfrm.hxx
+sw/source/core/inc/crossrefbookmark.hxx
+sw/source/core/inc/dbg_lay.hxx
+sw/source/core/inc/dflyobj.hxx
+sw/source/core/inc/docfld.hxx
+sw/source/core/inc/docsort.hxx
+sw/source/core/inc/doctxm.hxx
+sw/source/core/inc/drawfont.hxx
+sw/source/core/inc/dumpfilter.hxx
+sw/source/core/inc/dview.hxx
+sw/source/core/inc/flowfrm.hxx
+sw/source/core/inc/flyfrm.hxx
+sw/source/core/inc/flyfrms.hxx
+sw/source/core/inc/fntcache.hxx
+sw/source/core/inc/fntcap.hxx
+sw/source/core/inc/frame.hxx
+sw/source/core/inc/frminf.hxx
+sw/source/core/inc/frmtool.hxx
+sw/source/core/inc/ftnboss.hxx
+sw/source/core/inc/ftnfrm.hxx
+sw/source/core/inc/hffrm.hxx
+sw/source/core/inc/ifinishedthreadlistener.hxx
+sw/source/core/inc/layact.hxx
+sw/source/core/inc/laycache.hxx
+sw/source/core/inc/layfrm.hxx
+sw/source/core/inc/layouter.hxx
+sw/source/core/inc/movedfwdfrmsbyobjpos.hxx
+sw/source/core/inc/mvsave.hxx
+sw/source/core/inc/notxtfrm.hxx
+sw/source/core/inc/objectformatter.hxx
+sw/source/core/inc/observablethread.hxx
+sw/source/core/inc/pagedeschint.hxx
+sw/source/core/inc/pagefrm.hxx
+sw/source/core/inc/pamtyp.hxx
+sw/source/core/inc/prevwpage.hxx
+sw/source/core/inc/retrievedinputstreamdata.hxx
+sw/source/core/inc/retrieveinputstream.hxx
+sw/source/core/inc/retrieveinputstreamconsumer.hxx
+sw/source/core/inc/rolbck.hxx
+sw/source/core/inc/rootfrm.hxx
+sw/source/core/inc/scriptinfo.hxx
+sw/source/core/inc/sectfrm.hxx
+sw/source/core/inc/sortedobjs.hxx
+sw/source/core/inc/swblocks.hxx
+sw/source/core/inc/swcache.hxx
+sw/source/core/inc/swfntcch.hxx
+sw/source/core/inc/swfont.hxx
+sw/source/core/inc/swthreadmanager.hxx
+sw/source/core/inc/tabfrm.hxx
+sw/source/core/inc/tblrwcl.hxx
+sw/source/core/inc/textapi.hxx
+sw/source/core/inc/threadlistener.hxx
+sw/source/core/inc/tocntntanchoredobjectposition.hxx
+sw/source/core/inc/tolayoutanchoredobjectposition.hxx
+sw/source/core/inc/txmsrt.hxx
+sw/source/core/inc/txtfly.hxx
+sw/source/core/inc/txtfrm.hxx
+sw/source/core/inc/txttypes.hxx
+sw/source/core/inc/undoflystrattr.hxx
+sw/source/core/inc/unobookmark.hxx
+sw/source/core/inc/unofield.hxx
+sw/source/core/inc/unoflatpara.hxx
+sw/source/core/inc/unofldmid.h
+sw/source/core/inc/unofootnote.hxx
+sw/source/core/inc/unoidx.hxx
+sw/source/core/inc/unometa.hxx
+sw/source/core/inc/unoparaframeenum.hxx
+sw/source/core/inc/unoport.hxx
+sw/source/core/inc/unorefmark.hxx
+sw/source/core/inc/unosection.hxx
+sw/source/core/inc/unotextmarkup.hxx
+sw/source/core/inc/viewimp.hxx
+sw/source/core/inc/wrong.hxx
+sw/source/core/layout/anchoreddrawobject.cxx
+sw/source/core/layout/anchoredobject.cxx
+sw/source/core/layout/atrfrm.cxx
+sw/source/core/layout/calcmove.cxx
+sw/source/core/layout/colfrm.cxx
+sw/source/core/layout/dbg_lay.cxx
+sw/source/core/layout/dumpfilter.cxx
+sw/source/core/layout/findfrm.cxx
+sw/source/core/layout/flowfrm.cxx
+sw/source/core/layout/fly.cxx
+sw/source/core/layout/flycnt.cxx
+sw/source/core/layout/flyincnt.cxx
+sw/source/core/layout/flylay.cxx
+sw/source/core/layout/frmtool.cxx
+sw/source/core/layout/ftnfrm.cxx
+sw/source/core/layout/hffrm.cxx
+sw/source/core/layout/layact.cxx
+sw/source/core/layout/laycache.cxx
+sw/source/core/layout/layhelp.hxx
+sw/source/core/layout/layouter.cxx
+sw/source/core/layout/legacyitem.cxx
+sw/source/core/layout/movedfwdfrmsbyobjpos.cxx
+sw/source/core/layout/newfrm.cxx
+sw/source/core/layout/objectformatter.cxx
+sw/source/core/layout/objectformatterlayfrm.cxx
+sw/source/core/layout/objectformatterlayfrm.hxx
+sw/source/core/layout/objectformattertxtfrm.cxx
+sw/source/core/layout/objectformattertxtfrm.hxx
+sw/source/core/layout/objstmpconsiderwrapinfl.cxx
+sw/source/core/layout/objstmpconsiderwrapinfl.hxx
+sw/source/core/layout/pagechg.cxx
+sw/source/core/layout/pagedesc.cxx
+sw/source/core/layout/paintfrm.cxx
+sw/source/core/layout/sectfrm.cxx
+sw/source/core/layout/softpagebreak.cxx
+sw/source/core/layout/sortedobjs.cxx
+sw/source/core/layout/ssfrm.cxx
+sw/source/core/layout/swselectionlist.cxx
+sw/source/core/layout/tabfrm.cxx
+sw/source/core/layout/trvlfrm.cxx
+sw/source/core/layout/unusedf.cxx
+sw/source/core/layout/virtoutp.cxx
+sw/source/core/layout/virtoutp.hxx
+sw/source/core/layout/wsfrm.cxx
+sw/source/core/objectpositioning/anchoredobjectposition.cxx
+sw/source/core/objectpositioning/ascharanchoredobjectposition.cxx
+sw/source/core/objectpositioning/environmentofanchoredobject.cxx
+sw/source/core/objectpositioning/tocntntanchoredobjectposition.cxx
+sw/source/core/objectpositioning/tolayoutanchoredobjectposition.cxx
+sw/source/core/ole/ndole.cxx
+sw/source/core/para/paratr.cxx
+sw/source/core/sw3io/swacorr.cxx
+sw/source/core/swg/SwXMLBlockExport.cxx
+sw/source/core/swg/SwXMLBlockImport.cxx
+sw/source/core/swg/SwXMLSectionList.cxx
+sw/source/core/swg/SwXMLTextBlocks.cxx
+sw/source/core/swg/SwXMLTextBlocks1.cxx
+sw/source/core/swg/swblocks.cxx
+sw/source/core/table/swnewtable.cxx
+sw/source/core/table/swtable.cxx
+sw/source/core/text/EnhancedPDFExportHelper.cxx
+sw/source/core/text/SwGrammarMarkUp.cxx
+sw/source/core/text/atrhndl.hxx
+sw/source/core/text/atrstck.cxx
+sw/source/core/text/frmcrsr.cxx
+sw/source/core/text/frmform.cxx
+sw/source/core/text/frminf.cxx
+sw/source/core/text/frmpaint.cxx
+sw/source/core/text/guess.cxx
+sw/source/core/text/guess.hxx
+sw/source/core/text/inftxt.cxx
+sw/source/core/text/inftxt.hxx
+sw/source/core/text/itradj.cxx
+sw/source/core/text/itratr.cxx
+sw/source/core/text/itratr.hxx
+sw/source/core/text/itrcrsr.cxx
+sw/source/core/text/itrform2.cxx
+sw/source/core/text/itrform2.hxx
+sw/source/core/text/itrpaint.cxx
+sw/source/core/text/itrpaint.hxx
+sw/source/core/text/itrtxt.cxx
+sw/source/core/text/itrtxt.hxx
+sw/source/core/text/pordrop.hxx
+sw/source/core/text/porexp.cxx
+sw/source/core/text/porexp.hxx
+sw/source/core/text/porfld.cxx
+sw/source/core/text/porfld.hxx
+sw/source/core/text/porfly.cxx
+sw/source/core/text/porfly.hxx
+sw/source/core/text/porftn.hxx
+sw/source/core/text/porglue.cxx
+sw/source/core/text/porglue.hxx
+sw/source/core/text/porhyph.hxx
+sw/source/core/text/porlay.cxx
+sw/source/core/text/porlay.hxx
+sw/source/core/text/porlin.cxx
+sw/source/core/text/porlin.hxx
+sw/source/core/text/pormulti.cxx
+sw/source/core/text/pormulti.hxx
+sw/source/core/text/porref.cxx
+sw/source/core/text/porrst.cxx
+sw/source/core/text/porrst.hxx
+sw/source/core/text/portab.hxx
+sw/source/core/text/portox.cxx
+sw/source/core/text/portxt.cxx
+sw/source/core/text/portxt.hxx
+sw/source/core/text/possiz.hxx
+sw/source/core/text/redlnitr.cxx
+sw/source/core/text/redlnitr.hxx
+sw/source/core/text/txtcache.cxx
+sw/source/core/text/txtdrop.cxx
+sw/source/core/text/txtfld.cxx
+sw/source/core/text/txtfly.cxx
+sw/source/core/text/txtfrm.cxx
+sw/source/core/text/txtftn.cxx
+sw/source/core/text/txthyph.cxx
+sw/source/core/text/txtinit.cxx
+sw/source/core/text/txtpaint.cxx
+sw/source/core/text/txtpaint.hxx
+sw/source/core/text/txttab.cxx
+sw/source/core/text/widorp.cxx
+sw/source/core/text/widorp.hxx
+sw/source/core/text/wrong.cxx
+sw/source/core/text/xmldump.cxx
+sw/source/core/tox/ToxLinkProcessor.cxx
+sw/source/core/tox/ToxTabStopTokenHandler.cxx
+sw/source/core/tox/ToxTextGenerator.cxx
+sw/source/core/tox/ToxWhitespaceStripper.cxx
+sw/source/core/tox/tox.cxx
+sw/source/core/tox/toxhlp.cxx
+sw/source/core/tox/txmsrt.cxx
+sw/source/core/txtnode/SwGrammarContact.cxx
+sw/source/core/txtnode/atrfld.cxx
+sw/source/core/txtnode/atrflyin.cxx
+sw/source/core/txtnode/atrftn.cxx
+sw/source/core/txtnode/atrref.cxx
+sw/source/core/txtnode/atrtox.cxx
+sw/source/core/txtnode/fmtatr2.cxx
+sw/source/core/txtnode/fntcache.cxx
+sw/source/core/txtnode/fntcap.cxx
+sw/source/core/txtnode/modeltoviewhelper.cxx
+sw/source/core/txtnode/ndhints.cxx
+sw/source/core/txtnode/ndtxt.cxx
+sw/source/core/txtnode/swfntcch.cxx
+sw/source/core/txtnode/swfont.cxx
+sw/source/core/txtnode/thints.cxx
+sw/source/core/txtnode/txatbase.cxx
+sw/source/core/txtnode/txatritr.cxx
+sw/source/core/txtnode/txtatr2.cxx
+sw/source/core/txtnode/txtedt.cxx
+sw/source/core/undo/SwUndoField.cxx
+sw/source/core/undo/SwUndoFmt.cxx
+sw/source/core/undo/SwUndoPageDesc.cxx
+sw/source/core/undo/SwUndoTOXChange.cxx
+sw/source/core/undo/docundo.cxx
+sw/source/core/undo/rolbck.cxx
+sw/source/core/undo/unattr.cxx
+sw/source/core/undo/unbkmk.cxx
+sw/source/core/undo/undel.cxx
+sw/source/core/undo/undobj.cxx
+sw/source/core/undo/undobj1.cxx
+sw/source/core/undo/undoflystrattr.cxx
+sw/source/core/undo/undraw.cxx
+sw/source/core/undo/unfmco.cxx
+sw/source/core/undo/unins.cxx
+sw/source/core/undo/unmove.cxx
+sw/source/core/undo/unnum.cxx
+sw/source/core/undo/unoutl.cxx
+sw/source/core/undo/unovwr.cxx
+sw/source/core/undo/unredln.cxx
+sw/source/core/undo/unsect.cxx
+sw/source/core/undo/unsort.cxx
+sw/source/core/undo/unspnd.cxx
+sw/source/core/undo/untbl.cxx
+sw/source/core/undo/untblk.cxx
+sw/source/core/unocore/SwXTextDefaults.cxx
+sw/source/core/unocore/TextCursorHelper.cxx
+sw/source/core/unocore/XMLRangeHelper.cxx
+sw/source/core/unocore/XMLRangeHelper.hxx
+sw/source/core/unocore/swunohelper.cxx
+sw/source/core/unocore/unobkm.cxx
+sw/source/core/unocore/unochart.cxx
+sw/source/core/unocore/unocoll.cxx
+sw/source/core/unocore/unocrsr.cxx
+sw/source/core/unocore/unocrsrhelper.cxx
+sw/source/core/unocore/unodraw.cxx
+sw/source/core/unocore/unoevent.cxx
+sw/source/core/unocore/unofield.cxx
+sw/source/core/unocore/unoflatpara.cxx
+sw/source/core/unocore/unoframe.cxx
+sw/source/core/unocore/unoftn.cxx
+sw/source/core/unocore/unoidx.cxx
+sw/source/core/unocore/unomap.cxx
+sw/source/core/unocore/unomap1.cxx
+sw/source/core/unocore/unomapproperties.hxx
+sw/source/core/unocore/unoobj.cxx
+sw/source/core/unocore/unoobj2.cxx
+sw/source/core/unocore/unoparagraph.cxx
+sw/source/core/unocore/unoport.cxx
+sw/source/core/unocore/unoportenum.cxx
+sw/source/core/unocore/unoredline.cxx
+sw/source/core/unocore/unoredlines.cxx
+sw/source/core/unocore/unorefmk.cxx
+sw/source/core/unocore/unosect.cxx
+sw/source/core/unocore/unosett.cxx
+sw/source/core/unocore/unosrch.cxx
+sw/source/core/unocore/unostyle.cxx
+sw/source/core/unocore/unotbl.cxx
+sw/source/core/unocore/unotext.cxx
+sw/source/core/unocore/unotextmarkup.cxx
+sw/source/core/view/pagepreviewlayout.cxx
+sw/source/core/view/printdata.cxx
+sw/source/core/view/vdraw.cxx
+sw/source/core/view/viewimp.cxx
+sw/source/core/view/viewpg.cxx
+sw/source/core/view/viewsh.cxx
+sw/source/core/view/vnew.cxx
+sw/source/core/view/vprint.cxx
+sw/source/filter/ascii/ascatr.cxx
+sw/source/filter/ascii/parasc.cxx
+sw/source/filter/ascii/wrtasc.cxx
+sw/source/filter/basflt/docfact.cxx
+sw/source/filter/basflt/fltini.cxx
+sw/source/filter/basflt/fltshell.cxx
+sw/source/filter/basflt/iodetect.cxx
+sw/source/filter/basflt/shellio.cxx
+sw/source/filter/docx/swdocxreader.cxx
+sw/source/filter/html/SwAppletImpl.cxx
+sw/source/filter/html/css1atr.cxx
+sw/source/filter/html/htmlatr.cxx
+sw/source/filter/html/htmlbas.cxx
+sw/source/filter/html/htmlcss1.cxx
+sw/source/filter/html/htmlctxt.cxx
+sw/source/filter/html/htmldrawreader.cxx
+sw/source/filter/html/htmldrawwriter.cxx
+sw/source/filter/html/htmlfld.cxx
+sw/source/filter/html/htmlfldw.cxx
+sw/source/filter/html/htmlfly.cxx
+sw/source/filter/html/htmlfly.hxx
+sw/source/filter/html/htmlflyt.cxx
+sw/source/filter/html/htmlflywriter.cxx
+sw/source/filter/html/htmlform.cxx
+sw/source/filter/html/htmlforw.cxx
+sw/source/filter/html/htmlftn.cxx
+sw/source/filter/html/htmlgrin.cxx
+sw/source/filter/html/htmlnum.hxx
+sw/source/filter/html/htmlnumreader.cxx
+sw/source/filter/html/htmlnumwriter.cxx
+sw/source/filter/html/htmlplug.cxx
+sw/source/filter/html/htmlsect.cxx
+sw/source/filter/html/htmltab.cxx
+sw/source/filter/html/htmltabw.cxx
+sw/source/filter/html/parcss1.cxx
+sw/source/filter/html/parcss1.hxx
+sw/source/filter/html/svxcss1.cxx
+sw/source/filter/html/svxcss1.hxx
+sw/source/filter/html/swcss1.hxx
+sw/source/filter/html/swhtml.cxx
+sw/source/filter/html/swhtml.hxx
+sw/source/filter/html/wrthtml.cxx
+sw/source/filter/html/wrthtml.hxx
+sw/source/filter/inc/fltshell.hxx
+sw/source/filter/inc/msfilter.hxx
+sw/source/filter/inc/wrt_fn.hxx
+sw/source/filter/inc/wrtswtbl.hxx
+sw/source/filter/inc/wwstyles.hxx
+sw/source/filter/writer/writer.cxx
+sw/source/filter/writer/wrt_fn.cxx
+sw/source/filter/writer/wrtswtbl.cxx
+sw/source/filter/ww8/WW8FFData.cxx
+sw/source/filter/ww8/WW8Sttbf.cxx
+sw/source/filter/ww8/WW8Sttbf.hxx
+sw/source/filter/ww8/WW8TableInfo.cxx
+sw/source/filter/ww8/WW8TableInfo.hxx
+sw/source/filter/ww8/attributeoutputbase.hxx
+sw/source/filter/ww8/docxattributeoutput.cxx
+sw/source/filter/ww8/docxattributeoutput.hxx
+sw/source/filter/ww8/docxexport.cxx
+sw/source/filter/ww8/docxexport.hxx
+sw/source/filter/ww8/docxexportfilter.cxx
+sw/source/filter/ww8/docxexportfilter.hxx
+sw/source/filter/ww8/docxfootnotes.hxx
+sw/source/filter/ww8/docxsdrexport.hxx
+sw/source/filter/ww8/escher.hxx
+sw/source/filter/ww8/fields.cxx
+sw/source/filter/ww8/needed_cast.hxx
+sw/source/filter/ww8/sortedarray.hxx
+sw/source/filter/ww8/styles.cxx
+sw/source/filter/ww8/types.hxx
+sw/source/filter/ww8/writerhelper.cxx
+sw/source/filter/ww8/writerhelper.hxx
+sw/source/filter/ww8/writerwordglue.cxx
+sw/source/filter/ww8/writerwordglue.hxx
+sw/source/filter/ww8/wrtw8esh.cxx
+sw/source/filter/ww8/wrtw8nds.cxx
+sw/source/filter/ww8/wrtw8num.cxx
+sw/source/filter/ww8/wrtw8sty.cxx
+sw/source/filter/ww8/wrtww8.cxx
+sw/source/filter/ww8/wrtww8.hxx
+sw/source/filter/ww8/wrtww8gr.cxx
+sw/source/filter/ww8/ww8atr.cxx
+sw/source/filter/ww8/ww8attributeoutput.hxx
+sw/source/filter/ww8/ww8glsy.cxx
+sw/source/filter/ww8/ww8glsy.hxx
+sw/source/filter/ww8/ww8graf.cxx
+sw/source/filter/ww8/ww8graf.hxx
+sw/source/filter/ww8/ww8graf2.cxx
+sw/source/filter/ww8/ww8par.cxx
+sw/source/filter/ww8/ww8par.hxx
+sw/source/filter/ww8/ww8par2.cxx
+sw/source/filter/ww8/ww8par2.hxx
+sw/source/filter/ww8/ww8par3.cxx
+sw/source/filter/ww8/ww8par4.cxx
+sw/source/filter/ww8/ww8par5.cxx
+sw/source/filter/ww8/ww8par6.cxx
+sw/source/filter/ww8/ww8scan.cxx
+sw/source/filter/ww8/ww8scan.hxx
+sw/source/filter/ww8/ww8struc.hxx
+sw/source/filter/ww8/ww8toolbar.cxx
+sw/source/filter/ww8/ww8toolbar.hxx
+sw/source/filter/xml/XMLRedlineImportHelper.cxx
+sw/source/filter/xml/XMLRedlineImportHelper.hxx
+sw/source/filter/xml/swxml.cxx
+sw/source/filter/xml/wrtxml.cxx
+sw/source/filter/xml/wrtxml.hxx
+sw/source/filter/xml/xmlbrsh.cxx
+sw/source/filter/xml/xmlbrshi.hxx
+sw/source/filter/xml/xmlexp.cxx
+sw/source/filter/xml/xmlexp.hxx
+sw/source/filter/xml/xmlexpit.cxx
+sw/source/filter/xml/xmlexpit.hxx
+sw/source/filter/xml/xmlfmt.cxx
+sw/source/filter/xml/xmlfmte.cxx
+sw/source/filter/xml/xmlfonte.cxx
+sw/source/filter/xml/xmlimp.cxx
+sw/source/filter/xml/xmlimp.hxx
+sw/source/filter/xml/xmlimpit.cxx
+sw/source/filter/xml/xmlimpit.hxx
+sw/source/filter/xml/xmlitem.cxx
+sw/source/filter/xml/xmlitem.hxx
+sw/source/filter/xml/xmliteme.cxx
+sw/source/filter/xml/xmlitemi.cxx
+sw/source/filter/xml/xmlitemm.cxx
+sw/source/filter/xml/xmlithlp.cxx
+sw/source/filter/xml/xmlithlp.hxx
+sw/source/filter/xml/xmlitmap.hxx
+sw/source/filter/xml/xmlitmpr.cxx
+sw/source/filter/xml/xmlmeta.cxx
+sw/source/filter/xml/xmltble.cxx
+sw/source/filter/xml/xmltbli.cxx
+sw/source/filter/xml/xmltbli.hxx
+sw/source/filter/xml/xmltext.cxx
+sw/source/filter/xml/xmltexte.cxx
+sw/source/filter/xml/xmltexte.hxx
+sw/source/filter/xml/xmltexti.cxx
+sw/source/filter/xml/xmltexti.hxx
+sw/source/ui/chrdlg/break.cxx
+sw/source/ui/chrdlg/chardlg.cxx
+sw/source/ui/chrdlg/drpcps.cxx
+sw/source/ui/chrdlg/numpara.cxx
+sw/source/ui/chrdlg/pardlg.cxx
+sw/source/ui/chrdlg/swuiccoll.cxx
+sw/source/ui/chrdlg/tblnumfm.cxx
+sw/source/ui/config/mailconfigpage.cxx
+sw/source/ui/config/optcomp.cxx
+sw/source/ui/config/optload.cxx
+sw/source/ui/config/optpage.cxx
+sw/source/ui/dbui/addresslistdialog.cxx
+sw/source/ui/dbui/addresslistdialog.hxx
+sw/source/ui/dbui/createaddresslistdialog.cxx
+sw/source/ui/dbui/createaddresslistdialog.hxx
+sw/source/ui/dbui/customizeaddresslistdialog.cxx
+sw/source/ui/dbui/customizeaddresslistdialog.hxx
+sw/source/ui/dbui/dbinsdlg.cxx
+sw/source/ui/dbui/dbtablepreviewdialog.cxx
+sw/source/ui/dbui/dbtablepreviewdialog.hxx
+sw/source/ui/dbui/mailmergewizard.cxx
+sw/source/ui/dbui/mmaddressblockpage.cxx
+sw/source/ui/dbui/mmaddressblockpage.hxx
+sw/source/ui/dbui/mmdocselectpage.cxx
+sw/source/ui/dbui/mmgreetingspage.cxx
+sw/source/ui/dbui/mmlayoutpage.cxx
+sw/source/ui/dbui/mmlayoutpage.hxx
+sw/source/ui/dbui/mmoutputtypepage.cxx
+sw/source/ui/dbui/mmresultdialogs.cxx
+sw/source/ui/dbui/selectdbtabledialog.hxx
+sw/source/ui/dialog/ascfldlg.cxx
+sw/source/ui/dialog/docstdlg.cxx
+sw/source/ui/dialog/macassgn.cxx
+sw/source/ui/dialog/swdlgfact.cxx
+sw/source/ui/dialog/swdlgfact.hxx
+sw/source/ui/dialog/swmessdialog.cxx
+sw/source/ui/dialog/uiregionsw.cxx
+sw/source/ui/dialog/wordcountdialog.cxx
+sw/source/ui/dochdl/selglos.cxx
+sw/source/ui/envelp/envfmt.cxx
+sw/source/ui/envelp/envlop1.cxx
+sw/source/ui/envelp/envprt.cxx
+sw/source/ui/envelp/label1.cxx
+sw/source/ui/envelp/labelexp.cxx
+sw/source/ui/envelp/labfmt.cxx
+sw/source/ui/envelp/labprt.cxx
+sw/source/ui/envelp/mailmrge.cxx
+sw/source/ui/fldui/DropDownFieldDialog.cxx
+sw/source/ui/fldui/changedb.cxx
+sw/source/ui/fldui/flddb.cxx
+sw/source/ui/fldui/flddb.hxx
+sw/source/ui/fldui/flddinf.cxx
+sw/source/ui/fldui/flddinf.hxx
+sw/source/ui/fldui/flddok.cxx
+sw/source/ui/fldui/flddok.hxx
+sw/source/ui/fldui/fldedt.cxx
+sw/source/ui/fldui/fldfunc.cxx
+sw/source/ui/fldui/fldfunc.hxx
+sw/source/ui/fldui/fldpage.cxx
+sw/source/ui/fldui/fldpage.hxx
+sw/source/ui/fldui/fldref.cxx
+sw/source/ui/fldui/fldref.hxx
+sw/source/ui/fldui/fldtdlg.cxx
+sw/source/ui/fldui/fldvar.cxx
+sw/source/ui/fldui/fldvar.hxx
+sw/source/ui/fldui/inpdlg.cxx
+sw/source/ui/fldui/javaedit.cxx
+sw/source/ui/fmtui/tmpdlg.cxx
+sw/source/ui/frmdlg/column.cxx
+sw/source/ui/frmdlg/cption.cxx
+sw/source/ui/frmdlg/frmdlg.cxx
+sw/source/ui/frmdlg/frmpage.cxx
+sw/source/ui/frmdlg/wrap.cxx
+sw/source/ui/inc/mmresultdialogs.hxx
+sw/source/ui/index/cntex.cxx
+sw/source/ui/index/cnttab.cxx
+sw/source/ui/index/swuiidxmrk.cxx
+sw/source/ui/misc/docfnote.cxx
+sw/source/ui/misc/glosbib.cxx
+sw/source/ui/misc/glossary.cxx
+sw/source/ui/misc/impfnote.hxx
+sw/source/ui/misc/insfnote.cxx
+sw/source/ui/misc/linenum.cxx
+sw/source/ui/misc/num.cxx
+sw/source/ui/misc/outline.cxx
+sw/source/ui/misc/pgfnote.cxx
+sw/source/ui/misc/pggrid.cxx
+sw/source/ui/misc/srtdlg.cxx
+sw/source/ui/misc/swmodalredlineacceptdlg.cxx
+sw/source/ui/misc/titlepage.cxx
+sw/source/ui/table/colwd.cxx
+sw/source/ui/table/instable.cxx
+sw/source/ui/table/rowht.cxx
+sw/source/ui/table/tabledlg.cxx
+sw/source/ui/table/tautofmt.cxx
+sw/source/ui/uno/swdetect.cxx
+sw/source/ui/uno/swdetect.hxx
+sw/source/ui/utlui/swrenamexnameddlg.cxx
+sw/source/ui/vba/vbaaddin.cxx
+sw/source/ui/vba/vbaaddins.cxx
+sw/source/ui/vba/vbaapplication.cxx
+sw/source/ui/vba/vbaapplication.hxx
+sw/source/ui/vba/vbaautotextentry.cxx
+sw/source/ui/vba/vbaautotextentry.hxx
+sw/source/ui/vba/vbabookmark.cxx
+sw/source/ui/vba/vbabookmarks.cxx
+sw/source/ui/vba/vbabookmarks.hxx
+sw/source/ui/vba/vbaborders.cxx
+sw/source/ui/vba/vbaborders.hxx
+sw/source/ui/vba/vbacell.cxx
+sw/source/ui/vba/vbacell.hxx
+sw/source/ui/vba/vbacells.cxx
+sw/source/ui/vba/vbacells.hxx
+sw/source/ui/vba/vbacolumn.cxx
+sw/source/ui/vba/vbacolumn.hxx
+sw/source/ui/vba/vbacolumns.cxx
+sw/source/ui/vba/vbacolumns.hxx
+sw/source/ui/vba/vbadialog.cxx
+sw/source/ui/vba/vbadialog.hxx
+sw/source/ui/vba/vbadialogs.cxx
+sw/source/ui/vba/vbadialogs.hxx
+sw/source/ui/vba/vbadocument.cxx
+sw/source/ui/vba/vbadocument.hxx
+sw/source/ui/vba/vbadocumentproperties.cxx
+sw/source/ui/vba/vbadocumentproperties.hxx
+sw/source/ui/vba/vbadocuments.cxx
+sw/source/ui/vba/vbadocuments.hxx
+sw/source/ui/vba/vbaeventshelper.cxx
+sw/source/ui/vba/vbaeventshelper.hxx
+sw/source/ui/vba/vbafield.cxx
+sw/source/ui/vba/vbafield.hxx
+sw/source/ui/vba/vbafind.cxx
+sw/source/ui/vba/vbafind.hxx
+sw/source/ui/vba/vbafont.cxx
+sw/source/ui/vba/vbafont.hxx
+sw/source/ui/vba/vbaframe.cxx
+sw/source/ui/vba/vbaframe.hxx
+sw/source/ui/vba/vbaframes.cxx
+sw/source/ui/vba/vbaframes.hxx
+sw/source/ui/vba/vbaglobals.cxx
+sw/source/ui/vba/vbaheaderfooter.cxx
+sw/source/ui/vba/vbaheaderfooter.hxx
+sw/source/ui/vba/vbaheaderfooterhelper.cxx
+sw/source/ui/vba/vbaheadersfooters.cxx
+sw/source/ui/vba/vbaheadersfooters.hxx
+sw/source/ui/vba/vbainformationhelper.cxx
+sw/source/ui/vba/vbalistformat.cxx
+sw/source/ui/vba/vbalistformat.hxx
+sw/source/ui/vba/vbalistgalleries.cxx
+sw/source/ui/vba/vbalistgalleries.hxx
+sw/source/ui/vba/vbalistgallery.cxx
+sw/source/ui/vba/vbalistgallery.hxx
+sw/source/ui/vba/vbalisthelper.cxx
+sw/source/ui/vba/vbalisthelper.hxx
+sw/source/ui/vba/vbalistlevel.cxx
+sw/source/ui/vba/vbalistlevel.hxx
+sw/source/ui/vba/vbalistlevels.cxx
+sw/source/ui/vba/vbalistlevels.hxx
+sw/source/ui/vba/vbalisttemplate.cxx
+sw/source/ui/vba/vbalisttemplate.hxx
+sw/source/ui/vba/vbalisttemplates.cxx
+sw/source/ui/vba/vbalisttemplates.hxx
+sw/source/ui/vba/vbaoptions.cxx
+sw/source/ui/vba/vbaoptions.hxx
+sw/source/ui/vba/vbapagesetup.cxx
+sw/source/ui/vba/vbapagesetup.hxx
+sw/source/ui/vba/vbapalette.cxx
+sw/source/ui/vba/vbapalette.hxx
+sw/source/ui/vba/vbapane.cxx
+sw/source/ui/vba/vbapanes.cxx
+sw/source/ui/vba/vbapanes.hxx
+sw/source/ui/vba/vbaparagraph.cxx
+sw/source/ui/vba/vbaparagraph.hxx
+sw/source/ui/vba/vbaparagraphformat.cxx
+sw/source/ui/vba/vbaparagraphformat.hxx
+sw/source/ui/vba/vbarange.cxx
+sw/source/ui/vba/vbarange.hxx
+sw/source/ui/vba/vbarangehelper.cxx
+sw/source/ui/vba/vbarangehelper.hxx
+sw/source/ui/vba/vbareplacement.cxx
+sw/source/ui/vba/vbareplacement.hxx
+sw/source/ui/vba/vbarevision.cxx
+sw/source/ui/vba/vbarevision.hxx
+sw/source/ui/vba/vbarevisions.cxx
+sw/source/ui/vba/vbarevisions.hxx
+sw/source/ui/vba/vbarow.cxx
+sw/source/ui/vba/vbarow.hxx
+sw/source/ui/vba/vbarows.cxx
+sw/source/ui/vba/vbarows.hxx
+sw/source/ui/vba/vbasection.cxx
+sw/source/ui/vba/vbasection.hxx
+sw/source/ui/vba/vbasections.cxx
+sw/source/ui/vba/vbasections.hxx
+sw/source/ui/vba/vbaselection.cxx
+sw/source/ui/vba/vbaselection.hxx
+sw/source/ui/vba/vbastyle.cxx
+sw/source/ui/vba/vbastyle.hxx
+sw/source/ui/vba/vbastyles.cxx
+sw/source/ui/vba/vbastyles.hxx
+sw/source/ui/vba/vbasystem.cxx
+sw/source/ui/vba/vbasystem.hxx
+sw/source/ui/vba/vbatable.cxx
+sw/source/ui/vba/vbatable.hxx
+sw/source/ui/vba/vbatablehelper.cxx
+sw/source/ui/vba/vbatablehelper.hxx
+sw/source/ui/vba/vbatableofcontents.cxx
+sw/source/ui/vba/vbatableofcontents.hxx
+sw/source/ui/vba/vbatables.cxx
+sw/source/ui/vba/vbatables.hxx
+sw/source/ui/vba/vbatablesofcontents.cxx
+sw/source/ui/vba/vbatablesofcontents.hxx
+sw/source/ui/vba/vbatabstop.cxx
+sw/source/ui/vba/vbatabstops.cxx
+sw/source/ui/vba/vbatabstops.hxx
+sw/source/ui/vba/vbatemplate.cxx
+sw/source/ui/vba/vbatemplate.hxx
+sw/source/ui/vba/vbavariable.cxx
+sw/source/ui/vba/vbavariable.hxx
+sw/source/ui/vba/vbavariables.cxx
+sw/source/ui/vba/vbavariables.hxx
+sw/source/ui/vba/vbaview.cxx
+sw/source/ui/vba/vbaview.hxx
+sw/source/ui/vba/vbawindow.cxx
+sw/source/ui/vba/vbawindow.hxx
+sw/source/ui/vba/vbawrapformat.cxx
+sw/source/ui/vba/vbawrapformat.hxx
+sw/source/ui/vba/wordvbahelper.cxx
+sw/source/ui/vba/wordvbahelper.hxx
+sw/source/uibase/app/appenv.cxx
+sw/source/uibase/app/apphdl.cxx
+sw/source/uibase/app/applab.cxx
+sw/source/uibase/app/appopt.cxx
+sw/source/uibase/app/docsh.cxx
+sw/source/uibase/app/docsh2.cxx
+sw/source/uibase/app/docshdrw.cxx
+sw/source/uibase/app/docshini.cxx
+sw/source/uibase/app/docst.cxx
+sw/source/uibase/app/docstyle.cxx
+sw/source/uibase/app/mainwn.cxx
+sw/source/uibase/app/swdll.cxx
+sw/source/uibase/app/swmodul1.cxx
+sw/source/uibase/app/swmodule.cxx
+sw/source/uibase/app/swwait.cxx
+sw/source/uibase/chrdlg/ccoll.cxx
+sw/source/uibase/config/StoredChapterNumbering.cxx
+sw/source/uibase/config/barcfg.cxx
+sw/source/uibase/config/caption.cxx
+sw/source/uibase/config/cfgitems.cxx
+sw/source/uibase/config/dbconfig.cxx
+sw/source/uibase/config/fontcfg.cxx
+sw/source/uibase/config/modcfg.cxx
+sw/source/uibase/config/prtopt.cxx
+sw/source/uibase/config/uinums.cxx
+sw/source/uibase/config/usrpref.cxx
+sw/source/uibase/config/viewopt.cxx
+sw/source/uibase/dbui/dbmgr.cxx
+sw/source/uibase/dbui/dbtree.cxx
+sw/source/uibase/dbui/dbui.cxx
+sw/source/uibase/dbui/maildispatcher.cxx
+sw/source/uibase/dbui/mailmergehelper.cxx
+sw/source/uibase/dbui/mailmergetoolbarcontrols.cxx
+sw/source/uibase/dbui/mmconfigitem.cxx
+sw/source/uibase/dialog/SwSpellDialogChildWindow.cxx
+sw/source/uibase/dialog/regionsw.cxx
+sw/source/uibase/dialog/swabstdlg.cxx
+sw/source/uibase/dialog/swwrtshitem.cxx
+sw/source/uibase/dialog/watermarkdialog.cxx
+sw/source/uibase/dialog/wordcountwrapper.cxx
+sw/source/uibase/dochdl/gloshdl.cxx
+sw/source/uibase/dochdl/swdtflvr.cxx
+sw/source/uibase/docvw/AnchorOverlayObject.cxx
+sw/source/uibase/docvw/AnchorOverlayObject.hxx
+sw/source/uibase/docvw/AnnotationMenuButton.cxx
+sw/source/uibase/docvw/AnnotationWin.cxx
+sw/source/uibase/docvw/AnnotationWin2.cxx
+sw/source/uibase/docvw/DashedLine.cxx
+sw/source/uibase/docvw/FrameControlsManager.cxx
+sw/source/uibase/docvw/HeaderFooterWin.cxx
+sw/source/uibase/docvw/OverlayRanges.cxx
+sw/source/uibase/docvw/OverlayRanges.hxx
+sw/source/uibase/docvw/PageBreakWin.cxx
+sw/source/uibase/docvw/PostItMgr.cxx
+sw/source/uibase/docvw/ShadowOverlayObject.cxx
+sw/source/uibase/docvw/ShadowOverlayObject.hxx
+sw/source/uibase/docvw/SidebarTxtControl.cxx
+sw/source/uibase/docvw/SidebarTxtControl.hxx
+sw/source/uibase/docvw/SidebarWinAcc.cxx
+sw/source/uibase/docvw/SidebarWinAcc.hxx
+sw/source/uibase/docvw/edtdd.cxx
+sw/source/uibase/docvw/edtwin.cxx
+sw/source/uibase/docvw/edtwin2.cxx
+sw/source/uibase/docvw/edtwin3.cxx
+sw/source/uibase/docvw/frmsidebarwincontainer.cxx
+sw/source/uibase/docvw/frmsidebarwincontainer.hxx
+sw/source/uibase/docvw/romenu.cxx
+sw/source/uibase/docvw/romenu.hxx
+sw/source/uibase/docvw/srcedtw.cxx
+sw/source/uibase/envelp/envimg.cxx
+sw/source/uibase/envelp/labelcfg.cxx
+sw/source/uibase/envelp/labimg.cxx
+sw/source/uibase/envelp/syncbtn.cxx
+sw/source/uibase/fldui/fldmgr.cxx
+sw/source/uibase/fldui/fldwrap.cxx
+sw/source/uibase/fldui/xfldui.cxx
+sw/source/uibase/frmdlg/colex.cxx
+sw/source/uibase/frmdlg/frmmgr.cxx
+sw/source/uibase/globdoc/globdoc.cxx
+sw/source/uibase/inc/DropDownFieldDialog.hxx
+sw/source/uibase/inc/FrameControl.hxx
+sw/source/uibase/inc/FrameControlsManager.hxx
+sw/source/uibase/inc/HeaderFooterWin.hxx
+sw/source/uibase/inc/PageBreakWin.hxx
+sw/source/uibase/inc/SwSpellDialogChildWindow.hxx
+sw/source/uibase/inc/SwXFilterOptions.hxx
+sw/source/uibase/inc/annotsh.hxx
+sw/source/uibase/inc/basesh.hxx
+sw/source/uibase/inc/bmpwin.hxx
+sw/source/uibase/inc/bookmark.hxx
+sw/source/uibase/inc/caption.hxx
+sw/source/uibase/inc/cfgitems.hxx
+sw/source/uibase/inc/changedb.hxx
+sw/source/uibase/inc/chartins.hxx
+sw/source/uibase/inc/chldwrap.hxx
+sw/source/uibase/inc/chrdlg.hxx
+sw/source/uibase/inc/chrdlgmodes.hxx
+sw/source/uibase/inc/cnttab.hxx
+sw/source/uibase/inc/colex.hxx
+sw/source/uibase/inc/colmgr.hxx
+sw/source/uibase/inc/column.hxx
+sw/source/uibase/inc/conarc.hxx
+sw/source/uibase/inc/concustomshape.hxx
+sw/source/uibase/inc/conform.hxx
+sw/source/uibase/inc/conrect.hxx
+sw/source/uibase/inc/content.hxx
+sw/source/uibase/inc/conttree.hxx
+sw/source/uibase/inc/dbconfig.hxx
+sw/source/uibase/inc/dbinsdlg.hxx
+sw/source/uibase/inc/dbtree.hxx
+sw/source/uibase/inc/docstdlg.hxx
+sw/source/uibase/inc/drawbase.hxx
+sw/source/uibase/inc/drawsh.hxx
+sw/source/uibase/inc/drformsh.hxx
+sw/source/uibase/inc/drpcps.hxx
+sw/source/uibase/inc/drwbassh.hxx
+sw/source/uibase/inc/drwtxtsh.hxx
+sw/source/uibase/inc/edtwin.hxx
+sw/source/uibase/inc/envimg.hxx
+sw/source/uibase/inc/fldedt.hxx
+sw/source/uibase/inc/fldmgr.hxx
+sw/source/uibase/inc/fldtdlg.hxx
+sw/source/uibase/inc/fldwrap.hxx
+sw/source/uibase/inc/fontcfg.hxx
+sw/source/uibase/inc/frmdlg.hxx
+sw/source/uibase/inc/frmmgr.hxx
+sw/source/uibase/inc/frmpage.hxx
+sw/source/uibase/inc/frmsh.hxx
+sw/source/uibase/inc/glosdoc.hxx
+sw/source/uibase/inc/gloshdl.hxx
+sw/source/uibase/inc/gloslst.hxx
+sw/source/uibase/inc/glossary.hxx
+sw/source/uibase/inc/glshell.hxx
+sw/source/uibase/inc/hyp.hxx
+sw/source/uibase/inc/idxmrk.hxx
+sw/source/uibase/inc/imaildsplistener.hxx
+sw/source/uibase/inc/inpdlg.hxx
+sw/source/uibase/inc/inputwin.hxx
+sw/source/uibase/inc/insfnote.hxx
+sw/source/uibase/inc/javaedit.hxx
+sw/source/uibase/inc/label.hxx
+sw/source/uibase/inc/labelcfg.hxx
+sw/source/uibase/inc/labimg.hxx
+sw/source/uibase/inc/labrec.hxx
+sw/source/uibase/inc/langhelper.hxx
+sw/source/uibase/inc/mailconfigpage.hxx
+sw/source/uibase/inc/mailmergehelper.hxx
+sw/source/uibase/inc/mailmergewizard.hxx
+sw/source/uibase/inc/mailmrge.hxx
+sw/source/uibase/inc/mmconfigitem.hxx
+sw/source/uibase/inc/navicfg.hxx
+sw/source/uibase/inc/navicont.hxx
+sw/source/uibase/inc/navipi.hxx
+sw/source/uibase/inc/navmgr.hxx
+sw/source/uibase/inc/num.hxx
+sw/source/uibase/inc/numberingtypelistbox.hxx
+sw/source/uibase/inc/numfmtlb.hxx
+sw/source/uibase/inc/numpara.hxx
+sw/source/uibase/inc/numprevw.hxx
+sw/source/uibase/inc/olmenu.hxx
+sw/source/uibase/inc/optcomp.hxx
+sw/source/uibase/inc/optload.hxx
+sw/source/uibase/inc/optpage.hxx
+sw/source/uibase/inc/outline.hxx
+sw/source/uibase/inc/pgfnote.hxx
+sw/source/uibase/inc/pggrid.hxx
+sw/source/uibase/inc/prcntfld.hxx
+sw/source/uibase/inc/pview.hxx
+sw/source/uibase/inc/redlndlg.hxx
+sw/source/uibase/inc/regionsw.hxx
+sw/source/uibase/inc/scroll.hxx
+sw/source/uibase/inc/selglos.hxx
+sw/source/uibase/inc/shdwcrsr.hxx
+sw/source/uibase/inc/srcedtw.hxx
+sw/source/uibase/inc/srcview.hxx
+sw/source/uibase/inc/swcont.hxx
+sw/source/uibase/inc/swdtflvr.hxx
+sw/source/uibase/inc/swmessdialog.hxx
+sw/source/uibase/inc/swmodalredlineacceptdlg.hxx
+sw/source/uibase/inc/swrenamexnameddlg.hxx
+sw/source/uibase/inc/swruler.hxx
+sw/source/uibase/inc/swtablerep.hxx
+sw/source/uibase/inc/swuiccoll.hxx
+sw/source/uibase/inc/swuicnttab.hxx
+sw/source/uibase/inc/swuiidxmrk.hxx
+sw/source/uibase/inc/swuipardlg.hxx
+sw/source/uibase/inc/swwrtshitem.hxx
+sw/source/uibase/inc/syncbtn.hxx
+sw/source/uibase/inc/tablemgr.hxx
+sw/source/uibase/inc/tabsh.hxx
+sw/source/uibase/inc/tautofmt.hxx
+sw/source/uibase/inc/textsh.hxx
+sw/source/uibase/inc/tmpdlg.hxx
+sw/source/uibase/inc/toxmgr.hxx
+sw/source/uibase/inc/uiitems.hxx
+sw/source/uibase/inc/uinums.hxx
+sw/source/uibase/inc/uiobject.hxx
+sw/source/uibase/inc/uitool.hxx
+sw/source/uibase/inc/uivwimp.hxx
+sw/source/uibase/inc/unoatxt.hxx
+sw/source/uibase/inc/unodispatch.hxx
+sw/source/uibase/inc/unomailmerge.hxx
+sw/source/uibase/inc/unomod.hxx
+sw/source/uibase/inc/unotools.hxx
+sw/source/uibase/inc/unotxvw.hxx
+sw/source/uibase/inc/usrpref.hxx
+sw/source/uibase/inc/viewlayoutctrl.hxx
+sw/source/uibase/inc/wordcountdialog.hxx
+sw/source/uibase/inc/workctrl.hxx
+sw/source/uibase/inc/wrap.hxx
+sw/source/uibase/inc/wrtsh.hxx
+sw/source/uibase/index/idxmrk.cxx
+sw/source/uibase/index/toxmgr.cxx
+sw/source/uibase/lingu/hhcwrp.cxx
+sw/source/uibase/lingu/hyp.cxx
+sw/source/uibase/lingu/olmenu.cxx
+sw/source/uibase/lingu/sdrhhcwrap.cxx
+sw/source/uibase/lingu/sdrhhcwrap.hxx
+sw/source/uibase/misc/glosdoc.cxx
+sw/source/uibase/misc/glshell.cxx
+sw/source/uibase/misc/redlndlg.cxx
+sw/source/uibase/ribbar/concustomshape.cxx
+sw/source/uibase/ribbar/conform.cxx
+sw/source/uibase/ribbar/conpoly.cxx
+sw/source/uibase/ribbar/conrect.cxx
+sw/source/uibase/ribbar/drawbase.cxx
+sw/source/uibase/ribbar/inputwin.cxx
+sw/source/uibase/ribbar/workctrl.cxx
+sw/source/uibase/shells/annotsh.cxx
+sw/source/uibase/shells/basesh.cxx
+sw/source/uibase/shells/beziersh.cxx
+sw/source/uibase/shells/drawdlg.cxx
+sw/source/uibase/shells/drawsh.cxx
+sw/source/uibase/shells/drformsh.cxx
+sw/source/uibase/shells/drwbassh.cxx
+sw/source/uibase/shells/drwtxtex.cxx
+sw/source/uibase/shells/drwtxtsh.cxx
+sw/source/uibase/shells/frmsh.cxx
+sw/source/uibase/shells/grfsh.cxx
+sw/source/uibase/shells/grfshex.cxx
+sw/source/uibase/shells/langhelper.cxx
+sw/source/uibase/shells/listsh.cxx
+sw/source/uibase/shells/olesh.cxx
+sw/source/uibase/shells/tabsh.cxx
+sw/source/uibase/shells/textdrw.cxx
+sw/source/uibase/shells/textfld.cxx
+sw/source/uibase/shells/textglos.cxx
+sw/source/uibase/shells/textidx.cxx
+sw/source/uibase/shells/textsh.cxx
+sw/source/uibase/shells/textsh1.cxx
+sw/source/uibase/shells/textsh2.cxx
+sw/source/uibase/shells/txtattr.cxx
+sw/source/uibase/shells/txtcrsr.cxx
+sw/source/uibase/shells/txtnum.cxx
+sw/source/uibase/sidebar/PageColumnControl.cxx
+sw/source/uibase/sidebar/PageColumnPopup.cxx
+sw/source/uibase/sidebar/PageFooterPanel.cxx
+sw/source/uibase/sidebar/PageFooterPanel.hxx
+sw/source/uibase/sidebar/PageFormatPanel.cxx
+sw/source/uibase/sidebar/PageFormatPanel.hxx
+sw/source/uibase/sidebar/PageHeaderPanel.cxx
+sw/source/uibase/sidebar/PageHeaderPanel.hxx
+sw/source/uibase/sidebar/PageMarginControl.cxx
+sw/source/uibase/sidebar/PageMarginControl.hxx
+sw/source/uibase/sidebar/PageMarginPopup.cxx
+sw/source/uibase/sidebar/PageMarginUtils.hxx
+sw/source/uibase/sidebar/PageOrientationControl.cxx
+sw/source/uibase/sidebar/PageOrientationControl.hxx
+sw/source/uibase/sidebar/PageOrientationPopup.cxx
+sw/source/uibase/sidebar/PageSizeControl.cxx
+sw/source/uibase/sidebar/PageSizePopup.cxx
+sw/source/uibase/sidebar/PageStylesPanel.cxx
+sw/source/uibase/sidebar/PageStylesPanel.hxx
+sw/source/uibase/sidebar/StylePresetsPanel.cxx
+sw/source/uibase/sidebar/StylePresetsPanel.hxx
+sw/source/uibase/sidebar/SwPanelFactory.cxx
+sw/source/uibase/sidebar/ThemePanel.cxx
+sw/source/uibase/sidebar/ThemePanel.hxx
+sw/source/uibase/sidebar/WrapPropertyPanel.cxx
+sw/source/uibase/sidebar/WrapPropertyPanel.hxx
+sw/source/uibase/table/chartins.cxx
+sw/source/uibase/table/swtablerep.cxx
+sw/source/uibase/table/tablemgr.cxx
+sw/source/uibase/table/tablepg.hxx
+sw/source/uibase/uitest/uiobject.cxx
+sw/source/uibase/uiview/formatclipboard.cxx
+sw/source/uibase/uiview/pview.cxx
+sw/source/uibase/uiview/scroll.cxx
+sw/source/uibase/uiview/srcview.cxx
+sw/source/uibase/uiview/swcli.cxx
+sw/source/uibase/uiview/uivwimp.cxx
+sw/source/uibase/uiview/view.cxx
+sw/source/uibase/uiview/view0.cxx
+sw/source/uibase/uiview/view1.cxx
+sw/source/uibase/uiview/view2.cxx
+sw/source/uibase/uiview/viewcoll.cxx
+sw/source/uibase/uiview/viewdlg.cxx
+sw/source/uibase/uiview/viewdlg2.cxx
+sw/source/uibase/uiview/viewdraw.cxx
+sw/source/uibase/uiview/viewfunc.hxx
+sw/source/uibase/uiview/viewling.cxx
+sw/source/uibase/uiview/viewmdi.cxx
+sw/source/uibase/uiview/viewport.cxx
+sw/source/uibase/uiview/viewprt.cxx
+sw/source/uibase/uiview/viewsrch.cxx
+sw/source/uibase/uiview/viewstat.cxx
+sw/source/uibase/uiview/viewtab.cxx
+sw/source/uibase/uno/SwXDocumentSettings.cxx
+sw/source/uibase/uno/SwXDocumentSettings.hxx
+sw/source/uibase/uno/SwXFilterOptions.cxx
+sw/source/uibase/uno/dlelstnr.cxx
+sw/source/uibase/uno/unoatxt.cxx
+sw/source/uibase/uno/unodispatch.cxx
+sw/source/uibase/uno/unodoc.cxx
+sw/source/uibase/uno/unomailmerge.cxx
+sw/source/uibase/uno/unomod.cxx
+sw/source/uibase/uno/unomodule.cxx
+sw/source/uibase/uno/unomodule.hxx
+sw/source/uibase/uno/unotxdoc.cxx
+sw/source/uibase/uno/unotxvw.cxx
+sw/source/uibase/utlui/attrdesc.cxx
+sw/source/uibase/utlui/bookctrl.cxx
+sw/source/uibase/utlui/condedit.cxx
+sw/source/uibase/utlui/content.cxx
+sw/source/uibase/utlui/glbltree.cxx
+sw/source/uibase/utlui/gloslst.cxx
+sw/source/uibase/utlui/initui.cxx
+sw/source/uibase/utlui/navicfg.cxx
+sw/source/uibase/utlui/navipi.cxx
+sw/source/uibase/utlui/numfmtlb.cxx
+sw/source/uibase/utlui/shdwcrsr.cxx
+sw/source/uibase/utlui/tmplctrl.cxx
+sw/source/uibase/utlui/uiitems.cxx
+sw/source/uibase/utlui/uitool.cxx
+sw/source/uibase/utlui/unotools.cxx
+sw/source/uibase/utlui/viewlayoutctrl.cxx
+sw/source/uibase/utlui/wordcountctrl.cxx
+sw/source/uibase/utlui/zoomctrl.cxx
+sw/source/uibase/web/wdocsh.cxx
+sw/source/uibase/web/wformsh.cxx
+sw/source/uibase/web/wfrmsh.cxx
+sw/source/uibase/web/wgrfsh.cxx
+sw/source/uibase/web/wlistsh.cxx
+sw/source/uibase/web/wolesh.cxx
+sw/source/uibase/web/wtabsh.cxx
+sw/source/uibase/web/wtextsh.cxx
+sw/source/uibase/web/wview.cxx
+sw/source/uibase/wrtsh/delete.cxx
+sw/source/uibase/wrtsh/move.cxx
+sw/source/uibase/wrtsh/navmgr.cxx
+sw/source/uibase/wrtsh/select.cxx
+sw/source/uibase/wrtsh/wrtsh1.cxx
+sw/source/uibase/wrtsh/wrtsh2.cxx
+sw/source/uibase/wrtsh/wrtsh3.cxx
+sw/source/uibase/wrtsh/wrtsh4.cxx
+sw/source/uibase/wrtsh/wrtundo.cxx
+test/source/bootstrapfixture.cxx
+test/source/calc_unoapi_test.cxx
+test/source/diff/diff.cxx
+test/source/htmltesttools.cxx
+test/source/isheadless.hxx
+test/source/screenshot_test.cxx
+test/source/setupvcl.cxx
+test/source/sheet/datapilotfield.cxx
+test/source/sheet/xarealink.cxx
+test/source/sheet/xarealinks.cxx
+test/source/sheet/xcellrangedata.cxx
+test/source/sheet/xcellrangesquery.cxx
+test/source/sheet/xcellseries.cxx
+test/source/sheet/xdatapilotdescriptor.cxx
+test/source/sheet/xdatapilotfieldgrouping.cxx
+test/source/sheet/xdatapilottable2.cxx
+test/source/sheet/xnamedrange.cxx
+test/source/sheet/xprintareas.cxx
+test/source/sheet/xsheetannotation.cxx
+test/source/sheet/xsheetannotations.cxx
+test/source/sheet/xsheetannotationshapesupplier.cxx
+test/source/sheet/xsheetfilterable.cxx
+test/source/sheet/xsheetlinkable.cxx
+test/source/sheet/xsheetoutline.cxx
+test/source/sheet/xsheetpagebreak.cxx
+test/source/sheet/xspreadsheet.cxx
+test/source/sheet/xspreadsheets.cxx
+test/source/sheet/xspreadsheets2.cxx
+test/source/sheet/xsubtotalcalculatable.cxx
+test/source/sheet/xsubtotalfield.cxx
+test/source/sheet/xuniquecellformatrangessupplier.cxx
+test/source/sheet/xusedareacursor.cxx
+test/source/sheet/xviewsplitable.cxx
+test/source/vclbootstrapprotector.cxx
+test/source/xmltesttools.cxx
+testtools/source/bridgetest/bridgetest.cxx
+testtools/source/bridgetest/cli/cli_cpp_bridgetest.cxx
+testtools/source/bridgetest/constructors.cxx
+testtools/source/bridgetest/cppobj.cxx
+testtools/source/bridgetest/currentcontextchecker.cxx
+testtools/source/bridgetest/currentcontextchecker.hxx
+testtools/source/bridgetest/multi.cxx
+testtools/source/bridgetest/multi.hxx
+testtools/source/performance/pseudo.cxx
+testtools/source/performance/ubobject.cxx
+testtools/source/performance/ubtest.cxx
+toolkit/inc/awt/animatedimagespeer.hxx
+toolkit/inc/awt/vclxbitmap.hxx
+toolkit/inc/awt/vclxcontainer.hxx
+toolkit/inc/awt/vclxgraphics.hxx
+toolkit/inc/awt/vclxpointer.hxx
+toolkit/inc/awt/vclxprinter.hxx
+toolkit/inc/awt/vclxregion.hxx
+toolkit/inc/awt/vclxspinbutton.hxx
+toolkit/inc/awt/vclxsystemdependentwindow.hxx
+toolkit/inc/awt/vclxtabpagecontainer.hxx
+toolkit/inc/awt/vclxtopwindow.hxx
+toolkit/inc/awt/vclxwindows.hxx
+toolkit/inc/controls/accessiblecontrolcontext.hxx
+toolkit/inc/controls/animatedimages.hxx
+toolkit/inc/controls/controlmodelcontainerbase.hxx
+toolkit/inc/controls/dialogcontrol.hxx
+toolkit/inc/controls/eventcontainer.hxx
+toolkit/inc/controls/filectrl.hxx
+toolkit/inc/controls/formattedcontrol.hxx
+toolkit/inc/controls/geometrycontrolmodel.hxx
+toolkit/inc/controls/roadmapcontrol.hxx
+toolkit/inc/controls/roadmapentry.hxx
+toolkit/inc/controls/stdtabcontroller.hxx
+toolkit/inc/controls/stdtabcontrollermodel.hxx
+toolkit/inc/controls/svmedit.hxx
+toolkit/inc/controls/tabpagecontainer.hxx
+toolkit/inc/controls/tabpagemodel.hxx
+toolkit/inc/controls/tkscrollbar.hxx
+toolkit/inc/controls/treecontrolpeer.hxx
+toolkit/inc/controls/unocontrolcontainer.hxx
+toolkit/inc/controls/unocontrolcontainermodel.hxx
+toolkit/inc/helper/accessibilityclient.hxx
+toolkit/inc/helper/btndlg.hxx
+toolkit/inc/helper/imagealign.hxx
+toolkit/inc/helper/scrollabledialog.hxx
+toolkit/inc/helper/unopropertyarrayhelper.hxx
+toolkit/inc/helper/unowrapper.hxx
+toolkit/source/awt/animatedimagespeer.cxx
+toolkit/source/awt/asynccallback.cxx
+toolkit/source/awt/scrollabledialog.cxx
+toolkit/source/awt/stylesettings.cxx
+toolkit/source/awt/stylesettings.hxx
+toolkit/source/awt/vclxaccessiblecomponent.cxx
+toolkit/source/awt/vclxbitmap.cxx
+toolkit/source/awt/vclxcontainer.cxx
+toolkit/source/awt/vclxdevice.cxx
+toolkit/source/awt/vclxfont.cxx
+toolkit/source/awt/vclxgraphics.cxx
+toolkit/source/awt/vclxmenu.cxx
+toolkit/source/awt/vclxpointer.cxx
+toolkit/source/awt/vclxprinter.cxx
+toolkit/source/awt/vclxregion.cxx
+toolkit/source/awt/vclxspinbutton.cxx
+toolkit/source/awt/vclxsystemdependentwindow.cxx
+toolkit/source/awt/vclxtabpagecontainer.cxx
+toolkit/source/awt/vclxtoolkit.cxx
+toolkit/source/awt/vclxtopwindow.cxx
+toolkit/source/awt/vclxwindow.cxx
+toolkit/source/awt/vclxwindows.cxx
+toolkit/source/controls/accessiblecontrolcontext.cxx
+toolkit/source/controls/animatedimages.cxx
+toolkit/source/controls/controlmodelcontainerbase.cxx
+toolkit/source/controls/dialogcontrol.cxx
+toolkit/source/controls/eventcontainer.cxx
+toolkit/source/controls/filectrl.cxx
+toolkit/source/controls/formattedcontrol.cxx
+toolkit/source/controls/geometrycontrolmodel.cxx
+toolkit/source/controls/grid/defaultgridcolumnmodel.cxx
+toolkit/source/controls/grid/defaultgriddatamodel.cxx
+toolkit/source/controls/grid/gridcolumn.cxx
+toolkit/source/controls/grid/gridcolumn.hxx
+toolkit/source/controls/grid/gridcontrol.cxx
+toolkit/source/controls/grid/gridcontrol.hxx
+toolkit/source/controls/grid/grideventforwarder.cxx
+toolkit/source/controls/grid/grideventforwarder.hxx
+toolkit/source/controls/grid/sortablegriddatamodel.cxx
+toolkit/source/controls/roadmapcontrol.cxx
+toolkit/source/controls/roadmapentry.cxx
+toolkit/source/controls/spinningprogress.cxx
+toolkit/source/controls/stdtabcontroller.cxx
+toolkit/source/controls/stdtabcontrollermodel.cxx
+toolkit/source/controls/tabpagecontainer.cxx
+toolkit/source/controls/tabpagemodel.cxx
+toolkit/source/controls/tkscrollbar.cxx
+toolkit/source/controls/tkspinbutton.cxx
+toolkit/source/controls/tree/treecontrol.cxx
+toolkit/source/controls/tree/treecontrolpeer.cxx
+toolkit/source/controls/tree/treedatamodel.cxx
+toolkit/source/controls/unocontrol.cxx
+toolkit/source/controls/unocontrolbase.cxx
+toolkit/source/controls/unocontrolcontainer.cxx
+toolkit/source/controls/unocontrolcontainermodel.cxx
+toolkit/source/controls/unocontrolmodel.cxx
+toolkit/source/controls/unocontrols.cxx
+toolkit/source/hatchwindow/documentcloser.cxx
+toolkit/source/hatchwindow/hatchwindow.cxx
+toolkit/source/hatchwindow/hatchwindow.hxx
+toolkit/source/hatchwindow/hatchwindowfactory.cxx
+toolkit/source/hatchwindow/ipwin.cxx
+toolkit/source/hatchwindow/ipwin.hxx
+toolkit/source/helper/accessibilityclient.cxx
+toolkit/source/helper/btndlg.cxx
+toolkit/source/helper/formpdfexport.cxx
+toolkit/source/helper/imagealign.cxx
+toolkit/source/helper/listenermultiplexer.cxx
+toolkit/source/helper/property.cxx
+toolkit/source/helper/unopropertyarrayhelper.cxx
+toolkit/source/helper/unowrapper.cxx
+toolkit/source/helper/vclunohelper.cxx
+tools/inc/poly.h
+tools/qa/cppunit/test_color.cxx
+tools/qa/cppunit/test_fract.cxx
+tools/qa/cppunit/test_inetmime.cxx
+tools/qa/cppunit/test_reversemap.cxx
+tools/qa/cppunit/test_stream.cxx
+tools/qa/cppunit/test_urlobj.cxx
+tools/source/datetime/datetime.cxx
+tools/source/datetime/datetimeutils.cxx
+tools/source/datetime/tdate.cxx
+tools/source/datetime/ttime.cxx
+tools/source/debug/debug.cxx
+tools/source/fsys/urlobj.cxx
+tools/source/fsys/wldcrd.cxx
+tools/source/generic/b3dtrans.cxx
+tools/source/generic/bigint.cxx
+tools/source/generic/color.cxx
+tools/source/generic/config.cxx
+tools/source/generic/fract.cxx
+tools/source/generic/gen.cxx
+tools/source/generic/line.cxx
+tools/source/generic/point.cxx
+tools/source/generic/poly.cxx
+tools/source/generic/poly2.cxx
+tools/source/inet/inetmime.cxx
+tools/source/inet/inetmsg.cxx
+tools/source/inet/inetstrm.cxx
+tools/source/memtools/multisel.cxx
+tools/source/misc/pathutils.cxx
+tools/source/ref/globname.cxx
+tools/source/reversemap/bestreversemap.cxx
+tools/source/stream/stream.cxx
+tools/source/stream/strmunx.cxx
+tools/source/stream/strmwnt.cxx
+tools/source/string/tenccvt.cxx
+tools/source/zcodec/zcodec.cxx
+ucb/qa/cppunit/webdav/webdav_local_neon.cxx
+ucb/qa/cppunit/webdav/webdav_options.cxx
+ucb/qa/cppunit/webdav/webdav_propfindcache.cxx
+ucb/qa/cppunit/webdav/webdav_resource_access.cxx
+ucb/source/cacher/cachedcontentresultset.cxx
+ucb/source/cacher/cachedcontentresultset.hxx
+ucb/source/cacher/cachedcontentresultsetstub.cxx
+ucb/source/cacher/cachedcontentresultsetstub.hxx
+ucb/source/cacher/cacheddynamicresultset.cxx
+ucb/source/cacher/cacheddynamicresultset.hxx
+ucb/source/cacher/cacheddynamicresultsetstub.cxx
+ucb/source/cacher/cacheddynamicresultsetstub.hxx
+ucb/source/cacher/contentresultsetwrapper.cxx
+ucb/source/cacher/contentresultsetwrapper.hxx
+ucb/source/cacher/dynamicresultsetwrapper.cxx
+ucb/source/cacher/dynamicresultsetwrapper.hxx
+ucb/source/core/FileAccess.cxx
+ucb/source/core/cmdenv.cxx
+ucb/source/core/cmdenv.hxx
+ucb/source/core/providermap.hxx
+ucb/source/core/provprox.cxx
+ucb/source/core/provprox.hxx
+ucb/source/core/ucb.cxx
+ucb/source/core/ucb.hxx
+ucb/source/core/ucbcmds.cxx
+ucb/source/core/ucbcmds.hxx
+ucb/source/core/ucbprops.cxx
+ucb/source/core/ucbprops.hxx
+ucb/source/core/ucbstore.cxx
+ucb/source/core/ucbstore.hxx
+ucb/source/inc/regexp.hxx
+ucb/source/inc/regexpmap.hxx
+ucb/source/regexp/regexp.cxx
+ucb/source/sorter/sortdynres.cxx
+ucb/source/sorter/sortdynres.hxx
+ucb/source/sorter/sortresult.cxx
+ucb/source/sorter/sortresult.hxx
+ucb/source/ucp/cmis/auth_provider.cxx
+ucb/source/ucp/cmis/auth_provider.hxx
+ucb/source/ucp/cmis/certvalidation_handler.cxx
+ucb/source/ucp/cmis/certvalidation_handler.hxx
+ucb/source/ucp/cmis/children_provider.hxx
+ucb/source/ucp/cmis/cmis_content.cxx
+ucb/source/ucp/cmis/cmis_content.hxx
+ucb/source/ucp/cmis/cmis_datasupplier.cxx
+ucb/source/ucp/cmis/cmis_datasupplier.hxx
+ucb/source/ucp/cmis/cmis_provider.cxx
+ucb/source/ucp/cmis/cmis_provider.hxx
+ucb/source/ucp/cmis/cmis_repo_content.cxx
+ucb/source/ucp/cmis/cmis_repo_content.hxx
+ucb/source/ucp/cmis/cmis_resultset.cxx
+ucb/source/ucp/cmis/cmis_resultset.hxx
+ucb/source/ucp/cmis/cmis_strings.hxx
+ucb/source/ucp/cmis/cmis_url.cxx
+ucb/source/ucp/cmis/cmis_url.hxx
+ucb/source/ucp/cmis/std_inputstream.cxx
+ucb/source/ucp/cmis/std_inputstream.hxx
+ucb/source/ucp/cmis/std_outputstream.cxx
+ucb/source/ucp/cmis/std_outputstream.hxx
+ucb/source/ucp/expand/ucpexpand.cxx
+ucb/source/ucp/ext/ucpext_content.cxx
+ucb/source/ucp/ext/ucpext_content.hxx
+ucb/source/ucp/ext/ucpext_datasupplier.cxx
+ucb/source/ucp/ext/ucpext_datasupplier.hxx
+ucb/source/ucp/ext/ucpext_provider.cxx
+ucb/source/ucp/ext/ucpext_provider.hxx
+ucb/source/ucp/ext/ucpext_resultset.cxx
+ucb/source/ucp/ext/ucpext_resultset.hxx
+ucb/source/ucp/file/bc.cxx
+ucb/source/ucp/file/bc.hxx
+ucb/source/ucp/file/filcmd.cxx
+ucb/source/ucp/file/filcmd.hxx
+ucb/source/ucp/file/filerror.hxx
+ucb/source/ucp/file/filglob.cxx
+ucb/source/ucp/file/filglob.hxx
+ucb/source/ucp/file/filid.cxx
+ucb/source/ucp/file/filid.hxx
+ucb/source/ucp/file/filinl.hxx
+ucb/source/ucp/file/filinpstr.cxx
+ucb/source/ucp/file/filinpstr.hxx
+ucb/source/ucp/file/filinsreq.cxx
+ucb/source/ucp/file/filinsreq.hxx
+ucb/source/ucp/file/filnot.cxx
+ucb/source/ucp/file/filnot.hxx
+ucb/source/ucp/file/filprp.cxx
+ucb/source/ucp/file/filprp.hxx
+ucb/source/ucp/file/filrec.cxx
+ucb/source/ucp/file/filrec.hxx
+ucb/source/ucp/file/filrow.cxx
+ucb/source/ucp/file/filrow.hxx
+ucb/source/ucp/file/filrset.cxx
+ucb/source/ucp/file/filrset.hxx
+ucb/source/ucp/file/filstr.cxx
+ucb/source/ucp/file/filstr.hxx
+ucb/source/ucp/file/filtask.cxx
+ucb/source/ucp/file/filtask.hxx
+ucb/source/ucp/file/prov.cxx
+ucb/source/ucp/file/prov.hxx
+ucb/source/ucp/ftp/ftpcfunc.cxx
+ucb/source/ucp/ftp/ftpcontainer.hxx
+ucb/source/ucp/ftp/ftpcontent.cxx
+ucb/source/ucp/ftp/ftpcontent.hxx
+ucb/source/ucp/ftp/ftpcontentcaps.cxx
+ucb/source/ucp/ftp/ftpcontentidentifier.cxx
+ucb/source/ucp/ftp/ftpcontentidentifier.hxx
+ucb/source/ucp/ftp/ftpcontentprovider.cxx
+ucb/source/ucp/ftp/ftpcontentprovider.hxx
+ucb/source/ucp/ftp/ftpdirp.cxx
+ucb/source/ucp/ftp/ftpdirp.hxx
+ucb/source/ucp/ftp/ftpdynresultset.cxx
+ucb/source/ucp/ftp/ftpdynresultset.hxx
+ucb/source/ucp/ftp/ftpintreq.hxx
+ucb/source/ucp/ftp/ftploaderthread.cxx
+ucb/source/ucp/ftp/ftploaderthread.hxx
+ucb/source/ucp/ftp/ftpresultsetI.cxx
+ucb/source/ucp/ftp/ftpresultsetI.hxx
+ucb/source/ucp/ftp/ftpresultsetbase.cxx
+ucb/source/ucp/ftp/ftpresultsetbase.hxx
+ucb/source/ucp/ftp/ftpresultsetfactory.hxx
+ucb/source/ucp/ftp/ftpurl.cxx
+ucb/source/ucp/ftp/ftpurl.hxx
+ucb/source/ucp/gio/gio_content.cxx
+ucb/source/ucp/gio/gio_content.hxx
+ucb/source/ucp/gio/gio_datasupplier.cxx
+ucb/source/ucp/gio/gio_datasupplier.hxx
+ucb/source/ucp/gio/gio_inputstream.cxx
+ucb/source/ucp/gio/gio_inputstream.hxx
+ucb/source/ucp/gio/gio_mount.cxx
+ucb/source/ucp/gio/gio_mount.hxx
+ucb/source/ucp/gio/gio_outputstream.cxx
+ucb/source/ucp/gio/gio_outputstream.hxx
+ucb/source/ucp/gio/gio_provider.cxx
+ucb/source/ucp/gio/gio_resultset.cxx
+ucb/source/ucp/gio/gio_resultset.hxx
+ucb/source/ucp/gio/gio_seekable.cxx
+ucb/source/ucp/hierarchy/dynamicresultset.cxx
+ucb/source/ucp/hierarchy/dynamicresultset.hxx
+ucb/source/ucp/hierarchy/hierarchycontent.cxx
+ucb/source/ucp/hierarchy/hierarchycontent.hxx
+ucb/source/ucp/hierarchy/hierarchycontentcaps.cxx
+ucb/source/ucp/hierarchy/hierarchydata.cxx
+ucb/source/ucp/hierarchy/hierarchydata.hxx
+ucb/source/ucp/hierarchy/hierarchydatasource.cxx
+ucb/source/ucp/hierarchy/hierarchydatasource.hxx
+ucb/source/ucp/hierarchy/hierarchydatasupplier.cxx
+ucb/source/ucp/hierarchy/hierarchydatasupplier.hxx
+ucb/source/ucp/hierarchy/hierarchyprovider.cxx
+ucb/source/ucp/hierarchy/hierarchyprovider.hxx
+ucb/source/ucp/hierarchy/hierarchyuri.cxx
+ucb/source/ucp/hierarchy/hierarchyuri.hxx
+ucb/source/ucp/image/ucpimage.cxx
+ucb/source/ucp/inc/urihelper.hxx
+ucb/source/ucp/package/pkgcontent.cxx
+ucb/source/ucp/package/pkgcontent.hxx
+ucb/source/ucp/package/pkgcontentcaps.cxx
+ucb/source/ucp/package/pkgdatasupplier.cxx
+ucb/source/ucp/package/pkgdatasupplier.hxx
+ucb/source/ucp/package/pkgprovider.cxx
+ucb/source/ucp/package/pkgprovider.hxx
+ucb/source/ucp/package/pkgresultset.cxx
+ucb/source/ucp/package/pkgresultset.hxx
+ucb/source/ucp/package/pkguri.cxx
+ucb/source/ucp/package/pkguri.hxx
+ucb/source/ucp/tdoc/tdoc_content.cxx
+ucb/source/ucp/tdoc/tdoc_content.hxx
+ucb/source/ucp/tdoc/tdoc_contentcaps.cxx
+ucb/source/ucp/tdoc/tdoc_datasupplier.cxx
+ucb/source/ucp/tdoc/tdoc_datasupplier.hxx
+ucb/source/ucp/tdoc/tdoc_docmgr.cxx
+ucb/source/ucp/tdoc/tdoc_docmgr.hxx
+ucb/source/ucp/tdoc/tdoc_documentcontentfactory.cxx
+ucb/source/ucp/tdoc/tdoc_documentcontentfactory.hxx
+ucb/source/ucp/tdoc/tdoc_passwordrequest.cxx
+ucb/source/ucp/tdoc/tdoc_provider.cxx
+ucb/source/ucp/tdoc/tdoc_provider.hxx
+ucb/source/ucp/tdoc/tdoc_resultset.cxx
+ucb/source/ucp/tdoc/tdoc_resultset.hxx
+ucb/source/ucp/tdoc/tdoc_stgelems.cxx
+ucb/source/ucp/tdoc/tdoc_stgelems.hxx
+ucb/source/ucp/tdoc/tdoc_storage.cxx
+ucb/source/ucp/tdoc/tdoc_storage.hxx
+ucb/source/ucp/tdoc/tdoc_uri.cxx
+ucb/source/ucp/tdoc/tdoc_uri.hxx
+ucb/source/ucp/webdav-curl/ContentProperties.cxx
+ucb/source/ucp/webdav-curl/ContentProperties.hxx
+ucb/source/ucp/webdav-curl/DAVAuthListener.hxx
+ucb/source/ucp/webdav-curl/DAVAuthListenerImpl.hxx
+ucb/source/ucp/webdav-curl/DAVException.hxx
+ucb/source/ucp/webdav-curl/DAVProperties.cxx
+ucb/source/ucp/webdav-curl/DAVProperties.hxx
+ucb/source/ucp/webdav-curl/DAVRequestEnvironment.hxx
+ucb/source/ucp/webdav-curl/DAVResource.hxx
+ucb/source/ucp/webdav-curl/DAVResourceAccess.cxx
+ucb/source/ucp/webdav-curl/DAVResourceAccess.hxx
+ucb/source/ucp/webdav-curl/DAVSession.hxx
+ucb/source/ucp/webdav-curl/DAVSessionFactory.cxx
+ucb/source/ucp/webdav-curl/DAVTypes.cxx
+ucb/source/ucp/webdav-curl/DAVTypes.hxx
+ucb/source/ucp/webdav-curl/DateTimeHelper.cxx
+ucb/source/ucp/webdav-curl/DateTimeHelper.hxx
+ucb/source/ucp/webdav-curl/PropertyMap.hxx
+ucb/source/ucp/webdav-curl/PropfindCache.cxx
+ucb/source/ucp/webdav-curl/PropfindCache.hxx
+ucb/source/ucp/webdav-curl/SerfLockStore.cxx
+ucb/source/ucp/webdav-curl/SerfLockStore.hxx
+ucb/source/ucp/webdav-curl/UCBDeadPropertyValue.cxx
+ucb/source/ucp/webdav-curl/UCBDeadPropertyValue.hxx
+ucb/source/ucp/webdav-curl/webdavcontent.cxx
+ucb/source/ucp/webdav-curl/webdavcontent.hxx
+ucb/source/ucp/webdav-curl/webdavcontentcaps.cxx
+ucb/source/ucp/webdav-curl/webdavdatasupplier.cxx
+ucb/source/ucp/webdav-curl/webdavdatasupplier.hxx
+ucb/source/ucp/webdav-curl/webdavprovider.cxx
+ucb/source/ucp/webdav-curl/webdavprovider.hxx
+ucb/source/ucp/webdav-curl/webdavresponseparser.cxx
+ucb/source/ucp/webdav-curl/webdavresultset.cxx
+ucb/source/ucp/webdav-curl/webdavresultset.hxx
+ucb/source/ucp/webdav-curl/webdavservices.cxx
+ucbhelper/source/client/commandenvironment.cxx
+ucbhelper/source/client/content.cxx
+ucbhelper/source/client/interceptedinteraction.cxx
+ucbhelper/source/client/proxydecider.cxx
+ucbhelper/source/provider/authenticationfallback.cxx
+ucbhelper/source/provider/cancelcommandexecution.cxx
+ucbhelper/source/provider/contenthelper.cxx
+ucbhelper/source/provider/contentidentifier.cxx
+ucbhelper/source/provider/contentinfo.cxx
+ucbhelper/source/provider/contentinfo.hxx
+ucbhelper/source/provider/fd_inputstream.cxx
+ucbhelper/source/provider/interactionrequest.cxx
+ucbhelper/source/provider/propertyvalueset.cxx
+ucbhelper/source/provider/providerhelper.cxx
+ucbhelper/source/provider/registerucb.cxx
+ucbhelper/source/provider/resultset.cxx
+ucbhelper/source/provider/resultsethelper.cxx
+ucbhelper/source/provider/resultsetmetadata.cxx
+ucbhelper/source/provider/simpleauthenticationrequest.cxx
+ucbhelper/source/provider/simplecertificatevalidationrequest.cxx
+ucbhelper/source/provider/simpleinteractionrequest.cxx
+ucbhelper/source/provider/simpleioerrorrequest.cxx
+ucbhelper/source/provider/simpleioerrorrequest.hxx
+ucbhelper/source/provider/simplenameclashresolverequest.cxx
+unodevtools/inc/options.hxx
+unodevtools/source/skeletonmaker/cppcompskeleton.cxx
+unodevtools/source/skeletonmaker/cpptypemaker.cxx
+unodevtools/source/skeletonmaker/javacompskeleton.cxx
+unodevtools/source/skeletonmaker/javatypemaker.cxx
+unodevtools/source/skeletonmaker/skeletoncommon.cxx
+unodevtools/source/skeletonmaker/skeletoncommon.hxx
+unodevtools/source/skeletonmaker/skeletoncpp.hxx
+unodevtools/source/skeletonmaker/skeletonjava.hxx
+unodevtools/source/skeletonmaker/skeletonmaker.cxx
+unodevtools/source/unodevtools/options.cxx
+unoidl/source/legacyprovider.cxx
+unoidl/source/legacyprovider.hxx
+unoidl/source/sourcefileprovider.cxx
+unoidl/source/sourceprovider-parser-requires.hxx
+unoidl/source/sourceprovider-scanner.hxx
+unoidl/source/sourcetreeprovider.cxx
+unoidl/source/unoidl-check.cxx
+unoidl/source/unoidl-read.cxx
+unoidl/source/unoidl-write.cxx
+unoidl/source/unoidl.cxx
+unoidl/source/unoidlprovider.cxx
+unoidl/source/unoidlprovider.hxx
+unotest/source/cpp/filters-test.cxx
+unotest/source/cpp/officeconnection.cxx
+unotest/source/cpp/toabsolutefileurl.cxx
+unotest/source/cpp/unobootstrapprotector/unobootstrapprotector.cxx
+unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx
+unotools/qa/unit/testGetEnglishSearchName.cxx
+unotools/source/accessibility/accessiblerelationsethelper.cxx
+unotools/source/accessibility/accessiblestatesethelper.cxx
+unotools/source/config/bootstrap.cxx
+unotools/source/config/cmdoptions.cxx
+unotools/source/config/compatibility.cxx
+unotools/source/config/configitem.cxx
+unotools/source/config/configmgr.cxx
+unotools/source/config/confignode.cxx
+unotools/source/config/configpaths.cxx
+unotools/source/config/configvaluecontainer.cxx
+unotools/source/config/defaultoptions.cxx
+unotools/source/config/docinfohelper.cxx
+unotools/source/config/dynamicmenuoptions.cxx
+unotools/source/config/eventcfg.cxx
+unotools/source/config/fltrcfg.cxx
+unotools/source/config/fontcfg.cxx
+unotools/source/config/historyoptions.cxx
+unotools/source/config/itemholder1.cxx
+unotools/source/config/itemholder1.hxx
+unotools/source/config/lingucfg.cxx
+unotools/source/config/moduleoptions.cxx
+unotools/source/config/options.cxx
+unotools/source/config/optionsdlg.cxx
+unotools/source/config/pathoptions.cxx
+unotools/source/config/saveopt.cxx
+unotools/source/config/searchopt.cxx
+unotools/source/config/securityoptions.cxx
+unotools/source/config/syslocaleoptions.cxx
+unotools/source/config/useroptions.cxx
+unotools/source/config/viewoptions.cxx
+unotools/source/i18n/calendarwrapper.cxx
+unotools/source/i18n/charclass.cxx
+unotools/source/i18n/collatorwrapper.cxx
+unotools/source/i18n/intlwrapper.cxx
+unotools/source/i18n/localedatawrapper.cxx
+unotools/source/i18n/nativenumberwrapper.cxx
+unotools/source/i18n/readwritemutexguard.cxx
+unotools/source/i18n/resmgr.cxx
+unotools/source/i18n/textsearch.cxx
+unotools/source/i18n/transliterationwrapper.cxx
+unotools/source/misc/ServiceDocumenter.cxx
+unotools/source/misc/ServiceDocumenter.hxx
+unotools/source/misc/ZipPackageHelper.cxx
+unotools/source/misc/closeveto.cxx
+unotools/source/misc/datetime.cxx
+unotools/source/misc/desktopterminationobserver.cxx
+unotools/source/misc/eventlisteneradapter.cxx
+unotools/source/misc/fontcvt.cxx
+unotools/source/misc/fontdefs.cxx
+unotools/source/misc/mediadescriptor.cxx
+unotools/source/misc/sharedunocomponent.cxx
+unotools/source/misc/syslocale.cxx
+unotools/source/misc/wincodepage.cxx
+unotools/source/streaming/streamhelper.cxx
+unotools/source/streaming/streamwrap.cxx
+unotools/source/ucbhelper/XTempFile.hxx
+unotools/source/ucbhelper/localfilehelper.cxx
+unotools/source/ucbhelper/progresshandlerwrap.cxx
+unotools/source/ucbhelper/tempfile.cxx
+unotools/source/ucbhelper/ucbhelper.cxx
+unotools/source/ucbhelper/ucblockbytes.cxx
+unotools/source/ucbhelper/ucblockbytes.hxx
+unotools/source/ucbhelper/ucbstreamhelper.cxx
+unotools/source/ucbhelper/xtempfile.cxx
+unoxml/inc/event.hxx
+unoxml/inc/eventdispatcher.hxx
+unoxml/inc/mouseevent.hxx
+unoxml/inc/mutationevent.hxx
+unoxml/inc/node.hxx
+unoxml/inc/uievent.hxx
+unoxml/qa/unit/domtest.cxx
+unoxml/source/dom/attr.cxx
+unoxml/source/dom/attr.hxx
+unoxml/source/dom/attributesmap.cxx
+unoxml/source/dom/attributesmap.hxx
+unoxml/source/dom/cdatasection.cxx
+unoxml/source/dom/cdatasection.hxx
+unoxml/source/dom/characterdata.cxx
+unoxml/source/dom/characterdata.hxx
+unoxml/source/dom/childlist.cxx
+unoxml/source/dom/childlist.hxx
+unoxml/source/dom/comment.cxx
+unoxml/source/dom/comment.hxx
+unoxml/source/dom/document.cxx
+unoxml/source/dom/document.hxx
+unoxml/source/dom/documentbuilder.cxx
+unoxml/source/dom/documentbuilder.hxx
+unoxml/source/dom/documentfragment.cxx
+unoxml/source/dom/documentfragment.hxx
+unoxml/source/dom/documenttype.cxx
+unoxml/source/dom/documenttype.hxx
+unoxml/source/dom/domimplementation.cxx
+unoxml/source/dom/domimplementation.hxx
+unoxml/source/dom/element.cxx
+unoxml/source/dom/element.hxx
+unoxml/source/dom/elementlist.cxx
+unoxml/source/dom/elementlist.hxx
+unoxml/source/dom/entitiesmap.cxx
+unoxml/source/dom/entitiesmap.hxx
+unoxml/source/dom/entity.cxx
+unoxml/source/dom/entity.hxx
+unoxml/source/dom/entityreference.cxx
+unoxml/source/dom/entityreference.hxx
+unoxml/source/dom/node.cxx
+unoxml/source/dom/notation.cxx
+unoxml/source/dom/notation.hxx
+unoxml/source/dom/notationsmap.cxx
+unoxml/source/dom/notationsmap.hxx
+unoxml/source/dom/processinginstruction.cxx
+unoxml/source/dom/processinginstruction.hxx
+unoxml/source/dom/saxbuilder.cxx
+unoxml/source/dom/saxbuilder.hxx
+unoxml/source/dom/text.cxx
+unoxml/source/dom/text.hxx
+unoxml/source/events/event.cxx
+unoxml/source/events/eventdispatcher.cxx
+unoxml/source/events/mouseevent.cxx
+unoxml/source/events/mutationevent.cxx
+unoxml/source/events/uievent.cxx
+unoxml/source/rdf/CBlankNode.cxx
+unoxml/source/rdf/CLiteral.cxx
+unoxml/source/rdf/CURI.cxx
+unoxml/source/rdf/librdf_repository.cxx
+unoxml/source/xpath/nodelist.cxx
+unoxml/source/xpath/nodelist.hxx
+unoxml/source/xpath/xpathapi.cxx
+unoxml/source/xpath/xpathapi.hxx
+unoxml/source/xpath/xpathobject.cxx
+unoxml/source/xpath/xpathobject.hxx
+uui/inc/ids.hxx
+uui/source/alreadyopen.cxx
+uui/source/filechanged.cxx
+uui/source/fltdlg.hxx
+uui/source/getcontinuations.hxx
+uui/source/iahndl-authentication.cxx
+uui/source/iahndl-errorhandler.cxx
+uui/source/iahndl-filter.cxx
+uui/source/iahndl-ioexceptions.cxx
+uui/source/iahndl-locking.cxx
+uui/source/iahndl-ssl.cxx
+uui/source/iahndl.cxx
+uui/source/iahndl.hxx
+uui/source/interactionhandler.cxx
+uui/source/lockcorrupt.cxx
+uui/source/lockfailed.cxx
+uui/source/logindlg.cxx
+uui/source/logindlg.hxx
+uui/source/loginerr.hxx
+uui/source/masterpasscrtdlg.cxx
+uui/source/masterpassworddlg.cxx
+uui/source/nameclashdlg.cxx
+uui/source/nameclashdlg.hxx
+uui/source/openlocked.cxx
+uui/source/passwordcontainer.cxx
+uui/source/passwordcontainer.hxx
+uui/source/passworddlg.cxx
+uui/source/passworddlg.hxx
+uui/source/requeststringresolver.cxx
+uui/source/requeststringresolver.hxx
+uui/source/secmacrowarnings.cxx
+uui/source/secmacrowarnings.hxx
+uui/source/sslwarndlg.cxx
+uui/source/trylater.cxx
+uui/source/unknownauthdlg.hxx
+vbahelper/source/msforms/vbabutton.cxx
+vbahelper/source/msforms/vbabutton.hxx
+vbahelper/source/msforms/vbacheckbox.cxx
+vbahelper/source/msforms/vbacheckbox.hxx
+vbahelper/source/msforms/vbacombobox.cxx
+vbahelper/source/msforms/vbacombobox.hxx
+vbahelper/source/msforms/vbacontrol.cxx
+vbahelper/source/msforms/vbacontrol.hxx
+vbahelper/source/msforms/vbacontrols.cxx
+vbahelper/source/msforms/vbacontrols.hxx
+vbahelper/source/msforms/vbaframe.cxx
+vbahelper/source/msforms/vbaframe.hxx
+vbahelper/source/msforms/vbaimage.cxx
+vbahelper/source/msforms/vbaimage.hxx
+vbahelper/source/msforms/vbalabel.cxx
+vbahelper/source/msforms/vbalabel.hxx
+vbahelper/source/msforms/vbalistbox.cxx
+vbahelper/source/msforms/vbalistbox.hxx
+vbahelper/source/msforms/vbalistcontrolhelper.cxx
+vbahelper/source/msforms/vbalistcontrolhelper.hxx
+vbahelper/source/msforms/vbamultipage.cxx
+vbahelper/source/msforms/vbamultipage.hxx
+vbahelper/source/msforms/vbanewfont.cxx
+vbahelper/source/msforms/vbapages.cxx
+vbahelper/source/msforms/vbapages.hxx
+vbahelper/source/msforms/vbaprogressbar.cxx
+vbahelper/source/msforms/vbaprogressbar.hxx
+vbahelper/source/msforms/vbaradiobutton.cxx
+vbahelper/source/msforms/vbaradiobutton.hxx
+vbahelper/source/msforms/vbascrollbar.cxx
+vbahelper/source/msforms/vbascrollbar.hxx
+vbahelper/source/msforms/vbaspinbutton.cxx
+vbahelper/source/msforms/vbaspinbutton.hxx
+vbahelper/source/msforms/vbasystemaxcontrol.cxx
+vbahelper/source/msforms/vbasystemaxcontrol.hxx
+vbahelper/source/msforms/vbatextbox.cxx
+vbahelper/source/msforms/vbatextbox.hxx
+vbahelper/source/msforms/vbatogglebutton.cxx
+vbahelper/source/msforms/vbatogglebutton.hxx
+vbahelper/source/msforms/vbauserform.cxx
+vbahelper/source/msforms/vbauserform.hxx
+vbahelper/source/vbahelper/vbaapplicationbase.cxx
+vbahelper/source/vbahelper/vbacolorformat.cxx
+vbahelper/source/vbahelper/vbacolorformat.hxx
+vbahelper/source/vbahelper/vbacommandbar.cxx
+vbahelper/source/vbahelper/vbacommandbar.hxx
+vbahelper/source/vbahelper/vbacommandbarcontrol.cxx
+vbahelper/source/vbahelper/vbacommandbarcontrol.hxx
+vbahelper/source/vbahelper/vbacommandbarcontrols.cxx
+vbahelper/source/vbahelper/vbacommandbarcontrols.hxx
+vbahelper/source/vbahelper/vbacommandbarhelper.cxx
+vbahelper/source/vbahelper/vbacommandbarhelper.hxx
+vbahelper/source/vbahelper/vbacommandbars.cxx
+vbahelper/source/vbahelper/vbacommandbars.hxx
+vbahelper/source/vbahelper/vbadocumentbase.cxx
+vbahelper/source/vbahelper/vbadocumentsbase.cxx
+vbahelper/source/vbahelper/vbaeventshelperbase.cxx
+vbahelper/source/vbahelper/vbafillformat.cxx
+vbahelper/source/vbahelper/vbafillformat.hxx
+vbahelper/source/vbahelper/vbafontbase.cxx
+vbahelper/source/vbahelper/vbaglobalbase.cxx
+vbahelper/source/vbahelper/vbahelper.cxx
+vbahelper/source/vbahelper/vbalineformat.cxx
+vbahelper/source/vbahelper/vbalineformat.hxx
+vbahelper/source/vbahelper/vbapagesetupbase.cxx
+vbahelper/source/vbahelper/vbapictureformat.cxx
+vbahelper/source/vbahelper/vbapictureformat.hxx
+vbahelper/source/vbahelper/vbapropvalue.cxx
+vbahelper/source/vbahelper/vbashape.cxx
+vbahelper/source/vbahelper/vbashaperange.cxx
+vbahelper/source/vbahelper/vbashapes.cxx
+vbahelper/source/vbahelper/vbatextframe.cxx
+vbahelper/source/vbahelper/vbawindowbase.cxx
+vcl/android/androidinst.cxx
+vcl/backendtest/VisualBackendTest.cxx
+vcl/backendtest/outputdevice/bitmap.cxx
+vcl/backendtest/outputdevice/common.cxx
+vcl/backendtest/outputdevice/line.cxx
+vcl/backendtest/outputdevice/outputdevice.cxx
+vcl/backendtest/outputdevice/polygon.cxx
+vcl/backendtest/outputdevice/polyline.cxx
+vcl/headless/headlessinst.cxx
+vcl/headless/svpbmp.cxx
+vcl/headless/svpdata.cxx
+vcl/headless/svpdummies.cxx
+vcl/headless/svpframe.cxx
+vcl/headless/svpgdi.cxx
+vcl/headless/svpinst.cxx
+vcl/headless/svpprn.cxx
+vcl/headless/svptext.cxx
+vcl/headless/svpvd.cxx
+vcl/inc/IconThemeSelector.hxx
+vcl/inc/IPrioritable.hxx
+vcl/inc/PhysicalFontFamily.hxx
+vcl/inc/ResampleKernel.hxx
+vcl/inc/WidgetThemeLibraryTypes.hxx
+vcl/inc/bitmap/bmpfast.hxx
+vcl/inc/accel.hxx
+vcl/inc/accmgr.hxx
+vcl/inc/brdwin.hxx
+vcl/inc/bubblewindow.hxx
+vcl/inc/calendar.hxx
+vcl/inc/canvasbitmap.hxx
+vcl/inc/configsettings.hxx
+vcl/inc/controldata.hxx
+vcl/inc/debugevent.hxx
+vcl/inc/displayconnectiondispatch.hxx
+vcl/inc/dndeventdispatcher.hxx
+vcl/inc/dndlistenercontainer.hxx
+vcl/inc/factory.hxx
+vcl/inc/fltcall.hxx
+vcl/inc/font/FontSelectPattern.hxx
+vcl/inc/font/PhysicalFontCollection.hxx
+vcl/inc/font/PhysicalFontFace.hxx
+vcl/inc/fontattributes.hxx
+vcl/inc/fontinstance.hxx
+vcl/inc/fontsubset.hxx
+vcl/inc/graphic/UnoGraphic.hxx
+vcl/inc/graphic/UnoGraphicDescriptor.hxx
+vcl/inc/headless/svpbmp.hxx
+vcl/inc/headless/svpdummies.hxx
+vcl/inc/headless/svpframe.hxx
+vcl/inc/headless/svpgdi.hxx
+vcl/inc/headless/svpinst.hxx
+vcl/inc/headless/svpvd.hxx
+vcl/inc/helpwin.hxx
+vcl/inc/hyperlabel.hxx
+vcl/inc/image.h
+vcl/inc/imagerepository.hxx
+vcl/inc/impanmvw.hxx
+vcl/inc/impdel.hxx
+vcl/inc/impfont.hxx
+vcl/inc/impfontcache.hxx
+vcl/inc/impfontcharmap.hxx
+vcl/inc/impfontmetricdata.hxx
+vcl/inc/impgraph.hxx
+vcl/inc/implimagetree.hxx
+vcl/inc/jobdata.hxx
+vcl/inc/jobset.h
+vcl/inc/listbox.hxx
+vcl/inc/opengl/win/WinDeviceInfo.hxx
+vcl/inc/osx/a11yfactory.h
+vcl/inc/osx/a11yfocustracker.hxx
+vcl/inc/osx/a11ywrapper.h
+vcl/inc/osx/printview.h
+vcl/inc/osx/runinmain.hxx
+vcl/inc/osx/saldata.hxx
+vcl/inc/osx/salframe.h
+vcl/inc/osx/salframeview.h
+vcl/inc/osx/salinst.h
+vcl/inc/osx/salmenu.h
+vcl/inc/osx/salnativewidgets.h
+vcl/inc/osx/salobj.h
+vcl/inc/osx/salprn.h
+vcl/inc/osx/salsys.h
+vcl/inc/osx/saltimer.h
+vcl/inc/osx/vclnsapp.h
+vcl/inc/pdf/pdffontcache.hxx
+vcl/inc/pdf/pdfwriter_impl.hxx
+vcl/inc/ppdparser.hxx
+vcl/inc/print.h
+vcl/inc/printdlg.hxx
+vcl/inc/printerinfomanager.hxx
+vcl/inc/quartz/common.h
+vcl/inc/quartz/salbmp.h
+vcl/inc/quartz/salgdi.h
+vcl/inc/quartz/salgdicommon.hxx
+vcl/inc/quartz/salvd.h
+vcl/inc/quartz/utils.h
+vcl/inc/regband.hxx
+vcl/inc/salbmp.hxx
+vcl/inc/salframe.hxx
+vcl/inc/salgdi.hxx
+vcl/inc/salgdiimpl.hxx
+vcl/inc/salgeom.hxx
+vcl/inc/salinst.hxx
+vcl/inc/sallayout.hxx
+vcl/inc/salmenu.hxx
+vcl/inc/salobj.hxx
+vcl/inc/salprn.hxx
+vcl/inc/salptype.hxx
+vcl/inc/salsession.hxx
+vcl/inc/saltimer.hxx
+vcl/inc/salusereventlist.hxx
+vcl/inc/salvd.hxx
+vcl/inc/salwtype.hxx
+vcl/inc/schedulerimpl.hxx
+vcl/inc/scrwnd.hxx
+vcl/inc/sft.hxx
+vcl/inc/slider.hxx
+vcl/inc/spin.hxx
+vcl/inc/strhelper.hxx
+vcl/inc/svdata.hxx
+vcl/inc/svimpbox.hxx
+vcl/inc/test/outputdevice.hxx
+vcl/inc/textlayout.hxx
+vcl/inc/textlineinfo.hxx
+vcl/inc/textrender.hxx
+vcl/inc/toolbox.h
+vcl/inc/unx/cairotextrender.hxx
+vcl/inc/unx/cpdmgr.hxx
+vcl/inc/unx/cupsmgr.hxx
+vcl/inc/unx/fc_fontoptions.hxx
+vcl/inc/unx/fontmanager.hxx
+vcl/inc/unx/freetype_glyphcache.hxx
+vcl/inc/unx/freetypetextrender.hxx
+vcl/inc/unx/gendisp.hxx
+vcl/inc/unx/geninst.h
+vcl/inc/unx/genprn.h
+vcl/inc/unx/genpspgraphics.h
+vcl/inc/unx/gensys.h
+vcl/inc/unx/glyphcache.hxx
+vcl/inc/unx/gtk/gloactiongroup.h
+vcl/inc/unx/gtk/glomenu.h
+vcl/inc/unx/gtk/gtkdata.hxx
+vcl/inc/unx/gtk/gtkframe.hxx
+vcl/inc/unx/gtk/gtkgdi.hxx
+vcl/inc/unx/gtk/gtkinst.hxx
+vcl/inc/unx/gtk/gtkobject.hxx
+vcl/inc/unx/gtk/gtkprintwrapper.hxx
+vcl/inc/unx/gtk/gtkprn.hxx
+vcl/inc/unx/gtk/gtksalmenu.hxx
+vcl/inc/unx/gtk/gtksys.hxx
+vcl/inc/unx/gtk/hudawareness.h
+vcl/inc/unx/helper.hxx
+vcl/inc/unx/i18n_cb.hxx
+vcl/inc/unx/i18n_ic.hxx
+vcl/inc/unx/i18n_im.hxx
+vcl/inc/unx/i18n_xkb.hxx
+vcl/inc/unx/printergfx.hxx
+vcl/inc/unx/printerjob.hxx
+vcl/inc/unx/salbmp.h
+vcl/inc/unx/saldata.hxx
+vcl/inc/unx/saldisp.hxx
+vcl/inc/unx/salframe.h
+vcl/inc/unx/salgdi.h
+vcl/inc/unx/salinst.h
+vcl/inc/unx/salobj.h
+vcl/inc/unx/saltimer.h
+vcl/inc/unx/saltype.h
+vcl/inc/unx/salunxtime.h
+vcl/inc/unx/salvd.h
+vcl/inc/unx/sm.hxx
+vcl/inc/unx/wmadaptor.hxx
+vcl/inc/unx/x11/x11sys.hxx
+vcl/inc/unx/x11/xlimits.hxx
+vcl/inc/unx/x11/xrender_peer.hxx
+vcl/inc/unx/x11_cursors/ase_curs.h
+vcl/inc/unx/x11_cursors/ase_mask.h
+vcl/inc/unx/x11_cursors/asn_curs.h
+vcl/inc/unx/x11_cursors/asn_mask.h
+vcl/inc/unx/x11_cursors/asne_curs.h
+vcl/inc/unx/x11_cursors/asne_mask.h
+vcl/inc/unx/x11_cursors/asns_curs.h
+vcl/inc/unx/x11_cursors/asns_mask.h
+vcl/inc/unx/x11_cursors/asnswe_curs.h
+vcl/inc/unx/x11_cursors/asnswe_mask.h
+vcl/inc/unx/x11_cursors/asnw_curs.h
+vcl/inc/unx/x11_cursors/asnw_mask.h
+vcl/inc/unx/x11_cursors/ass_curs.h
+vcl/inc/unx/x11_cursors/ass_mask.h
+vcl/inc/unx/x11_cursors/asse_curs.h
+vcl/inc/unx/x11_cursors/asse_mask.h
+vcl/inc/unx/x11_cursors/assw_curs.h
+vcl/inc/unx/x11_cursors/assw_mask.h
+vcl/inc/unx/x11_cursors/asw_curs.h
+vcl/inc/unx/x11_cursors/asw_mask.h
+vcl/inc/unx/x11_cursors/aswe_curs.h
+vcl/inc/unx/x11_cursors/aswe_mask.h
+vcl/inc/unx/x11_cursors/chain_curs.h
+vcl/inc/unx/x11_cursors/chain_mask.h
+vcl/inc/unx/x11_cursors/chainnot_curs.h
+vcl/inc/unx/x11_cursors/chainnot_mask.h
+vcl/inc/unx/x11_cursors/chart_curs.h
+vcl/inc/unx/x11_cursors/chart_mask.h
+vcl/inc/unx/x11_cursors/copydata_curs.h
+vcl/inc/unx/x11_cursors/copydata_mask.h
+vcl/inc/unx/x11_cursors/copydlnk_curs.h
+vcl/inc/unx/x11_cursors/copydlnk_mask.h
+vcl/inc/unx/x11_cursors/copyfile_curs.h
+vcl/inc/unx/x11_cursors/copyfile_mask.h
+vcl/inc/unx/x11_cursors/copyfiles_curs.h
+vcl/inc/unx/x11_cursors/copyfiles_mask.h
+vcl/inc/unx/x11_cursors/copyflnk_curs.h
+vcl/inc/unx/x11_cursors/copyflnk_mask.h
+vcl/inc/unx/x11_cursors/crook_curs.h
+vcl/inc/unx/x11_cursors/crook_mask.h
+vcl/inc/unx/x11_cursors/crop_curs.h
+vcl/inc/unx/x11_cursors/crop_mask.h
+vcl/inc/unx/x11_cursors/detective_curs.h
+vcl/inc/unx/x11_cursors/detective_mask.h
+vcl/inc/unx/x11_cursors/drawarc_curs.h
+vcl/inc/unx/x11_cursors/drawarc_mask.h
+vcl/inc/unx/x11_cursors/drawbezier_curs.h
+vcl/inc/unx/x11_cursors/drawbezier_mask.h
+vcl/inc/unx/x11_cursors/drawcaption_curs.h
+vcl/inc/unx/x11_cursors/drawcaption_mask.h
+vcl/inc/unx/x11_cursors/drawcirclecut_curs.h
+vcl/inc/unx/x11_cursors/drawcirclecut_mask.h
+vcl/inc/unx/x11_cursors/drawconnect_curs.h
+vcl/inc/unx/x11_cursors/drawconnect_mask.h
+vcl/inc/unx/x11_cursors/drawellipse_curs.h
+vcl/inc/unx/x11_cursors/drawellipse_mask.h
+vcl/inc/unx/x11_cursors/drawfreehand_curs.h
+vcl/inc/unx/x11_cursors/drawfreehand_mask.h
+vcl/inc/unx/x11_cursors/drawline_curs.h
+vcl/inc/unx/x11_cursors/drawline_mask.h
+vcl/inc/unx/x11_cursors/drawpie_curs.h
+vcl/inc/unx/x11_cursors/drawpie_mask.h
+vcl/inc/unx/x11_cursors/drawpolygon_curs.h
+vcl/inc/unx/x11_cursors/drawpolygon_mask.h
+vcl/inc/unx/x11_cursors/drawrect_curs.h
+vcl/inc/unx/x11_cursors/drawrect_mask.h
+vcl/inc/unx/x11_cursors/drawtext_curs.h
+vcl/inc/unx/x11_cursors/drawtext_mask.h
+vcl/inc/unx/x11_cursors/fill_curs.h
+vcl/inc/unx/x11_cursors/fill_mask.h
+vcl/inc/unx/x11_cursors/hshear_curs.h
+vcl/inc/unx/x11_cursors/hshear_mask.h
+vcl/inc/unx/x11_cursors/invert50.h
+vcl/inc/unx/x11_cursors/linkdata_curs.h
+vcl/inc/unx/x11_cursors/linkdata_mask.h
+vcl/inc/unx/x11_cursors/linkfile_curs.h
+vcl/inc/unx/x11_cursors/linkfile_mask.h
+vcl/inc/unx/x11_cursors/magnify_curs.h
+vcl/inc/unx/x11_cursors/magnify_mask.h
+vcl/inc/unx/x11_cursors/mirror_curs.h
+vcl/inc/unx/x11_cursors/mirror_mask.h
+vcl/inc/unx/x11_cursors/movebezierweight_curs.h
+vcl/inc/unx/x11_cursors/movebezierweight_mask.h
+vcl/inc/unx/x11_cursors/movedata_curs.h
+vcl/inc/unx/x11_cursors/movedata_mask.h
+vcl/inc/unx/x11_cursors/movedlnk_curs.h
+vcl/inc/unx/x11_cursors/movedlnk_mask.h
+vcl/inc/unx/x11_cursors/movefile_curs.h
+vcl/inc/unx/x11_cursors/movefile_mask.h
+vcl/inc/unx/x11_cursors/movefiles_curs.h
+vcl/inc/unx/x11_cursors/movefiles_mask.h
+vcl/inc/unx/x11_cursors/moveflnk_curs.h
+vcl/inc/unx/x11_cursors/moveflnk_mask.h
+vcl/inc/unx/x11_cursors/movepoint_curs.h
+vcl/inc/unx/x11_cursors/movepoint_mask.h
+vcl/inc/unx/x11_cursors/nodrop_curs.h
+vcl/inc/unx/x11_cursors/nodrop_mask.h
+vcl/inc/unx/x11_cursors/pivotcol_curs.h
+vcl/inc/unx/x11_cursors/pivotcol_mask.h
+vcl/inc/unx/x11_cursors/pivotdel_curs.h
+vcl/inc/unx/x11_cursors/pivotdel_mask.h
+vcl/inc/unx/x11_cursors/pivotfld_curs.h
+vcl/inc/unx/x11_cursors/pivotfld_mask.h
+vcl/inc/unx/x11_cursors/pivotrow_curs.h
+vcl/inc/unx/x11_cursors/pivotrow_mask.h
+vcl/inc/unx/x11_cursors/rotate_curs.h
+vcl/inc/unx/x11_cursors/rotate_mask.h
+vcl/inc/unx/x11_cursors/tblsele_curs.h
+vcl/inc/unx/x11_cursors/tblsele_mask.h
+vcl/inc/unx/x11_cursors/tblsels_curs.h
+vcl/inc/unx/x11_cursors/tblsels_mask.h
+vcl/inc/unx/x11_cursors/tblselse_curs.h
+vcl/inc/unx/x11_cursors/tblselse_mask.h
+vcl/inc/unx/x11_cursors/tblselsw_curs.h
+vcl/inc/unx/x11_cursors/tblselsw_mask.h
+vcl/inc/unx/x11_cursors/tblselw_curs.h
+vcl/inc/unx/x11_cursors/tblselw_mask.h
+vcl/inc/unx/x11_cursors/vertcurs_curs.h
+vcl/inc/unx/x11_cursors/vertcurs_mask.h
+vcl/inc/unx/x11_cursors/vshear_curs.h
+vcl/inc/unx/x11_cursors/vshear_mask.h
+vcl/inc/vclstatuslistener.hxx
+vcl/inc/wall2.hxx
+vcl/inc/win/dnd_source.hxx
+vcl/inc/win/DWriteTextRenderer.hxx
+vcl/inc/win/salbmp.h
+vcl/inc/win/saldata.hxx
+vcl/inc/win/salframe.h
+vcl/inc/win/salgdi.h
+vcl/inc/win/salinst.h
+vcl/inc/win/salmenu.h
+vcl/inc/win/salobj.h
+vcl/inc/win/salprn.h
+vcl/inc/win/salsys.h
+vcl/inc/win/saltimer.h
+vcl/inc/win/salvd.h
+vcl/inc/win/wincomp.hxx
+vcl/inc/win/winlayout.hxx
+vcl/inc/window.h
+vcl/inc/wizdlg.hxx
+vcl/ios/dummies.cxx
+vcl/ios/iosinst.cxx
+vcl/ios/salios.cxx
+vcl/null/printerinfomanager.cxx
+vcl/osx/DataFlavorMapping.cxx
+vcl/osx/DataFlavorMapping.hxx
+vcl/osx/DragSource.cxx
+vcl/osx/DragSource.hxx
+vcl/osx/DragSourceContext.cxx
+vcl/osx/DragSourceContext.hxx
+vcl/osx/DropTarget.cxx
+vcl/osx/DropTarget.hxx
+vcl/osx/HtmlFmtFlt.cxx
+vcl/osx/OSXTransferable.cxx
+vcl/osx/OSXTransferable.hxx
+vcl/osx/PictToBmpFlt.cxx
+vcl/osx/a11yfocuslistener.cxx
+vcl/osx/a11yfocustracker.cxx
+vcl/osx/a11ylistener.cxx
+vcl/osx/a11yrolehelper.h
+vcl/osx/a11ytextattributeswrapper.h
+vcl/osx/clipboard.cxx
+vcl/osx/clipboard.hxx
+vcl/osx/cuidraw.hxx
+vcl/osx/documentfocuslistener.cxx
+vcl/osx/documentfocuslistener.hxx
+vcl/osx/saldata.cxx
+vcl/osx/salframe.cxx
+vcl/osx/salgdiutils.cxx
+vcl/osx/salinst.cxx
+vcl/osx/salmacos.cxx
+vcl/osx/salmenu.cxx
+vcl/osx/salnativewidgets.cxx
+vcl/osx/salobj.cxx
+vcl/osx/salprn.cxx
+vcl/osx/salsys.cxx
+vcl/osx/saltimer.cxx
+vcl/osx/service_entry.cxx
+vcl/qa/cppunit/app/test_IconThemeInfo.cxx
+vcl/qa/cppunit/app/test_IconThemeScanner.cxx
+vcl/qa/cppunit/app/test_IconThemeSelector.cxx
+vcl/qa/cppunit/blocklistparsertest.cxx
+vcl/qa/cppunit/canvasbitmaptest.cxx
+vcl/qa/cppunit/complextext.cxx
+vcl/qa/cppunit/dndtest.cxx
+vcl/qa/cppunit/errorhandler.cxx
+vcl/qa/cppunit/font.cxx
+vcl/qa/cppunit/fontmetric.cxx
+vcl/qa/cppunit/graphicfilter/filters-dxf-test.cxx
+vcl/qa/cppunit/graphicfilter/filters-eps-test.cxx
+vcl/qa/cppunit/graphicfilter/filters-met-test.cxx
+vcl/qa/cppunit/graphicfilter/filters-pcd-test.cxx
+vcl/qa/cppunit/graphicfilter/filters-pcx-test.cxx
+vcl/qa/cppunit/graphicfilter/filters-pict-test.cxx
+vcl/qa/cppunit/graphicfilter/filters-ppm-test.cxx
+vcl/qa/cppunit/graphicfilter/filters-psd-test.cxx
+vcl/qa/cppunit/graphicfilter/filters-ras-test.cxx
+vcl/qa/cppunit/graphicfilter/filters-test.cxx
+vcl/qa/cppunit/graphicfilter/filters-tga-test.cxx
+vcl/qa/cppunit/lifecycle.cxx
+vcl/qa/cppunit/svm/svmtest.cxx
+vcl/qa/cppunit/timer.cxx
+vcl/quartz/ctfonts.cxx
+vcl/quartz/salbmp.cxx
+vcl/quartz/salgdi.cxx
+vcl/quartz/salgdicommon.cxx
+vcl/quartz/salvd.cxx
+vcl/quartz/utils.cxx
+vcl/source/app/IconThemeInfo.cxx
+vcl/source/app/IconThemeScanner.cxx
+vcl/source/app/IconThemeSelector.cxx
+vcl/source/app/brand.cxx
+vcl/source/app/dbggui.cxx
+vcl/source/app/dndhelp.cxx
+vcl/source/app/help.cxx
+vcl/source/app/i18nhelp.cxx
+vcl/source/app/idle.cxx
+vcl/source/app/salplug.cxx
+vcl/source/app/salusereventlist.cxx
+vcl/source/app/scheduler.cxx
+vcl/source/app/session.cxx
+vcl/source/app/settings.cxx
+vcl/source/app/stdtext.cxx
+vcl/source/app/svapp.cxx
+vcl/source/app/svdata.cxx
+vcl/source/app/svmain.cxx
+vcl/source/app/timer.cxx
+vcl/source/app/unohelp.cxx
+vcl/source/app/unohelp2.cxx
+vcl/source/app/vclevent.cxx
+vcl/source/bitmap/BitmapScaleConvolutionFilter.cxx
+vcl/source/bitmap/BitmapScaleSuperFilter.cxx
+vcl/source/bitmap/BitmapSymmetryCheck.cxx
+vcl/source/bitmap/BitmapTools.cxx
+vcl/source/bitmap/alpha.cxx
+vcl/source/bitmap/bitmap.cxx
+vcl/source/bitmap/BitmapEx.cxx
+vcl/source/bitmap/bmpfast.cxx
+vcl/source/bitmap/checksum.cxx
+vcl/source/bitmap/dibtools.cxx
+vcl/source/bitmap/floyd.hxx
+vcl/source/bitmap/impvect.cxx
+vcl/source/bitmap/impvect.hxx
+vcl/source/bitmap/salbmp.cxx
+vcl/source/cnttype/mcnttfactory.cxx
+vcl/source/cnttype/mcnttfactory.hxx
+vcl/source/cnttype/mcnttype.cxx
+vcl/source/cnttype/mcnttype.hxx
+vcl/source/components/dtranscomp.cxx
+vcl/source/components/factory.cxx
+vcl/source/components/fontident.cxx
+vcl/source/control/button.cxx
+vcl/source/control/calendar.cxx
+vcl/source/control/combobox.cxx
+vcl/source/control/ctrl.cxx
+vcl/source/control/ContextVBox.cxx
+vcl/source/control/edit.cxx
+vcl/source/control/field.cxx
+vcl/source/control/field2.cxx
+vcl/source/control/fixed.cxx
+vcl/source/control/fixedhyper.cxx
+vcl/source/control/fmtfield.cxx
+vcl/source/control/hyperlabel.cxx
+vcl/source/control/imgctrl.cxx
+vcl/source/control/imivctl.hxx
+vcl/source/control/imivctl1.cxx
+vcl/source/control/imivctl2.cxx
+vcl/source/control/imp_listbox.cxx
+vcl/source/control/ivctrl.cxx
+vcl/source/control/listbox.cxx
+vcl/source/control/longcurr.cxx
+vcl/source/control/managedmenubutton.cxx
+vcl/source/control/menubtn.cxx
+vcl/source/control/notebookbar.cxx
+vcl/source/control/prgsbar.cxx
+vcl/source/control/quickselectionengine.cxx
+vcl/source/control/roadmap.cxx
+vcl/source/control/roadmapwizard.cxx
+vcl/source/control/scrbar.cxx
+vcl/source/control/slider.cxx
+vcl/source/control/spinbtn.cxx
+vcl/source/control/spinfld.cxx
+vcl/source/control/tabctrl.cxx
+vcl/source/control/throbber.cxx
+vcl/source/control/wizardmachine.cxx
+vcl/source/control/wizimpldata.hxx
+vcl/source/edit/textdat2.hxx
+vcl/source/edit/textdata.cxx
+vcl/source/edit/textdoc.cxx
+vcl/source/edit/textdoc.hxx
+vcl/source/edit/texteng.cxx
+vcl/source/edit/textund2.hxx
+vcl/source/edit/textundo.cxx
+vcl/source/edit/textundo.hxx
+vcl/source/edit/textview.cxx
+vcl/source/edit/txtattr.cxx
+vcl/source/edit/vclmedit.cxx
+vcl/source/edit/xtextedt.cxx
+vcl/source/filter/svm/SvmConverter.cxx
+vcl/source/filter/svm/SvmConverter.hxx
+vcl/source/filter/FilterConfigCache.cxx
+vcl/source/filter/FilterConfigCache.hxx
+vcl/source/filter/FilterConfigItem.cxx
+vcl/source/filter/graphicfilter.cxx
+vcl/source/filter/graphicfilter2.cxx
+vcl/source/filter/egif/egif.cxx
+vcl/source/filter/egif/giflzwc.cxx
+vcl/source/filter/egif/giflzwc.hxx
+vcl/source/filter/eps/eps.cxx
+vcl/source/filter/etiff/etiff.cxx
+vcl/source/filter/idxf/dxf2mtf.cxx
+vcl/source/filter/idxf/dxf2mtf.hxx
+vcl/source/filter/idxf/dxfblkrd.cxx
+vcl/source/filter/idxf/dxfblkrd.hxx
+vcl/source/filter/idxf/dxfentrd.cxx
+vcl/source/filter/idxf/dxfentrd.hxx
+vcl/source/filter/idxf/dxfgrprd.cxx
+vcl/source/filter/idxf/dxfgrprd.hxx
+vcl/source/filter/idxf/dxfreprd.cxx
+vcl/source/filter/idxf/dxfreprd.hxx
+vcl/source/filter/idxf/dxftblrd.cxx
+vcl/source/filter/idxf/dxftblrd.hxx
+vcl/source/filter/idxf/dxfvec.cxx
+vcl/source/filter/idxf/dxfvec.hxx
+vcl/source/filter/idxf/idxf.cxx
+vcl/source/filter/ieps/ieps.cxx
+vcl/source/filter/igif/decode.cxx
+vcl/source/filter/igif/decode.hxx
+vcl/source/filter/igif/gifread.cxx
+vcl/source/filter/imet/ios2met.cxx
+vcl/source/filter/ipbm/ipbm.cxx
+vcl/source/filter/ipcd/ipcd.cxx
+vcl/source/filter/ipcx/ipcx.cxx
+vcl/source/filter/ipict/ipict.cxx
+vcl/source/filter/ipsd/ipsd.cxx
+vcl/source/filter/ipict/shape.cxx
+vcl/source/filter/ipict/shape.hxx
+vcl/source/filter/iras/iras.cxx
+vcl/source/filter/ixbm/xbmread.cxx
+vcl/source/filter/ixpm/rgbtable.hxx
+vcl/source/filter/ixpm/xpmread.cxx
+vcl/source/filter/itga/itga.cxx
+vcl/source/filter/itiff/itiff.cxx
+vcl/source/filter/jpeg/Exif.cxx
+vcl/source/filter/jpeg/Exif.hxx
+vcl/source/filter/jpeg/JpegReader.cxx
+vcl/source/filter/jpeg/JpegReader.hxx
+vcl/source/filter/jpeg/JpegTransform.cxx
+vcl/source/filter/jpeg/JpegWriter.cxx
+vcl/source/filter/jpeg/JpegWriter.hxx
+vcl/source/filter/jpeg/jpeg.cxx
+vcl/source/filter/jpeg/jpeg.h
+vcl/source/filter/jpeg/jpeg.hxx
+vcl/source/filter/jpeg/jpegc.cxx
+vcl/source/filter/jpeg/transupp.c
+vcl/source/filter/jpeg/transupp.h
+vcl/source/filter/png/pngread.cxx
+vcl/source/filter/wmf/emfwr.cxx
+vcl/source/filter/wmf/emfwr.hxx
+vcl/source/filter/wmf/wmf.cxx
+vcl/source/filter/wmf/wmfwr.cxx
+vcl/source/filter/wmf/wmfwr.hxx
+vcl/source/font/DirectFontSubstitution.cxx
+vcl/source/font/FontSelectPattern.cxx
+vcl/source/font/PhysicalFontCollection.cxx
+vcl/source/font/PhysicalFontFace.cxx
+vcl/source/font/PhysicalFontFamily.cxx
+vcl/source/font/font.cxx
+vcl/source/font/fontattributes.cxx
+vcl/source/font/fontcache.cxx
+vcl/source/font/fontcharmap.cxx
+vcl/source/font/fontinstance.cxx
+vcl/source/font/fontmetric.cxx
+vcl/source/fontsubset/cff.cxx
+vcl/source/fontsubset/fontsubset.cxx
+vcl/source/fontsubset/list.cxx
+vcl/source/fontsubset/list.h
+vcl/source/fontsubset/sft.cxx
+vcl/source/fontsubset/ttcr.cxx
+vcl/source/fontsubset/ttcr.hxx
+vcl/source/fontsubset/xlat.cxx
+vcl/source/gdi/CommonSalLayout.cxx
+vcl/source/gdi/VerticalOrientationData.cxx
+vcl/source/gdi/configsettings.cxx
+vcl/source/gdi/cvtgrf.cxx
+vcl/source/gdi/embeddedfontshelper.cxx
+vcl/source/gdi/gdimetafiletools.cxx
+vcl/source/gdi/gdimtf.cxx
+vcl/source/gdi/gfxlink.cxx
+vcl/source/gdi/gradient.cxx
+vcl/source/gdi/graph.cxx
+vcl/source/gdi/graphictools.cxx
+vcl/source/gdi/hatch.cxx
+vcl/source/gdi/impanmvw.cxx
+vcl/source/gdi/impgraph.cxx
+vcl/source/gdi/impvect.hxx
+vcl/source/gdi/jobset.cxx
+vcl/source/gdi/lineinfo.cxx
+vcl/source/gdi/mapmod.cxx
+vcl/source/gdi/metaact.cxx
+vcl/source/gdi/mtfxmldump.cxx
+vcl/source/gdi/oldprintadaptor.cxx
+vcl/source/gdi/pdfextoutdevdata.cxx
+vcl/source/gdi/pdffontcache.cxx
+vcl/source/gdi/pdfwriter.cxx
+vcl/source/gdi/pdfwriter_impl.cxx
+vcl/source/gdi/pdfwriter_impl2.cxx
+vcl/source/gdi/print.cxx
+vcl/source/gdi/print2.cxx
+vcl/source/gdi/print3.cxx
+vcl/source/gdi/regband.cxx
+vcl/source/gdi/region.cxx
+vcl/source/gdi/regionband.cxx
+vcl/source/gdi/salgdilayout.cxx
+vcl/source/gdi/sallayout.cxx
+vcl/source/gdi/salmisc.cxx
+vcl/source/gdi/scrptrun.cxx
+vcl/source/gdi/textlayout.cxx
+vcl/source/gdi/vectorgraphicdata.cxx
+vcl/source/gdi/virdev.cxx
+vcl/source/gdi/wall.cxx
+vcl/source/graphic/GraphicObject.cxx
+vcl/source/graphic/GraphicObject2.cxx
+vcl/source/graphic/UnoGraphic.cxx
+vcl/source/graphic/UnoGraphicDescriptor.cxx
+vcl/source/graphic/UnoGraphicObject.cxx
+vcl/source/graphic/UnoGraphicProvider.cxx
+vcl/source/graphic/grfattr.cxx
+vcl/source/helper/canvasbitmap.cxx
+vcl/source/helper/canvastools.cxx
+vcl/source/helper/commandinfoprovider.cxx
+vcl/source/helper/displayconnectiondispatch.cxx
+vcl/source/helper/evntpost.cxx
+vcl/source/helper/strhelper.cxx
+vcl/source/helper/svtaccessiblefactory.cxx
+vcl/source/image/Image.cxx
+vcl/source/image/ImageRepository.cxx
+vcl/source/image/ImageTree.cxx
+vcl/source/image/ImplImage.cxx
+vcl/source/image/ImplImageTree.cxx
+vcl/source/opengl/OpenGLContext.cxx
+vcl/source/opengl/OpenGLHelper.cxx
+vcl/source/opengl/win/WinDeviceInfo.cxx
+vcl/source/opengl/win/context.cxx
+vcl/source/opengl/x11/context.cxx
+vcl/source/outdev/background.cxx
+vcl/source/outdev/bitmap.cxx
+vcl/source/outdev/bitmapex.cxx
+vcl/source/outdev/clipping.cxx
+vcl/source/outdev/curvedshapes.cxx
+vcl/source/outdev/eps.cxx
+vcl/source/outdev/fill.cxx
+vcl/source/outdev/font.cxx
+vcl/source/outdev/gradient.cxx
+vcl/source/outdev/hatch.cxx
+vcl/source/outdev/line.cxx
+vcl/source/outdev/map.cxx
+vcl/source/outdev/mask.cxx
+vcl/source/outdev/nativecontrols.cxx
+vcl/source/outdev/outdev.cxx
+vcl/source/outdev/stack.cxx
+vcl/source/outdev/pixel.cxx
+vcl/source/outdev/polygon.cxx
+vcl/source/outdev/polyline.cxx
+vcl/source/outdev/rect.cxx
+vcl/source/outdev/text.cxx
+vcl/source/outdev/textline.cxx
+vcl/source/outdev/transparent.cxx
+vcl/source/outdev/vclreferencebase.cxx
+vcl/source/outdev/wallpaper.cxx
+vcl/source/text/ImplLayoutRuns.cxx
+vcl/source/toolkit/group.cxx
+vcl/source/toolkit/morebtn.cxx
+vcl/source/treelist/headbar.cxx
+vcl/source/treelist/iconviewimpl.cxx
+vcl/source/treelist/imap.cxx
+vcl/source/treelist/imap2.cxx
+vcl/source/treelist/inetimg.cxx
+vcl/source/treelist/svimpbox.cxx
+vcl/source/treelist/svlbitm.cxx
+vcl/source/treelist/svtabbx.cxx
+vcl/source/treelist/transfer.cxx
+vcl/source/treelist/transfer2.cxx
+vcl/source/treelist/treelist.cxx
+vcl/source/treelist/treelistbox.cxx
+vcl/source/treelist/treelistentry.cxx
+vcl/source/treelist/uiobject.cxx
+vcl/source/treelist/viewdataentry.cxx
+vcl/source/uipreviewer/previewer.cxx
+vcl/source/uitest/uiobject.cxx
+vcl/source/uitest/uitest.cxx
+vcl/source/uitest/uno/uiobject_uno.cxx
+vcl/source/uitest/uno/uiobject_uno.hxx
+vcl/source/uitest/uno/uitest_uno.cxx
+vcl/source/window/EnumContext.cxx
+vcl/source/window/accel.cxx
+vcl/source/window/accessibility.cxx
+vcl/source/window/accmgr.cxx
+vcl/source/window/brdwin.cxx
+vcl/source/window/bubblewindow.cxx
+vcl/source/window/builder.cxx
+vcl/source/window/clipping.cxx
+vcl/source/window/commandevent.cxx
+vcl/source/window/cursor.cxx
+vcl/source/window/debugevent.cxx
+vcl/source/window/decoview.cxx
+vcl/source/window/dialog.cxx
+vcl/source/window/dlgctrl.cxx
+vcl/source/window/dlgctrl.hxx
+vcl/source/window/dndeventdispatcher.cxx
+vcl/source/window/dndlistenercontainer.cxx
+vcl/source/window/dockingarea.cxx
+vcl/source/window/dockmgr.cxx
+vcl/source/window/dockwin.cxx
+vcl/source/window/errinf.cxx
+vcl/source/window/event.cxx
+vcl/source/window/floatwin.cxx
+vcl/source/window/globalization.cxx
+vcl/source/window/impldockingwrapper.hxx
+vcl/source/window/keycod.cxx
+vcl/source/window/keyevent.cxx
+vcl/source/window/layout.cxx
+vcl/source/window/legacyaccessibility.cxx
+vcl/source/window/menu.cxx
+vcl/source/window/menubarwindow.cxx
+vcl/source/window/menubarwindow.hxx
+vcl/source/window/menufloatingwindow.cxx
+vcl/source/window/menufloatingwindow.hxx
+vcl/source/window/menuitemlist.cxx
+vcl/source/window/menuitemlist.hxx
+vcl/source/window/menuwindow.cxx
+vcl/source/window/menuwindow.hxx
+vcl/source/window/mnemonic.cxx
+vcl/source/window/mouse.cxx
+vcl/source/window/paint.cxx
+vcl/source/window/printdlg.cxx
+vcl/source/window/scrwnd.cxx
+vcl/source/window/seleng.cxx
+vcl/source/window/settings.cxx
+vcl/source/window/split.cxx
+vcl/source/window/splitwin.cxx
+vcl/source/window/stacking.cxx
+vcl/source/window/status.cxx
+vcl/source/window/syschild.cxx
+vcl/source/window/syswin.cxx
+vcl/source/window/tabdlg.cxx
+vcl/source/window/tabpage.cxx
+vcl/source/window/taskpanelist.cxx
+vcl/source/window/toolbox.cxx
+vcl/source/window/toolbox2.cxx
+vcl/source/window/window.cxx
+vcl/source/window/window2.cxx
+vcl/source/window/winproc.cxx
+vcl/source/window/wrkwin.cxx
+vcl/unx/generic/app/gendisp.cxx
+vcl/unx/generic/app/geninst.cxx
+vcl/unx/generic/app/gensys.cxx
+vcl/unx/generic/app/i18n_cb.cxx
+vcl/unx/generic/app/i18n_ic.cxx
+vcl/unx/generic/app/i18n_im.cxx
+vcl/unx/generic/app/i18n_keysym.cxx
+vcl/unx/generic/app/i18n_xkb.cxx
+vcl/unx/generic/app/keysymnames.cxx
+vcl/unx/generic/app/randrwrapper.cxx
+vcl/unx/generic/app/saldata.cxx
+vcl/unx/generic/app/saldisp.cxx
+vcl/unx/generic/app/salinst.cxx
+vcl/unx/generic/app/saltimer.cxx
+vcl/unx/generic/app/sm.cxx
+vcl/unx/generic/app/wmadaptor.cxx
+vcl/unx/generic/desktopdetect/desktopdetector.cxx
+vcl/unx/generic/dtrans/X11_clipboard.cxx
+vcl/unx/generic/dtrans/X11_clipboard.hxx
+vcl/unx/generic/dtrans/X11_dndcontext.cxx
+vcl/unx/generic/dtrans/X11_dndcontext.hxx
+vcl/unx/generic/dtrans/X11_droptarget.cxx
+vcl/unx/generic/dtrans/X11_selection.cxx
+vcl/unx/generic/dtrans/X11_selection.hxx
+vcl/unx/generic/dtrans/X11_service.cxx
+vcl/unx/generic/dtrans/X11_transferable.cxx
+vcl/unx/generic/dtrans/X11_transferable.hxx
+vcl/unx/generic/dtrans/bmp.cxx
+vcl/unx/generic/dtrans/bmp.hxx
+vcl/unx/generic/dtrans/config.cxx
+vcl/unx/generic/dtrans/copydata_curs.h
+vcl/unx/generic/dtrans/copydata_mask.h
+vcl/unx/generic/dtrans/linkdata_curs.h
+vcl/unx/generic/dtrans/linkdata_mask.h
+vcl/unx/generic/dtrans/movedata_curs.h
+vcl/unx/generic/dtrans/movedata_mask.h
+vcl/unx/generic/dtrans/nodrop_curs.h
+vcl/unx/generic/dtrans/nodrop_mask.h
+vcl/unx/generic/fontmanager/fontconfig.cxx
+vcl/unx/generic/fontmanager/fontmanager.cxx
+vcl/unx/generic/fontmanager/fontsubst.cxx
+vcl/unx/generic/fontmanager/helper.cxx
+vcl/unx/generic/gdi/cairo_xlib_cairo.cxx
+vcl/unx/generic/gdi/cairo_xlib_cairo.hxx
+vcl/unx/generic/gdi/cairotextrender.cxx
+vcl/unx/generic/gdi/font.cxx
+vcl/unx/generic/gdi/freetypetextrender.cxx
+vcl/unx/generic/gdi/gdiimpl.cxx
+vcl/unx/generic/gdi/gdiimpl.hxx
+vcl/unx/generic/gdi/salbmp.cxx
+vcl/unx/generic/gdi/salgdi.cxx
+vcl/unx/generic/gdi/salgdi2.cxx
+vcl/unx/generic/gdi/salvd.cxx
+vcl/unx/generic/gdi/x11cairotextrender.cxx
+vcl/unx/generic/gdi/xrender_peer.cxx
+vcl/unx/generic/glyphs/freetype_glyphcache.cxx
+vcl/unx/generic/glyphs/glyphcache.cxx
+vcl/unx/generic/print/bitmap_gfx.cxx
+vcl/unx/generic/print/common_gfx.cxx
+vcl/unx/generic/print/genprnpsp.cxx
+vcl/unx/generic/print/genpspgraphics.cxx
+vcl/unx/generic/print/glyphset.cxx
+vcl/unx/generic/print/glyphset.hxx
+vcl/unx/generic/print/printerjob.cxx
+vcl/unx/generic/print/prtsetup.cxx
+vcl/unx/generic/print/psputil.cxx
+vcl/unx/generic/print/psputil.hxx
+vcl/unx/generic/print/text_gfx.cxx
+vcl/unx/generic/printer/cpdmgr.cxx
+vcl/unx/generic/printer/cupsmgr.cxx
+vcl/unx/generic/printer/jobdata.cxx
+vcl/unx/generic/printer/ppdparser.cxx
+vcl/unx/generic/printer/printerinfomanager.cxx
+vcl/unx/generic/window/salframe.cxx
+vcl/unx/generic/window/salobj.cxx
+vcl/unx/generic/window/screensaverinhibitor.cxx
+vcl/unx/gtk3/a11y/atklistener.hxx
+vcl/unx/gtk3/a11y/atkwrapper.hxx
+vcl/unx/gtk3/a11y/atkaction.cxx
+vcl/unx/gtk3/a11y/atkcomponent.cxx
+vcl/unx/gtk3/a11y/atkeditabletext.cxx
+vcl/unx/gtk3/a11y/atkfactory.cxx
+vcl/unx/gtk3/a11y/atkhypertext.cxx
+vcl/unx/gtk3/a11y/atkimage.cxx
+vcl/unx/gtk3/a11y/atklistener.cxx
+vcl/unx/gtk3/a11y/atkregistry.cxx
+vcl/unx/gtk3/a11y/atkselection.cxx
+vcl/unx/gtk3/a11y/atktable.cxx
+vcl/unx/gtk3/a11y/atktext.cxx
+vcl/unx/gtk3/a11y/atktextattributes.cxx
+vcl/unx/gtk3/a11y/atkutil.cxx
+vcl/unx/gtk3/a11y/atkvalue.cxx
+vcl/unx/gtk3/a11y/atkwrapper.cxx
+vcl/unx/gtk3/gtkcairo.cxx
+vcl/unx/gtk3/gtkcairo.hxx
+vcl/unx/gtk3/fpicker/SalGtkFilePicker.cxx
+vcl/unx/gtk3/fpicker/SalGtkFilePicker.hxx
+vcl/unx/gtk3/fpicker/SalGtkFolderPicker.cxx
+vcl/unx/gtk3/fpicker/SalGtkFolderPicker.hxx
+vcl/unx/gtk3/fpicker/SalGtkPicker.cxx
+vcl/unx/gtk3/fpicker/SalGtkPicker.hxx
+vcl/unx/gtk3/fpicker/resourceprovider.cxx
+vcl/unx/gtk3/gloactiongroup.cxx
+vcl/unx/gtk3/glomenu.cxx
+vcl/unx/gtk3/gtkdata.cxx
+vcl/unx/gtk3/gtkframe.cxx
+vcl/unx/gtk3/gtkinst.cxx
+vcl/unx/gtk3/gtkobject.cxx
+vcl/unx/gtk3/gtkprintwrapper.cxx
+vcl/unx/gtk3/gtksalmenu.cxx
+vcl/unx/gtk3/gtksys.cxx
+vcl/unx/gtk3/hudawareness.cxx
+vcl/unx/gtk3/salnativewidgets-gtk.cxx
+vcl/unx/x11/x11sys.cxx
+vcl/unx/x11/xlimits.cxx
+vcl/win/app/saldata.cxx
+vcl/win/app/salinfo.cxx
+vcl/win/app/salinst.cxx
+vcl/win/app/salshl.cxx
+vcl/win/app/saltimer.cxx
+vcl/win/dtrans/APNDataObject.cxx
+vcl/win/dtrans/APNDataObject.hxx
+vcl/win/dtrans/clipboardmanager.cxx
+vcl/win/dtrans/clipboardmanager.hxx
+vcl/win/dtrans/DataFmtTransl.cxx
+vcl/win/dtrans/DataFmtTransl.hxx
+vcl/win/dtrans/DOTransferable.cxx
+vcl/win/dtrans/DOTransferable.hxx
+vcl/win/dtrans/DtObjFactory.hxx
+vcl/win/dtrans/DTransHelper.cxx
+vcl/win/dtrans/DTransHelper.hxx
+vcl/win/dtrans/Fetc.cxx
+vcl/win/dtrans/Fetc.hxx
+vcl/win/dtrans/FetcList.cxx
+vcl/win/dtrans/FetcList.hxx
+vcl/win/dtrans/FmtFilter.cxx
+vcl/win/dtrans/ftransl.cxx
+vcl/win/dtrans/ftransl.hxx
+vcl/win/dtrans/generic_clipboard.cxx
+vcl/win/dtrans/generic_clipboard.hxx
+vcl/win/dtrans/globals.cxx
+vcl/win/dtrans/idroptarget.cxx
+vcl/win/dtrans/idroptarget.hxx
+vcl/win/dtrans/ImplHelper.cxx
+vcl/win/dtrans/MtaOleClipb.cxx
+vcl/win/dtrans/MtaOleClipb.hxx
+vcl/win/dtrans/sourcecontext.cxx
+vcl/win/dtrans/source.cxx
+vcl/win/dtrans/target.cxx
+vcl/win/dtrans/TxtCnvtHlp.cxx
+vcl/win/dtrans/TxtCnvtHlp.hxx
+vcl/win/dtrans/XNotifyingDataObject.cxx
+vcl/win/dtrans/XNotifyingDataObject.hxx
+vcl/win/dtrans/XTDataObject.cxx
+vcl/win/dtrans/XTDataObject.hxx
+vcl/win/gdi/DWriteTextRenderer.cxx
+vcl/win/gdi/gdiimpl.cxx
+vcl/win/gdi/gdiimpl.hxx
+vcl/win/gdi/salbmp.cxx
+vcl/win/gdi/salfont.cxx
+vcl/win/gdi/salgdi.cxx
+vcl/win/gdi/salgdi2.cxx
+vcl/win/gdi/salgdi_gdiplus.cxx
+vcl/win/gdi/salnativewidgets-luna.cxx
+vcl/win/gdi/salprn.cxx
+vcl/win/gdi/salvd.cxx
+vcl/win/window/keynames.cxx
+vcl/win/window/salframe.cxx
+vcl/win/window/salmenu.cxx
+vcl/win/window/salobj.cxx
+vcl/workben/602fuzzer.cxx
+vcl/workben/bmpfuzzer.cxx
+vcl/workben/cgmfuzzer.cxx
+vcl/workben/cnttype/testcnttype.cxx
+vcl/workben/commonfuzzer.hxx
+vcl/workben/docxfuzzer.cxx
+vcl/workben/dtrans/test_dtrans.cxx
+vcl/workben/dxffuzzer.cxx
+vcl/workben/epsfuzzer.cxx
+vcl/workben/fftester.cxx
+vcl/workben/fodpfuzzer.cxx
+vcl/workben/fodsfuzzer.cxx
+vcl/workben/fodtfuzzer.cxx
+vcl/workben/giffuzzer.cxx
+vcl/workben/hwpfuzzer.cxx
+vcl/workben/icontest.cxx
+vcl/workben/jpgfuzzer.cxx
+vcl/workben/localestub/localedata_en_AU.cxx
+vcl/workben/localestub/localedata_en_BW.cxx
+vcl/workben/localestub/localedata_en_BZ.cxx
+vcl/workben/localestub/localedata_en_CA.cxx
+vcl/workben/localestub/localedata_en_GB.cxx
+vcl/workben/localestub/localedata_en_GH.cxx
+vcl/workben/localestub/localedata_en_GM.cxx
+vcl/workben/localestub/localedata_en_IE.cxx
+vcl/workben/localestub/localedata_en_IN.cxx
+vcl/workben/localestub/localedata_en_JM.cxx
+vcl/workben/localestub/localedata_en_MW.cxx
+vcl/workben/localestub/localedata_en_MY.cxx
+vcl/workben/localestub/localedata_en_NA.cxx
+vcl/workben/localestub/localedata_en_NZ.cxx
+vcl/workben/localestub/localedata_en_PH.cxx
+vcl/workben/localestub/localedata_en_TT.cxx
+vcl/workben/localestub/localedata_en_US.cxx
+vcl/workben/localestub/localedata_en_ZA.cxx
+vcl/workben/localestub/localedata_en_ZW.cxx
+vcl/workben/lwpfuzzer.cxx
+vcl/workben/metfuzzer.cxx
+vcl/workben/mtfdemo.cxx
+vcl/workben/olefuzzer.cxx
+vcl/workben/pcdfuzzer.cxx
+vcl/workben/pctfuzzer.cxx
+vcl/workben/pcxfuzzer.cxx
+vcl/workben/pngfuzzer.cxx
+vcl/workben/ppmfuzzer.cxx
+vcl/workben/pptfuzzer.cxx
+vcl/workben/psdfuzzer.cxx
+vcl/workben/qpwfuzzer.cxx
+vcl/workben/rasfuzzer.cxx
+vcl/workben/rtffuzzer.cxx
+vcl/workben/slkfuzzer.cxx
+vcl/workben/svdem.cxx
+vcl/workben/svmfuzzer.cxx
+vcl/workben/svpclient.cxx
+vcl/workben/svptest.cxx
+vcl/workben/tgafuzzer.cxx
+vcl/workben/tiffuzzer.cxx
+vcl/workben/vcldemo.cxx
+vcl/workben/win/dnd/atlwindow.cxx
+vcl/workben/win/dnd/atlwindow.hxx
+vcl/workben/win/dnd/dndTest.cxx
+vcl/workben/win/dnd/sourcelistener.cxx
+vcl/workben/win/dnd/sourcelistener.hxx
+vcl/workben/win/dnd/targetlistener.cxx
+vcl/workben/win/dnd/targetlistener.hxx
+vcl/workben/win/dnd/transferable.cxx
+vcl/workben/win/dnd/transferable.hxx
+vcl/workben/win/dtrans/testmarshal.cxx
+vcl/workben/win/dtrans/test_wincb.cxx
+vcl/workben/win/dtrans/XTDo.cxx
+vcl/workben/win/dtrans/XTDo.hxx
+vcl/workben/wmffuzzer.cxx
+vcl/workben/ww2fuzzer.cxx
+vcl/workben/ww6fuzzer.cxx
+vcl/workben/ww8fuzzer.cxx
+vcl/workben/xbmfuzzer.cxx
+vcl/workben/xpmfuzzer.cxx
+winaccessibility/inc/AccContainerEventListener.hxx
+winaccessibility/inc/AccDescendantManagerEventListener.hxx
+winaccessibility/inc/AccObject.hxx
+winaccessibility/inc/AccObjectContainerEventListener.hxx
+winaccessibility/inc/AccObjectManagerAgent.hxx
+winaccessibility/inc/AccObjectWinManager.hxx
+winaccessibility/source/UAccCOM/AccAction.cxx
+winaccessibility/source/UAccCOM/AccAction.h
+winaccessibility/source/UAccCOM/AccActionBase.cxx
+winaccessibility/source/UAccCOM/AccComponent.h
+winaccessibility/source/UAccCOM/AccEditableText.cxx
+winaccessibility/source/UAccCOM/AccEditableText.h
+winaccessibility/source/UAccCOM/AccHyperLink.cxx
+winaccessibility/source/UAccCOM/AccHyperLink.h
+winaccessibility/source/UAccCOM/AccHypertext.cxx
+winaccessibility/source/UAccCOM/AccHypertext.h
+winaccessibility/source/UAccCOM/AccImage.h
+winaccessibility/source/UAccCOM/AccRelation.cxx
+winaccessibility/source/UAccCOM/AccRelation.h
+winaccessibility/source/UAccCOM/AccTable.cxx
+winaccessibility/source/UAccCOM/AccTable.h
+winaccessibility/source/UAccCOM/AccText.cxx
+winaccessibility/source/UAccCOM/AccText.h
+winaccessibility/source/UAccCOM/AccTextBase.cxx
+winaccessibility/source/UAccCOM/AccValue.h
+winaccessibility/source/UAccCOM/EnumVariant.cxx
+winaccessibility/source/UAccCOM/EnumVariant.h
+winaccessibility/source/UAccCOM/MAccessible.cxx
+winaccessibility/source/UAccCOM/MAccessible.h
+winaccessibility/source/UAccCOM/Resource.h
+winaccessibility/source/UAccCOM/acccommon.h
+winaccessibility/source/UAccCOM/stdafx.h
+winaccessibility/source/service/AccComponentEventListener.cxx
+winaccessibility/source/service/AccContainerEventListener.cxx
+winaccessibility/source/service/AccDescendantManagerEventListener.cxx
+winaccessibility/source/service/AccDialogEventListener.cxx
+winaccessibility/source/service/AccFrameEventListener.cxx
+winaccessibility/source/service/AccListEventListener.cxx
+winaccessibility/source/service/AccMenuEventListener.cxx
+winaccessibility/source/service/AccObject.cxx
+winaccessibility/source/service/AccObjectManagerAgent.cxx
+winaccessibility/source/service/AccObjectWinManager.cxx
+winaccessibility/source/service/AccParagraphEventListener.cxx
+winaccessibility/source/service/AccTableEventListener.cxx
+winaccessibility/source/service/AccTextComponentEventListener.cxx
+winaccessibility/source/service/AccTopWindowListener.cxx
+winaccessibility/source/service/AccTreeEventListener.cxx
+winaccessibility/source/service/AccWindowEventListener.cxx
+winaccessibility/source/service/msaaservice_impl.cxx
+writerfilter/inc/ooxml/OOXMLDocument.hxx
+writerfilter/source/dmapper/BorderHandler.cxx
+writerfilter/source/dmapper/BorderHandler.hxx
+writerfilter/source/dmapper/CellColorHandler.cxx
+writerfilter/source/dmapper/CellColorHandler.hxx
+writerfilter/source/dmapper/CellMarginHandler.cxx
+writerfilter/source/dmapper/CellMarginHandler.hxx
+writerfilter/source/dmapper/ConversionHelper.cxx
+writerfilter/source/dmapper/ConversionHelper.hxx
+writerfilter/source/dmapper/DomainMapper.cxx
+writerfilter/source/dmapper/DomainMapper.hxx
+writerfilter/source/dmapper/DomainMapperTableHandler.cxx
+writerfilter/source/dmapper/DomainMapperTableHandler.hxx
+writerfilter/source/dmapper/DomainMapperTableManager.cxx
+writerfilter/source/dmapper/DomainMapperTableManager.hxx
+writerfilter/source/dmapper/DomainMapper_Impl.cxx
+writerfilter/source/dmapper/DomainMapper_Impl.hxx
+writerfilter/source/dmapper/FFDataHandler.cxx
+writerfilter/source/dmapper/FieldTypes.hxx
+writerfilter/source/dmapper/FontTable.cxx
+writerfilter/source/dmapper/FontTable.hxx
+writerfilter/source/dmapper/FormControlHelper.cxx
+writerfilter/source/dmapper/GraphicHelpers.cxx
+writerfilter/source/dmapper/GraphicImport.cxx
+writerfilter/source/dmapper/GraphicImport.hxx
+writerfilter/source/dmapper/MeasureHandler.cxx
+writerfilter/source/dmapper/ModelEventListener.cxx
+writerfilter/source/dmapper/NumberingManager.cxx
+writerfilter/source/dmapper/NumberingManager.hxx
+writerfilter/source/dmapper/OLEHandler.cxx
+writerfilter/source/dmapper/OLEHandler.hxx
+writerfilter/source/dmapper/PageBordersHandler.cxx
+writerfilter/source/dmapper/PropertyIds.cxx
+writerfilter/source/dmapper/PropertyIds.hxx
+writerfilter/source/dmapper/PropertyMap.cxx
+writerfilter/source/dmapper/PropertyMap.hxx
+writerfilter/source/dmapper/SectionColumnHandler.hxx
+writerfilter/source/dmapper/SettingsTable.cxx
+writerfilter/source/dmapper/StyleSheetTable.cxx
+writerfilter/source/dmapper/StyleSheetTable.hxx
+writerfilter/source/dmapper/TDefTableHandler.cxx
+writerfilter/source/dmapper/TDefTableHandler.hxx
+writerfilter/source/dmapper/TableData.hxx
+writerfilter/source/dmapper/TableManager.hxx
+writerfilter/source/dmapper/TablePropertiesHandler.cxx
+writerfilter/source/dmapper/TablePropertiesHandler.hxx
+writerfilter/source/dmapper/TagLogger.cxx
+writerfilter/source/dmapper/TagLogger.hxx
+writerfilter/source/dmapper/TblStylePrHandler.cxx
+writerfilter/source/dmapper/TblStylePrHandler.hxx
+writerfilter/source/dmapper/TextEffectsHandler.cxx
+writerfilter/source/dmapper/ThemeTable.cxx
+writerfilter/source/dmapper/TrackChangesHandler.cxx
+writerfilter/source/dmapper/WrapPolygonHandler.cxx
+writerfilter/source/ooxml/Handler.cxx
+writerfilter/source/ooxml/OOXMLBinaryObjectReference.cxx
+writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
+writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
+writerfilter/source/ooxml/OOXMLFactory.cxx
+writerfilter/source/ooxml/OOXMLFactory.hxx
+writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
+writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx
+writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx
+writerfilter/source/ooxml/OOXMLFastHelper.hxx
+writerfilter/source/ooxml/OOXMLParserState.cxx
+writerfilter/source/ooxml/OOXMLPropertySet.cxx
+writerfilter/source/ooxml/OOXMLStreamImpl.cxx
+writerfilter/source/ooxml/OOXMLStreamImpl.hxx
+xmlhelp/source/cxxhelp/inc/tvfactory.hxx
+xmlhelp/source/cxxhelp/inc/tvread.hxx
+xmlhelp/source/cxxhelp/provider/content.cxx
+xmlhelp/source/cxxhelp/provider/content.hxx
+xmlhelp/source/cxxhelp/provider/contentcaps.cxx
+xmlhelp/source/cxxhelp/provider/databases.cxx
+xmlhelp/source/cxxhelp/provider/databases.hxx
+xmlhelp/source/cxxhelp/provider/db.cxx
+xmlhelp/source/cxxhelp/provider/db.hxx
+xmlhelp/source/cxxhelp/provider/inputstream.cxx
+xmlhelp/source/cxxhelp/provider/inputstream.hxx
+xmlhelp/source/cxxhelp/provider/provider.cxx
+xmlhelp/source/cxxhelp/provider/provider.hxx
+xmlhelp/source/cxxhelp/provider/resultset.cxx
+xmlhelp/source/cxxhelp/provider/resultset.hxx
+xmlhelp/source/cxxhelp/provider/resultsetbase.cxx
+xmlhelp/source/cxxhelp/provider/resultsetbase.hxx
+xmlhelp/source/cxxhelp/provider/resultsetfactory.hxx
+xmlhelp/source/cxxhelp/provider/resultsetforquery.cxx
+xmlhelp/source/cxxhelp/provider/resultsetforquery.hxx
+xmlhelp/source/cxxhelp/provider/resultsetforroot.cxx
+xmlhelp/source/cxxhelp/provider/resultsetforroot.hxx
+xmlhelp/source/cxxhelp/provider/urlparameter.cxx
+xmlhelp/source/cxxhelp/provider/urlparameter.hxx
+xmlhelp/source/cxxhelp/test/searchdemo.cxx
+xmlhelp/source/treeview/tvfactory.cxx
+xmlhelp/source/treeview/tvread.cxx
+xmloff/inc/AttributeContainerHandler.hxx
+xmloff/inc/DomBuilderContext.hxx
+xmloff/inc/DomExport.hxx
+xmloff/inc/EnhancedCustomShapeToken.hxx
+xmloff/inc/MetaExportComponent.hxx
+xmloff/inc/PageMasterImportContext.hxx
+xmloff/inc/PageMasterStyleMap.hxx
+xmloff/inc/RDFaExportHelper.hxx
+xmloff/inc/RDFaImportHelper.hxx
+xmloff/inc/SchXMLAutoStylePoolP.hxx
+xmloff/inc/SchXMLExport.hxx
+xmloff/inc/StyleMap.hxx
+xmloff/inc/TransGradientStyle.hxx
+xmloff/inc/WordWrapPropertyHdl.hxx
+xmloff/inc/XMLBackgroundImageContext.hxx
+xmloff/inc/XMLBackgroundImageExport.hxx
+xmloff/inc/XMLBase64Export.hxx
+xmloff/inc/XMLBasicExportFilter.hxx
+xmloff/inc/XMLBitmapLogicalSizePropertyHandler.hxx
+xmloff/inc/XMLBitmapRepeatOffsetPropertyHandler.hxx
+xmloff/inc/XMLChartPropertySetMapper.hxx
+xmloff/inc/XMLChartStyleContext.hxx
+xmloff/inc/XMLClipPropertyHandler.hxx
+xmloff/inc/XMLElementPropertyContext.hxx
+xmloff/inc/XMLEmbeddedObjectExportFilter.hxx
+xmloff/inc/XMLEmbeddedObjectImportContext.hxx
+xmloff/inc/XMLEventImportHelper.hxx
+xmloff/inc/XMLFillBitmapSizePropertyHandler.hxx
+xmloff/inc/XMLFootnoteConfigurationImportContext.hxx
+xmloff/inc/XMLImageMapContext.hxx
+xmloff/inc/XMLImageMapExport.hxx
+xmloff/inc/XMLIndexBibliographyConfigurationContext.hxx
+xmloff/inc/XMLIsPercentagePropertyHandler.hxx
+xmloff/inc/XMLLineNumberingImportContext.hxx
+xmloff/inc/XMLNumberStylesImport.hxx
+xmloff/inc/XMLPercentOrMeasurePropertyHandler.hxx
+xmloff/inc/XMLRectangleMembersHandler.hxx
+xmloff/inc/XMLReplacementImageContext.hxx
+xmloff/inc/XMLScriptContextFactory.hxx
+xmloff/inc/XMLScriptExportHandler.hxx
+xmloff/inc/XMLShapePropertySetContext.hxx
+xmloff/inc/XMLStarBasicContextFactory.hxx
+xmloff/inc/XMLStarBasicExportHandler.hxx
+xmloff/inc/XMLStringBufferImportContext.hxx
+xmloff/inc/XMLTextColumnsContext.hxx
+xmloff/inc/XMLTextColumnsPropertyHandler.hxx
+xmloff/inc/XMLTextHeaderFooterContext.hxx
+xmloff/inc/animationimport.hxx
+xmloff/inc/fasttokenhandler.hxx
+xmloff/inc/forms/property_handler.hxx
+xmloff/inc/forms/property_ids.hxx
+xmloff/inc/propimp0.hxx
+xmloff/inc/txtflde.hxx
+xmloff/inc/txtfldi.hxx
+xmloff/inc/txtlists.hxx
+xmloff/inc/txtvfldi.hxx
+xmloff/inc/xexptran.hxx
+xmloff/inc/xmlmultiimagehelper.hxx
+xmloff/inc/xmlsdtypes.hxx
+xmloff/inc/xmltabe.hxx
+xmloff/inc/xmlversion.hxx
+xmloff/qa/unit/tokenmap-test.cxx
+xmloff/qa/unit/uxmloff.cxx
+xmloff/source/chart/ColorPropertySet.cxx
+xmloff/source/chart/ColorPropertySet.hxx
+xmloff/source/chart/MultiPropertySetHandler.hxx
+xmloff/source/chart/PropertyMap.hxx
+xmloff/source/chart/PropertyMaps.cxx
+xmloff/source/chart/SchXMLAutoStylePoolP.cxx
+xmloff/source/chart/SchXMLAxisContext.cxx
+xmloff/source/chart/SchXMLAxisContext.hxx
+xmloff/source/chart/SchXMLCalculationSettingsContext.cxx
+xmloff/source/chart/SchXMLCalculationSettingsContext.hxx
+xmloff/source/chart/SchXMLChartContext.cxx
+xmloff/source/chart/SchXMLChartContext.hxx
+xmloff/source/chart/SchXMLEnumConverter.cxx
+xmloff/source/chart/SchXMLExport.cxx
+xmloff/source/chart/SchXMLImport.cxx
+xmloff/source/chart/SchXMLLegendContext.cxx
+xmloff/source/chart/SchXMLLegendContext.hxx
+xmloff/source/chart/SchXMLParagraphContext.cxx
+xmloff/source/chart/SchXMLParagraphContext.hxx
+xmloff/source/chart/SchXMLPlotAreaContext.cxx
+xmloff/source/chart/SchXMLPlotAreaContext.hxx
+xmloff/source/chart/SchXMLPropertyMappingContext.cxx
+xmloff/source/chart/SchXMLPropertyMappingContext.hxx
+xmloff/source/chart/SchXMLRegressionCurveObjectContext.cxx
+xmloff/source/chart/SchXMLRegressionCurveObjectContext.hxx
+xmloff/source/chart/SchXMLSeries2Context.cxx
+xmloff/source/chart/SchXMLSeries2Context.hxx
+xmloff/source/chart/SchXMLSeriesHelper.cxx
+xmloff/source/chart/SchXMLTableContext.cxx
+xmloff/source/chart/SchXMLTableContext.hxx
+xmloff/source/chart/SchXMLTextListContext.cxx
+xmloff/source/chart/SchXMLTextListContext.hxx
+xmloff/source/chart/SchXMLTools.cxx
+xmloff/source/chart/SchXMLTools.hxx
+xmloff/source/chart/XMLAxisPositionPropertyHdl.cxx
+xmloff/source/chart/XMLAxisPositionPropertyHdl.hxx
+xmloff/source/chart/XMLChartPropertyContext.cxx
+xmloff/source/chart/XMLChartPropertyContext.hxx
+xmloff/source/chart/XMLChartStyleContext.cxx
+xmloff/source/chart/XMLErrorBarStylePropertyHdl.cxx
+xmloff/source/chart/XMLErrorIndicatorPropertyHdl.cxx
+xmloff/source/chart/XMLErrorIndicatorPropertyHdl.hxx
+xmloff/source/chart/XMLLabelSeparatorContext.cxx
+xmloff/source/chart/XMLSymbolImageContext.cxx
+xmloff/source/chart/XMLSymbolImageContext.hxx
+xmloff/source/chart/XMLSymbolTypePropertyHdl.cxx
+xmloff/source/chart/XMLSymbolTypePropertyHdl.hxx
+xmloff/source/chart/XMLTextOrientationHdl.cxx
+xmloff/source/chart/XMLTextOrientationHdl.hxx
+xmloff/source/chart/contexts.cxx
+xmloff/source/chart/contexts.hxx
+xmloff/source/chart/transporttypes.cxx
+xmloff/source/chart/transporttypes.hxx
+xmloff/source/core/DocumentSettingsContext.cxx
+xmloff/source/core/DomBuilderContext.cxx
+xmloff/source/core/DomExport.cxx
+xmloff/source/core/ProgressBarHelper.cxx
+xmloff/source/core/PropertySetMerger.cxx
+xmloff/source/core/RDFaExportHelper.cxx
+xmloff/source/core/RDFaImportHelper.cxx
+xmloff/source/core/SettingsExportHelper.cxx
+xmloff/source/core/SvXMLAttr.cxx
+xmloff/source/core/SvXMLAttr.hxx
+xmloff/source/core/SvXMLAttrCollection.cxx
+xmloff/source/core/SvXMLAttrCollection.hxx
+xmloff/source/core/XMLBase64Export.cxx
+xmloff/source/core/XMLBase64ImportContext.cxx
+xmloff/source/core/XMLBasicExportFilter.cxx
+xmloff/source/core/XMLEmbeddedObjectExportFilter.cxx
+xmloff/source/core/XMLEmbeddedObjectImportContext.cxx
+xmloff/source/core/attrlist.cxx
+xmloff/source/core/fasttokenhandler.cxx
+xmloff/source/core/i18nmap.cxx
+xmloff/source/core/namespacemap.cxx
+xmloff/source/core/unoatrcn.cxx
+xmloff/source/core/unointerfacetouniqueidentifiermapper.cxx
+xmloff/source/core/xmlcnimp.cxx
+xmloff/source/core/xmlerror.cxx
+xmloff/source/core/xmlexp.cxx
+xmloff/source/core/xmlictxt.cxx
+xmloff/source/core/xmlimp.cxx
+xmloff/source/core/xmlmultiimagehelper.cxx
+xmloff/source/core/xmltkmap.cxx
+xmloff/source/core/xmltoken.cxx
+xmloff/source/core/xmluconv.cxx
+xmloff/source/draw/EnhancedCustomShapeToken.cxx
+xmloff/source/draw/XMLGraphicsDefaultStyle.cxx
+xmloff/source/draw/XMLImageMapContext.cxx
+xmloff/source/draw/XMLImageMapExport.cxx
+xmloff/source/draw/XMLNumberStyles.cxx
+xmloff/source/draw/XMLReplacementImageContext.cxx
+xmloff/source/draw/XMLShapePropertySetContext.cxx
+xmloff/source/draw/XMLShapeStyleContext.cxx
+xmloff/source/draw/animationexport.cxx
+xmloff/source/draw/animationimport.cxx
+xmloff/source/draw/animexp.cxx
+xmloff/source/draw/animimp.cxx
+xmloff/source/draw/descriptionimp.cxx
+xmloff/source/draw/descriptionimp.hxx
+xmloff/source/draw/eventimp.cxx
+xmloff/source/draw/eventimp.hxx
+xmloff/source/draw/layerexp.cxx
+xmloff/source/draw/layerimp.cxx
+xmloff/source/draw/layerimp.hxx
+xmloff/source/draw/numithdl.cxx
+xmloff/source/draw/numithdl.hxx
+xmloff/source/draw/propimp0.cxx
+xmloff/source/draw/sdpropls.cxx
+xmloff/source/draw/sdpropls.hxx
+xmloff/source/draw/sdxmlexp.cxx
+xmloff/source/draw/sdxmlexp_impl.hxx
+xmloff/source/draw/sdxmlimp.cxx
+xmloff/source/draw/sdxmlimp_impl.hxx
+xmloff/source/draw/shapeexport.cxx
+xmloff/source/draw/shapeimport.cxx
+xmloff/source/draw/xexptran.cxx
+xmloff/source/draw/ximp3dobject.cxx
+xmloff/source/draw/ximp3dobject.hxx
+xmloff/source/draw/ximp3dscene.cxx
+xmloff/source/draw/ximp3dscene.hxx
+xmloff/source/draw/ximpbody.cxx
+xmloff/source/draw/ximpbody.hxx
+xmloff/source/draw/ximpcustomshape.cxx
+xmloff/source/draw/ximpcustomshape.hxx
+xmloff/source/draw/ximpgrp.cxx
+xmloff/source/draw/ximpgrp.hxx
+xmloff/source/draw/ximplink.cxx
+xmloff/source/draw/ximplink.hxx
+xmloff/source/draw/ximpnote.hxx
+xmloff/source/draw/ximppage.cxx
+xmloff/source/draw/ximppage.hxx
+xmloff/source/draw/ximpshap.cxx
+xmloff/source/draw/ximpshap.hxx
+xmloff/source/draw/ximpshow.cxx
+xmloff/source/draw/ximpshow.hxx
+xmloff/source/draw/ximpstyl.cxx
+xmloff/source/draw/ximpstyl.hxx
+xmloff/source/forms/attriblistmerge.cxx
+xmloff/source/forms/attriblistmerge.hxx
+xmloff/source/forms/callbacks.hxx
+xmloff/source/forms/controlelement.cxx
+xmloff/source/forms/controlelement.hxx
+xmloff/source/forms/controlpropertyhdl.cxx
+xmloff/source/forms/controlpropertymap.cxx
+xmloff/source/forms/controlpropertymap.hxx
+xmloff/source/forms/elementexport.cxx
+xmloff/source/forms/elementexport.hxx
+xmloff/source/forms/elementimport.cxx
+xmloff/source/forms/elementimport.hxx
+xmloff/source/forms/eventexport.cxx
+xmloff/source/forms/eventexport.hxx
+xmloff/source/forms/eventimport.cxx
+xmloff/source/forms/eventimport.hxx
+xmloff/source/forms/formattributes.cxx
+xmloff/source/forms/formattributes.hxx
+xmloff/source/forms/formcellbinding.cxx
+xmloff/source/forms/formcellbinding.hxx
+xmloff/source/forms/formenums.cxx
+xmloff/source/forms/formevents.cxx
+xmloff/source/forms/formlayerexport.cxx
+xmloff/source/forms/formlayerimport.cxx
+xmloff/source/forms/gridcolumnproptranslator.cxx
+xmloff/source/forms/gridcolumnproptranslator.hxx
+xmloff/source/forms/handler/form_handler_factory.cxx
+xmloff/source/forms/handler/vcl_date_handler.cxx
+xmloff/source/forms/handler/vcl_date_handler.hxx
+xmloff/source/forms/handler/vcl_time_handler.cxx
+xmloff/source/forms/handler/vcl_time_handler.hxx
+xmloff/source/forms/layerexport.cxx
+xmloff/source/forms/layerexport.hxx
+xmloff/source/forms/layerimport.cxx
+xmloff/source/forms/layerimport.hxx
+xmloff/source/forms/logging.cxx
+xmloff/source/forms/logging.hxx
+xmloff/source/forms/officeforms.cxx
+xmloff/source/forms/officeforms.hxx
+xmloff/source/forms/property_description.hxx
+xmloff/source/forms/property_meta_data.cxx
+xmloff/source/forms/property_meta_data.hxx
+xmloff/source/forms/propertyexport.cxx
+xmloff/source/forms/propertyexport.hxx
+xmloff/source/forms/propertyimport.cxx
+xmloff/source/forms/propertyimport.hxx
+xmloff/source/forms/strings.hxx
+xmloff/source/forms/valueproperties.cxx
+xmloff/source/forms/valueproperties.hxx
+xmloff/source/meta/MetaExportComponent.cxx
+xmloff/source/meta/MetaImportComponent.cxx
+xmloff/source/meta/xmlmetae.cxx
+xmloff/source/meta/xmlmetai.cxx
+xmloff/source/meta/xmlversion.cxx
+xmloff/source/script/XMLEventExport.cxx
+xmloff/source/script/XMLEventImportHelper.cxx
+xmloff/source/script/XMLEventsImportContext.cxx
+xmloff/source/script/XMLScriptExportHandler.cxx
+xmloff/source/script/XMLStarBasicContextFactory.cxx
+xmloff/source/script/XMLStarBasicExportHandler.cxx
+xmloff/source/script/xmlscripti.cxx
+xmloff/source/style/AttributeContainerHandler.cxx
+xmloff/source/style/DashStyle.cxx
+xmloff/source/style/DrawAspectHdl.cxx
+xmloff/source/style/DrawAspectHdl.hxx
+xmloff/source/style/EnumPropertyHdl.cxx
+xmloff/source/style/FillStyleContext.cxx
+xmloff/source/style/FillStyleContext.hxx
+xmloff/source/style/GradientStyle.cxx
+xmloff/source/style/HatchStyle.cxx
+xmloff/source/style/ImageStyle.cxx
+xmloff/source/style/MarkerStyle.cxx
+xmloff/source/style/MultiPropertySetHelper.cxx
+xmloff/source/style/NamedBoolPropertyHdl.cxx
+xmloff/source/style/PageHeaderFooterContext.cxx
+xmloff/source/style/PageHeaderFooterContext.hxx
+xmloff/source/style/PageMasterExportPropMapper.cxx
+xmloff/source/style/PageMasterExportPropMapper.hxx
+xmloff/source/style/PageMasterImportContext.cxx
+xmloff/source/style/PageMasterImportPropMapper.cxx
+xmloff/source/style/PageMasterImportPropMapper.hxx
+xmloff/source/style/PageMasterPropHdl.cxx
+xmloff/source/style/PageMasterPropHdl.hxx
+xmloff/source/style/PageMasterPropHdlFactory.cxx
+xmloff/source/style/PageMasterPropMapper.cxx
+xmloff/source/style/PageMasterStyleMap.cxx
+xmloff/source/style/PagePropertySetContext.cxx
+xmloff/source/style/PagePropertySetContext.hxx
+xmloff/source/style/SinglePropertySetInfoCache.cxx
+xmloff/source/style/TransGradientStyle.cxx
+xmloff/source/style/WordWrapPropertyHdl.cxx
+xmloff/source/style/XMLBackgroundImageContext.cxx
+xmloff/source/style/XMLBackgroundImageExport.cxx
+xmloff/source/style/XMLBitmapLogicalSizePropertyHandler.cxx
+xmloff/source/style/XMLBitmapRepeatOffsetPropertyHandler.cxx
+xmloff/source/style/XMLClipPropertyHandler.cxx
+xmloff/source/style/XMLConstantsPropertyHandler.cxx
+xmloff/source/style/XMLElementPropertyContext.cxx
+xmloff/source/style/XMLFillBitmapSizePropertyHandler.cxx
+xmloff/source/style/XMLFontAutoStylePool.cxx
+xmloff/source/style/XMLFontStylesContext.cxx
+xmloff/source/style/XMLFontStylesContext_impl.hxx
+xmloff/source/style/XMLFootnoteSeparatorExport.cxx
+xmloff/source/style/XMLFootnoteSeparatorExport.hxx
+xmloff/source/style/XMLFootnoteSeparatorImport.cxx
+xmloff/source/style/XMLFootnoteSeparatorImport.hxx
+xmloff/source/style/XMLIsPercentagePropertyHandler.cxx
+xmloff/source/style/XMLPageExport.cxx
+xmloff/source/style/XMLPercentOrMeasurePropertyHandler.cxx
+xmloff/source/style/XMLRectangleMembersHandler.cxx
+xmloff/source/style/adjushdl.cxx
+xmloff/source/style/adjushdl.hxx
+xmloff/source/style/backhdl.cxx
+xmloff/source/style/backhdl.hxx
+xmloff/source/style/bordrhdl.cxx
+xmloff/source/style/bordrhdl.hxx
+xmloff/source/style/breakhdl.cxx
+xmloff/source/style/breakhdl.hxx
+xmloff/source/style/cdouthdl.cxx
+xmloff/source/style/cdouthdl.hxx
+xmloff/source/style/chrhghdl.cxx
+xmloff/source/style/chrhghdl.hxx
+xmloff/source/style/chrlohdl.cxx
+xmloff/source/style/chrlohdl.hxx
+xmloff/source/style/csmaphdl.cxx
+xmloff/source/style/csmaphdl.hxx
+xmloff/source/style/durationhdl.cxx
+xmloff/source/style/durationhdl.hxx
+xmloff/source/style/escphdl.cxx
+xmloff/source/style/escphdl.hxx
+xmloff/source/style/fonthdl.cxx
+xmloff/source/style/fonthdl.hxx
+xmloff/source/style/impastpl.cxx
+xmloff/source/style/impastpl.hxx
+xmloff/source/style/kernihdl.cxx
+xmloff/source/style/kernihdl.hxx
+xmloff/source/style/lspachdl.cxx
+xmloff/source/style/lspachdl.hxx
+xmloff/source/style/numehelp.cxx
+xmloff/source/style/opaquhdl.cxx
+xmloff/source/style/opaquhdl.hxx
+xmloff/source/style/postuhdl.cxx
+xmloff/source/style/postuhdl.hxx
+xmloff/source/style/prhdlfac.cxx
+xmloff/source/style/prstylecond.cxx
+xmloff/source/style/prstylei.cxx
+xmloff/source/style/shadwhdl.cxx
+xmloff/source/style/shadwhdl.hxx
+xmloff/source/style/shdwdhdl.cxx
+xmloff/source/style/shdwdhdl.hxx
+xmloff/source/style/styleexp.cxx
+xmloff/source/style/tabsthdl.cxx
+xmloff/source/style/tabsthdl.hxx
+xmloff/source/style/undlihdl.cxx
+xmloff/source/style/undlihdl.hxx
+xmloff/source/style/weighhdl.cxx
+xmloff/source/style/weighhdl.hxx
+xmloff/source/style/xmlaustp.cxx
+xmloff/source/style/xmlbahdl.cxx
+xmloff/source/style/xmlbahdl.hxx
+xmloff/source/style/xmlexppr.cxx
+xmloff/source/style/xmlimppr.cxx
+xmloff/source/style/xmlnume.cxx
+xmloff/source/style/xmlnumfe.cxx
+xmloff/source/style/xmlnumfi.cxx
+xmloff/source/style/xmlnumi.cxx
+xmloff/source/style/xmlprcon.cxx
+xmloff/source/style/xmlprmap.cxx
+xmloff/source/style/xmlstyle.cxx
+xmloff/source/style/xmltabe.cxx
+xmloff/source/style/xmltabi.cxx
+xmloff/source/table/XMLTableExport.cxx
+xmloff/source/table/XMLTableImport.cxx
+xmloff/source/text/XMLAnchorTypePropHdl.hxx
+xmloff/source/text/XMLAutoMarkFileContext.cxx
+xmloff/source/text/XMLAutoMarkFileContext.hxx
+xmloff/source/text/XMLAutoTextContainerEventImport.cxx
+xmloff/source/text/XMLAutoTextContainerEventImport.hxx
+xmloff/source/text/XMLAutoTextEventExport.cxx
+xmloff/source/text/XMLAutoTextEventExport.hxx
+xmloff/source/text/XMLAutoTextEventImport.hxx
+xmloff/source/text/XMLCalculationSettingsContext.cxx
+xmloff/source/text/XMLCalculationSettingsContext.hxx
+xmloff/source/text/XMLChangeElementImportContext.cxx
+xmloff/source/text/XMLChangeElementImportContext.hxx
+xmloff/source/text/XMLChangeImportContext.cxx
+xmloff/source/text/XMLChangeImportContext.hxx
+xmloff/source/text/XMLChangeInfoContext.cxx
+xmloff/source/text/XMLChangeInfoContext.hxx
+xmloff/source/text/XMLChangedRegionImportContext.cxx
+xmloff/source/text/XMLChangedRegionImportContext.hxx
+xmloff/source/text/XMLFootnoteBodyImportContext.cxx
+xmloff/source/text/XMLFootnoteBodyImportContext.hxx
+xmloff/source/text/XMLFootnoteConfigurationImportContext.cxx
+xmloff/source/text/XMLFootnoteImportContext.cxx
+xmloff/source/text/XMLFootnoteImportContext.hxx
+xmloff/source/text/XMLIndexAlphabeticalSourceContext.cxx
+xmloff/source/text/XMLIndexAlphabeticalSourceContext.hxx
+xmloff/source/text/XMLIndexBibliographyConfigurationContext.cxx
+xmloff/source/text/XMLIndexBibliographyEntryContext.cxx
+xmloff/source/text/XMLIndexBibliographyEntryContext.hxx
+xmloff/source/text/XMLIndexBibliographySourceContext.cxx
+xmloff/source/text/XMLIndexBibliographySourceContext.hxx
+xmloff/source/text/XMLIndexBodyContext.cxx
+xmloff/source/text/XMLIndexBodyContext.hxx
+xmloff/source/text/XMLIndexChapterInfoEntryContext.cxx
+xmloff/source/text/XMLIndexChapterInfoEntryContext.hxx
+xmloff/source/text/XMLIndexIllustrationSourceContext.cxx
+xmloff/source/text/XMLIndexIllustrationSourceContext.hxx
+xmloff/source/text/XMLIndexMarkExport.cxx
+xmloff/source/text/XMLIndexMarkExport.hxx
+xmloff/source/text/XMLIndexObjectSourceContext.cxx
+xmloff/source/text/XMLIndexObjectSourceContext.hxx
+xmloff/source/text/XMLIndexSimpleEntryContext.cxx
+xmloff/source/text/XMLIndexSimpleEntryContext.hxx
+xmloff/source/text/XMLIndexSourceBaseContext.cxx
+xmloff/source/text/XMLIndexSourceBaseContext.hxx
+xmloff/source/text/XMLIndexSpanEntryContext.cxx
+xmloff/source/text/XMLIndexSpanEntryContext.hxx
+xmloff/source/text/XMLIndexTOCContext.cxx
+xmloff/source/text/XMLIndexTOCContext.hxx
+xmloff/source/text/XMLIndexTOCSourceContext.cxx
+xmloff/source/text/XMLIndexTOCSourceContext.hxx
+xmloff/source/text/XMLIndexTOCStylesContext.cxx
+xmloff/source/text/XMLIndexTOCStylesContext.hxx
+xmloff/source/text/XMLIndexTabStopEntryContext.cxx
+xmloff/source/text/XMLIndexTabStopEntryContext.hxx
+xmloff/source/text/XMLIndexTableSourceContext.cxx
+xmloff/source/text/XMLIndexTableSourceContext.hxx
+xmloff/source/text/XMLIndexTemplateContext.cxx
+xmloff/source/text/XMLIndexTemplateContext.hxx
+xmloff/source/text/XMLIndexTitleTemplateContext.cxx
+xmloff/source/text/XMLIndexTitleTemplateContext.hxx
+xmloff/source/text/XMLIndexUserSourceContext.cxx
+xmloff/source/text/XMLIndexUserSourceContext.hxx
+xmloff/source/text/XMLLineNumberingExport.cxx
+xmloff/source/text/XMLLineNumberingImportContext.cxx
+xmloff/source/text/XMLLineNumberingSeparatorImportContext.cxx
+xmloff/source/text/XMLLineNumberingSeparatorImportContext.hxx
+xmloff/source/text/XMLPropertyBackpatcher.cxx
+xmloff/source/text/XMLPropertyBackpatcher.hxx
+xmloff/source/text/XMLRedlineExport.cxx
+xmloff/source/text/XMLRedlineExport.hxx
+xmloff/source/text/XMLSectionExport.cxx
+xmloff/source/text/XMLSectionExport.hxx
+xmloff/source/text/XMLSectionFootnoteConfigExport.cxx
+xmloff/source/text/XMLSectionFootnoteConfigExport.hxx
+xmloff/source/text/XMLSectionFootnoteConfigImport.cxx
+xmloff/source/text/XMLSectionFootnoteConfigImport.hxx
+xmloff/source/text/XMLSectionImportContext.cxx
+xmloff/source/text/XMLSectionImportContext.hxx
+xmloff/source/text/XMLSectionSourceDDEImportContext.cxx
+xmloff/source/text/XMLSectionSourceDDEImportContext.hxx
+xmloff/source/text/XMLSectionSourceImportContext.cxx
+xmloff/source/text/XMLSectionSourceImportContext.hxx
+xmloff/source/text/XMLStringBufferImportContext.cxx
+xmloff/source/text/XMLTextCharStyleNamesElementExport.cxx
+xmloff/source/text/XMLTextCharStyleNamesElementExport.hxx
+xmloff/source/text/XMLTextColumnsContext.cxx
+xmloff/source/text/XMLTextColumnsExport.cxx
+xmloff/source/text/XMLTextFrameContext.cxx
+xmloff/source/text/XMLTextFrameContext.hxx
+xmloff/source/text/XMLTextFrameHyperlinkContext.cxx
+xmloff/source/text/XMLTextFrameHyperlinkContext.hxx
+xmloff/source/text/XMLTextHeaderFooterContext.cxx
+xmloff/source/text/XMLTextListAutoStylePool.cxx
+xmloff/source/text/XMLTextListBlockContext.cxx
+xmloff/source/text/XMLTextListBlockContext.hxx
+xmloff/source/text/XMLTextListItemContext.cxx
+xmloff/source/text/XMLTextListItemContext.hxx
+xmloff/source/text/XMLTextMarkImportContext.cxx
+xmloff/source/text/XMLTextMarkImportContext.hxx
+xmloff/source/text/XMLTextMasterPageContext.cxx
+xmloff/source/text/XMLTextMasterPageExport.cxx
+xmloff/source/text/XMLTextMasterStylesContext.cxx
+xmloff/source/text/XMLTextNumRuleInfo.cxx
+xmloff/source/text/XMLTextNumRuleInfo.hxx
+xmloff/source/text/XMLTextPropertySetContext.cxx
+xmloff/source/text/XMLTextPropertySetContext.hxx
+xmloff/source/text/XMLTextShapeImportHelper.cxx
+xmloff/source/text/XMLTextShapeStyleContext.cxx
+xmloff/source/text/XMLTextTableContext.cxx
+xmloff/source/text/XMLTrackedChangesImportContext.cxx
+xmloff/source/text/XMLTrackedChangesImportContext.hxx
+xmloff/source/text/txtdrope.cxx
+xmloff/source/text/txtdrope.hxx
+xmloff/source/text/txtdropi.cxx
+xmloff/source/text/txtexppr.cxx
+xmloff/source/text/txtexppr.hxx
+xmloff/source/text/txtflde.cxx
+xmloff/source/text/txtfldi.cxx
+xmloff/source/text/txtftne.cxx
+xmloff/source/text/txtimp.cxx
+xmloff/source/text/txtimppr.cxx
+xmloff/source/text/txtlists.cxx
+xmloff/source/text/txtparae.cxx
+xmloff/source/text/txtparai.cxx
+xmloff/source/text/txtparai.hxx
+xmloff/source/text/txtparaimphint.hxx
+xmloff/source/text/txtprhdl.cxx
+xmloff/source/text/txtprmap.cxx
+xmloff/source/text/txtsecte.cxx
+xmloff/source/text/txtstyle.cxx
+xmloff/source/text/txtstyli.cxx
+xmloff/source/text/txtvfldi.cxx
+xmloff/source/transform/AttrTransformerAction.hxx
+xmloff/source/transform/ChartOASISTContext.cxx
+xmloff/source/transform/ChartOASISTContext.hxx
+xmloff/source/transform/ChartOOoTContext.cxx
+xmloff/source/transform/ChartOOoTContext.hxx
+xmloff/source/transform/ChartPlotAreaOASISTContext.cxx
+xmloff/source/transform/ChartPlotAreaOASISTContext.hxx
+xmloff/source/transform/ChartPlotAreaOOoTContext.cxx
+xmloff/source/transform/ChartPlotAreaOOoTContext.hxx
+xmloff/source/transform/ControlOASISTContext.cxx
+xmloff/source/transform/ControlOASISTContext.hxx
+xmloff/source/transform/ControlOOoTContext.cxx
+xmloff/source/transform/ControlOOoTContext.hxx
+xmloff/source/transform/CreateElemTContext.cxx
+xmloff/source/transform/CreateElemTContext.hxx
+xmloff/source/transform/DeepTContext.cxx
+xmloff/source/transform/DeepTContext.hxx
+xmloff/source/transform/DlgOASISTContext.cxx
+xmloff/source/transform/DlgOASISTContext.hxx
+xmloff/source/transform/DocumentTContext.cxx
+xmloff/source/transform/ElemTransformerAction.hxx
+xmloff/source/transform/EventMap.cxx
+xmloff/source/transform/EventOASISTContext.cxx
+xmloff/source/transform/EventOASISTContext.hxx
+xmloff/source/transform/EventOOoTContext.cxx
+xmloff/source/transform/EventOOoTContext.hxx
+xmloff/source/transform/FlatTContext.cxx
+xmloff/source/transform/FlatTContext.hxx
+xmloff/source/transform/FormPropOASISTContext.cxx
+xmloff/source/transform/FormPropOASISTContext.hxx
+xmloff/source/transform/FormPropOOoTContext.cxx
+xmloff/source/transform/FormPropOOoTContext.hxx
+xmloff/source/transform/FrameOASISTContext.cxx
+xmloff/source/transform/FrameOASISTContext.hxx
+xmloff/source/transform/FrameOOoTContext.cxx
+xmloff/source/transform/FrameOOoTContext.hxx
+xmloff/source/transform/IgnoreTContext.cxx
+xmloff/source/transform/IgnoreTContext.hxx
+xmloff/source/transform/MergeElemTContext.cxx
+xmloff/source/transform/MergeElemTContext.hxx
+xmloff/source/transform/MetaTContext.cxx
+xmloff/source/transform/MetaTContext.hxx
+xmloff/source/transform/MutableAttrList.cxx
+xmloff/source/transform/MutableAttrList.hxx
+xmloff/source/transform/NotesTContext.cxx
+xmloff/source/transform/NotesTContext.hxx
+xmloff/source/transform/OOo2Oasis.cxx
+xmloff/source/transform/OOo2Oasis.hxx
+xmloff/source/transform/Oasis2OOo.cxx
+xmloff/source/transform/Oasis2OOo.hxx
+xmloff/source/transform/PersAttrListTContext.cxx
+xmloff/source/transform/PersAttrListTContext.hxx
+xmloff/source/transform/PersMixedContentTContext.cxx
+xmloff/source/transform/PersMixedContentTContext.hxx
+xmloff/source/transform/ProcAddAttrTContext.cxx
+xmloff/source/transform/ProcAddAttrTContext.hxx
+xmloff/source/transform/ProcAttrTContext.cxx
+xmloff/source/transform/ProcAttrTContext.hxx
+xmloff/source/transform/PropertyActionsOASIS.cxx
+xmloff/source/transform/PropertyActionsOOo.cxx
+xmloff/source/transform/RenameElemTContext.cxx
+xmloff/source/transform/RenameElemTContext.hxx
+xmloff/source/transform/StyleOASISTContext.cxx
+xmloff/source/transform/StyleOASISTContext.hxx
+xmloff/source/transform/StyleOOoTContext.cxx
+xmloff/source/transform/StyleOOoTContext.hxx
+xmloff/source/transform/Transformer.hxx
+xmloff/source/transform/TransformerActionInit.hxx
+xmloff/source/transform/TransformerActions.cxx
+xmloff/source/transform/TransformerActions.hxx
+xmloff/source/transform/TransformerBase.cxx
+xmloff/source/transform/TransformerBase.hxx
+xmloff/source/transform/TransformerContext.cxx
+xmloff/source/transform/TransformerContext.hxx
+xmloff/source/transform/TransformerTokenMap.cxx
+xmloff/source/xforms/SchemaContext.cxx
+xmloff/source/xforms/SchemaContext.hxx
+xmloff/source/xforms/SchemaRestrictionContext.cxx
+xmloff/source/xforms/SchemaRestrictionContext.hxx
+xmloff/source/xforms/SchemaSimpleTypeContext.cxx
+xmloff/source/xforms/SchemaSimpleTypeContext.hxx
+xmloff/source/xforms/TokenContext.cxx
+xmloff/source/xforms/TokenContext.hxx
+xmloff/source/xforms/XFormsBindContext.cxx
+xmloff/source/xforms/XFormsBindContext.hxx
+xmloff/source/xforms/XFormsInstanceContext.cxx
+xmloff/source/xforms/XFormsInstanceContext.hxx
+xmloff/source/xforms/XFormsModelContext.cxx
+xmloff/source/xforms/XFormsModelContext.hxx
+xmloff/source/xforms/XFormsModelExport.hxx
+xmloff/source/xforms/XFormsSubmissionContext.cxx
+xmloff/source/xforms/XFormsSubmissionContext.hxx
+xmloff/source/xforms/xformsapi.cxx
+xmloff/source/xforms/xformsapi.hxx
+xmloff/source/xforms/xformsexport.cxx
+xmloff/source/xforms/xformsimport.cxx
+xmlreader/source/pad.cxx
+xmlreader/source/span.cxx
+xmlreader/source/xmlreader.cxx
+xmlscript/source/inc/misc.hxx
+xmlscript/source/xml_helper/xml_byteseq.cxx
+xmlscript/source/xml_helper/xml_element.cxx
+xmlscript/source/xml_helper/xml_impctx.cxx
+xmlscript/source/xmldlg_imexp/exp_share.hxx
+xmlscript/source/xmldlg_imexp/imp_share.hxx
+xmlscript/source/xmldlg_imexp/xmldlg_addfunc.cxx
+xmlscript/source/xmldlg_imexp/xmldlg_expmodels.cxx
+xmlscript/source/xmldlg_imexp/xmldlg_export.cxx
+xmlscript/source/xmldlg_imexp/xmldlg_impmodels.cxx
+xmlscript/source/xmldlg_imexp/xmldlg_import.cxx
+xmlscript/source/xmlflat_imexp/xmlbas_export.cxx
+xmlscript/source/xmlflat_imexp/xmlbas_export.hxx
+xmlscript/source/xmllib_imexp/imp_share.hxx
+xmlscript/source/xmllib_imexp/xmllib_export.cxx
+xmlscript/source/xmllib_imexp/xmllib_import.cxx
+xmlscript/source/xmlmod_imexp/imp_share.hxx
+xmlscript/source/xmlmod_imexp/xmlmod_export.cxx
+xmlscript/source/xmlmod_imexp/xmlmod_import.cxx
+xmlscript/test/imexp.cxx
+xmlsecurity/inc/certificatechooser.hxx
+xmlsecurity/inc/certificateviewer.hxx
+xmlsecurity/inc/digitalsignaturesdialog.hxx
+xmlsecurity/inc/documentsignaturehelper.hxx
+xmlsecurity/inc/framework/saxeventkeeperimpl.hxx
+xmlsecurity/inc/framework/securityengine.hxx
+xmlsecurity/inc/framework/signaturecreatorimpl.hxx
+xmlsecurity/inc/framework/signatureengine.hxx
+xmlsecurity/inc/framework/signatureverifierimpl.hxx
+xmlsecurity/inc/framework/xmlsignaturetemplateimpl.hxx
+xmlsecurity/inc/gpg/SEInitializer.hxx
+xmlsecurity/inc/gpg/xmlsignature_gpgimpl.hxx
+xmlsecurity/inc/macrosecurity.hxx
+xmlsecurity/inc/UriBindingHelper.hxx
+xmlsecurity/inc/xmlsec/saxhelper.hxx
+xmlsecurity/inc/xmlsec/xmldocumentwrapper_xmlsecimpl.hxx
+xmlsecurity/inc/xmlsignaturehelper.hxx
+xmlsecurity/inc/xsecctl.hxx
+xmlsecurity/qa/certext/SanCertExt.cxx
+xmlsecurity/source/component/certificatecontainer.cxx
+xmlsecurity/source/component/documentdigitalsignatures.cxx
+xmlsecurity/source/dialogs/certificatechooser.cxx
+xmlsecurity/source/dialogs/certificateviewer.cxx
+xmlsecurity/source/dialogs/digitalsignaturesdialog.cxx
+xmlsecurity/source/dialogs/macrosecurity.cxx
+xmlsecurity/source/framework/buffernode.cxx
+xmlsecurity/source/framework/elementcollector.cxx
+xmlsecurity/source/framework/elementcollector.hxx
+xmlsecurity/source/framework/elementmark.cxx
+xmlsecurity/source/framework/saxeventkeeperimpl.cxx
+xmlsecurity/source/framework/securityengine.cxx
+xmlsecurity/source/framework/signaturecreatorimpl.cxx
+xmlsecurity/source/framework/signatureengine.cxx
+xmlsecurity/source/framework/signatureverifierimpl.cxx
+xmlsecurity/source/framework/xmlsignaturetemplateimpl.cxx
+xmlsecurity/source/gpg/CertificateImpl.cxx
+xmlsecurity/source/gpg/CertificateImpl.hxx
+xmlsecurity/source/gpg/SecurityEnvironment.cxx
+xmlsecurity/source/gpg/SecurityEnvironment.hxx
+xmlsecurity/source/gpg/XMLEncryption.cxx
+xmlsecurity/source/gpg/XMLEncryption.hxx
+xmlsecurity/source/gpg/XMLSecurityContext.hxx
+xmlsecurity/source/gpg/xmlsignature_gpgimpl.cxx
+xmlsecurity/source/helper/documentsignaturehelper.cxx
+xmlsecurity/source/helper/ooxmlsecparser.cxx
+xmlsecurity/source/helper/ooxmlsecparser.hxx
+xmlsecurity/source/helper/UriBindingHelper.cxx
+xmlsecurity/source/helper/xmlsignaturehelper.cxx
+xmlsecurity/source/helper/xsecctl.cxx
+xmlsecurity/source/helper/xsecparser.cxx
+xmlsecurity/source/helper/xsecparser.hxx
+xmlsecurity/source/helper/xsecsign.cxx
+xmlsecurity/source/helper/xsecverify.cxx
+xmlsecurity/source/xmlsec/biginteger.cxx
+xmlsecurity/source/xmlsec/certificateextension_certextn.cxx
+xmlsecurity/source/xmlsec/certificateextension_xmlsecimpl.hxx
+xmlsecurity/source/xmlsec/errorcallback.cxx
+xmlsecurity/source/xmlsec/mscrypt/akmngr.cxx
+xmlsecurity/source/xmlsec/mscrypt/akmngr.hxx
+xmlsecurity/source/xmlsec/mscrypt/oid.hxx
+xmlsecurity/source/xmlsec/mscrypt/sanextension_mscryptimpl.cxx
+xmlsecurity/source/xmlsec/mscrypt/sanextension_mscryptimpl.hxx
+xmlsecurity/source/xmlsec/mscrypt/securityenvironment_mscryptimpl.cxx
+xmlsecurity/source/xmlsec/mscrypt/securityenvironment_mscryptimpl.hxx
+xmlsecurity/source/xmlsec/mscrypt/seinitializer_mscryptimpl.cxx
+xmlsecurity/source/xmlsec/mscrypt/seinitializer_mscryptimpl.hxx
+xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.cxx
+xmlsecurity/source/xmlsec/mscrypt/x509certificate_mscryptimpl.hxx
+xmlsecurity/source/xmlsec/mscrypt/xmlsecuritycontext_mscryptimpl.cxx
+xmlsecurity/source/xmlsec/mscrypt/xmlsignature_mscryptimpl.cxx
+xmlsecurity/source/xmlsec/nss/certerrors.h
+xmlsecurity/source/xmlsec/nss/ciphercontext.cxx
+xmlsecurity/source/xmlsec/nss/ciphercontext.hxx
+xmlsecurity/source/xmlsec/nss/digestcontext.cxx
+xmlsecurity/source/xmlsec/nss/digestcontext.hxx
+xmlsecurity/source/xmlsec/nss/nssinitializer.cxx
+xmlsecurity/source/xmlsec/nss/nssinitializer.hxx
+xmlsecurity/source/xmlsec/nss/sanextension_nssimpl.cxx
+xmlsecurity/source/xmlsec/nss/sanextension_nssimpl.hxx
+xmlsecurity/source/xmlsec/nss/secerror.cxx
+xmlsecurity/source/xmlsec/nss/securityenvironment_nssimpl.cxx
+xmlsecurity/source/xmlsec/nss/securityenvironment_nssimpl.hxx
+xmlsecurity/source/xmlsec/nss/seinitializer_nssimpl.cxx
+xmlsecurity/source/xmlsec/nss/seinitializer_nssimpl.hxx
+xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.cxx
+xmlsecurity/source/xmlsec/nss/x509certificate_nssimpl.hxx
+xmlsecurity/source/xmlsec/nss/xmlsecuritycontext_nssimpl.cxx
+xmlsecurity/source/xmlsec/nss/xmlsignature_nssimpl.cxx
+xmlsecurity/source/xmlsec/saxhelper.cxx
+xmlsecurity/source/xmlsec/xmldocumentwrapper_xmlsecimpl.cxx
+xmlsecurity/source/xmlsec/xmlelementwrapper_xmlsecimpl.cxx
+xmlsecurity/source/xmlsec/xmlelementwrapper_xmlsecimpl.hxx
+xmlsecurity/source/xmlsec/xmlsec_init.cxx
+xmlsecurity/source/xmlsec/xmlstreamio.cxx
diff --git a/solenv/clang-format/generate-style-excludelist b/solenv/clang-format/generate-style-excludelist
new file mode 100755
index 000000000..b34b2041d
--- /dev/null
+++ b/solenv/clang-format/generate-style-excludelist
@@ -0,0 +1,31 @@
+#!/usr/bin/env perl
+# 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/.
+
+# Generates an excludelist containing all existing cxx/hxx files.
+
+use strict;
+use warnings;
+use lib "solenv/clang-format";
+use ClangFormat;
+
+my $src = ClangFormat::get_extension_regex();
+my @filenames = ();
+
+# Get a list of files.
+open (FILES, "git ls-files |") || die "Cannot run git ls-files.";
+while (my $filename = <FILES>)
+{
+ chomp $filename;
+ if ($filename =~ /\.($src)$/)
+ {
+ push @filenames, $filename;
+ }
+}
+
+ClangFormat::set_excludelist(\@filenames);
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/clang-format/reformat-formatted-files b/solenv/clang-format/reformat-formatted-files
new file mode 100755
index 000000000..a3a670f83
--- /dev/null
+++ b/solenv/clang-format/reformat-formatted-files
@@ -0,0 +1,49 @@
+#!/usr/bin/env perl
+# 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/.
+
+# Reformat files which are not excluded. This is interesting if the
+# clang-format version or config changes.
+# -n allows just listing the formatted files.
+
+use strict;
+use warnings;
+use lib "solenv/clang-format";
+use ClangFormat;
+
+my $clang_format = ClangFormat::find();
+my $src = ClangFormat::get_extension_regex();
+my $excluded_list_names = ClangFormat::get_excludelist();
+my @filenames = ();
+my $dry_run = 0;
+
+# Get a list of files.
+open (FILES, "git ls-files |") || die "Cannot run git ls-files.";
+while (my $filename = <FILES>)
+{
+ chomp $filename;
+ if ($filename =~ /\.($src)$/ and !exists($excluded_list_names->{$filename}))
+ {
+ push @filenames, $filename;
+ }
+}
+
+if ($#ARGV ge 0 && $ARGV[0] eq "-n")
+{
+ $dry_run = 1;
+}
+
+foreach my $filename (@filenames)
+{
+ my $command = $clang_format . " -i " . $filename;
+ print($filename . "\n");
+ if (!$dry_run)
+ {
+ system($command) == 0 or die "failed to execute \"$command\": $?";
+ }
+}
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/clang-format/remove_not_existent_files_from_clang_excludelist b/solenv/clang-format/remove_not_existent_files_from_clang_excludelist
new file mode 100755
index 000000000..89380381c
--- /dev/null
+++ b/solenv/clang-format/remove_not_existent_files_from_clang_excludelist
@@ -0,0 +1,37 @@
+#!/usr/bin/python
+# 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/.
+# Reformat files which are not excluded. This is interesting if the
+# clang-format version or config changes.
+# -n allows just listing the formatted files.
+
+import os
+
+base_path_to_core = os.path.abspath("../../")
+excludelist = "solenv/clang-format/excludelist"
+
+def delete_line_in_excludelist(line_to_be_removed):
+ with open(os.path.join(base_path_to_core, excludelist), "r") as f:
+ lines = f.readlines()
+ with open(os.path.join(base_path_to_core, excludelist), "w") as f:
+ for line in lines:
+ if line.strip("\n") != line_to_be_removed:
+ f.write(line)
+
+f = open(os.path.join(base_path_to_core, excludelist), "r")
+lines = f.read().split("\n")
+f.close()
+del lines[len(lines)-1] # remove empty, last line
+
+amount_lines_deleted = 0
+
+for line in lines:
+ if not os.path.isfile(os.path.join(base_path_to_core, line)):
+ print("Deleting file {} in excludelist".format(line))
+ delete_line_in_excludelist(line)
+ amount_lines_deleted += 1
+
+print("Removed {} lines in {}".format(amount_lines_deleted, os.path.join(base_path_to_core, excludelist)))
diff --git a/solenv/doc/gbuild/doxygen.cfg b/solenv/doc/gbuild/doxygen.cfg
new file mode 100644
index 000000000..d66fe0cd1
--- /dev/null
+++ b/solenv/doc/gbuild/doxygen.cfg
@@ -0,0 +1,1890 @@
+# Doxyfile 1.8.4
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed
+# in front of the TAG it is preceding .
+# All text after a hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or sequence of words) that should
+# identify the project. Note that if you do not use Doxywizard you need
+# to put quotes around the project name if it contains spaces.
+
+PROJECT_NAME = gbuild
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = ./output
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian,
+# Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic,
+# Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip. Note that you specify absolute paths here, but also
+# relative paths, which will be relative from the directory where doxygen is
+# started.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding
+# "class=itcl::class" will allow you to use the command class in the
+# itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension,
+# and language is one of the parsers supported by doxygen: IDL, Java,
+# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C,
+# C++. For instance to make doxygen treat .inc files as Fortran files (default
+# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note
+# that for custom extensions you also need to set FILE_PATTERNS otherwise the
+# files are not read by doxygen.
+
+EXTENSION_MAPPING = mk=IDL
+
+# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all
+# comments according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you
+# can mix doxygen, HTML, and XML commands with Markdown formatting.
+# Disable only in case of backward compatibilities issues.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word
+# or globally by setting AUTOLINK_SUPPORT to NO.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES (the
+# default) will make doxygen replace the get and set methods by a property in
+# the documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and
+# unions with only public data fields or simple typedef fields will be shown
+# inline in the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO (the default), structs, classes, and unions are shown on a separate
+# page (for HTML and Man pages) or section (for LaTeX and RTF).
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can
+# be an expensive process and often the same symbol appear multiple times in
+# the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too
+# small doxygen will become slower. If the cache is too large, memory is wasted.
+# The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid
+# range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536
+# symbols.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal
+# scope will be included in the documentation.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if section-label ... \endif
+# and \cond section-label ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files
+# containing the references data. This must be a list of .bib files. The
+# .bib extension is automatically appended if omitted. Using this command
+# requires the bibtex tool to be installed. See also
+# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style
+# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this
+# feature you need bibtex and perl available in the search path. Do not use
+# file names with spaces, bibtex cannot handle them.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = solenv/gbuild
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS = *.mk
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be ignored.
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C, C++ and Fortran comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+# for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is advised to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when
+# changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If left blank doxygen will
+# generate a default style sheet. Note that it is recommended to use
+# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this
+# tag will in the future become obsolete.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional
+# user-defined cascading style sheet that is included after the standard
+# style sheets created by doxygen. Using this option one can overrule
+# certain style aspects. This is preferred over using HTML_STYLESHEET
+# since it does not replace the standard style sheet and is therefore more
+# robust against future updates. Doxygen will copy the style sheet file to
+# the output directory.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the style sheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of
+# entries shown in the various tree structured indices initially; the user
+# can expand and collapse entries dynamically later on. Doxygen will expand
+# the tree to such a level that at most the specified number of entries are
+# visible (unless a fully collapsed tree already exceeds this amount).
+# So setting the number of entries 1 will produce a full collapsed tree by
+# default. 0 is a special value representing an infinite number of entries
+# and will result in a full expanded tree by default.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID = org.openoffice.gbuild
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely
+# identify the documentation publisher. This should be a reverse domain-name
+# style string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE =
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+# will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)
+# at top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it. Since the tabs have the same information as the
+# navigation tree you can set this option to NO if you already set
+# GENERATE_TREEVIEW to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+# Since the tree basically has the same information as the tab index you
+# could consider to set DISABLE_INDEX to NO when enabling this option.
+
+GENERATE_TREEVIEW = NONE
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you may also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and
+# SVG. The default value is HTML-CSS, which is slower, but has the best
+# compatibility.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to
+# the MathJax Content Delivery Network so you can quickly see the result without
+# installing MathJax.
+# However, it is strongly recommended to install a local
+# copy of MathJax from http://www.mathjax.org before deployment.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
+# names that should be enabled during MathJax rendering.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript
+# pieces of code that will be used on startup of the MathJax code.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript.
+# There are two flavours of web server based search depending on the
+# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
+# searching and an index file used by the script. When EXTERNAL_SEARCH is
+# enabled the indexing and searching needs to be provided by external tools.
+# See the manual for details.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain
+# the search results. Doxygen ships with an example indexer (doxyindexer) and
+# search engine (doxysearch.cgi) which are based on the open source search
+# engine library Xapian. See the manual for configuration details.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will returned the search results when EXTERNAL_SEARCH is enabled.
+# Doxygen ships with an example search engine (doxysearch) which is based on
+# the open source search engine library Xapian. See the manual for configuration
+# details.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id
+# of to a relative location where the documentation can be found.
+# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ...
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4 will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images
+# or other source files which should be copied to the LaTeX output directory.
+# Note that the files will be copied as-is; there are no commands or markers
+# available.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See
+# http://en.wikipedia.org/wiki/BibTeX for more info.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load style sheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files
+# that can be used to generate PDF.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it. If left blank docbook will be used as the default path.
+
+DOCBOOK_OUTPUT = docbook
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. For each
+# tag file the location of the external documentation should be added. The
+# format of a tag file without this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths
+# or URLs. Note that each tag file must have a unique name (where the name does
+# NOT include the path). If a tag file is not located in the directory in which
+# doxygen is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed
+# in the related pages index. If set to NO, only the current project's
+# pages will be listed.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate an inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS = 0
+
+# By default doxygen will use the Helvetica font for all dot files that
+# doxygen generates. When you want a differently looking font you can specify
+# the font name using DOT_FONTNAME. You need to make sure dot is able to find
+# the font, which can be done by putting it in a standard location or by setting
+# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
+# directory containing the font.
+
+DOT_FONTNAME = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the Helvetica font.
+# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to
+# set the path where dot can find it.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside
+# the class node. If there are many fields or methods and many nodes the
+# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS
+# threshold limits the number of items for each type to make the size more
+# manageable. Set this to 0 for no limit. Note that the threshold may be
+# exceeded by 50% before the limit is enforced.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are svg, png, jpg, or gif.
+# If left blank png will be used. If you choose svg you need to set
+# HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible in IE 9+ (other browsers do not have this requirement).
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+# Note that this requires a modern browser other than Internet Explorer.
+# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you
+# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files
+# visible. Older versions of IE do not have SVG support.
+
+INTERACTIVE_SVG = NO
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
diff --git a/solenv/doc/gbuild/solenv/gbuild/executable.mk b/solenv/doc/gbuild/solenv/gbuild/executable.mk
new file mode 100644
index 000000000..87b7992a7
--- /dev/null
+++ b/solenv/doc/gbuild/solenv/gbuild/executable.mk
@@ -0,0 +1,43 @@
+/*
+ * 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 .
+ */
+
+#include <types.h>
+
+namespace gb
+{
+ using namespace types;
+
+ class LinkTarget;
+
+ class Executable : public IsCleanable, public HasDependencies, public IsLinking, public DeliversHeaders, public HasCompileSettings, public Target
+ {
+ public:
+ Executable(String name);
+
+ private:
+ /// private helper function for the constructor
+ void Executable_impl(LinkTarget library_linktarget);
+ /// platformdependent additional setup for constructor (used on Windows only)
+ void Executable_platform(LinkTarget library_linktarget);
+ /// helper function to wrap LinkTargets functions (this is more or less pimpl ...)
+ void forward_to_linktarget(Function f);
+
+ static const List<String> TARGETTYPEFLAGS;
+ };
+}
+/* vim: set filetype=cpp : */
diff --git a/solenv/doc/gbuild/solenv/gbuild/gbuild.mk b/solenv/doc/gbuild/solenv/gbuild/gbuild.mk
new file mode 100644
index 000000000..55ef76cdc
--- /dev/null
+++ b/solenv/doc/gbuild/solenv/gbuild/gbuild.mk
@@ -0,0 +1,89 @@
+///
+/// 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 .
+///
+
+#include <types.mk>
+using namespace gb::types;
+
+// GNU make specific setup
+static const Command SHELL;
+
+
+// gbuild root directories
+static Path SRCDIR;
+static Path WORKDIR;
+
+// Expected from configure/environment
+static const Integer OSL_DEBUG_LEVEL;
+static const List<Path> SOLARINC;
+static const Path GBUILDDIR;
+static const Path JAVA_HOME;
+static const Path UPD;
+static const String LIBXML_CFLAGS;
+static const String OS;
+static const Bool DEBUG;
+
+// gbuild global variables derived from the configure/environment
+// some of these are defined per platform
+namespace gb
+{
+ /// building with generated dependencies
+ static const Bool FULLDEPS;
+ /// command to run awk scripts
+ static const Command AWK;
+ /// command to compile c source files
+ static const Command CC;
+ /// command to compile c++ source files
+ static const Command CXX;
+ /// command to process input with a gcc compatible preprocessor
+ static const Command GCCP;
+ /// command to link objects on the microsoft toolchain
+ static const Command LINK;
+ /// command to create a unique temporary file
+ static const Command MKTEMP;
+ /// debuglevel:
+ /// 0=no debugging,
+ /// 1=non-product build,
+ /// 2=debugging build (either product or nonproduct)
+ static const Integer DEBUGLEVEL;
+ /// compiler specific optimization flags
+ static const List<String> COMPILEROPTFLAGS;
+ /// default c compilation compiler flags
+ static const List<String> CFLAGS;
+ /// compiler specific defines
+ static const List<String> COMPILERDEFS;
+ /// cpu-specific default defines
+ static const List<String> CPUDEFS;
+ /// default c++ compilation compiler flags
+ static const List<String> CXXFLAGS;
+ /// platform- and compiler independent default defines
+ static const List<String> GLOBALDEFS;
+ /// default objective c++ compilation compiler flags
+ static const List<String> OBJCXXFLAGS;
+ /// platformspecific default defines
+ static const List<String> OSDEFS;
+ /// ?
+ static const Path SDKDIR;
+};
+
+// PTHREAD_CFLAGS (Linux)
+// SYSTEM_ICU (Linux)
+// SYSTEM_JPEG (Linux)
+// SYSTEM_LIBXML (Linux)
+// USE_SYSTEM_STL (Linux)
+
+/* vim: set filetype=cpp : */
diff --git a/solenv/doc/gbuild/solenv/gbuild/helper.mk b/solenv/doc/gbuild/solenv/gbuild/helper.mk
new file mode 100644
index 000000000..b2db7ef7d
--- /dev/null
+++ b/solenv/doc/gbuild/solenv/gbuild/helper.mk
@@ -0,0 +1,54 @@
+/*
+ * 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 .
+ */
+
+#include <types.h>
+
+String NEWLINE;
+String COMMA;
+
+namespace gb
+{
+ using namespace types;
+
+ class Helper
+ {
+ public:
+ /// Abbreviates the common directory roots in a command
+ static Command abbreviate_dirs(Command c);
+ /// Announces the start/end of a task.
+ static void announce(String announcement);
+ /// Creates the default get_clean_target() function for the type.
+ static void make_clean_target(TargetType t);
+ /// Creates the default get_clean_target() function for the types.
+ static void make_clean_targets(List<TargetType> ts);
+ /// Creates the default get_dep_target() function for the type.
+ static void make_dep_target(TargetType t);
+ /// Creates the default get_dep_target() function for the types.
+ static void make_dep_targets(List<TargetType> ts);
+
+ /// The path to a zero length file.
+ static const Path NULLFILE;
+ /// The path to the misc directory for temporary files etc.
+ static const Path MISC;
+ /// The path to a phony target, that is always outdated.
+ static const Path PHONY;
+ /// Internally used dummy file.
+ static const Path MISCDUMMY;
+ };
+}
+/* vim: set filetype=cpp : */
diff --git a/solenv/doc/gbuild/solenv/gbuild/library.mk b/solenv/doc/gbuild/solenv/gbuild/library.mk
new file mode 100644
index 000000000..c06a19e9b
--- /dev/null
+++ b/solenv/doc/gbuild/solenv/gbuild/library.mk
@@ -0,0 +1,59 @@
+/*
+ * 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 .
+ */
+
+#include <types.h>
+
+namespace gb
+{
+ using namespace types;
+
+ class LinkTarget;
+
+ class Library : public IsCleanable, public HasDependencies, public IsLinking, public DeliversHeaders, public HasCompileSettings, public Target
+ {
+ public:
+ Library(String name);
+ /// Returns how the library is named in the filesystem on the current platform.
+ /// Library filename schemes are defined in solenv/gbuild/libnames.mk (with some platformdependent hacks in solenv/gbuild/platform/*.mk.
+
+ /// This function needs to be defined in solenv/gbuild/target_names.mk so that it is available to everywhere.
+ Path get_filename();
+
+ private:
+ /// private helper function for the constructor
+ void Library_impl(LinkTarget library_linktarget);
+ /// platformdependent additional setup for constructor (used on Windows only)
+ void Library_platform(
+ LinkTarget library_linktarget,
+ Path dllfile);
+ /// helper function to wrap LinkTargets functions (this is more or less pimpl ...)
+ void forward_to_linktarget(Function f);
+
+ /// List of buildable libraries (i.e. libraries that are not expected to exist on the system).
+ static const List<Library> TARGETS;
+ /// List of additional defines for compiling objects for libraries
+ static const List<String> DEFS;
+ /// List of additional flags for linking a library
+ static const List<String> TARGETTYPEFLAGS;
+ /// Mapping from symbolic library names to dll filenames
+ static const Map<Library,Path> DLLFILENAMES;
+ /// Mapping from symbolic library names to filenames
+ static const Map<Library,Path> FILENAMES;
+ };
+}
+/* vim: set filetype=cpp : */
diff --git a/solenv/doc/gbuild/solenv/gbuild/linktarget.mk b/solenv/doc/gbuild/solenv/gbuild/linktarget.mk
new file mode 100644
index 000000000..0321c8a64
--- /dev/null
+++ b/solenv/doc/gbuild/solenv/gbuild/linktarget.mk
@@ -0,0 +1,144 @@
+/*
+ * 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 .
+ */
+
+#include <types.h>
+
+namespace gb
+{
+ using namespace types;
+
+ class LinkTarget;
+ class Library;
+ class StaticLibrary;
+ class SdiTarget;
+ class Package;
+
+ /// CObjects are never used standalone. They only exist as part of a
+ /// LinkTarget.
+ class CObject : public HasSource, public HasDependencies, public Target
+ {
+ public:
+ Path get_source();
+ private:
+ /// CObjects do not need to be explicitly constructed.
+ /// They are named after the path of their source file (without
+ /// file extension) from the root of their source repository.
+ CObject(String name);
+ friend class LinkTarget;
+
+ /// Platformdependent command to compile a plain C object.
+ static const Command command(
+ Path objectfile,
+ String name,
+ Path sourcefile,
+ List<String> defs,
+ List<String> cxxflags,
+ List<Path> include);
+ /// Platformdependent command to generate plain C object dependencies.
+ static const Command command_dep(
+ Path depfile,
+ String name,
+ Path sourcefile,
+ List<String> defs,
+ List<String> cxxflags,
+ List<Path> include);
+ };
+
+ /// CxxObjects are never used standalone. They only exist as part of a
+ /// LinkTarget.
+ class CxxObject : public HasSource, public HasDependencies, public Target
+ {
+ public:
+ Path get_source();
+ private:
+ /// CxxObjects do not need to be explicitly constructed.
+ /// They are named after the path of their source file (without
+ /// file extension) from the root of their source repository.
+ CxxObject(String name);
+ friend class LinkTarget;
+
+ /// Platformdependent command to compile a C++ object.
+ static const Command command(
+ Path objectfile,
+ String name,
+ Path sourcefile,
+ List<String> defs,
+ List<String> cxxflags,
+ List<Path> include);
+ /// Platformdependent command to generate C++ object dependencies.
+ static const Command command_dep(
+ Path objectfile,
+ String name,
+ Path sourcefile,
+ List<String> defs,
+ List<String> cxxflags,
+ List<Path> include);
+ };
+
+ class LinkTarget : public IsCleanable, public HasDependencies, public IsLinking, public DeliversHeaders, public HasCompileSettings, public Target
+ {
+ public:
+ LinkTarget(String name);
+
+ private:
+ void get_external_headers_check();
+ void add_internal_headers(const List<Target>& internal_headers);
+
+ /// @warning Evil Hack: SELF is set to the name of the LinkTarget
+ /// in the constructor. If SELF is not set to the LinkTarget name in
+ /// the execution of the header rule, the LinkTarget is used (linked
+ /// against) but was never defined. This might work out, if the
+ /// LinkTarget has been provided by other means (for example:
+ /// build.pl/dmake), but it should never happen in a project where
+ /// all LinkTarget s are controlled by gbuild.
+ LinkTarget& SELF;
+ List<CObject> COBJECTS;
+ List<CxxObject> CXXOBJECTS;
+ List<Library> LINKED_LIBS;
+ List<Path> AUXTARGETS;
+ List<Path> INCLUDE;
+ List<StaticLibrary> LINKED_STATIC_LIBS;
+ List<String> CFLAGS;
+ List<String> CXXFLAGS;
+ List<String> DEFS;
+ List<String> LDFLAGS;
+ List<String> TARGETTYPE_FLAGS;
+ Path DLLTARGET;
+
+ /// Platformdependent command for linking.
+ static const Command command (
+ Path linktargetfile,
+ String linktargetname,
+ List<String> linkflags,
+ List<Library> linked_libs,
+ List<StaticLibrary> linked_static_libs,
+ List<CObject> cobjects,
+ List<CxxObject> cxxobjects);
+ /// Command to collect all dependencies of this LinkTarget.
+ static const Command command_dep(
+ Path depfile,
+ String linktargetname,
+ List<CObject> cobjects,
+ List<CxxObject> cxxobjects);
+ static const List<String> DEFAULTDEFS;
+ static const List<String> CXXFLAGS;
+ static const List<String> LDFLAGS;
+ static const List<Path> INCLUDE;
+ };
+}
+/* vim: set filetype=cpp : */
diff --git a/solenv/doc/gbuild/solenv/gbuild/package.mk b/solenv/doc/gbuild/solenv/gbuild/package.mk
new file mode 100644
index 000000000..b1d25a642
--- /dev/null
+++ b/solenv/doc/gbuild/solenv/gbuild/package.mk
@@ -0,0 +1,48 @@
+/*
+ * 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 .
+ */
+
+#include <types.h>
+
+namespace gb
+{
+ using namespace types;
+ class PackagePart
+ {
+ private:
+ /// PackagePart s do not need to be explicitly constructed.
+ /// They are named after the path of their source file (without
+ /// file extension) from the root of their source repository.
+ PackagePart(String name, Path Source);
+ friend Package;
+ /// Returns a list of absolute paths where files are copied to with the PackagePart class.
+
+ /// This function needs to be defined in solenv/gbuild/target_names.mk so that it is available to everywhere.
+ static const List<Path> get_destinations();
+ };
+
+ class Package : public Target, public IsCleanable
+ {
+ public:
+ /// Creates a new package that copies files from source_dir to the \$(INSTDIR).
+ Package(String name, Path source_dir);
+ /// Adds a file to the package. destination is the relative path in
+ /// the \$(INSTROOT) and source is the relative path in the source_dir.
+ add_file(Path destination, Path source);
+ }
+}
+/* vim: set filetype=cpp : */
diff --git a/solenv/doc/gbuild/solenv/gbuild/sdi.mk b/solenv/doc/gbuild/solenv/gbuild/sdi.mk
new file mode 100644
index 000000000..0e21980fe
--- /dev/null
+++ b/solenv/doc/gbuild/solenv/gbuild/sdi.mk
@@ -0,0 +1,41 @@
+/*
+ * 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 .
+ */
+
+#include <types.h>
+
+namespace gb
+{
+ using namespace types;
+
+ class SdiTarget : public Target, public IsCleanable
+ {
+ public:
+ /// Creates a new SdiTarget.
+ SdiTarget(String name, String exports);
+ /// Sets the include paths for this SdiTarget.
+ set_include(List<Path> includes);
+ private:
+ /// The command to execute svidl.
+ static const Command SVIDLCOMMAND;
+ /// The target on with to depend to make sure the svidl executable is available.
+ static const Path SVIDLTARGET;
+ /// The target on with to depend to make sure the auxiliary files (libraries etc.) for the svidl executable are available.
+ static const Path SVIDLAUXDEPS;
+ };
+}
+/* vim: set filetype=cpp : */
diff --git a/solenv/doc/gbuild/solenv/gbuild/static_library.mk b/solenv/doc/gbuild/solenv/gbuild/static_library.mk
new file mode 100644
index 000000000..fe0272382
--- /dev/null
+++ b/solenv/doc/gbuild/solenv/gbuild/static_library.mk
@@ -0,0 +1,55 @@
+/*
+ * 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 .
+ */
+
+#include <types.h>
+
+namespace gb
+{
+ using namespace types;
+
+ class LinkTarget;
+
+ class StaticLibrary : public IsCleanable, public HasDependencies, public IsLinking, public DeliversHeaders, public HasCompileSettings, public Target
+ {
+ public:
+ StaticLibrary(String name);
+ /// Returns how the library is named in the filesystem on the current platform.
+ /// StaticLibrary filename schemes are defined in solenv/gbuild/libnames.mk (with some platformdependent hacks in solenv/gbuild/platform/*.mk.
+
+ /// This function needs to be defined in solenv/gbuild/target_names.mk so that it is available to everywhere.
+ Path get_filename();
+
+ private:
+ /// private helper function for the constructor
+ void StaticLibrary_impl(LinkTarget library_linktarget);
+ /// helper function to wrap LinkTargets functions (this is more or less pimpl ...).
+ void forward_to_linktarget(Function f);
+
+ /// List of buildable static libraries (i.e. static libraries that are not expected to exist on the system).
+ static const List<StaticLibrary> TARGETS;
+ /// List of additional defines for compiling objects for static libraries
+ static const List<String> DEFS;
+ /// List of additional flags for linking a static library
+ static const List<String> TARGETTYPEFLAGS;
+ /// Mapping from symbolic static library names to filenames
+ static const Map<StaticLibrary,Path> FILENAMES;
+ /// platformdependent file extension for static libraries
+ static const String PLAINEXT;
+ };
+}
+/* vim: set filetype=cpp : */
diff --git a/solenv/doc/gbuild/solenv/gbuild/types.mk b/solenv/doc/gbuild/solenv/gbuild/types.mk
new file mode 100644
index 000000000..8798f0105
--- /dev/null
+++ b/solenv/doc/gbuild/solenv/gbuild/types.mk
@@ -0,0 +1,162 @@
+/*
+ * 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 .
+ */
+
+namespace gb {
+ class CObject;
+ class CxxObject;
+ class Library;
+ class StaticLibrary;
+ class Package;
+ class SdiTarget;
+};
+
+namespace gb { namespace types
+{
+ /// A type of target, with its set of rules etc., as used in the build system.
+ class TargetType {};
+ /// A plain old string.
+ class String {};
+ /// A partial, relative or absolute filesystem path.
+ class Path {};
+ /// A target to be build.
+ class Target
+ {
+ public:
+ /// The absolute filesystem path representing the target.
+
+ /// This function needs to be defined in solenv/gbuild/target_names.mk so that it is available to everywhere.
+ Path get_target();
+ };
+ /// A partial or complete shell-command.
+ class Command {};
+ /// A integer number.
+ class Integer {};
+ /// A boolean value.
+
+ /// There are const boolean values true and false for
+ /// comparisons (written as $(true) and $(false) in makefiles.
+ class Bool {};
+ /// A language (for localisation)
+
+ /// A language represented by its ISO 639-1:2002 code.
+ class Language {};
+ /// A List of objects.
+
+ /// A List of objects represented by a whitespace separated list
+ /// in makefiles.
+ template <typename T>
+ class List<T> {};
+
+ /// A Mapping from with a key of type K and a value of type V
+
+ /// A Mapping is represented by a whitespace separated list
+ /// of key-value pairs. Key and value are separated by a colon (:).
+ template <typename K, typename V>
+ class Map<K,V> {};
+ /// A target that can be cleaned.
+ class IsCleanable
+ {
+ public:
+ /// The (phony) absolute filesystem path to clean the target.
+
+ /// This function needs to be defined in solenv/gbuild/target_names.mk so that it is available to everywhere.
+ Path get_clean_target();
+ };
+ /// A target that has generated dependencies.
+ class HasDependencies
+ {
+ public:
+ /// The absolute filesystem path to the file containing the dependencies.
+
+ /// This function needs to be defined in solenv/gbuild/target_names.mk so that it is available to everywhere.
+ Path get_dep_target();
+ };
+ /// A target that has a source file from which it is generated.
+ class HasSource
+ {
+ public:
+ /// The absolute filesystem path to the source file.
+ Path get_source();
+ };
+ /// A target that links objects and libraries.
+ class IsLinking
+ {
+ public:
+ /// Add a CObject to be compiled and linked.
+ void add_cobject(CObject cobject);
+ /// Add multiple CObject s to be compiled and linked.
+ void add_cobjects(List<CObject> cobjects);
+ /// Add a CxxObject to be compiled and linked.
+ void add_cxxobject(CxxObject cobject);
+ /// Add multiple CxxObject s to be compiled and linked.
+ void add_cxxobjects(List<CxxObject> cobjects);
+ /// Add multiple CxxObject s to be compiled and linked (with exceptions enabled).
+ void add_exception_objects(List<CxxObject> cobject);
+ /// Add libraries to link against dynamically.
+ void add_linked_libs(List<Library> linked_libs);
+ /// Add libraries to link against statically.
+ void add_linked_static_libs(List<StaticLibrary> linked_static_libs);
+ /// Set auxiliary files that are produced by linking (for cleanup and copying).
+ void set_auxtargets(List<Path> auxtargets);
+ /// Set the location for the produced DLL (used on Windows only).
+ void set_dll_target(Path dlltarget);
+ /// Set additional flags for the link command.
+ void set_ldflags(List<Path> ldflags);
+ };
+ /// A target that delivers headers of some kind.
+ class DeliversHeaders
+ {
+ public:
+ /// The absolute filesystem path which is touched when all headers for this target are prepared.
+
+ /// This function needs to be defined in solenv/gbuild/target_names.mk so that it is available to everywhere.
+ Path get_headers_target();
+ /// The absolute filesystem path which is touched when all external headers for this target are prepared.
+
+ /// This function needs to be defined in solenv/gbuild/target_names.mk so that it is available to everywhere.
+ Path get_external_headers_target();
+ /// Add multiple Packages that need to be delivered/generated
+ /// before compilation or dependency generation can start.
+ void add_package_headers(List<Package> packages);
+ /// Add multiple SdiTargets that need to be delivered/generated
+ /// before compilation or dependency generation can start.
+ void add_sdi_headers(List<SdiTarget> sdis);
+ };
+ /// A target where settings for the compilation can be set.
+ class HasCompileSettings
+ {
+ public:
+ /// Sets flags for plain C compilation.
+ /// \$\$(CFLAGS) contains the current flags and can be used if
+ /// just a few need to be modified.
+ void set_cflags(List<String> cflags);
+ /// Sets flags for C++ compilation.
+ /// \$\$(CXXFLAGS) contains the current flags and can be used if
+ /// just a few need to be modified.
+ void set_cxxflags(List<String> cxxflags);
+ /// Sets defines for C/C++ compilation.
+ /// \$\$(DEFS) contains the current flags and can be used if
+ /// just a few need to be modified.
+ void set_defs(List<String> defs);
+ /// Sets the include paths for C/C++ compilation.
+ /// \$\$(INCLUDE) contains the current paths and can be used if
+ /// just a few need to be modified.
+ void set_include(List<Path> include);
+ };
+}};
+/* vim: set filetype=cpp : */
diff --git a/solenv/flatpak-manifest.in b/solenv/flatpak-manifest.in
new file mode 100644
index 000000000..9ed880565
--- /dev/null
+++ b/solenv/flatpak-manifest.in
@@ -0,0 +1,728 @@
+{
+ "id": "org.libreoffice.LibreOffice",
+ "runtime": "org.freedesktop.Platform",
+ "runtime-version": "22.08",
+ "sdk": "org.freedesktop.Sdk",
+ "sdk-extensions": [
+ "org.freedesktop.Sdk.Extension.openjdk11"
+ ],
+ "command": "libreoffice",
+ "modules": [
+ {
+ "name": "openjdk",
+ "buildsystem": "simple",
+ "build-commands": [
+ "/usr/lib/sdk/openjdk11/install.sh"
+ ]
+ },
+ {
+ "name": "gvfs",
+ "buildsystem": "meson",
+ "config-opts": [ "-Dsystemduserunitdir=no", "-Dtmpfilesdir=no", "-Dinstalled_tests=true",
+ "-Dadmin=false", "-Dafc=false", "-Dafp=false",
+ "-Darchive=false", "-Dcdda=false", "-Ddnssd=false", "-Dgoa=false", "-Dgoogle=false",
+ "-Dgphoto2=false", "-Dhttp=false", "-Dmtp=false", "-Dnfs=false", "-Dsftp=false", "-Dsmb=false",
+ "-Dudisks2=false", "-Dbluray=false", "-Dfuse=false", "-Dgcr=false", "-Dgcrypt=false",
+ "-Dgudev=false", "-Dkeyring=false", "-Dlogind=false", "-Dlibusb=false" ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://download.gnome.org/sources/gvfs/1.38/gvfs-1.38.1.tar.xz",
+ "sha256": "ed136a842c996d25c835da405c4775c77106b46470e75bdc242bdd59ec0d61a0"
+ }
+ ]
+ },
+ {
+ "name": "krb5",
+ "subdir": "src",
+ "config-opts": [
+ "--disable-static",
+ "--disable-rpath",
+ "--sbindir=/app/bin"
+ ],
+ "cleanup": [
+ "/include",
+ "/lib/pkgconfig",
+ "/var"
+ ],
+ "sources": [
+ {
+ "type": "archive",
+ "url": "https://kerberos.org/dist/krb5/1.16/krb5-1.16.2.tar.gz",
+ "sha256": "9f721e1fe593c219174740c71de514c7228a97d23eb7be7597b2ae14e487f027"
+ }
+ ]
+ },
+ {
+ "name": "libreoffice",
+ "sources": [
+ {
+ "type": "git",
+ "url": "https://gerrit.libreoffice.org/core",
+ "branch": "@BRANCH@",
+ "disable-fsckobjects": true
+ },
+ {
+ "type": "archive",
+ "url": "https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.5-bin.tar.xz",
+ "sha256": "cebb705dbbe26a41d359b8be08ec066caba4e8686670070ce44bbf2b57ae113f",
+ "dest": "ant"
+ },
+ {
+ "commands": [
+ "mkdir external/tarballs"
+ ],
+ "type": "shell"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@PDFIUM_TARBALL@",
+ "sha256": "@PDFIUM_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@PDFIUM_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@UCPP_TARBALL@",
+ "sha256": "@UCPP_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@UCPP_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@XMLSEC_TARBALL@",
+ "sha256": "@XMLSEC_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@XMLSEC_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_CALADEA_TARBALL@",
+ "sha256": "@FONT_CALADEA_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_CALADEA_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_CARLITO_TARBALL@",
+ "sha256": "@FONT_CARLITO_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_CARLITO_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/33e1e61fab06a547851ed308b4ffef42-dejavu-fonts-ttf-2.37.zip",
+ "sha256": "7576310b219e04159d35ff61dd4a4ec4cdba4f35c00e002a136f00e96a908b0a",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "33e1e61fab06a547851ed308b4ffef42-dejavu-fonts-ttf-2.37.zip"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_GENTIUM_TARBALL@",
+ "sha256": "@FONT_GENTIUM_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_GENTIUM_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_LIBERATION_NARROW_TARBALL@",
+ "sha256": "@FONT_LIBERATION_NARROW_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_LIBERATION_NARROW_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_LIBERATION_TARBALL@",
+ "sha256": "@FONT_LIBERATION_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_LIBERATION_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_LINLIBERTINEG_TARBALL@",
+ "sha256": "@FONT_LINLIBERTINEG_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_LINLIBERTINEG_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_SOURCECODE_TARBALL@",
+ "sha256": "@FONT_SOURCECODE_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_SOURCECODE_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_SOURCESANS_TARBALL@",
+ "sha256": "@FONT_SOURCESANS_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_SOURCESANS_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_SOURCESERIF_TARBALL@",
+ "sha256": "@FONT_SOURCESERIF_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_SOURCESERIF_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_EMOJIONE_COLOR_TARBALL@",
+ "sha256": "@FONT_EMOJIONE_COLOR_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_EMOJIONE_COLOR_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@BOOST_TARBALL@",
+ "sha256": "@BOOST_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@BOOST_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@CLUCENE_TARBALL@",
+ "sha256": "@CLUCENE_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@CLUCENE_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@COINMP_TARBALL@",
+ "sha256": "@COINMP_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@COINMP_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@CPPUNIT_TARBALL@",
+ "sha256": "@CPPUNIT_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@CPPUNIT_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FIREBIRD_TARBALL@",
+ "sha256": "@FIREBIRD_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FIREBIRD_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@GLM_TARBALL@",
+ "sha256": "@GLM_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@GLM_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@GPGME_TARBALL@",
+ "sha256": "@GPGME_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@GPGME_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@LIBASSUAN_TARBALL@",
+ "sha256": "@LIBASSUAN_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@LIBASSUAN_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@LIBGPGERROR_TARBALL@",
+ "sha256": "@LIBGPGERROR_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@LIBGPGERROR_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@ABW_TARBALL@",
+ "sha256": "@ABW_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@ABW_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@CDR_TARBALL@",
+ "sha256": "@CDR_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@CDR_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@LIBCMIS_TARBALL@",
+ "sha256": "@LIBCMIS_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@LIBCMIS_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@EBOOK_TARBALL@",
+ "sha256": "@EBOOK_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@EBOOK_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@ETONYEK_TARBALL@",
+ "sha256": "@ETONYEK_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@ETONYEK_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@LIBEXTTEXTCAT_TARBALL@",
+ "sha256": "@LIBEXTTEXTCAT_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@LIBEXTTEXTCAT_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FREEHAND_TARBALL@",
+ "sha256": "@FREEHAND_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FREEHAND_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@LANGTAGREG_TARBALL@",
+ "sha256": "@LANGTAGREG_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@LANGTAGREG_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@LIBLANGTAG_TARBALL@",
+ "sha256": "@LIBLANGTAG_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@LIBLANGTAG_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@MSPUB_TARBALL@",
+ "sha256": "@MSPUB_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@MSPUB_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@MWAW_TARBALL@",
+ "sha256": "@MWAW_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@MWAW_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@ODFGEN_TARBALL@",
+ "sha256": "@ODFGEN_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@ODFGEN_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@PAGEMAKER_TARBALL@",
+ "sha256": "@PAGEMAKER_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@PAGEMAKER_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@REVENGE_TARBALL@",
+ "sha256": "@REVENGE_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@REVENGE_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@STAROFFICE_TARBALL@",
+ "sha256": "@STAROFFICE_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@STAROFFICE_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@LIBTOMMATH_TARBALL@",
+ "sha256": "@LIBTOMMATH_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@LIBTOMMATH_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@VISIO_TARBALL@",
+ "sha256": "@VISIO_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@VISIO_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@WPD_TARBALL@",
+ "sha256": "@WPD_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@WPD_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@WPG_TARBALL@",
+ "sha256": "@WPG_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@WPG_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@WPS_TARBALL@",
+ "sha256": "@WPS_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@WPS_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@ZMF_TARBALL@",
+ "sha256": "@ZMF_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@ZMF_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@LPSOLVE_TARBALL@",
+ "sha256": "@LPSOLVE_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@LPSOLVE_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@MARIADB_CONNECTOR_C_TARBALL@",
+ "sha256": "@MARIADB_CONNECTOR_C_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@MARIADB_CONNECTOR_C_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@MDDS_TARBALL@",
+ "sha256": "@MDDS_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@MDDS_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_NOTO_TARBALL@",
+ "sha256": "@FONT_NOTO_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_NOTO_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@OPENLDAP_TARBALL@",
+ "sha256": "@OPENLDAP_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@OPENLDAP_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@ORCUS_TARBALL@",
+ "sha256": "@ORCUS_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@ORCUS_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@POPPLER_TARBALL@",
+ "sha256": "@POPPLER_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@POPPLER_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@POPPLER_DATA_TARBALL@",
+ "sha256": "@POPPLER_DATA_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@POPPLER_DATA_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@POSTGRESQL_TARBALL@",
+ "sha256": "@POSTGRESQL_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@POSTGRESQL_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@RAPTOR_TARBALL@",
+ "sha256": "@RAPTOR_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@RAPTOR_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/1f5def51ca0026cd192958ef07228b52-rasqal-0.9.33.tar.gz",
+ "sha256": "6924c9ac6570bd241a9669f83b467c728a322470bf34f4b2da4f69492ccfd97c",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "1f5def51ca0026cd192958ef07228b52-rasqal-0.9.33.tar.gz"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@REDLAND_TARBALL@",
+ "sha256": "@REDLAND_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@REDLAND_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_REEM_TARBALL@",
+ "sha256": "@FONT_REEM_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_REEM_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@EPUBGEN_TARBALL@",
+ "sha256": "@EPUBGEN_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@EPUBGEN_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@QXP_TARBALL@",
+ "sha256": "@QXP_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@QXP_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_ALEF_TARBALL@",
+ "sha256": "@FONT_ALEF_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_ALEF_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_AMIRI_TARBALL@",
+ "sha256": "@FONT_AMIRI_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_AMIRI_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_CULMUS_TARBALL@",
+ "sha256": "@FONT_CULMUS_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_CULMUS_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_LIBRE_HEBREW_TARBALL@",
+ "sha256": "@FONT_LIBRE_HEBREW_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_LIBRE_HEBREW_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_SCHEHERAZADE_TARBALL@",
+ "sha256": "@FONT_SCHEHERAZADE_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_SCHEHERAZADE_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@FONT_KACST_TARBALL@",
+ "sha256": "@FONT_KACST_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@FONT_KACST_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@BSH_TARBALL@",
+ "sha256": "@BSH_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@BSH_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_FLOW_ENGINE_TARBALL@",
+ "sha256": "@JFREEREPORT_FLOW_ENGINE_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_FLOW_ENGINE_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_FLUTE_TARBALL@",
+ "sha256": "@JFREEREPORT_FLUTE_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_FLUTE_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@HSQLDB_TARBALL@",
+ "sha256": "@HSQLDB_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@HSQLDB_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_LIBBASE_TARBALL@",
+ "sha256": "@JFREEREPORT_LIBBASE_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_LIBBASE_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_LIBFONTS_TARBALL@",
+ "sha256": "@JFREEREPORT_LIBFONTS_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_LIBFONTS_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_LIBFORMULA_TARBALL@",
+ "sha256": "@JFREEREPORT_LIBFORMULA_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_LIBFORMULA_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_LIBLAYOUT_TARBALL@",
+ "sha256": "@JFREEREPORT_LIBLAYOUT_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_LIBLAYOUT_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_LIBLOADER_TARBALL@",
+ "sha256": "@JFREEREPORT_LIBLOADER_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_LIBLOADER_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_LIBREPOSITORY_TARBALL@",
+ "sha256": "@JFREEREPORT_LIBREPOSITORY_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_LIBREPOSITORY_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_LIBSERIALIZER_TARBALL@",
+ "sha256": "@JFREEREPORT_LIBSERIALIZER_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_LIBSERIALIZER_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_LIBXML_TARBALL@",
+ "sha256": "@JFREEREPORT_LIBXML_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_LIBXML_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@RHINO_TARBALL@",
+ "sha256": "@RHINO_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@RHINO_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@JFREEREPORT_SAC_TARBALL@",
+ "sha256": "@JFREEREPORT_SAC_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@JFREEREPORT_SAC_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@SWING_TARBALL@",
+ "sha256": "@SWING_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@SWING_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@LIBNUMBERTEXT_TARBALL@",
+ "sha256": "@LIBNUMBERTEXT_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@LIBNUMBERTEXT_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@LIBATOMIC_OPS_TARBALL@",
+ "sha256": "@LIBATOMIC_OPS_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@LIBATOMIC_OPS_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@DRAGONBOX_TARBALL@",
+ "sha256": "@DRAGONBOX_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@DRAGONBOX_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@DTOA_TARBALL@",
+ "sha256": "@DTOA_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@DTOA_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@BOX2D_TARBALL@",
+ "sha256": "@BOX2D_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@BOX2D_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/src/@ZXING_TARBALL@",
+ "sha256": "@ZXING_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@ZXING_TARBALL@"
+ },
+ {
+ "url": "https://dev-www.libreoffice.org/extern/@OPENSYMBOL_TTF@",
+ "sha256": "@OPENSYMBOL_SHA256SUM@",
+ "type": "file",
+ "dest": "external/tarballs",
+ "dest-filename": "@OPENSYMBOL_TTF@"
+ }
+ ],
+ "buildsystem": "simple",
+ "build-commands": [
+ "./autogen.sh --prefix=/run/build/libreoffice/inst --with-distro=LibreOfficeFlatpak",
+ "make check",
+ "make distro-pack-install",
+ "make cmd cmd='$(SRCDIR)/solenv/bin/assemble-flatpak.sh'",
+ "printf '<?xml version=\"1.0\"?>\\n<oor:data xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:oor=\"http://openoffice.org/2001/registry\"><dependency file=\"main\"/><oor:component-data oor:name=\"Common\" oor:package=\"org.openoffice.Office\"><node oor:name=\"Misc\"><prop oor:name=\"UseOpenCL\"><value>false</value></prop></node></oor:component-data></oor:data>' >/app/libreoffice/share/registry/flatpak.xcd"
+ ]
+ }
+ ],
+ "add-extensions": {
+ "org.libreoffice.LibreOffice.BundledExtension": {
+ "directory": "libreoffice/share/extensions",
+ "subdirectories": true,
+ "no-autodownload": true,
+ "autodelete": true
+ },
+ "org.libreoffice.LibreOffice.Help": {
+ "directory": "libreoffice/help",
+ "bundle": true,
+ "autodelete": true,
+ "no-autodownload": true
+ }
+ },
+ "finish-args": [
+ "--share=network",
+ "--share=ipc",
+ "--socket=fallback-x11",
+ "--socket=wayland",
+ "--socket=pulseaudio",
+ "--device=dri",
+ "--filesystem=xdg-config/gtk-3.0",
+ "--filesystem=xdg-run/gvfsd",
+ "--filesystem=host",
+ "--env=GIO_EXTRA_MODULES=/app/lib/gio/modules",
+ "--env=JAVA_HOME=/app/jre",
+ "--env=LIBO_FLATPAK=1",
+ "--own-name=org.libreoffice.LibreOfficeIpc0",
+ "--talk-name=org.gtk.vfs.*",
+ "--talk-name=com.canonical.AppMenu.Registrar"
+ ]
+}
diff --git a/solenv/gbuild/AllLangHelp.mk b/solenv/gbuild/AllLangHelp.mk
new file mode 100644
index 000000000..32d38166d
--- /dev/null
+++ b/solenv/gbuild/AllLangHelp.mk
@@ -0,0 +1,172 @@
+# -*- 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/.
+#
+
+# class AllLangHelp
+
+# Creates and delivers all language versions of a module.
+
+gb_AllLangHelp_HELPDIRNAME := helpcontent2
+gb_AllLangHelp_AUXDIRNAME := auxiliary
+gb_AllLangHelp_HELPDIR := $(gb_AllLangHelp_HELPDIRNAME)/source
+gb_AllLangHelp_AUXDIR := $(gb_AllLangHelp_HELPDIR)/$(gb_AllLangHelp_AUXDIRNAME)
+
+gb_AllLangHelp__get_helpname = $(1)/$(2)
+
+ifneq ($(ENABLE_HTMLHELP),)
+$(call gb_AllLangHelp_get_helpfiles_target,%): | \
+ $(dir $(call gb_AllLangHelp_get_helpfiles_target,%)).dir
+ touch $@
+endif
+
+$(dir $(call gb_AllLangHelp_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_AllLangHelp_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_AllLangHelp_get_target,%) :
+ifeq ($(ENABLE_HTMLHELP),)
+ $(call gb_Output_announce,$*,$(true),ALH,5)
+ $(call gb_Trace_MakeMark,$*,ALH)
+endif
+ touch $@
+
+$(call gb_AllLangHelp_get_clean_target,%) :
+ifeq ($(ENABLE_HTMLHELP),)
+ $(call gb_Output_announce,$*,$(false),ALH,5)
+endif
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_AllLangHelp_get_target,$*) $(call gb_AllLangHelp_get_helpfiles_target,$*) \
+ )
+
+# gb_AllLangHelp_AllLangHelp__one_lang module lang helpname
+define gb_AllLangHelp_AllLangHelp__one_lang
+$(call gb_HelpTarget_HelpTarget,$(3),$(1),$(2))
+$(call gb_HelpTarget_set_helpdir,$(3),$(gb_AllLangHelp_HELPDIR))
+
+$(call gb_AllLangHelp_get_target,$(1)) : $(call gb_HelpTarget_get_target,$(3))
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_AllLangHelp_get_target,$(1)) : $(call gb_Package_get_target,$(call gb_HelpTarget_get_packagename,$(3)))
+endif
+$(call gb_AllLangHelp_get_clean_target,$(1)) : $(call gb_HelpTarget_get_clean_target,$(3))
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_AllLangHelp_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(call gb_HelpTarget_get_packagename,$(3)))
+endif
+
+endef
+
+# Create and deliver help packs for a module for all languages.
+#
+# gb_AllLangHelp_AllLangHelp module
+gb_AllLangHelp_ALLTARGETS :=
+
+define gb_AllLangHelp_AllLangHelp
+gb_AllLangHelp_ALLTARGETS += $(1)
+$(foreach lang,$(gb_HELP_LANGS),\
+ $(call gb_AllLangHelp_AllLangHelp__one_lang,$(1),$(lang),$(call gb_AllLangHelp__get_helpname,$(1),$(lang))))
+
+$(call gb_AllLangHelp_get_target,$(1)) :| $(dir $(call gb_AllLangHelp_get_target,$(1))).dir
+
+$$(eval $$(call gb_Module_register_target,$(call gb_AllLangHelp_get_target,$(1)),$(call gb_AllLangHelp_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),AllLangHelp)
+
+endef
+
+# gb_AllLangHelp_set_treefile module treefile
+define gb_AllLangHelp_set_treefile
+$(foreach lang,$(gb_HELP_LANGS),\
+ $(call gb_HelpTarget_set_treefile,$(call gb_AllLangHelp__get_helpname,$(1),$(lang)),$(2),$(gb_AllLangHelp_HELPDIR)/text) \
+)
+
+endef
+
+# Add one or more help files.
+#
+# gb_AllLangHelp_add_helpfiles module file(s) [optional bookmark token]
+define gb_AllLangHelp_add_helpfiles
+$(foreach lang,$(gb_HELP_LANGS),\
+ $(call gb_HelpTarget_add_helpfiles,$(call gb_AllLangHelp__get_helpname,$(1),$(lang)),$(2)) \
+)
+ifneq ($(ENABLE_HTMLHELP),)
+gb_AllLangHelp_$(1)_HELPFILES += $(addsuffix .xhp,$(2))
+gb_AllLangHelp_$(or $(3),$(1))_BOOKMARK_HELPFILES += $(addsuffix .xhp,$(2))
+$(call gb_AllLangHelp_get_helpfiles_target,$(1)): $(addprefix $(SRCDIR)/,$(addsuffix .xhp,$(2)))
+endif
+
+endef
+
+# Add additional localized file(s) to the help pack.
+#
+# gb_AllLangHelp_add_localized_files module basedir file(s)
+define gb_AllLangHelp_add_localized_files
+$(foreach lang,$(gb_HELP_LANGS),\
+ $(call gb_HelpTarget_add_files,$(call gb_AllLangHelp__get_helpname,$(1),$(lang)),$(addprefix $(2)/$(lang)/,$(3))) \
+)
+
+endef
+
+# Add a localized file from helpdir under a new name.
+#
+# This is a hack needed for err.html in shared help module.
+#
+# gb_AllLangHelp_add_helpdir_file module filename file
+define gb_AllLangHelp_add_helpdir_file
+$(foreach lang,$(gb_HELP_LANGS),\
+ $(call gb_HelpTarget_add_helpdir_file,$(call gb_AllLangHelp__get_helpname,$(1),$(lang)),$(2),$(3)) \
+)
+
+endef
+
+# gb_AllLangHelp__use_module module other-module lang
+define gb_AllLangHelp__use_module
+$(call gb_HelpTarget_use_module,$(call gb_AllLangHelp__get_helpname,$(1),$(3)),$(call gb_AllLangHelp__get_helpname,$(2),$(3)))
+
+endef
+
+# Use references from another help module's files.
+#
+# gb_AllLangHelp_use_module module other-module
+define gb_AllLangHelp_use_module
+$(foreach lang,$(gb_HELP_LANGS),$(call gb_AllLangHelp__use_module,$(1),$(2),$(lang)))
+
+endef
+
+# Use references from other help modules' files.
+#
+# gb_AllLangHelp_use_module module other-module(s)
+define gb_AllLangHelp_use_modules
+$(foreach module,$(2),$(call gb_AllLangHelp_use_module,$(1),$(module)))
+
+endef
+
+# gb_AllLangHelp__use_linked_module module other-module lang
+define gb_AllLangHelp__use_linked_module
+$(call gb_HelpTarget_use_linked_module,$(call gb_AllLangHelp__get_helpname,$(1),$(3)),$(call gb_AllLangHelp__get_helpname,$(2),$(3)))
+$(call gb_HelpTarget_set_indexed,$(call gb_AllLangHelp__get_helpname,$(1),$(3)))
+$(call gb_HelpTarget_set_configfile,$(call gb_AllLangHelp__get_helpname,$(1),$(3)),$(gb_AllLangHelp_AUXDIR)/$(3)/$(1))
+
+endef
+
+# Link with another help module.
+#
+# gb_AllLangHelp_use_linked_module module other-module
+define gb_AllLangHelp_use_linked_module
+$(foreach lang,$(gb_HELP_LANGS),$(call gb_AllLangHelp__use_linked_module,$(1),$(2),$(lang)))
+
+endef
+
+# Link with other help module(s).
+#
+# gb_AllLangHelp_use_linked_module module other-module(s)
+define gb_AllLangHelp_use_linked_modules
+$(foreach module,$(2),$(call gb_AllLangHelp_use_linked_module,$(1),$(module)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/AllLangMoTarget.mk b/solenv/gbuild/AllLangMoTarget.mk
new file mode 100644
index 000000000..ec05985d5
--- /dev/null
+++ b/solenv/gbuild/AllLangMoTarget.mk
@@ -0,0 +1,100 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# Overview of dependencies and tasks of AllLangMoTarget
+#
+# target task depends on
+# AllLangMoTarget nothing MoTarget for all active langs
+# MoTarget running msgfmt
+
+# MoTarget
+
+$(call gb_MoTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),RES,2)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f \
+ $(call gb_MoTarget_get_target,$*) \
+ $(call gb_MoTarget_get_install_target,$*))
+
+$(call gb_MoTarget_get_target,%) : $(gb_Helper_MISCDUMMY)
+ $(call gb_Output_announce,$*,$(true),MO ,2)
+ $(call gb_Trace_StartRange,$*,MO )
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ $(MSGUNIQ) --force-po $(gb_POLOCATION)/$(LANGUAGE)/$(POLOCATION)/messages.po | $(MSGFMT) - -o $@)
+ $(call gb_Trace_EndRange,$*,MO )
+
+#$(info $(call gb_MoTarget_get_target,$(1)))
+define gb_MoTarget_MoTarget
+$(call gb_MoTarget_get_target,$(1)) : LIBRARY = $(2)
+$(call gb_MoTarget_get_target,$(1)) : LANGUAGE = $(3)
+$(call gb_MoTarget_get_target,$(1)) : POLOCATION = $(2)
+$(call gb_AllLangMoTarget_get_clean_target,$(2)) : $(call gb_MoTarget_get_clean_target,$(1))
+
+endef
+
+define gb_MoTarget_set_polocation
+$(call gb_MoTarget_get_target,$(1)) : POLOCATION = $(2)
+
+endef
+
+# AllLangMoTarget
+
+gb_AllLangMoTarget_LANGS := $(filter-out qtz,$(filter-out en-US,$(gb_WITH_LANG)))
+
+define gb_AllLangMoTarget_set_langs
+gb_AllLangMoTarget_LANGS := $(1)
+endef
+
+$(call gb_AllLangMoTarget_get_clean_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_AllLangMoTarget_get_target,$*))
+
+$(call gb_AllLangMoTarget_get_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && touch $@)
+
+gb_MoTarget_get_install_target = $(INSTROOT)/$(LIBO_SHARE_RESOURCE_FOLDER)/$(1).mo
+
+define gb_AllLangMoTarget_AllLangMoTarget
+ifeq (,$$(filter $(1),$$(gb_AllLangMoTarget_REGISTERED)))
+$$(eval $$(call gb_Output_info,Currently known AllLangMoTargets are: $(sort $(gb_AllLangMoTarget_REGISTERED)),ALL))
+$$(eval $$(call gb_Output_error,AllLangMoTarget $(1) must be registered in Repository.mk))
+endif
+$(foreach lang,$(gb_AllLangMoTarget_LANGS),\
+ $(call gb_MoTarget_MoTarget,$(1)$(lang),$(1),$(lang)))
+
+$(foreach lang,$(gb_AllLangMoTarget_LANGS),\
+$(call gb_Helper_install,$(call gb_AllLangMoTarget_get_target,$(1)), \
+ $(call gb_MoTarget_get_install_target,$(shell $(SRCDIR)/solenv/bin/localestr $(lang))/LC_MESSAGES/$(1)), \
+ $(call gb_MoTarget_get_target,$(1)$(lang))))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_AllLangMoTarget_get_target,$(1)),$(call gb_AllLangMoTarget_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),AllLangMoTarget)
+$(call gb_Postprocess_register_target,AllResources,AllLangMoTarget,$(1))
+
+endef
+
+define gb_AllLangMoTarget_set_polocation
+$(foreach lang,$(gb_AllLangMoTarget_LANGS),\
+ $(call gb_MoTarget_set_polocation,$(1)$(lang),$(2)))
+
+endef
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/AllLangPackage.mk b/solenv/gbuild/AllLangPackage.mk
new file mode 100644
index 000000000..092716b37
--- /dev/null
+++ b/solenv/gbuild/AllLangPackage.mk
@@ -0,0 +1,124 @@
+# -*- 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/.
+#
+
+# AllLangPackage class
+
+# Handles creation of a bunch of packages with content dependent on
+# language. The package files are placed into $(INSTROOT).
+
+gb_AllLangPackage_LANGS := $(if $(strip $(gb_WITH_LANG)),$(gb_WITH_LANG),en-US)
+
+$(dir $(call gb_AllLangPackage_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_AllLangPackage_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),ALP,3)
+ $(call gb_Trace_MakeMark,$*,ALP)
+ touch $@
+
+.PHONY : $(call gb_AllLangPackage_get_clean_target,%)
+$(call gb_AllLangPackage_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),ALP,3)
+ rm -f $(call gb_AllLangPackage_get_target,$*)
+
+# Define a new package group.
+#
+# gb_AllLangPackage_AllLangPackage group srcdir
+define gb_AllLangPackage_AllLangPackage
+$(foreach lang,$(gb_AllLangPackage_LANGS),$(call gb_AllLangPackage__AllLangPackage_onelang,$(1),$(1)_$(lang),$(2)))
+
+$(call gb_AllLangPackage_get_target,$(1)) :| $(dir $(call gb_AllLangPackage_get_target,$(1))).dir
+
+$$(eval $$(call gb_Module_register_target,$(call gb_AllLangPackage_get_target,$(1)),$(call gb_AllLangPackage_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),AllLangPackage)
+
+endef
+
+# Define a package for one lang.
+#
+# gb_AllLangPackage__AllLangPackage_lang group package srcdir
+define gb_AllLangPackage__AllLangPackage_onelang
+$(call gb_Package_Package_internal,$(2),$(3))
+$(call gb_AllLangPackage_get_target,$(1)) : $(call gb_Package_get_target,$(2))
+$(call gb_AllLangPackage_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(2))
+
+endef
+
+# gb_AllLangPackage__add_to_package target package destination source
+define gb_AllLangPackage__add_to_package
+$(call gb_Package_add_file,$(2),$(3),$(4))
+
+endef
+
+# gb_AllLangPackage__add_file target destination source lang
+define gb_AllLangPackage__add_file
+$(if $(filter $(4),$(gb_AllLangPackage_LANGS)),$(call gb_AllLangPackage__add_to_package,$(1),$(1)_$(4),$(2),$(3)))
+
+endef
+
+# Add a file to one of the child packages.
+#
+# If 'lang' is empty, the language is taken from the first component of the 'source' file name. The
+# file is only added if there is a package defined for the language
+# (i.e., if we are building with the language).
+#
+# gb_AllLangPackage_add_file target destination source lang
+gb_AllLangPackage_ALLDIRS :=
+define gb_AllLangPackage_add_file
+gb_AllLangPackage_ALLDIRS := $(sort $(gb_AllLangPackage_ALLDIRS) $(patsubst %$(3),%,$(2)))
+$(call gb_AllLangPackage__add_file,$(1),$(2),$(3),$(or $(4),$(firstword $(subst /, ,$(3)))))
+
+endef
+
+# Add several files to the child packages at once.
+#
+# gb_AllLangPackage_add_files target destination-dir file(s)
+define gb_AllLangPackage_add_files
+$(if $(strip $(2)),,$(call gb_Output_error,gb_AllLangPackage_add_files: destination dir cannot be empty))
+$(foreach file,$(3),$(call gb_AllLangPackage_add_file,$(1),$(2)/$(file),$(file)))
+
+endef
+
+# gb_AllLangPackage_add_files_for_lang target lang destination-dir file(s)
+define gb_AllLangPackage_add_files_for_lang
+$(if $(strip $(3)),,$(call gb_Output_error,gb_AllLangPackage_add_files: destination dir cannot be empty))
+$(foreach file,$(4),$(call gb_AllLangPackage_add_file,$(1),$(3)/$(file),$(file),$(2)))
+
+endef
+
+# Add several files to the child packages at once.
+#
+# The files are placed into subdir under the language-dependent path.
+#
+# Example:
+# $(eval $(call # gb_AllLangPackage_add_files_with_subdir,foo,destdir,subdir,cs/file.ext))
+# # -> destdir/cs/subdir/file.ext
+#
+# gb_AllLangPackage_add_files_with_subdir target destination-dir subdir file(s)
+define gb_AllLangPackage_add_files_with_subdir
+$(if $(strip $(2)),,$(call gb_Output_error,gb_AllLangPackage_add_files_with_subdir: destination dir cannot be empty))
+$(if $(strip $(3)),,$(call gb_Output_error,gb_AllLangPackage_add_files_with_subdir: there is no subdir, just use gb_AllLangPackage_add_files))
+$(foreach file,$(4),$(call gb_AllLangPackage_add_file,$(1),$(2)/$(dir $(file))$(3)/$(notdir $(file)),$(file)))
+
+endef
+
+# Use unpacked tarball.
+#
+# gb_AllLangPackage_add_dependency target unpacked
+define gb_AllLangPackage_use_unpacked
+$(foreach lang,$(gb_AllLangPackage_LANGS),$(call gb_Package_use_unpacked,$(1)_$(lang),$(2)))
+
+endef
+
+define gb_AllLangPackage_use_customtarget
+$(foreach lang,$(gb_AllLangPackage_LANGS),$(call gb_Package_use_customtarget,$(1)_$(lang),$(2)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/AutoInstall.mk b/solenv/gbuild/AutoInstall.mk
new file mode 100644
index 000000000..aee2750e9
--- /dev/null
+++ b/solenv/gbuild/AutoInstall.mk
@@ -0,0 +1,76 @@
+# -*- 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/.
+#
+
+# AutoInstall class
+
+$(dir $(call gb_AutoInstall_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_AutoInstall_get_target,%) : $(GBUILDDIR)/AutoInstall.mk \
+ $(SRCDIR)/Repository.mk $(SRCDIR)/RepositoryExternal.mk \
+ $(BUILDDIR)/config_host.mk \
+ $(GBUILDDIR)/gen-autoinstall.py \
+ $(call gb_ExternalExecutable_get_dependencies,python)
+ $(call gb_Output_announce,$*,$(true),AIN,3)
+ $(call gb_Trace_StartRange,$*,AIN)
+ SDKLIBFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,\
+ $(foreach lib,$(gb_SdkLinkLibrary_MODULE_$*),\
+ $(lib) \
+ $(notdir $(call gb_Library_get_sdk_link_lib,$(lib))) \
+ ../../program/$(call gb_Library_get_runtime_filename,$(lib)))) \
+ && LIBFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,\
+ $(foreach lib,$(gb_Library_MODULE_$*),\
+ $(lib) \
+ $(call gb_Library_get_runtime_filename,$(lib)))) \
+ && EXEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,\
+ $(foreach exe,$(gb_Executable_MODULE_$*),\
+ $(exe) \
+ $(call gb_Executable_get_filename,$(exe)))) \
+ && JARFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(gb_Jar_MODULE_$*)) \
+ && PKGFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(gb_Package_MODULE_$*)) \
+ && $(call gb_ExternalExecutable_get_command,python) \
+ $(GBUILDDIR)/gen-autoinstall.py \
+ '$*' '$(SCP2COMPONENTCONDITION)' \
+ '$(SCP2LIBTEMPLATE)' '$(SCP2EXETEMPLATE)' '$(SCP2JARTEMPLATE)' \
+ '$(SCP2PKGTEMPLATE)' \
+ $${SDKLIBFILE} $${LIBFILE} $${EXEFILE} $${JARFILE} $${PKGFILE} \
+ > $@ \
+ && rm -f $${SDKLIBFILE} $${LIBFILE} $${EXEFILE} $${JARFILE} $${PKGFILE}
+ $(call gb_Trace_EndRange,$*,AIN)
+
+
+$(call gb_AutoInstall_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),AIL,3)
+ rm -f $(call gb_AutoInstall_get_target,$*)
+
+define gb_AutoInstall_AutoInstall
+$(call gb_AutoInstall_get_target,all) :| $(dir $(call gb_AutoInstall_get_target,all)).dir
+
+$$(eval $$(call gb_Module_register_target,$(call gb_AutoInstall_get_target,all),$(call gb_AutoInstall_get_clean_target,all)))
+$(call gb_Helper_make_userfriendly_targets,all,AutoInstall)
+
+endef
+
+# gb_AutoInstall_add_module module lib_template exe_template jar_template package_template componentcondition
+define gb_AutoInstall_add_module
+$(call gb_AutoInstall_get_target,all) : $(call gb_AutoInstall_get_target,$(1))
+$(call gb_AutoInstall_get_clean_target,all) : $(call gb_AutoInstall_get_clean_target,$(1))
+$(call gb_Helper_make_userfriendly_targets,$(1),AutoInstall)
+
+$(call gb_AutoInstall_get_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+$(call gb_AutoInstall_get_target,$(1)) :| $(dir $(call gb_AutoInstall_get_target,$(1))).dir
+$(call gb_AutoInstall_get_target,$(1)) : SCP2LIBTEMPLATE := $(2)
+$(call gb_AutoInstall_get_target,$(1)) : SCP2EXETEMPLATE := $(3)
+$(call gb_AutoInstall_get_target,$(1)) : SCP2JARTEMPLATE := $(4)
+$(call gb_AutoInstall_get_target,$(1)) : SCP2PKGTEMPLATE := $(5)
+$(call gb_AutoInstall_get_target,$(1)) : SCP2COMPONENTCONDITION := $(6)
+
+endef
+
+# vim: set shiftwidth=4 tabstop=4 noexpandtab:
diff --git a/solenv/gbuild/CliAssembly.mk b/solenv/gbuild/CliAssembly.mk
new file mode 100644
index 000000000..9c97e036f
--- /dev/null
+++ b/solenv/gbuild/CliAssembly.mk
@@ -0,0 +1,209 @@
+# -*- 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/.
+#
+
+# CliConfigTarget class
+
+gb_CliConfigTarget_TARGET := $(SRCDIR)/solenv/bin/clipatchconfig.pl
+gb_CliConfigTarget_COMMAND := $(PERL) -w $(gb_CliConfigTarget_TARGET)
+
+define gb_CliConfigTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ $(gb_CliConfigTarget_COMMAND) $(3) $(CLI_CONFIG_VERSIONFILE) $(1) \
+)
+endef
+
+$(dir $(call gb_CliConfigTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CliConfigTarget_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),CPA,1)
+ $(call gb_Trace_StartRange,$*,CPA)
+ $(call gb_CliConfigTarget__command,$@,$*,$<)
+ $(call gb_Trace_EndRange,$*,CPA)
+
+$(call gb_CliConfigTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),CPA,1)
+ rm -f $(call gb_CliConfigTarget_get_target,$*)
+
+# Subst. variables in a config file
+#
+# gb_CliConfigTarget_CliConfigTarget target source
+define gb_CliConfigTarget_CliConfigTarget
+$(call gb_CliConfigTarget_get_target,$(1)) : CLI_CONFIG_VERSIONFILE := $(3)
+
+$(call gb_CliConfigTarget_get_target,$(1)) : $(2)
+$(call gb_CliConfigTarget_get_target,$(1)) : $(gb_CliConfigTarget_TARGET)
+$(call gb_CliConfigTarget_get_target,$(1)) : $(3)
+$(call gb_CliConfigTarget_get_target,$(1)) :| $(dir $(call gb_CliConfigTarget_get_target,$(1))).dir
+
+endef
+
+# CliAssemblyTarget class
+
+# platform:
+# CliAssemblyTarget_POLICYEXT
+# CliAssemblyTarget_get_dll
+
+gb_CliAssemblyTarget_KEYFILE_DEFAULT := $(SRCDIR)/cli_ure/source/cliuno.snk
+
+define gb_CliAssemblyTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ $(GNUCOPY) $(CLI_ASSEMBLY_KEYFILE) $(1).tmp.snk && \
+ al \
+ -nologo \
+ -out:$(CLI_ASSEMBLY_OUTFILE) \
+ -version:$(CLI_ASSEMBLY_VERSION) \
+ -keyfile:$(1).tmp.snk \
+ -link:$(CLI_ASSEMBLY_CONFIGFILE) \
+ $(if $(CLI_ASSEMBLY_PLATFORM),-platform:$(CLI_ASSEMBLY_PLATFORM)) && \
+ rm -f $(1).tmp.snk && \
+ touch $(1) \
+)
+endef
+
+$(dir $(call gb_CliAssemblyTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_CliAssemblyTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CliAssemblyTarget_get_target,%) :
+ $(if $(strip $(CLI_ASSEMBLY_VERSION)),,$(call gb_Output_error,assembly version not set))
+ $(if $(strip $(CLI_ASSEMBLY_CONFIGFILE)),,$(call gb_Output_error,assembly configuration file not set))
+ $(if $(strip $(CLI_ASSEMBLY_OUTFILE)),,$(call gb_Output_error,assembly name not set))
+ $(call gb_Output_announce,$*,$(true),AL ,2)
+ $(call gb_Trace_StartRange,$*,AL )
+ $(call gb_CliAssemblyTarget__command,$@,$*,$<)
+ $(call gb_Trace_EndRange,$*,AL )
+
+$(call gb_CliAssemblyTarget_get_assembly_target,%) :
+ touch $@
+
+.PHONY : $(call gb_CliAssemblyTarget_get_clean_target,%)
+$(call gb_CliAssemblyTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),AL ,2)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_CliAssemblyTarget_get_target,$*) $(CLI_ASSEMBLY_OUTFILE) \
+ )
+
+# Create a CLI assembly
+define gb_CliAssemblyTarget_CliAssemblyTarget
+$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_CONFIGFILE :=
+$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_KEYFILE := $(gb_CliAssemblyTarget_KEYFILE_DEFAULT)
+$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_OUTFILE :=
+$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_PLATFORM :=
+$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_VERSION :=
+
+$(call gb_CliAssemblyTarget_get_clean_target,$(1)) : CLI_ASSEMBLY_OUTFILE :=
+
+$(call gb_CliAssemblyTarget_get_target,$(1)) :| $(dir $(call gb_CliAssemblyTarget_get_target,$(1))).dir
+
+endef
+
+define gb_CliAssemblyTarget_set_configfile
+$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_CONFIGFILE := $(2)
+$(call gb_CliAssemblyTarget_get_target,$(1)) : $(2)
+$(call gb_CliAssemblyTarget_get_clean_target,$(1)) : $(3)
+
+endef
+
+define gb_CliAssemblyTarget_set_keyfile
+$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_KEYFILE := $(2)
+$(call gb_CliAssemblyTarget_get_target,$(1)) : $(2)
+
+endef
+
+define gb_CliAssemblyTarget_set_name
+$(call gb_CliAssemblyTarget_get_target,$(1)) \
+$(call gb_CliAssemblyTarget_get_clean_target,$(1)) : \
+ CLI_ASSEMBLY_OUTFILE := $(call gb_CliAssemblyTarget_get_assembly_target,$(2))
+$(call gb_CliAssemblyTarget_get_assembly_target,$(2)) : $(call gb_CliAssemblyTarget_get_target,$(1))
+
+endef
+
+define gb_CliAssemblyTarget_set_platform
+$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_PLATFORM := $(2)
+
+endef
+
+define gb_CliAssemblyTarget_set_version
+$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_VERSION := $(2)
+
+endef
+
+# CliAssembly class
+
+gb_CliAssembly_KEYFILE_DEFAULT := $(gb_CliAssemblyTarget_KEYFILE_DEFAULT)
+gb_CliAssembly_POLICYEXT := $(gb_CliAssemblyTarget_POLICYEXT)
+
+gb_CliAssembly_get_dll = $(call gb_CliAssemblyTarget_get_dll,$(1))
+
+$(call gb_CliAssembly_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),CLA,3)
+ $(call gb_Trace_MakeMark,$*,CLA)
+ mkdir -p $(dir $@) && touch $@
+
+.PHONY : $(call gb_CliAssembly_get_clean_target,%)
+$(call gb_CliAssembly_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),CLA,3)
+ rm -f $(call gb_CliAssembly_get_target,$*)
+
+# call gb_CliAssembly_CliAssembly,dllname,dlltarget
+define gb_CliAssembly_CliAssembly
+$(call gb_CliAssemblyTarget_CliAssemblyTarget,$(1))
+$(call gb_Package_Package_internal,$(1)_assembly,$(WORKDIR))
+$(call gb_Package_set_outdir,$(1)_assembly,$(dir $(2)))
+
+$(call gb_CliAssembly_get_target,$(1)) : $(call gb_CliAssemblyTarget_get_target,$(1))
+$(call gb_CliAssembly_get_target,$(1)) :| $(call gb_Package_get_target,$(1)_assembly)
+$(call gb_CliAssembly_get_clean_target,$(1)) : $(call gb_CliAssemblyTarget_get_clean_target,$(1))
+$(call gb_CliAssembly_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(1)_assembly)
+
+endef
+
+define gb_CliAssembly__add_file
+$(call gb_Package_add_file,$(1)_assembly,$(notdir $(2)),$(subst $(WORKDIR)/,,$(2)))
+
+endef
+
+define gb_CliAssembly__set_configfile_impl
+$(call gb_CliAssemblyTarget_set_configfile,$(1),$(2),$(3))
+$(call gb_CliAssembly__add_file,$(1),$(2))
+
+endef
+
+define gb_CliAssembly__set_configfile
+$(call gb_CliConfigTarget_CliConfigTarget,$(2),$(3),$(4))
+$(call gb_CliAssembly__set_configfile_impl,$(1),$(call gb_CliConfigTarget_get_target,$(2)),$(call gb_CliConfigTarget_get_clean_target,$(2)))
+
+endef
+
+define gb_CliAssembly_set_configfile
+$(call gb_CliAssembly__set_configfile,$(1),$(patsubst %_config,%,$(2)),$(SRCDIR)/$(2),$(SRCDIR)/$(3))
+
+endef
+
+define gb_CliAssembly_set_keyfile
+$(call gb_CliAssemblyTarget_set_keyfile,$(1),$(2))
+
+endef
+
+define gb_CliAssembly_set_platform
+$(call gb_CliAssemblyTarget_set_platform,$(1),$(2))
+
+endef
+
+define gb_CliAssembly_set_policy
+$(call gb_CliAssemblyTarget_set_version,$(1),$(3))
+$(call gb_CliAssemblyTarget_set_name,$(1),$(2))
+$(call gb_CliAssembly__add_file,$(1),$(call gb_CliAssemblyTarget_get_assembly_target,$(2)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/CliLibrary.mk b/solenv/gbuild/CliLibrary.mk
new file mode 100644
index 000000000..4abd34b42
--- /dev/null
+++ b/solenv/gbuild/CliLibrary.mk
@@ -0,0 +1,148 @@
+# -*- 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/.
+#
+
+# CliLibrary class
+
+gb_CliLibrary_EXT := $(gb_CliAssembly_POLICYEXT)
+
+gb_CliLibrary_CSCFLAGS := \
+ -noconfig \
+ -nologo \
+
+gb_CliLibrary_CSCFLAGS_DEBUG := \
+ -checked+ \
+ -define:DEBUG \
+ -define:TRACE \
+
+ifeq ($(strip $(debug)),)
+ifeq ($(strip $(ENABLE_DBGUTIL)),TRUE)
+gb_CliLibrary__get_csflags = $(gb_CliLibrary_CSCFLAGS) $(gb_CliLibrary_CSCFLAGS_DEBUG)
+else
+gb_CliLibrary__get_csflags = $(gb_CliLibrary_CSCFLAGS) -o
+endif
+else
+gb_CliLibrary__get_csflags = $(gb_CliLibrary_CSCFLAGS) $(gb_CliLibrary_CSCFLAGS_DEBUG) -debug+
+endif
+
+gb_CliLibrary__get_source = $(SRCDIR)/$(1).cs
+gb_CliLibrary__get_generated_source = $(WORKDIR)/$(1).cs
+
+# csc has silly problems handling files passed on command line
+define gb_CliLibrary__command
+ csc \
+ $(call gb_CliLibrary__get_csflags) \
+ $(CLI_CSCFLAGS) \
+ -target:library \
+ -out:$(1) \
+ $(if $(call gb_target_symbols_enabled,$(1)),\
+ -debug:pdbonly \
+ -pdb:$(call gb_LinkTarget__get_pdb_filename,$(WORKDIR)/LinkTarget/Library/$(notdir $(1)))) \
+ -keyfile:$(CLI_KEYFILE) \
+ -reference:System.dll \
+ $(foreach assembly,$(CLI_ASSEMBLIES),-reference:$(assembly)) \
+ $(subst /,\,$(CLI_SOURCES)) \
+
+
+endef
+
+.PHONY : $(call gb_CliLibrary_get_clean_target,%)
+$(call gb_CliLibrary_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),CSC,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_CliLibrary_get_target,$*) \
+ )
+
+
+# Compiles one or more C# source files
+#
+# gb_CliLibrary_CliLibrary target
+define gb_CliLibrary_CliLibrary
+$(call gb_CliAssembly_CliAssembly,$(1),$(call gb_CliLibrary_get_target,$(1)))
+
+$(call gb_CliLibrary_get_target,$(1)) : CLI_ASSEMBLIES :=
+$(call gb_CliLibrary_get_target,$(1)) : CLI_SOURCES :=
+$(call gb_CliLibrary_get_target,$(1)) : CLI_CSCFLAGS :=
+$(call gb_CliLibrary_get_target,$(1)) : CLI_KEYFILE :=
+
+
+$(call gb_CliLibrary_get_target,$(1)) :| $(call gb_CliAssembly_get_target,$(1))
+$(call gb_CliLibrary_get_target,$(1)) :| $(dir $(call gb_CliLibrary_get_target,$(1))).dir
+$(call gb_CliLibrary_get_clean_target,$(1)) : $(call gb_CliAssembly_get_clean_target,$(1))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_CliLibrary_get_target,$(1)),$(call gb_CliLibrary_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),CliLibrary)
+
+$(call gb_CliLibrary_get_target,$(1)) :
+ $$(call gb_Output_announce,$(1),$(true),CSC,3)
+ $$(call gb_Trace_StartRange,$(1),CSC)
+ $$(call gb_CliLibrary__command,$$@,$(1))
+ $$(call gb_Trace_EndRange,$(1),CSC)
+
+endef
+
+define gb_CliLibrary_set_configfile
+$(call gb_CliAssembly_set_configfile,$(1),$(2),$(3))
+
+endef
+
+define gb_CliLibrary_set_keyfile
+$(call gb_CliLibrary_get_target,$(1)) : CLI_KEYFILE := $(2)
+$(call gb_CliAssembly_set_keyfile,$(1),$(2))
+
+endef
+
+define gb_CliLibrary_set_policy
+$(call gb_CliAssembly_set_policy,$(1),$(2),$(3))
+
+endef
+
+define gb_CliLibrary_use_assembly
+$(call gb_CliLibrary_get_target,$(1)) : CLI_ASSEMBLIES += $(call gb_CliLibrary_get_target,$(2))
+$(call gb_CliLibrary_get_target,$(1)) : $(call gb_CliLibrary_get_target,$(2))
+
+endef
+
+define gb_CliLibrary_use_assemblies
+$(foreach assembly,$(2),$(call gb_CliLibrary_use_assembly,$(1),$(assembly)))
+
+endef
+
+# Add a source file to compile
+define gb_CliLibrary_add_csfile
+$(call gb_CliLibrary_get_target,$(1)) : CLI_SOURCES += $(call gb_CliLibrary__get_source,$(2))
+$(call gb_CliLibrary_get_target,$(1)) : $(call gb_CliLibrary__get_source,$(2))
+
+endef
+
+# Add source files to compile
+define gb_CliLibrary_add_csfiles
+$(foreach csfile,$(2),$(call gb_CliLibrary_add_csfile,$(1),$(csfile)))
+
+endef
+
+# Add a generated source file to compile
+define gb_CliLibrary_add_generated_csfile
+$(call gb_CliLibrary_get_target,$(1)) : CLI_SOURCES += $(call gb_CliLibrary__get_generated_source,$(2))
+$(call gb_CliLibrary_get_target,$(1)) : $(call gb_CliLibrary__get_generated_source,$(2))
+
+endef
+
+# Add generated source files to compile
+define gb_CliLibrary_add_generated_csfiles
+$(foreach csfile,$(2),$(call gb_CliLibrary_add_generated_csfile,$(1),$(csfile)))
+
+endef
+
+# Add flags used for compilation
+define gb_CliLibrary_add_csflags
+$(call gb_CliLibrary_get_target,$(1)) : CLI_CSCFLAGS += $(2)
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/CliNativeLibrary.mk b/solenv/gbuild/CliNativeLibrary.mk
new file mode 100644
index 000000000..9e19ccd70
--- /dev/null
+++ b/solenv/gbuild/CliNativeLibrary.mk
@@ -0,0 +1,111 @@
+# -*- 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/.
+#
+
+# CliNativeLibrary class
+
+gb_CliNativeLibrary_PLATFORM_DEFAULT := x86
+gb_CliNativeLibrary_EXT := $(gb_CliAssembly_POLICYEXT)
+
+gb_CliNativeLibrary__get_library = $(call gb_CliAssembly_get_dll,$(1))
+
+define gb_CliNativeLibrary__command
+$(call gb_Helper_abbreviate_dirs,\
+ $(GNUCOPY) $(CLI_NATIVE_LIBRARY) $(1).tmp && \
+ sn -R $(1).tmp $(CLI_NATIVE_KEYFILE) && \
+ mv $(1).tmp $(1) \
+)
+endef
+
+$(call gb_CliNativeLibrary_get_preparation_target,%) :
+ mkdir -p $(dir $@) && touch $@
+
+.PHONY : $(call gb_CliNativeLibrary_get_clean_target,%)
+$(call gb_CliNativeLibrary_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),SN ,4)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(call gb_CliNativeLibrary_get_target,$*) \
+ $(call gb_CliNativeLibrary_get_preparation_target,$*) \
+ )
+
+
+# Create a CLI library for a native library
+#
+# CliNativeLibrary target
+define gb_CliNativeLibrary_CliNativeLibrary
+$(call gb_CliAssembly_CliAssembly,$(1),$(call gb_CliNativeLibrary_get_target,$(1)))
+
+$(call gb_CliNativeLibrary_get_target,$(1)) : CLI_NATIVE_ASSEMBLIES := $(gb_Helper_MISCDUMMY)
+$(call gb_CliNativeLibrary_get_target,$(1)) : CLI_NATIVE_KEYFILE :=
+$(call gb_CliNativeLibrary_get_target,$(1)) : CLI_NATIVE_LIBRARY :=
+
+
+$(call gb_CliNativeLibrary_set_keyfile,$(1),$(gb_CliAssembly_KEYFILE_DEFAULT))
+$(call gb_CliAssembly_set_platform,$(1),$(gb_CliNativeLibrary_PLATFORM_DEFAULT))
+
+$(call gb_CliNativeLibrary_get_target,$(1)) :| $(call gb_CliAssembly_get_target,$(1))
+$(call gb_CliNativeLibrary_get_target,$(1)) :| $(dir $(call gb_CliNativeLibrary_get_target,$(1))).dir
+$(call gb_CliNativeLibrary_get_clean_target,$(1)) : $(call gb_CliAssembly_get_clean_target,$(1))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_CliNativeLibrary_get_target,$(1)),$(call gb_CliNativeLibrary_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),CliNativeLibrary)
+
+$(call gb_CliNativeLibrary_get_target,$(1)) :
+ $$(call gb_Output_announce,$(1),$(true),SN ,4)
+ $$(call gb_Trace_StartRange,$(1),SN )
+ $$(call gb_CliNativeLibrary__command,$$@,$(1))
+ $$(call gb_Trace_EndRange,$(1),SN )
+
+endef
+
+define gb_CliNativeLibrary_set_configfile
+$(call gb_CliAssembly_set_configfile,$(1),$(2),$(3))
+
+endef
+
+define gb_CliNativeLibrary_set_keyfile
+$(call gb_CliAssembly_set_keyfile,$(1),$(2))
+$(call gb_CliNativeLibrary_get_target,$(1)) : CLI_NATIVE_KEYFILE := $(2)
+$(call gb_CliNativeLibrary_get_target,$(1)) : $(2)
+
+endef
+
+define gb_CliNativeLibrary_set_platform
+$(call gb_CliAssembly_set_platform,$(1),$(2))
+
+endef
+
+define gb_CliNativeLibrary_set_policy
+$(call gb_CliAssembly_set_policy,$(1),$(2),$(3))
+
+endef
+
+define gb_CliNativeLibrary_wrap_library
+$(call gb_CliNativeLibrary_get_target,$(1)) : \
+ CLI_NATIVE_LIBRARY := $(call gb_CliNativeLibrary__get_library,$(2))
+$(call gb_CliNativeLibrary_get_target,$(1)) : \
+ $(call gb_Library_get_target,$(2))
+$(call gb_Library_get_headers_target,$(2)) : \
+ $(call gb_CliNativeLibrary_get_preparation_target,$(1))
+
+endef
+
+define gb_CliNativeLibrary_use_assembly
+$(call gb_CliNativeLibrary_get_target,$(1)) : \
+ CLI_NATIVE_ASSEMBLIES += $(call gb_CliLibrary_get_target,$(2))
+$(call gb_CliNativeLibrary_get_preparation_target,$(1)) : \
+ $(call gb_CliLibrary_get_target,$(2))
+
+endef
+
+define gb_CliNativeLibrary_use_assemblies
+$(foreach assembly,$(2),$(call gb_CliNativeLibrary_use_assembly,$(1),$(assembly)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/CliUnoApi.mk b/solenv/gbuild/CliUnoApi.mk
new file mode 100644
index 000000000..db8401d0c
--- /dev/null
+++ b/solenv/gbuild/CliUnoApi.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/.
+#
+
+# CliUnoApi class
+
+gb_CliUnoApi_EXT := $(gb_CliAssembly_POLICYEXT)
+
+gb_CliUnoApi_KEYFILE_DEFAULT := $(gb_CliAssembly_KEYFILE_DEFAULT)
+
+gb_CliUnoApi_DEPS := $(call gb_Executable_get_runtime_dependencies,climaker)
+gb_CliUnoApi_COMMAND := $(call gb_Executable_get_command,climaker)
+
+define gb_CliUnoApi__command
+$(call gb_Helper_abbreviate_dirs,\
+ $(gb_CliUnoApi_COMMAND) \
+ --out $(1) \
+ --assembly-company "LibreOffice" \
+ --assembly-description "This assembly contains metadata for the LibreOffice API." \
+ --assembly-version $(CLI_UNOAPI_VERSION) \
+ --keyfile $(CLI_UNOAPI_KEYFILE) \
+ $(if $(gb_VERBOSE),--verbose) \
+ $(foreach api,$(CLI_UNOAPI_DEPS),-X $(api)) \
+ $(foreach assembly,$(CLI_UNOAPI_ASSEMBLIES),-r $(assembly)) \
+ $(CLI_UNOAPI_API) \
+)
+endef
+
+.PHONY : $(call gb_CliUnoApi_get_clean_target,%)
+$(call gb_CliUnoApi_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),CLI,4)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_CliUnoApi_get_target,$*) \
+ )
+
+
+# Create a CLI library for UNO API
+#
+# gb_CliUnoApi_CliUnoApi target
+define gb_CliUnoApi_CliUnoApi
+$(call gb_CliAssembly_CliAssembly,$(1),$(call gb_CliUnoApi_get_target,$(1)))
+
+$(call gb_CliUnoApi_get_target,$(1)) : CLI_UNOAPI_API :=
+$(call gb_CliUnoApi_get_target,$(1)) : CLI_UNOAPI_ASSEMBLIES :=
+$(call gb_CliUnoApi_get_target,$(1)) : CLI_UNOAPI_DEPS :=
+$(call gb_CliUnoApi_get_target,$(1)) : CLI_UNOAPI_KEYFILE :=
+$(call gb_CliUnoApi_get_target,$(1)) : CLI_UNOAPI_VERSION :=
+
+$(call gb_CliUnoApi_set_keyfile,$(1),$(gb_CliUnoApi_KEYFILE_DEFAULT))
+
+$(call gb_CliUnoApi_get_target,$(1)) :| $(call gb_CliAssembly_get_target,$(1))
+$(call gb_CliUnoApi_get_target,$(1)) :| $(dir $(call gb_CliUnoApi_get_target,$(1))).dir
+$(call gb_CliUnoApi_get_clean_target,$(1)) : $(call gb_CliAssembly_get_clean_target,$(1))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_CliUnoApi_get_target,$(1)),$(call gb_CliUnoApi_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),CliUnoApi)
+
+
+$(call gb_CliUnoApi_get_target,$(1)) : $(gb_CliUnoApi_DEPS)
+ $$(call gb_Output_announce,$(1),$(true),CLI,4)
+ $$(call gb_Trace_StartRange,$(1),CLI)
+ $$(call gb_CliUnoApi__command,$$@,$(1))
+ $$(call gb_Trace_EndRange,$(1),CLI)
+
+endef
+
+define gb_CliUnoApi_set_configfile
+$(call gb_CliAssembly_set_configfile,$(1),$(2),$(3))
+
+endef
+
+define gb_CliUnoApi_set_keyfile
+$(call gb_CliAssembly_set_keyfile,$(1),$(2))
+$(call gb_CliUnoApi_get_target,$(1)) : CLI_UNOAPI_KEYFILE := $(2)
+$(call gb_CliUnoApi_get_target,$(1)) : $(2)
+
+endef
+
+define gb_CliUnoApi_set_assembly_version
+$(call gb_CliUnoApi_get_target,$(1)) : CLI_UNOAPI_VERSION := $(2)
+
+endef
+
+define gb_CliUnoApi_set_policy
+$(call gb_CliAssembly_set_policy,$(1),$(2),$(3))
+
+endef
+
+define gb_CliUnoApi_wrap_api
+$(call gb_CliUnoApi_get_target,$(1)) : CLI_UNOAPI_API := $(call gb_UnoApiTarget_get_target,$(2))
+$(call gb_CliUnoApi_get_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(2))
+
+endef
+
+define gb_CliUnoApi__use_api
+$(call gb_CliUnoApi_get_target,$(1)) : CLI_UNOAPI_DEPS += $(2)
+$(call gb_CliUnoApi_get_target,$(1)) : $(2)
+
+endef
+
+define gb_CliUnoApi_use_api
+$(foreach api,$(2),$(call gb_CliUnoApi__use_api,$(1),$(call gb_UnoApiTarget_get_target,$(api))))
+
+endef
+
+define gb_CliUnoApi_use_assembly
+$(call gb_CliUnoApi_get_target,$(1)) : CLI_UNOAPI_ASSEMBLIES += $(call gb_CliUnoApi_get_target,$(2))
+$(call gb_CliUnoApi_get_target,$(1)) : $(call gb_CliUnoApi_get_target,$(2))
+
+endef
+
+define gb_CliUnoApi_use_assemblies
+$(foreach assembly,$(2),$(call gb_CliUnoApi_use_assembly,$(1),$(assembly)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/CompilerTest.mk b/solenv/gbuild/CompilerTest.mk
new file mode 100644
index 000000000..fb5150f2c
--- /dev/null
+++ b/solenv/gbuild/CompilerTest.mk
@@ -0,0 +1,53 @@
+# -*- 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/.
+#
+
+define gb_CompilerTest_CompilerTest
+$(call gb_CompilerTest__CompilerTest_impl,$(1),$(call gb_CompilerTest_get_linktarget,$(1)))
+
+endef
+
+# call gb_CompilerTest__CompilerTest_impl,compilertest,linktarget
+define gb_CompilerTest__CompilerTest_impl
+$(call gb_LinkTarget_LinkTarget,$(2),CompilerTest_$(1),NONE)
+$(call gb_LinkTarget_set_targettype,$(2),CompilerTest)
+$(call gb_LinkTarget_get_target,$(2)): COMPILER_TEST := $(true)
+$(call gb_LinkTarget_get_target,$(2)): ENABLE_WERROR := $(true)
+$(call gb_CompilerTest_get_target,$(1)): $(call gb_LinkTarget_get_target,$(2))
+$(call gb_CompilerTest_get_clean_target,$(1)): $(call gb_LinkTarget_get_clean_target,$(2))
+$$(eval $$(call gb_Module_register_target,$(call gb_CompilerTest_get_target,$(1)),$(call gb_CompilerTest_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),CompilerTest)
+
+endef
+
+# forward the call to the gb_LinkTarget implementation
+# (note: because the function name is in $(1), the other args are shifted by 1)
+define gb_CompilerTest__forward_to_Linktarget
+$(call gb_LinkTarget_$(subst gb_CompilerTest_,,$(1)),$(call gb_CompilerTest_get_linktarget,$(2)),$(3),$(4),CompilerTest_$(2))
+
+endef
+
+# copy pasta for forwarding: this could be (and was) done more elegantly, but
+# these here can be found by both git grep and ctags
+gb_CompilerTest_add_cobject = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_cobjects = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_cxxobject = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_cxxobjects = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_exception_objects = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_objcobject = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_objcobjects = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_objcxxobject = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_objcxxobjects = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_cxxclrobject = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_cxxclrobjects = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_add_cxxflags = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_set_external_code = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_use_externals = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CompilerTest_use_udk_api = $(call gb_CompilerTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/ComponentTarget.mk b/solenv/gbuild/ComponentTarget.mk
new file mode 100644
index 000000000..d317f1b05
--- /dev/null
+++ b/solenv/gbuild/ComponentTarget.mk
@@ -0,0 +1,109 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+gb_ComponentTarget__ALLCOMPONENTS :=
+
+gb_ComponentTarget_XSLT_CREATE_COMPONENT := $(SRCDIR)/solenv/bin/createcomponent.xslt
+gb_ComponentTarget_XSLT_DUMP_OPTIONALS := $(SRCDIR)/solenv/bin/optionalimplementations.xslt
+gb_ComponentTarget_get_source = $(SRCDIR)/$(1).component
+
+# Some comment on the prerequisite handling for gb_ComponentTarget__command:
+# The whole setup feels - once again - much more complicated then it should be; for an IMHO simple task.
+# We can't just add all the $(call gb_ComponentTarget_get_target,%).* target commands to gb_ComponentTarget__command,
+# because $(shell cat $(1).filtered) is then evaluated too early, cat'ing a non-existing file.
+# Same happens if you add them to a gb_ComponentTarget__pre_command, run before the gb_ComponentTarget__command.
+# The various other "macros" add new rules to "expand" the pattern rules with normal rules and prerequisites.
+# As a result, the files from the pattern rules aren't cleaned up automagically, which I consider a plus point.
+# So the intermediate files must be explicitly added to $(call gb_ComponentTarget_get_clean_target,%).
+
+# In the DISABLE_DYNLOADING case we don't need any COMPONENTPREFIX, we
+# put just the static library filename into the uri parameter. For
+# each statically linked app using some subset of LO components, there
+# is a mapping from library filenames to direct pointers to the
+# corresponding PREFIX_component_getFactory functions.
+define gb_ComponentTarget__command
+$(if $(LIBFILENAME),,$(call gb_Output_error,No LIBFILENAME set at component target: $(1)))
+ $(call gb_ExternalExecutable_get_command,xsltproc) --nonet \
+ --stringparam uri '$(if $(filter TRUE,$(DISABLE_DYNLOADING)),,$(subst \d,$$,$(COMPONENTPREFIX)))$(LIBFILENAME)' \
+ --stringparam cppu_env $(CPPU_ENV) \
+ --stringparam filtered '$(shell cat $(1).filtered)' \
+ -o $(1) $(gb_ComponentTarget_XSLT_CREATE_COMPONENT) $(COMPONENTSOURCE)
+endef
+
+$(call gb_ComponentTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),CMP,1)
+ rm -f $(call gb_ComponentTarget_get_target,$*) \
+ $(call gb_ComponentTarget_get_target,$*).filtered \
+ $(call gb_ComponentTarget_get_target,$*).optionals \
+
+$(call gb_ComponentTarget_get_target,%).dir:
+ mkdir -p $(dir $@)
+
+# %.optionals : list of all optional implementations marked <optional/> in the component file
+$(call gb_ComponentTarget_get_target,%).optionals : \
+ $(gb_ComponentTarget_XSLT_DUMP_OPTIONALS) \
+ | $(call gb_ComponentTarget_get_target,%).dir \
+ $(call gb_ExternalExecutable_get_dependencies,xsltproc)
+ $(call gb_ExternalExecutable_get_command,xsltproc) --nonet \
+ $(gb_ComponentTarget_XSLT_DUMP_OPTIONALS) $(COMPONENTSOURCE) > $@ 2>&1
+
+# %.filtered : list of all optional implementations we don't build
+.PRECIOUS: $(call gb_ComponentTarget_get_target,%).filtered
+$(call gb_ComponentTarget_get_target,%).filtered : $(call gb_ComponentTarget_get_target,%).optionals
+ cat $< $(COMPONENTIMPL) | sed -e '/^#\|^\s*$$/d' | sort | uniq -u > $@
+
+# when a library is renamed, the component file needs to be rebuilt to match.
+# hence simply depend on Repository{,Fixes}.mk since the command runs quickly.
+$(call gb_ComponentTarget_get_target,%) : \
+ $(SRCDIR)/Repository.mk \
+ $(SRCDIR)/RepositoryFixes.mk \
+ $(gb_ComponentTarget_XSLT_CREATE_COMPONENT) \
+ $(call gb_ComponentTarget_get_target,%).filtered \
+ | $(call gb_ExternalExecutable_get_dependencies,xsltproc)
+ $(call gb_Output_announce,$*,$(true),CMP,1)
+ $(call gb_Trace_StartRange,$*,CMP)
+ $(call gb_ComponentTarget__command,$@)
+ $(call gb_Trace_EndRange,$*,CMP)
+
+define gb_ComponentTarget_ComponentTarget
+$(call gb_ComponentTarget_get_target,$(1)) : COMPONENTPREFIX := $(2)
+$(call gb_ComponentTarget_get_target,$(1)) : LIBFILENAME := $(3)
+$(call gb_ComponentTarget_get_target,$(1)) : COMPONENTSOURCE := $(call gb_ComponentTarget_get_source,$(patsubst CppunitTest/%,%,$(1)))
+$(call gb_ComponentTarget_get_target,$(1)) : COMPONENTIMPL :=
+
+$(call gb_ComponentTarget_get_target,$(1)) : $(call gb_ComponentTarget_get_source,$(patsubst CppunitTest/%,%,$(1)))
+$(call gb_ComponentTarget_get_target,$(1)).optionals : $(call gb_ComponentTarget_get_source,$(patsubst CppunitTest/%,%,$(1)))
+
+$(call gb_Helper_make_userfriendly_targets,$(1),ComponentTarget,$(call gb_ComponentTarget_get_target,$(1)))
+
+ifneq ($(4),)
+$$(eval $$(call gb_Rdb_add_component,$(4),$(1)))
+endif
+$(if $(4),$(eval gb_ComponentTarget__ALLCOMPONENTS += $(1)))
+
+endef
+
+# call gb_ComponentTarget_add_componentimpl,componentfile,implid
+define gb_ComponentTarget_add_componentimpl
+$(call gb_ComponentTarget_get_target,$(1)) : COMPONENTIMPL += $(call gb_ComponentTarget_get_source,$(1)).$(2)
+$(call gb_ComponentTarget_get_target,$(1)).filtered : $(call gb_ComponentTarget_get_source,$(1)).$(2)
+
+endef
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/Conditions.mk b/solenv/gbuild/Conditions.mk
new file mode 100644
index 000000000..0a7b88969
--- /dev/null
+++ b/solenv/gbuild/Conditions.mk
@@ -0,0 +1,39 @@
+# -*- 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/.
+#
+
+# IMPORTANT NOTE: make sure, the "else" part works as expected. This normally
+# means, that the condition ends with "$(1),$(2))" or the reverse. It should
+# just end in two (!) braces, otherwise you may need to use either the $(1)
+# or the $(2) multiple times.
+
+define gb_CondExeLockfile
+$(if $(and $(filter-out ANDROID MACOSX iOS WNT,$(OS))),$(1),$(2))
+endef
+
+define gb_CondExeRegistryTools
+$(if $(or $(DISABLE_DYNLOADING),$(ENABLE_MACOSX_SANDBOX)),$(2),$(1))
+endef
+
+define gb_CondExeSp2bv
+$(if $(and $(filter WNT,$(OS)),$(call gb_Helper_optionals_and,DESKTOP ODK,$(true))),$(1),$(2))
+endef
+
+define gb_CondExeUno
+$(if $(and $(filter DESKTOP,$(BUILD_TYPE)),$(if $(DISABLE_DYNLOADING),,$(true))),$(1),$(2))
+endef
+
+define gb_CondExeUnopkg
+$(if $(and $(filter DESKTOP,$(BUILD_TYPE)),$(if $(DISABLE_DYNLOADING),,$(true))),$(1),$(2))
+endef
+
+define gb_CondLibSalTextenc
+$(if $(or $(filter ANDROID,$(OS)),$(DISABLE_DYNLOADING)),$(2),$(1))
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/Configuration.mk b/solenv/gbuild/Configuration.mk
new file mode 100644
index 000000000..5459b9132
--- /dev/null
+++ b/solenv/gbuild/Configuration.mk
@@ -0,0 +1,456 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# Configuration files: a bit of an overview of the targets:
+#
+# Configuration
+# => XcsTarget: schemas
+# => buildtools
+# => Xcs source
+# => XcuDataTarget: data
+# => buildtools
+# => XcsTarget (schema)
+# => Xcu data source
+# => XcuModuleTaret: modules
+# => buildtools
+# => Xcu data source
+# => XcuLangpackTarget: langpack (per lang)
+# => buildtools
+# => Xcu data source
+# => XcuResTarget: resources (per lang)
+# => buildtools
+# => XcuMergeTarget: merge
+# => buildtools (cfgex)
+# => Xcu data source
+# => *.po
+# => XcsTarget (schema)
+
+# The main LibreOffice registry (cf. officecfg/Configuration_officecfg.mk):
+gb_Configuration_PRIMARY_REGISTRY_NAME := registry
+gb_Configuration_PRIMARY_REGISTRY_SCHEMA_ROOT = \
+ $(SRCDIR)/officecfg/registry/schema
+
+gb_Configuration__stringparam_schemaRoot = --stringparam schemaRoot \
+ $(if $(PRIMARY_REGISTRY), \
+ $(gb_Configuration_PRIMARY_REGISTRY_SCHEMA_ROOT), \
+ $(call gb_XcsTarget_get_target,))
+
+gb_Configuration_XSLTCOMMAND = $(call gb_ExternalExecutable_get_command,xsltproc)
+gb_Configuration_XSLTCOMMAND_DEPS = $(call gb_ExternalExecutable_get_dependencies,xsltproc)
+
+# XcsTarget class
+
+# need to locate a schema file corresponding to some XCU file in the outdir
+define gb_XcsTarget_for_XcuTarget
+$(call gb_XcsTarget_get_target,$(basename $(1)).xcs)
+endef
+
+gb_Configuration_LANGS := en-US $(filter-out en-US,$(gb_WITH_LANG))
+
+gb_XcsTarget_XSLT_SchemaVal := $(SRCDIR)/officecfg/util/schema_val.xsl
+gb_XcsTarget_XSLT_Sanity := $(SRCDIR)/officecfg/util/sanity.xsl
+gb_XcsTarget_XSLT_SchemaTrim := $(SRCDIR)/officecfg/util/schema_trim.xsl
+gb_XcsTarget_DTD_Schema := $(SRCDIR)/officecfg/registry/component-schema.dtd
+
+define gb_XcsTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && \
+ $(gb_Configuration_XSLTCOMMAND) --nonet \
+ --noout \
+ --stringparam componentName $(subst /,.,$(basename $(2))) \
+ --stringparam root $(subst $(2),,$(3)) \
+ $(gb_Configuration__stringparam_schemaRoot) \
+ $(gb_XcsTarget_XSLT_SchemaVal) \
+ $(3) && \
+ $(gb_Configuration_XSLTCOMMAND) --nonet \
+ --noout \
+ $(gb_XcsTarget_XSLT_Sanity) \
+ $(3) && \
+ $(gb_Configuration_XSLTCOMMAND) --nonet \
+ -o $(1) \
+ --stringparam LIBO_SHARE_FOLDER $(LIBO_SHARE_FOLDER) \
+ --stringparam LIBO_SHARE_HELP_FOLDER $(LIBO_SHARE_HELP_FOLDER) \
+ $(gb_XcsTarget_XSLT_SchemaTrim) \
+ $(3))
+endef
+
+$(call gb_XcsTarget_get_target,%) : \
+ $(gb_XcsTarget_XSLT_SchemaVal) $(gb_XcsTarget_XSLT_Sanity) \
+ $(gb_XcsTarget_XSLT_SchemaTrim) $(gb_XcsTarget_DTD_Schema) \
+ | $(gb_Configuration_XSLTCOMMAND_DEPS)
+ $(call gb_Output_announce,$*,$(true),XCS,1)
+ $(call gb_Trace_StartRange,$*,XCS)
+ $(call gb_XcsTarget__command,$@,$*,$(filter %.xcs,$^))
+ $(call gb_Trace_EndRange,$*,XCS)
+
+$(call gb_XcsTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),XCS,1)
+ rm -f $(call gb_XcsTarget_get_target,$*)
+
+
+# XcuDataTarget class
+
+gb_XcuTarget_XSLT_AllLang := $(SRCDIR)/officecfg/util/alllang.xsl
+gb_XcuDataTarget_XSLT_DataVal := $(SRCDIR)/officecfg/util/data_val.xsl
+gb_XcuDataTarget_DTD_ComponentUpdate := $(SRCDIR)/officecfg/registry/component-update.dtd
+
+define gb_XcuDataTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && \
+ $(gb_Configuration_XSLTCOMMAND) --nonet \
+ --noout \
+ --stringparam xcs $(call gb_XcsTarget_for_XcuTarget,$(XCUFILE)) \
+ $(gb_Configuration__stringparam_schemaRoot) \
+ --path $(SRCDIR)/officecfg/registry \
+ $(gb_XcuDataTarget_XSLT_DataVal) \
+ $(3) && \
+ $(gb_Configuration_XSLTCOMMAND) --nonet \
+ -o $(1) \
+ --stringparam xcs $(call gb_XcsTarget_for_XcuTarget,$(XCUFILE)) \
+ $(gb_Configuration__stringparam_schemaRoot) \
+ --stringparam LIBO_SHARE_FOLDER $(LIBO_SHARE_FOLDER) \
+ --stringparam LIBO_SHARE_HELP_FOLDER $(LIBO_SHARE_HELP_FOLDER) \
+ --path $(SRCDIR)/officecfg/registry \
+ $(gb_XcuTarget_XSLT_AllLang) \
+ $(3))
+endef
+
+$(call gb_XcuDataTarget_get_target,%) : $(gb_XcuDataTarget_XSLT_DataVal) \
+ $(gb_XcuTarget_XSLT_AllLang) $(gb_XcuDataTarget_DTD_ComponentUpdate) \
+ | $(gb_Configuration_XSLTCOMMAND_DEPS)
+ $(call gb_Output_announce,$*,$(true),XCU,2)
+ $(call gb_Trace_StartRange,$*,XCU)
+ $(call gb_XcuDataTarget__command,$@,$*,$(filter %.xcu,$^))
+ $(call gb_Trace_EndRange,$*,XCU)
+
+$(call gb_XcuDataTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),XCU,2)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_XcuDataTarget_get_target,$*))
+
+
+# XcuModuleTarget class
+
+define gb_XcuDataSource_for_XcuModuleTarget
+$(SRCDIR)/$(basename $(subst -,.,$(basename $(1)))).xcu
+endef
+
+define gb_XcsTarget_for_XcuModuleTarget
+$(call gb_XcsTarget_get_target,$(basename $(subst -,.,$(basename $(1)))).xcs)
+endef
+
+define gb_XcuModuleTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && \
+ $(gb_Configuration_XSLTCOMMAND) --nonet \
+ -o $(1) \
+ --stringparam xcs $(4) \
+ $(gb_Configuration__stringparam_schemaRoot) \
+ --stringparam module $(notdir $(subst -,/,$(basename $(notdir $(2))))) \
+ --stringparam LIBO_SHARE_FOLDER $(LIBO_SHARE_FOLDER) \
+ --stringparam LIBO_SHARE_HELP_FOLDER $(LIBO_SHARE_HELP_FOLDER) \
+ $(gb_XcuTarget_XSLT_AllLang) \
+ $(3))
+endef
+
+$(call gb_XcuModuleTarget_get_target,%) : $(gb_XcuTarget_XSLT_AllLang) \
+ | $(gb_Configuration_XSLTCOMMAND_DEPS)
+ $(if $(filter %.xcu,$^),,$(error There is no target $(call gb_XcuModuleTarget_get_target,$*)))
+ $(call gb_Output_announce,$*,$(true),XCM,3)
+ $(call gb_Trace_StartRange,$*,XCM)
+ $(call gb_XcuModuleTarget__command,$@,$*,$(filter %.xcu,$^),$(filter %.xcs,$^))
+ $(call gb_Trace_EndRange,$*,XCM)
+
+$(call gb_XcuModuleTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),XCM,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_XcuModuleTarget_get_target,$*))
+
+
+# XcuLangpackTarget class
+
+gb_XcuLangpackTarget__get_name_with_lang = $(basename $(1))-$(2)$(suffix $(1))
+
+gb_XcuLangpackTarget__get_target_with_lang = \
+ $(call gb_XcuLangpackTarget_get_target,$(call gb_XcuLangpackTarget__get_name_with_lang,$(1),$(2)))
+
+gb_XcuLangpackTarget_SED_delcomment := $(SRCDIR)/officecfg/util/delcomment.sed
+
+define gb_XcuLangpackTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && \
+ sed -e "s/__LANGUAGE__/$(LANGUAGE)/" -f $(gb_XcuLangpackTarget_SED_delcomment)\
+ $(3) > $(1))
+endef
+
+$(call gb_XcuLangpackTarget_get_target,%) : \
+ $(gb_XcuLangpackTarget_SED_delcomment)
+ $(call gb_Output_announce,$*,$(true),XCL,1)
+ $(call gb_Trace_StartRange,$*,XCL)
+ $(call gb_XcuLangpackTarget__command,$@,$*,$(filter %.tmpl,$^))
+ $(call gb_Trace_EndRange,$*,XCL)
+
+$(call gb_XcuLangpackTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),XCL,1)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(foreach lang,$(gb_Configuration_LANGS),\
+ $(call gb_XcuLangpackTarget__get_target_with_lang,$*,$(lang))))
+
+
+# XcuMergeTarget class
+
+gb_XcuMergeTarget_CFGEXDEPS := $(call gb_Executable_get_runtime_dependencies,cfgex)
+gb_XcuMergeTarget_CFGEXCOMMAND := $(call gb_Executable_get_command,cfgex)
+
+define gb_XcuMergeTarget__command
+MERGEINPUT=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(POFILES)) && \
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && \
+ $(gb_XcuMergeTarget_CFGEXCOMMAND) \
+ -i $(3) \
+ -o $(1) \
+ -m $${MERGEINPUT} \
+ -l all) && \
+rm -rf $${MERGEINPUT}
+
+endef
+
+$(call gb_XcuMergeTarget_get_target,%) : $(gb_XcuMergeTarget_CFGEXDEPS)
+ $(if $(filter $(words $(POFILES)),$(words $(wildcard $(POFILES)))),\
+ $(call gb_Output_announce,$*,$(true),XCX,1) \
+ $(call gb_Trace_StartRange,$*,XCX) \
+ $(call gb_XcuMergeTarget__command,$@,$*,$(filter %.xcu,$^)),\
+ $(call gb_Trace_EndRange,$*,XCX) \
+ mkdir -p $(dir $@) && cp $(filter %.xcu,$^) $@)
+
+$(call gb_XcuMergeTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),XCX,1)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_XcuMergeTarget_get_target,$*))
+
+# $(call gb_XcuMergeTarget_XcuMergeTarget,target,configuration,prefix,xcufile)
+define gb_XcuMergeTarget_XcuMergeTarget
+$(call gb_XcuMergeTarget_get_target,$(1)) : \
+ $(SRCDIR)/$(3)/$(4) \
+ $(wildcard $(foreach lang,$(gb_TRANS_LANGS),$(gb_POLOCATION)/$(lang)/$(patsubst %/,%,$(dir $(1))).po))
+$(call gb_XcuMergeTarget_get_target,$(1)) : \
+ POFILES := $(foreach lang,$(gb_TRANS_LANGS),$(gb_POLOCATION)/$(lang)/$(patsubst %/,%,$(dir $(1))).po)
+$(foreach lang,$(gb_TRANS_LANGS),$(gb_POLOCATION)/$(lang)/$(patsubst %/,%,$(dir $(1))).po) :
+endef
+
+
+# XcuResTarget class
+
+# locale is extracted from the stem (parameter $(2))
+define gb_XcuResTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && \
+ $(gb_Configuration_XSLTCOMMAND) --nonet \
+ -o $(1) \
+ --stringparam xcs $(call gb_XcsTarget_for_XcuTarget,$(XCUFILE)) \
+ $(gb_Configuration__stringparam_schemaRoot) \
+ --stringparam locale $(word 2,$(subst /, ,$(2))) \
+ --stringparam LIBO_SHARE_FOLDER $(LIBO_SHARE_FOLDER) \
+ --stringparam LIBO_SHARE_HELP_FOLDER $(LIBO_SHARE_HELP_FOLDER) \
+ --path $(SRCDIR)/officecfg/registry \
+ $(gb_XcuTarget_XSLT_AllLang) \
+ $(3))
+endef
+
+$(call gb_XcuResTarget_get_target,%) : $(gb_XcuTarget_XSLT_AllLang) \
+ | $(gb_Configuration_XSLTCOMMAND_DEPS)
+ $(call gb_Output_announce,$*,$(true),XCR,2)
+ $(call gb_Trace_StartRange,$*,XCR)
+ $(call gb_XcuResTarget__command,$@,$*,$(filter %.xcu,$^))
+ $(call gb_Trace_EndRange,$*,XCR)
+
+$(call gb_XcuResTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),XCR,2)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_XcuResTarget_get_target,$*))
+
+# $(call gb_XcuResTarget_XcuResTarget,target,configuration,prefix,xcufile,lang)
+# this depends either on the source or on the merge target (if WITH_LANG)
+define gb_XcuResTarget_XcuResTarget
+ifeq ($(strip $(gb_WITH_LANG)),)
+$(call gb_XcuResTarget_get_target,$(1)) : $(SRCDIR)/$(3)/$(4)
+else
+$(call gb_XcuResTarget_get_target,$(1)) : \
+ $(call gb_XcuMergeTarget_get_target,$(3)/$(4))
+endif
+$(call gb_XcuResTarget_get_target,$(1)) : \
+ $(call gb_XcsTarget_for_XcuTarget,$(4))
+$(call gb_XcuResTarget_get_target,$(1)) : PRIMARY_REGISTRY := $(filter $(2),$(gb_Configuration_PRIMARY_REGISTRY_NAME))
+$(call gb_XcuResTarget_get_target,$(1)) : XCUFILE := $(4)
+endef
+
+
+# Configuration class
+
+$(call gb_Configuration_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),CFG,4)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_Configuration_get_target,$*) $(call gb_Configuration_get_preparation_target,$*))
+
+$(call gb_Configuration_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),CFG,4)
+ $(call gb_Trace_MakeMark,$*,CFG)
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && touch $@)
+
+$(call gb_Configuration_get_preparation_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && touch $@)
+
+# $(call gb_Configuration_Configuration,configuration,nodeliver)
+# last parameter may be used to turn off delivering of files
+# FIXME: not anymore, no files are delivered now
+define gb_Configuration_Configuration
+$(eval gb_Configuration_NODELIVER_$(1) := $(2))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_Configuration_get_target,$(1)),$(call gb_Configuration_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Configuration)
+
+endef
+
+# $(call gb_Configuration_add_schema,configuration,prefix,xcsfile)
+# hopefully extensions do not need to add schemas with same name as officecfg
+define gb_Configuration_add_schema
+$(call gb_Configuration_get_clean_target,$(1)) : \
+ $(call gb_XcsTarget_get_clean_target,$(3))
+$(call gb_XcsTarget_get_target,$(3)) : \
+ $(SRCDIR)/$(2)/$(3) \
+ $(call gb_Configuration_get_preparation_target,$(1))
+$(call gb_XcsTarget_get_target,$(3)) : PRIMARY_REGISTRY := $(filter $(1),$(gb_Configuration_PRIMARY_REGISTRY_NAME))
+$(call gb_Configuration_get_target,$(1)) : \
+ $(call gb_XcsTarget_get_target,$(3))
+
+endef
+
+#$(call gb_Configuration_add_schemas,configuration,prefix,xcsfiles)
+define gb_Configuration_add_schemas
+$(foreach xcs,$(3),$(call gb_Configuration_add_schema,$(1),$(2),$(xcs)))
+
+endef
+
+# $(call gb_Configuration_add_data,configuration,prefix,xcufile)
+define gb_Configuration_add_data
+$(call gb_Configuration_get_clean_target,$(1)) : \
+ $(call gb_XcuDataTarget_get_clean_target,$(2)/$(3))
+$(call gb_XcuDataTarget_get_target,$(2)/$(3)) : \
+ $(SRCDIR)/$(2)/$(3) \
+ $(call gb_Configuration_get_preparation_target,$(1)) \
+ $(call gb_XcsTarget_for_XcuTarget,$(3))
+$(call gb_XcuDataTarget_get_target,$(2)/$(3)) : PRIMARY_REGISTRY := $(filter $(1),$(gb_Configuration_PRIMARY_REGISTRY_NAME))
+$(call gb_XcuDataTarget_get_target,$(2)/$(3)) : XCUFILE := $(3)
+$(call gb_Configuration_get_target,$(1)) : \
+ $(call gb_XcuDataTarget_get_target,$(2)/$(3))
+
+endef
+
+#$(call gb_Configuration_add_datas,configuration,prefix,xcufiles)
+define gb_Configuration_add_datas
+$(foreach xcu,$(3),$(call gb_Configuration_add_data,$(1),$(2),$(xcu)))
+
+endef
+
+# $(call gb_Configuration_add_spool_module,configuration,prefix,xcufile)
+define gb_Configuration_add_spool_module
+$(call gb_Configuration_get_clean_target,$(1)) : \
+ $(call gb_XcuModuleTarget_get_clean_target,$(2)/$(3))
+$(call gb_XcuModuleTarget_get_target,$(2)/$(3)) : \
+ $(call gb_XcuDataSource_for_XcuModuleTarget,$(2)/$(3)) \
+ $(call gb_Configuration_get_preparation_target,$(1)) \
+ $(call gb_XcsTarget_for_XcuModuleTarget,$(3))
+$(call gb_XcuModuleTarget_get_target,$(2)/$(3)) : PRIMARY_REGISTRY := $(filter $(1),$(gb_Configuration_PRIMARY_REGISTRY_NAME))
+$(call gb_Configuration_get_target,$(1)) : \
+ $(call gb_XcuModuleTarget_get_target,$(2)/$(3))
+
+endef
+
+# $(call gb_Configuration_add_spool_modules,configuration,prefix,xcufiles)
+define gb_Configuration_add_spool_modules
+$(foreach xcu,$(3),$(call gb_Configuration_add_spool_module,$(1),$(2),$(xcu)))
+
+endef
+
+define gb_Configuration__add_langpack
+$(if $(gb_Configuration_NODELIVER_$(1)),\
+ $(error TODO not needed yet: cannot add langpack if nodeliver))
+$(call gb_Configuration_get_target,$(1)) : \
+ $(call gb_XcuLangpackTarget__get_target_with_lang,$(3),$(4))
+$(call gb_XcuLangpackTarget__get_target_with_lang,$(3),$(4)) : \
+ $(SRCDIR)/$(2)/$(3).tmpl
+$(call gb_XcuLangpackTarget__get_target_with_lang,$(3),$(4)) : LANGUAGE := $(4)
+
+endef
+
+# $(call gb_Configuration_add_spool_langpack,configuration,prefix,xcufile)
+define gb_Configuration_add_spool_langpack
+$(foreach lang,$(gb_Configuration_LANGS),$(eval \
+ $(call gb_Configuration__add_langpack,$(1),$(2),$(strip $(3)),$(lang))))
+$(call gb_Configuration_get_clean_target,$(1)) : \
+ $(call gb_XcuLangpackTarget_get_clean_target,$(strip $(3)))
+
+endef
+
+# $(call gb_Configuration_add_localized_data,configuration,prefix,xcufile)
+define gb_Configuration_add_localized_data
+$(eval $(call gb_Configuration_add_data,$(1),$(2),$(3)))
+ifneq ($(strip $(gb_WITH_LANG)),)
+$(eval $(call gb_XcuMergeTarget_XcuMergeTarget,$(2)/$(3),$(1),$(2),$(3)))
+$(eval $(call gb_Configuration_get_clean_target,$(1)) : \
+ $(call gb_XcuMergeTarget_get_clean_target,$(2)/$(3)))
+endif
+$(foreach lang,$(gb_Configuration_LANGS),$(eval \
+ $(call gb_XcuResTarget_XcuResTarget,$(1)/$(lang)/$(3),$(1),$(2),$(3),$(lang))))
+$(foreach lang,$(gb_Configuration_LANGS),$(eval \
+ $(call gb_Configuration_get_target,$(1)) : \
+ $(call gb_XcuResTarget_get_target,$(1)/$(lang)/$(3))))
+$(foreach lang,$(gb_Configuration_LANGS),$(eval \
+ $(call gb_Configuration_get_clean_target,$(1)) : \
+ $(call gb_XcuResTarget_get_clean_target,$(1)/$(lang)/$(3))))
+
+endef
+
+# $(call gb_Configuration_add_localized_datas,configuration,prefix,xcufile)
+define gb_Configuration_add_localized_datas
+$(foreach xcu,$(3),$(call gb_Configuration_add_localized_data,$(1),$(2),$(xcu)))
+
+endef
+
+# Set extra registry this configuration can use schemas from.
+#
+# Example:
+# # foo needs schemas from the main configuration
+# $(eval $(call gb_Configuration_use_configuration,foo,registry))
+define gb_Configuration_use_configuration
+$(call gb_Configuration_get_preparation_target,$(1)) : $(call gb_Configuration_get_target,$(2))
+
+endef
+
+# apparently extensions package the XcuMergeTarget directly...
+# trivial convenience function to get the right file:
+ifeq ($(gb_WITH_LANG),)
+gb_XcuFile_for_extension = $(SRCDIR)/$(1)
+else
+gb_XcuFile_for_extension = $(call gb_XcuMergeTarget_get_target,$(1))
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/CppunitTest.mk b/solenv/gbuild/CppunitTest.mk
new file mode 100644
index 000000000..9545f0c52
--- /dev/null
+++ b/solenv/gbuild/CppunitTest.mk
@@ -0,0 +1,495 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# CppunitTest class
+
+gb_CppunitTest_UNITTESTFAILED ?= $(GBUILDDIR)/platform/unittest-failed-default.sh
+gb_CppunitTest_PYTHONDEPS ?= $(call gb_Library_get_target,pyuno_wrapper) $(if $(SYSTEM_PYTHON),,$(call gb_Package_get_target,python3))
+
+ifneq ($(strip $(CPPUNITTRACE)),)
+ifneq ($(filter gdb,$(CPPUNITTRACE)),)
+# sneak (a) setting the LD_LIBRARY_PATH, and (b) setting malloc debug flags, into the "gdb --args" command line
+gb_CppunitTest_GDBTRACE := $(subst gdb,\
+ PYTHONWARNINGS=default gdb -return-child-result -ex "add-auto-load-safe-path $(INSTDIR)" -ex "set environment $(subst =, ,$(gb_CppunitTest_CPPTESTPRECOMMAND))" $(if $(PYTHONWARNINGS),-ex 'set environment PYTHONWARNINGS $(PYTHONWARNINGS)') $(gb_CppunitTest_malloc_check) $(gb_CppunitTest_DEBUGCPPUNIT),\
+ $(CPPUNITTRACE))
+gb_PythonTest_GDBTRACE := $(subst gdb,\
+ PYTHONWARNINGS=default gdb -return-child-result -ex "add-auto-load-safe-path $(INSTDIR)" -ex "set environment $(subst =, ,$(gb_PythonTest_PRECOMMAND))" $(if $(PYTHONWARNINGS),-ex 'set environment PYTHONWARNINGS $(PYTHONWARNINGS)') $(gb_CppunitTest_malloc_check) $(gb_CppunitTest_DEBUGCPPUNIT),\
+ $(CPPUNITTRACE))
+else ifneq ($(filter lldb,$(CPPUNITTRACE)),)
+gb_CppunitTest_GDBTRACE := $(subst lldb,\
+ lldb -o "env $(gb_CppunitTest_CPPTESTPRECOMMAND)" $(gb_CppunitTest_malloc_check),\
+ $(CPPUNITTRACE))
+gb_PythonTest_GDBTRACE := $(gb_CppunitTest_GDBTRACE)
+else
+gb_CppunitTest_GDBTRACE := $(CPPUNITTRACE)
+gb_PythonTest_GDBTRACE := $(gb_CppunitTest_GDBTRACE)
+endif
+ifneq ($(strip $(DEBUGCPPUNIT)),TRUE)
+gb_CppunitTest__interactive := $(true)
+endif
+endif
+
+ifneq ($(strip $(VALGRIND)),)
+gb_CppunitTest_VALGRINDTOOL := valgrind --tool=$(VALGRIND) --num-callers=50 --error-exitcode=1 --trace-children=yes --trace-children-skip='*/java,*/gij'
+ifneq ($(strip $(VALGRIND_GDB)),)
+gb_CppunitTest_VALGRINDTOOL += --vgdb=yes --vgdb-error=0
+endif
+ifeq ($(strip $(VALGRIND)),memcheck)
+G_SLICE := always-malloc
+GLIBCXX_FORCE_NEW := 1
+endif
+endif
+
+ifneq (,$(filter perfcheck,$(MAKECMDGOALS)))
+$(if $(ENABLE_VALGRIND),,$(call gb_Output_error,Running performance tests with empty $$(ENABLE_VALGRIND) does not make sense. Please install valgrind-dev and re-run autogen.))
+gb_CppunitTest_VALGRINDTOOL := valgrind --tool=callgrind --dump-instr=yes --instr-atstart=no --simulate-cache=yes --dump-instr=yes --collect-bus=yes --branch-sim=yes
+ifneq ($(strip $(VALGRIND_GDB)),)
+gb_CppunitTest_VALGRINDTOOL += --vgdb=yes --vgdb-error=0
+endif
+endif
+
+ifneq ($(strip $(RR)),)
+gb_CppunitTest_RR := rr record
+endif
+
+# defined by platform
+# gb_CppunitTest_get_filename
+gb_CppunitTest_RUNTIMEDEPS := $(call gb_Executable_get_runtime_dependencies,cppunittester)
+gb_CppunitTest_CPPTESTCOMMAND := $(call gb_Executable_get_target_for_build,cppunittester)
+
+# i18npool dlopens localedata_* libraries.
+gb_CppunitTest_RUNTIMEDEPS += \
+ $(call gb_Library_get_target,localedata_en) \
+ $(call gb_Library_get_target,localedata_es) \
+ $(call gb_Library_get_target,localedata_euro) \
+ $(call gb_Library_get_target,localedata_others) \
+ $(call gb_Package_get_target,test_unittest) \
+
+define gb_CppunitTest__make_args
+$(HEADLESS) \
+"-env:BRAND_BASE_DIR=$(call gb_Helper_make_url,$(INSTROOT))" \
+"-env:BRAND_SHARE_SUBDIR=$(LIBO_SHARE_FOLDER)" \
+"-env:BRAND_SHARE_RESOURCE_SUBDIR=$(LIBO_SHARE_RESOURCE_FOLDER)" \
+"-env:UserInstallation=$(call gb_Helper_make_url,$(call gb_CppunitTest_get_target,$*).user)" \
+$(if $(URE),\
+ $(if $(strip $(CONFIGURATION_LAYERS)),\
+ "-env:CONFIGURATION_LAYERS=$(strip $(CONFIGURATION_LAYERS))") \
+ $(if $(strip $(UNO_TYPES)),\
+ "-env:UNO_TYPES=$(foreach item,$(UNO_TYPES),$(call gb_Helper_make_url,$(item)))") \
+ $(if $(strip $(UNO_SERVICES)),\
+ "-env:UNO_SERVICES=$(foreach item,$(UNO_SERVICES),$(call gb_Helper_make_url,$(item)))" -env:URE_BIN_DIR=$(call gb_Helper_make_url,$(INSTROOT)/$(LIBO_URE_BIN_FOLDER))) \
+ -env:URE_INTERNAL_LIB_DIR=$(call gb_Helper_make_url,$(INSTROOT)/$(LIBO_URE_LIB_FOLDER)) \
+ -env:LO_LIB_DIR=$(call gb_Helper_make_url,$(INSTROOT)/$(LIBO_LIB_FOLDER)) \
+ -env:LO_JAVA_DIR=$(call gb_Helper_make_url,$(INSTROOT)/$(LIBO_SHARE_JAVA_FOLDER)) \
+ --protector $(call gb_Library_get_target,unoexceptionprotector) unoexceptionprotector \
+ --protector $(call gb_Library_get_target,unobootstrapprotector) unobootstrapprotector \
+ ) \
+$(if $(VCL),\
+ --protector $(call gb_Library_get_target,vclbootstrapprotector) vclbootstrapprotector \
+ ) \
+$(ARGS)
+endef
+
+.PHONY : $(call gb_CppunitTest_get_clean_target,%)
+$(call gb_CppunitTest_get_clean_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_CppunitTest_get_target,$*) $(call gb_CppunitTest_get_target,$*).log)
+
+.PHONY : $(call gb_CppunitTest_get_target,%)
+$(call gb_CppunitTest_get_target,%) :| $(gb_CppunitTest_RUNTIMEDEPS)
+ifneq ($(gb_SUPPRESS_TESTS),)
+ @true
+else
+ $(call gb_Output_announce,$*,$(true),CUT,2)
+ $(call gb_Trace_StartRange,$*,CUT)
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ rm -fr $@.user && cp -r $(WORKDIR)/unittest $@.user && \
+ $(if $(gb_CppunitTest__use_confpreinit), \
+ $(INSTDIR)/program/lokconf_init $(call gb_CppunitTest__make_args) &&) \
+ $(if $(gb_CppunitTest__interactive),, \
+ $(if $(value gb_CppunitTest_postprocess), \
+ rm -fr $@.core && mkdir $@.core && cd $@.core &&)) \
+ ( \
+ $(if $(gb_CppunitTest_localized),for l in $(WITH_LANG_LIST) ; do \
+ printf 'LO_TEST_LOCALE=%s\n' "$$l" && LO_TEST_LOCALE="$$l" ) \
+ $(if $(gb_CppunitTest__vcl_no_svp), \
+ $(filter-out SAL_USE_VCLPLUGIN=svp,$(gb_TEST_ENV_VARS)),$(gb_TEST_ENV_VARS)) \
+ $(EXTRA_ENV_VARS) \
+ $(if $(filter gdb,$(gb_CppunitTest_GDBTRACE)),,$(gb_CppunitTest_CPPTESTPRECOMMAND)) \
+ $(if $(G_SLICE),G_SLICE=$(G_SLICE)) \
+ $(if $(GLIBCXX_FORCE_NEW),GLIBCXX_FORCE_NEW=$(GLIBCXX_FORCE_NEW)) \
+ $(if $(strip $(PYTHON_URE)),\
+ PYTHONDONTWRITEBYTECODE=1) \
+ $(ICECREAM_RUN) $(gb_CppunitTest_GDBTRACE) $(gb_CppunitTest_VALGRINDTOOL) $(gb_CppunitTest_RR) \
+ $(gb_CppunitTest_CPPTESTCOMMAND) \
+ $(call gb_CppunitTest_get_linktarget_target,$*) \
+ $(call gb_CppunitTest__make_args) "-env:CPPUNITTESTTARGET=$@" \
+ $(if $(gb_CppunitTest_localized),|| exit $$?; done) \
+ ) \
+ $(if $(gb_CppunitTest__interactive),, \
+ > $@.log 2>&1 \
+ || ($(if $(value gb_CppunitTest_postprocess), \
+ RET=$$?; \
+ $(call gb_CppunitTest_postprocess,$(gb_CppunitTest_CPPTESTCOMMAND),$@.core,$$RET) >> $@.log 2>&1;) \
+ cat $@.log; $(gb_CppunitTest_UNITTESTFAILED) Cppunit $*)))
+ $(call gb_Trace_EndRange,$*,CUT)
+endif
+
+define gb_CppunitTest_CppunitTest
+$(call gb_CppunitTest__CppunitTest_impl,$(1),$(call gb_CppunitTest_get_linktarget,$(1)))
+
+endef
+
+define gb_CppunitTest_CppunitScreenShot
+$(call gb_CppunitTest_get_target,$(1)) : gb_CppunitTest_localized := $(true)
+$(call gb_CppunitTest__CppunitTest_impl,$(1),$(call gb_CppunitTest_get_linktarget,$(1)))
+
+endef
+
+define gb_CppunitTest_register_target
+endef
+
+# call gb_CppunitTest__CppunitTest_impl,cppunittest,linktarget
+define gb_CppunitTest__CppunitTest_impl
+$(call gb_CppunitTest_register_target, $(1), $(2), "test")
+$(call gb_LinkTarget_LinkTarget,$(2),CppunitTest_$(1),NONE)
+$(call gb_LinkTarget_set_targettype,$(2),CppunitTest)
+$(call gb_LinkTarget_add_libs,$(2),$(gb_STDLIBS))
+$(call gb_LinkTarget_add_defs,$(2),\
+ $(gb_CppunitTest_DEFS) \
+)
+$(call gb_LinkTarget_use_external,$(2),cppunit)
+$(call gb_LinkTarget_set_include,$(2),\
+ $$(INCLUDE) \
+ $(filter -I%,$(CPPUNIT_CFLAGS)) \
+)
+$(call gb_LinkTarget_add_defs,$(2), \
+ $(filter-out -I%,$(CPPUNIT_CFLAGS)) \
+ -DCPPUNIT_PLUGIN_EXPORT='extern "C" SAL_DLLPUBLIC_EXPORT' \
+)
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_LinkTarget_get_target,$(2))
+$(call gb_CppunitTest_get_clean_target,$(1)) : $(call gb_LinkTarget_get_clean_target,$(2))
+$(call gb_CppunitTest_CppunitTest_platform,$(1),$(2),$(gb_CppunitTest_DLLDIR)/$(call gb_CppunitTest_get_ilibfilename,$(1)))
+$(call gb_CppunitTest_get_target,$(1)) : ARGS :=
+$(call gb_CppunitTest_get_target,$(1)) : CONFIGURATION_LAYERS :=
+$(call gb_CppunitTest_get_target,$(1)) : PYTHON_URE := $(false)
+$(call gb_CppunitTest_get_target,$(1)) : URE := $(false)
+$(call gb_CppunitTest_get_target,$(1)) : VCL := $(false)
+$(call gb_CppunitTest_get_target,$(1)) : UNO_SERVICES :=
+$(call gb_CppunitTest_get_target,$(1)) : UNO_TYPES :=
+$(call gb_CppunitTest_get_target,$(1)) : HEADLESS := --headless
+$(call gb_CppunitTest_get_target,$(1)) : EXTRA_ENV_VARS :=
+$$(eval $$(call gb_Module_register_target,$(call gb_CppunitTest_get_target,$(1)),$(call gb_CppunitTest_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),CppunitTest)
+
+endef
+
+# Add additional command line arguments for the test.
+#
+# You should practically never need to use this, as there are special
+# functions for adding many commonly used arguments.
+define gb_CppunitTest_add_arguments
+$(call gb_CppunitTest_get_target,$(1)) : ARGS += $(2)
+
+endef
+
+define gb_CppunitTest_use_ure
+$(call gb_CppunitTest_use_rdb,$(1),ure/services)
+$(call gb_CppunitTest_get_target,$(1)) : URE := $(true)
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Library_get_target,$(CPPU_ENV)_uno)
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Library_get_target,affine_uno)
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Library_get_target,unobootstrapprotector)
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Library_get_target,unoexceptionprotector)
+
+endef
+
+# $(2) == $(true) if headless:
+define gb_CppunitTest__use_vcl
+$(call gb_CppunitTest_get_target,$(1)) : VCL := $(true)
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Library_get_target,vclbootstrapprotector)
+ifeq ($(USING_X11),TRUE)
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Library_get_target,desktop_detector)
+$(call gb_CppunitTest_get_target,$(1)) : $(if $(filter $(2),$(true)),, \
+ $(call gb_Library_get_target,vclplug_gen) \
+ $(if $(ENABLE_GTK3),$(call gb_Library_get_target,vclplug_gtk3)) \
+ $(if $(ENABLE_GTK4),$(call gb_Library_get_target,vclplug_gtk4)) \
+ $(if $(ENABLE_QT5),$(call gb_Library_get_target,vclplug_qt5)) \
+ $(if $(ENABLE_QT6),$(call gb_Library_get_target,vclplug_qt6)) \
+ )
+else ifeq ($(OS),MACOSX)
+$(call gb_CppunitTest_get_target,$(1)): $(call gb_Library_get_target,vclplug_osx)
+else ifeq ($(OS),WNT)
+$(call gb_CppunitTest_get_target,$(1)): $(call gb_Library_get_target,vclplug_win)
+endif
+
+endef
+
+define gb_CppunitTest_use_confpreinit
+$(call gb_CppunitTest_use_executable,$(1),lokconf_init)
+$(call gb_CppunitTest_get_target,$(1)) : gb_CppunitTest__use_confpreinit := TRUE
+
+endef
+
+define gb_CppunitTest_use_vcl
+$(call gb_CppunitTest__use_vcl,$(1),$(true))
+
+endef
+
+define gb_CppunitTest_use_vcl_non_headless
+$(call gb_CppunitTest_get_target,$(1)) : gb_CppunitTest__vcl_no_svp := $(true)
+$(call gb_CppunitTest__use_vcl,$(1),$(false))
+
+endef
+
+define gb_CppunitTest_use_vcl_non_headless_with_windows
+$(call gb_CppunitTest_get_target,$(1)) : HEADLESS :=
+$(call gb_CppunitTest_get_target,$(1)) : gb_CppunitTest__vcl_no_svp := $(true)
+$(call gb_CppunitTest__use_vcl,$(1),$(false))
+
+endef
+
+define gb_CppunitTest_localized_run
+$(call gb_CppunitTest_get_target,$(1)) : gb_CppunitTest_localized := $(true)
+
+endef
+
+define gb_CppunitTest__use_api
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_UnoApi_get_target,$(2))
+$(call gb_CppunitTest_get_target,$(1)) : UNO_TYPES += $(call gb_UnoApi_get_target,$(2))
+
+endef
+
+define gb_CppunitTest_use_api
+$(call gb_LinkTarget_use_api,$(call gb_CppunitTest_get_linktarget,$(1)),$(2))
+$(foreach rdb,$(2),$(call gb_CppunitTest__use_api,$(1),$(rdb)))
+
+endef
+
+define gb_CppunitTest_use_udk_api
+$(call gb_CppunitTest_use_api,$(1),udkapi)
+
+endef
+
+define gb_CppunitTest_use_sdk_api
+$(call gb_CppunitTest_use_api,$(1),udkapi offapi)
+
+endef
+
+define gb_CppunitTest_use_rdb
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Rdb_get_target_for_build,$(2))
+$(call gb_CppunitTest_get_target,$(1)) : UNO_SERVICES += $(call gb_Rdb_get_target_for_build,$(2))
+
+endef
+
+define gb_CppunitTest_use_rdbs
+$(foreach rdb,$(2),$(call gb_CppunitTest_use_rdb,$(1),$(rdb)))
+
+endef
+
+define gb_CppunitTest_use_component
+$(call gb_CppunitTest_get_target,$(1)) : \
+ $(call gb_ComponentTarget_get_target,$(2))
+$(call gb_CppunitTest_get_target,$(1)) : \
+ UNO_SERVICES += $(call gb_ComponentTarget_get_target,$(2))
+
+endef
+
+define gb_CppunitTest_set_componentfile
+$(call gb_ComponentTarget_ComponentTarget,CppunitTest/$(2),\
+ $(call gb_Helper_make_url,$(gb_CppunitTest_DLLDIR))/,\
+ $(call gb_CppunitTest_get_filename,$(1)))
+$(call gb_CppunitTest_get_target,$(1)) : \
+ $(call gb_ComponentTarget_get_target,CppunitTest/$(2))
+$(call gb_CppunitTest_get_clean_target,$(1)) : \
+ $(call gb_ComponentTarget_get_clean_target,CppunitTest/$(2))
+$(call gb_CppunitTest_use_component,$(1),CppunitTest/$(2))
+
+endef
+
+# Given a list of component files, filter out those corresponding
+# to libraries not built in this configuration.
+define gb_CppunitTest__filter_not_built_components
+$(filter-out \
+ $(if $(filter SCRIPTING,$(BUILD_TYPE)),, \
+ basic/util/sb \
+ sw/util/vbaswobj \
+ scripting/source/basprov/basprov \
+ scripting/util/scriptframe) \
+ $(if $(filter DBCONNECTIVITY,$(BUILD_TYPE)),, \
+ dbaccess/util/dba \
+ forms/util/frm),$(1))
+endef
+
+define gb_CppunitTest_use_components
+$(foreach component,$(call gb_CppunitTest__filter_not_built_components,$(2)),$(call gb_CppunitTest_use_component,$(1),$(component)))
+
+endef
+
+define gb_CppunitTest__use_configuration
+$(call gb_CppunitTest_get_target,$(1)) : CONFIGURATION_LAYERS += $(2):$(call gb_Helper_make_url,$(3))
+
+endef
+
+# Use instdir configuration
+define gb_CppunitTest_use_instdir_configuration
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Package_get_target,postprocess_registry)
+$(call gb_CppunitTest__use_configuration,$(1),xcsxcu,$(INSTROOT)/$(LIBO_SHARE_FOLDER)/registry)
+
+endef
+
+# Use configuration in $(WORKDIR)/unittest/registry.
+define gb_CppunitTest_use_unittest_configuration
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Package_get_target,test_unittest)
+$(call gb_CppunitTest__use_configuration,$(1),xcsxcu,$(WORKDIR)/unittest/registry)
+
+endef
+
+# Use standard configuration: instdir config + unittest config (in this order!)
+define gb_CppunitTest_use_configuration
+$(call gb_CppunitTest_use_instdir_configuration,$(1))
+$(call gb_CppunitTest_use_unittest_configuration,$(1))
+
+endef
+
+define gb_CppunitTest_use_executable
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Executable_get_target,$(2))
+
+endef
+
+define gb_CppunitTest_use_more_fonts
+ifneq ($(filter MORE_FONTS,$(BUILD_TYPE)),)
+$(call gb_CppunitTest_get_target,$(1)) : \
+ $(foreach font,$(gb_Package_MODULE_ooo_fonts),$(call gb_Package_get_target,$(font)))
+endif
+
+endef
+
+define gb_CppunitTest__use_java_ure
+$(call gb_CppunitTest_get_target,$(1)) : \
+ $(foreach jar,java_uno libreoffice unoloader,$(call gb_Jar_get_target,$(jar))) \
+ $(call gb_Library_get_target,affine_uno_uno) \
+ $(call gb_Library_get_target,java_uno) \
+ $(call gb_Library_get_target,jpipe) \
+ $(call gb_Library_get_target,juhx) \
+ $(call gb_Library_get_target,juhx) \
+ $(call gb_Library_get_target,jvmaccess) \
+ $(call gb_Library_get_target,jvmfwk) \
+ $(call gb_Package_get_target,jvmfwk_javavendors) \
+ $(call gb_Package_get_target,jvmfwk_jreproperties) \
+ $(call gb_Package_get_target,jvmfwk_jvmfwk3_ini) \
+
+endef
+
+define gb_CppunitTest_use_jar
+$(call gb_CppunitTest__use_java_ure,$(1))
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_Jar_get_target,$(2))
+
+endef
+
+define gb_CppunitTest_use_jars
+$(foreach jar,$(2),$(call gb_CppunitTest_use_jar,$(1),$(jar)))
+
+endef
+
+define gb_CppunitTest_use_python_ure
+$(call gb_CppunitTest_get_target,$(1)) : PYTHON_URE := $(true)
+$(call gb_CppunitTest_get_target,$(1)) :\
+ $(call gb_Library_get_target,pythonloader) \
+ $(call gb_Library_get_target,pyuno) \
+ $(gb_CppunitTest_PYTHONDEPS) \
+ $(call gb_Package_get_target,pyuno_python_scripts)
+
+endef
+
+define gb_CppunitTest_use_uiconfig
+$(call gb_CppunitTest_get_target,$(1)) : $(call gb_UIConfig_get_target,$(2))
+
+endef
+
+define gb_CppunitTest_use_uiconfigs
+$(foreach uiconfig,$(2),$(call gb_CppunitTest_use_uiconfig,$(1),$(uiconfig)))
+
+endef
+
+# forward the call to the gb_LinkTarget implementation
+# (note: because the function name is in $(1), the other args are shifted by 1)
+define gb_CppunitTest__forward_to_Linktarget
+$(call gb_LinkTarget_$(subst gb_CppunitTest_,,$(1)),$(call gb_CppunitTest_get_linktarget,$(2)),$(3),$(4),CppunitTest_$(2))
+
+endef
+
+# copy pasta for forwarding: this could be (and was) done more elegantly, but
+# these here can be found by both git grep and ctags
+gb_CppunitTest_add_cobject = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_cobjects = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_cxxobject = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_cxxobjects = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_exception_objects = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_executable_objects = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_library_objects = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_libraries = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_static_libraries = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_objcobject = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_objcobjects = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_objcxxobject = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_objcxxobjects = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_cxxclrobject = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_cxxclrobjects = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_asmobject = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_asmobjects = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_package = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_packages = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_precompiled_header = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_reuse_precompiled_header = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_common_precompiled_header = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_sdi_headers = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_cflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_cflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_cxxflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_yaccflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_objcflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_objcxxflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_cxxclrflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_defs = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_include = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_ldflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_ldflags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_libs = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_disable_standard_system_libs = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_system_darwin_frameworks = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_system_win32_libs = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_internal_api = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_internal_bootstrap_api = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_internal_comprehensive_api = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_library_path_flags = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_external = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_externals = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_custom_headers = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_visibility_default = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_warnings_not_errors = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_warnings_disabled = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_external_code = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_generated_cxx_suffix = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_clang = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_set_clang_precompiled_header = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_use_vclmain = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_CppunitTest_add_prejs = $(call gb_CppunitTest__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/CustomTarget.mk b/solenv/gbuild/CustomTarget.mk
new file mode 100644
index 000000000..1ea43aa12
--- /dev/null
+++ b/solenv/gbuild/CustomTarget.mk
@@ -0,0 +1,136 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# the .dir is for make 3.81, which ignores trailing /
+$(call gb_CustomTarget_get_workdir,%)/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CustomTarget_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),CUS,3)
+ $(call gb_Trace_MakeMark,$*,CUS)
+ touch $@
+
+.PHONY: $(call gb_CustomTarget_get_clean_target,%)
+$(call gb_CustomTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),CUS,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(call gb_CustomTarget_get_workdir,$*) && \
+ rm -f $(call gb_CustomTarget_get_target,$*))
+
+define gb_CustomTarget_CustomTarget
+$(eval $(call gb_Module_register_target,$(call gb_CustomTarget_get_target,$(1)),$(call gb_CustomTarget_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),CustomTarget)
+$(call gb_CustomTarget_get_target,$(1)) :| $(dir $(call gb_CustomTarget_get_target,$(1))).dir
+
+endef
+
+define gb_CustomTarget_register_target
+$(call gb_CustomTarget_get_target,$(1)) : $(call gb_CustomTarget_get_workdir,$(1))/$(2)
+$(call gb_CustomTarget_get_workdir,$(1))/$(2) :| $(dir $(call gb_CustomTarget_get_workdir,$(1))/$(2)).dir
+
+endef
+
+define gb_CustomTarget_register_targets
+$(foreach target,$(2),$(call gb_CustomTarget_register_target,$(1),$(target)))
+
+endef
+
+ifneq ($(WITH_LANG),)
+
+# $(call gb_CustomTarget_ulfex__command,ulftarget,ulfsource,pofiles)
+define gb_CustomTarget_ulfex__command
+$(call gb_Output_announce,$(1),$(true),ULF,1)
+ $(call gb_Trace_StartRange,$(1),ULF)
+MERGEINPUT=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(3)) && \
+$(call gb_Helper_abbreviate_dirs,\
+ $(call gb_Executable_get_command,ulfex) -i $(2) -o $(1) -m $${MERGEINPUT} -l all) && \
+rm -rf $${MERGEINPUT}
+ $(call gb_Trace_EndRange,$(1),ULF)
+endef
+
+else
+
+define gb_CustomTarget_ulfex__command
+cp $(2) $(1)
+endef
+
+endif
+
+# $(call gb_CustomTarget_ulfex_rule,ulftargetpattern,ulfsource,pofiles)
+define gb_CustomTarget_ulfex_rule
+$(1) : $(2) $(if $(WITH_LANG),$(call gb_Executable_get_runtime_dependencies,ulfex)) | $(dir $(1)).dir
+ $$(call gb_CustomTarget_ulfex__command,$$@,$(subst %,$$*,$(strip $(2))),$(strip $(3)))
+
+endef
+
+#$(call gb_CustomTarget_token_hash,oox/generated,tokenhash.inc,tokenhash.gperf)
+define gb_CustomTarget_token_hash
+$(call gb_CustomTarget_get_target,$(1)) : $(call gb_CustomTarget_get_workdir,$(1))/$(2)
+$(call gb_CustomTarget_get_workdir,$(1))/$(2) : $(call gb_CustomTarget_get_workdir,$(1))/misc/$(3)
+ $$(call gb_Output_announce,$$(subst $(WORKDIR)/,,$$@),build,GPF,1)
+ $(GPERF) --compare-strncmp --switch=2 --readonly-tables $$< \
+ | sed -e 's/char\*)0/(char\*)0, 0/g' | grep -v '^#line' > $$@
+
+endef
+
+#$(call gb_CustomTarget_generate_tokens,oox/generated,oox,oox/source/token,
+#namespaces,namespace,namespaces.txt,namespaces-strict,namespaces.pl)
+define gb_CustomTarget_generate_tokens
+$(call gb_CustomTarget_get_workdir,$(1))/misc/$(5)ids.inc \
+$(call gb_CustomTarget_get_workdir,$(1))/$(5)names.inc \
+$(if $(6),$(call gb_CustomTarget_get_workdir,$(1))/misc/$(6)) \
+$(if $(7),$(call gb_CustomTarget_get_workdir,$(1))/$(7)names.inc) : \
+ $(call gb_CustomTarget_get_workdir,$(1))/$(2)/token/$(4).hxx
+ touch $$@
+
+$(call gb_CustomTarget_get_workdir,$(1))/$(2)/token/$(4).hxx : \
+ $(call gb_ExternalExecutable_get_dependencies,python) \
+ $(if $(7),$(SRCDIR)/$(3)/$(7).txt) \
+ $(if $(8),$(SRCDIR)/$(3)/$(8),$(SRCDIR)/solenv/bin/generate-tokens.py) \
+ $(SRCDIR)/$(3)/$(4).txt \
+ $(SRCDIR)/$(3)/$(4).hxx.head \
+ $(SRCDIR)/$(3)/$(4).hxx.tail
+ $$(call gb_Output_announce,$$(subst $(WORKDIR)/,,$$@),build,PRL,1)
+ $$(call gb_Trace_StartRange,$$(subst $(WORKDIR)/,,$$@),PRL)
+ mkdir -p $(call gb_CustomTarget_get_workdir,$(1))/misc \
+ $(call gb_CustomTarget_get_workdir,$(1)) \
+ $(call gb_CustomTarget_get_workdir,$(1))/$(2)/token
+ $(call gb_ExternalExecutable_get_command,python) $(if $(8),$(SRCDIR)/$(3)/$(8),$(SRCDIR)/solenv/bin/generate-tokens.py) \
+ $(SRCDIR)/$(3)/$(4).txt \
+ $(call gb_CustomTarget_get_workdir,$(1))/misc/$(5)ids.inc \
+ $(call gb_CustomTarget_get_workdir,$(1))/$(5)names.inc \
+ $(if $(6), $(call gb_CustomTarget_get_workdir,$(1))/misc/$(6)) \
+ $(if $(7), $(SRCDIR)/$(3)/$(7).txt \
+ $(call gb_CustomTarget_get_workdir,$(1))/$(7)names.inc) \
+ && cat $(SRCDIR)/$(3)/$(4).hxx.head \
+ $(call gb_CustomTarget_get_workdir,$(1))/misc/$(5)ids.inc \
+ $(SRCDIR)/$(3)/$(4).hxx.tail \
+ > $(call gb_CustomTarget_get_workdir,$(1))/$(2)/token/$(4).hxx \
+ && touch $$@
+ $$(call gb_Trace_EndRange,$$(subst $(WORKDIR)/,,$$@),PRL)
+
+$(call gb_CustomTarget_get_target,$(1)) : \
+ $(call gb_CustomTarget_get_workdir,$(1))/$(5)names.inc \
+ $(if $(7),$(call gb_CustomTarget_get_workdir,$(1))/$(7)names.inc) \
+ $(call gb_CustomTarget_get_workdir,$(1))/$(2)/token/$(4).hxx \
+ $(if $(6),$(call gb_CustomTarget_get_workdir,$(1))/misc/$(6)) \
+
+endef
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/Deliver.mk b/solenv/gbuild/Deliver.mk
new file mode 100644
index 000000000..a3e85f30c
--- /dev/null
+++ b/solenv/gbuild/Deliver.mk
@@ -0,0 +1,69 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+gb_Deliver_GNUCOPY := $(GNUCOPY)
+
+define gb_Deliver_init
+gb_Deliver_DELIVERABLES :=
+gb_Deliver_DELIVERABLES_INDEX :=
+
+endef
+
+define gb_Deliver_register_deliverable
+gb_Deliver_DELIVERABLES_$(notdir $(3)) += $(2):$(1)
+gb_Deliver_DELIVERABLES_INDEX := $$(sort $$(gb_Deliver_DELIVERABLES_INDEX) $(notdir $(3)))
+$(if $(gb_LOWRESTIME),.LOW_RESOLUTION_TIME : $(1),)
+
+endef
+
+define gb_Deliver_add_deliverable
+$$(if $(3),,$$(error - missing third parameter for deliverable $(1)))
+ifeq ($(MAKECMDGOALS),showdeliverables)
+$(call gb_Deliver_register_deliverable,$(1),$(2),$(3))
+endif
+
+endef
+
+define gb_Deliver__deliver
+$(if $(gb_Deliver_CLEARONDELIVER),rm -f $(2) &&) cp -P -f $(1) $(2) && $(TOUCH) -hr $(1) $(2)
+endef
+
+ifneq ($(strip $(gb_Deliver_GNUCOPY)),)
+define gb_Deliver__deliver
+$(gb_Deliver_GNUCOPY) $(if $(gb_Deliver_CLEARONDELIVER),--remove-destination) --no-dereference --force --preserve=timestamps $(1) $(2)
+endef
+endif
+
+define gb_Deliver_deliver
+$(if $(1),$(call gb_Deliver__deliver,$(1),$(2)),\
+ $(error gb_Deliver_deliver:\
+ file does not exist in instdir, and cannot be delivered: $(2)))
+endef
+
+define gb_Deliver_print_deliverable
+$(info $(1) $(2))
+endef
+
+showdeliverables :
+ $(eval MAKEFLAGS := s)
+ $(foreach deliverable,$(sort $(foreach list,$(gb_Deliver_DELIVERABLES_INDEX),$(gb_Deliver_DELIVERABLES_$(list)))),\
+ $(call gb_Deliver_print_deliverable,$(firstword $(subst :, ,$(deliverable))),$(lastword $(subst :, ,$(deliverable)))))
+ @true
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/Dictionary.mk b/solenv/gbuild/Dictionary.mk
new file mode 100644
index 000000000..b86f1b493
--- /dev/null
+++ b/solenv/gbuild/Dictionary.mk
@@ -0,0 +1,401 @@
+# -*- 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/.
+#
+
+# ThesaurusIndexTarget class
+
+gb_ThesaurusIndexTarget_CHECK_TARGET := $(SRCDIR)/dictionaries/util/th_check.pl
+gb_ThesaurusIndexTarget_CHECK_COMMAND := PERL_UNICODE=0 $(PERL) -w $(gb_ThesaurusIndexTarget_CHECK_TARGET)
+gb_ThesaurusIndexTarget_INDEX_DEPS := $(call gb_Executable_get_runtime_dependencies,idxdict)
+gb_ThesaurusIndexTarget_INDEX_COMMAND := $(call gb_Executable_get_command,idxdict)
+
+define gb_ThesaurusIndexTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ $(gb_ThesaurusIndexTarget_INDEX_COMMAND) -o $(1) < $(THESAURUS_FILE) \
+)
+endef
+ #$(gb_ThesaurusIndexTarget_CHECK_COMMAND) $(THESAURUS_FILE) && \
+
+$(dir $(call gb_ThesaurusIndexTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_ThesaurusIndexTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_ThesaurusIndexTarget_get_target,%) : $(gb_ThesaurusIndexTarget_INDEX_DEPS) | $(gb_ThesaurusIndexTarget_CHECK_TARGET)
+ $(call gb_Output_announce,$*,$(true),THI,1)
+ $(call gb_Trace_StartRange,$*,THI)
+ $(call gb_ThesaurusIndexTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,THI)
+
+.PHONY : $(call gb_ThesaurusIndexTarget_get_clean_target,%)
+$(call gb_ThesaurusIndexTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),THI,1)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_ThesaurusIndexTarget_get_target,$*) \
+ )
+
+# Creates an index for a given thesaurus
+#
+# The thesaurus' file path is relative to $(SRCDIR).
+#
+# gb_ThesaurusIndexTarget_ThesaurusIndexTarget thesaurus
+define gb_ThesaurusIndexTarget_ThesaurusIndexTarget
+$(call gb_ThesaurusIndexTarget_get_target,$(1)) : THESAURUS_FILE := $(SRCDIR)/$(1)
+$(call gb_ThesaurusIndexTarget_get_target,$(1)) : $(SRCDIR)/$(1)
+$(call gb_ThesaurusIndexTarget_get_target,$(1)) :| $(dir $(call gb_ThesaurusIndexTarget_get_target,$(1))).dir
+
+endef
+
+# PropertiesTranslateTarget class
+
+# Handles translation of .properties files in dictionaries.
+
+gb_PropertiesTranslateTarget_COMMAND := $(call gb_Executable_get_command,propex)
+gb_PropertiesTranslateTarget_DEPS := $(call gb_Executable_get_runtime_dependencies,propex)
+
+define gb_PropertiesTranslateTarget__command
+$(call gb_Helper_abbreviate_dirs, \
+ $(if $(filter-out qtz,$(LANGUAGE)), \
+ MERGEINPUT=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(POFILE)) && \
+ $(gb_PropertiesTranslateTarget_COMMAND) \
+ -i $(PROPERTIES_FILE) \
+ -l $(LANGUAGE) \
+ -m $${MERGEINPUT} \
+ -o $(1) && \
+ rm -f $${MERGEINPUT} \
+ , \
+ $(gb_PropertiesTranslateTarget_COMMAND) \
+ -i $(PROPERTIES_FILE) \
+ -l $(LANGUAGE) \
+ -m \
+ -o $(1) \
+ ) \
+)
+endef
+
+$(dir $(call gb_PropertiesTranslateTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_PropertiesTranslateTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_PropertiesTranslateTarget_get_target,%) : $(gb_PropertiesTranslateTarget_DEPS)
+ $(call gb_Output_announce,$*,$(true),PRP,1)
+ $(call gb_Trace_StartRange,$*,PRP)
+ $(call gb_PropertiesTranslateTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,PRP)
+
+.PHONY : $(call gb_PropertiesTranslateTarget_get_clean_target,%)
+$(call gb_PropertiesTranslateTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),PRP,1)
+ rm -f $(call gb_PropertiesTranslateTarget_get_target,$*)
+
+# gb_PropertiesTranslateTarget_PropertiesTranslateTarget target source lang
+define gb_PropertiesTranslateTarget_PropertiesTranslateTarget
+$(call gb_PropertiesTranslateTarget_get_target,$(1)) : LANGUAGE := $(3)
+$(call gb_PropertiesTranslateTarget_get_target,$(1)) : POFILE := $(gb_POLOCATION)/$(3)/$(patsubst %/,%,$(dir $(2))).po
+$(call gb_PropertiesTranslateTarget_get_target,$(1)) : PROPERTIES_FILE := $(SRCDIR)/$(2)
+
+$(call gb_PropertiesTranslateTarget_get_target,$(1)) : $(SRCDIR)/$(2)
+$(call gb_PropertiesTranslateTarget_get_target,$(1)) :| $(dir $(call gb_PropertiesTranslateTarget_get_target,$(1))).dir
+
+$(if $(filter-out qtz,$(3)),\
+ $(call gb_PropertiesTranslateTarget__PropertiesTranslateTarget_onelang,$(1),$(gb_POLOCATION)/$(3)/$(patsubst %/,%,$(dir $(2))).po) \
+)
+
+endef
+
+# gb_PropertiesTranslateTarget__PropertiesTranslateTarget_onelang target pofile
+define gb_PropertiesTranslateTarget__PropertiesTranslateTarget_onelang
+$(call gb_PropertiesTranslateTarget_get_target,$(1)) : $(2)
+$(2) :
+
+endef
+
+# DescriptionTranslateTarget class
+
+# Handles translation of description.xml files in dictionaries.
+
+gb_DescriptionTranslateTarget_COMMAND := $(call gb_Executable_get_command,xrmex)
+gb_DescriptionTranslateTarget_DEPS := $(call gb_Executable_get_runtime_dependencies,xrmex)
+
+define gb_DescriptionTranslateTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ MERGEINPUT=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(POFILES)) && \
+ $(gb_DescriptionTranslateTarget_COMMAND) \
+ -i $(DESCRIPTION_XML) \
+ -l all \
+ -m $${MERGEINPUT} \
+ -o $(1) && \
+ rm -f $${MERGEINPUT} \
+)
+endef
+
+$(dir $(call gb_DescriptionTranslateTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_DescriptionTranslateTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_DescriptionTranslateTarget_get_target,%) : $(gb_DescriptionTranslateTarget_DEPS)
+ $(call gb_Output_announce,$*,$(true),XRM,1)
+ $(call gb_Trace_StartRange,$*,XRM)
+ $(call gb_DescriptionTranslateTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,XRM)
+
+.PHONY : $(call gb_DescriptionTranslateTarget_get_clean_target,%)
+$(call gb_DescriptionTranslateTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),XRM,1)
+ rm -f $(call gb_DescriptionTranslateTarget_get_target,$*)
+
+# gb_DescriptionTranslateTarget_DescriptionTranslateTarget target source langs
+define gb_DescriptionTranslateTarget_DescriptionTranslateTarget
+$(call gb_DescriptionTranslateTarget_get_target,$(1)) : DESCRIPTION_XML := $(SRCDIR)/$(2)
+$(call gb_DescriptionTranslateTarget_get_target,$(1)) : POFILES :=
+
+$(call gb_DescriptionTranslateTarget_get_target,$(1)) : $(SRCDIR)/$(2)
+$(call gb_DescriptionTranslateTarget_get_target,$(1)) :| $(dir $(call gb_DescriptionTranslateTarget_get_target,$(1))).dir
+
+$(foreach lang,$(3),\
+ $(call gb_DescriptionTranslateTarget__DescriptionTranslateTarget_onelang,$(1),$(patsubst %/,%,$(dir $(2))),$(lang)) \
+)
+
+endef
+
+# gb_DescriptionTranslateTarget__DescriptionTranslateTarget_onelang target pobase lang
+define gb_DescriptionTranslateTarget__DescriptionTranslateTarget_onelang
+$(call gb_DescriptionTranslateTarget_get_target,$(1)) : POFILES += $(if $(filter-out qtz,$(3)),$(gb_POLOCATION)/$(3)/$(2).po)
+$(if $(filter-out qtz,$(3)),\
+ $(call gb_DescriptionTranslateTarget__DescriptionTranslateTarget_onelang_podeps,$(1),$(gb_POLOCATION)/$(3)/$(2).po))
+
+endef
+
+# gb_DescriptionTranslateTarget__DescriptionTranslateTarget_onelang_podeps target pofile
+define gb_DescriptionTranslateTarget__DescriptionTranslateTarget_onelang_podeps
+$(call gb_DescriptionTranslateTarget_get_target,$(1)) : $(2)
+$(2) :
+
+endef
+
+# Dictionary class
+
+# Handles creation and delivery of dictionary extensions.
+#
+# This class provides a filelist called Dictionary/<name> that contains
+# all installed files of the dictionary.
+
+gb_Dictionary_ALL_LANGS := $(filter-out en-US,$(gb_WITH_LANG))
+gb_Dictionary_INSTDIR := $(LIBO_SHARE_FOLDER)/extensions
+
+$(dir $(call gb_Dictionary_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_Dictionary_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_Dictionary_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),DIC,3)
+ $(call gb_Trace_MakeMark,$*,DIC)
+ touch $@
+
+.PHONY : $(call gb_Dictionary_get_clean_target,%)
+$(call gb_Dictionary_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),DIC,3)
+ rm -f $(call gb_Dictionary_get_target,$*)
+
+gb_Dictionary_get_packagename = Dictionary/$(1)
+gb_Dictionary_get_packagesetname = Dictionary/$(1)
+
+# Creates a dictionary extension
+#
+# gb_Dictionary_Dictionary dictionary srcdir
+define gb_Dictionary_Dictionary
+$(call gb_Package_Package_internal,$(call gb_Dictionary_get_packagename,$(1)),$(SRCDIR))
+$(call gb_Package_Package_internal,$(call gb_Dictionary_get_packagename,$(1)_generated),$(WORKDIR))
+$(call gb_PackageSet_PackageSet_internal,$(call gb_Dictionary_get_packagesetname,$(1)))
+
+$(call gb_PackageSet_add_package,$(call gb_Dictionary_get_packagesetname,$(1)),$(call gb_Dictionary_get_packagename,$(1)))
+
+ifeq (,$(gb_Dictionary_ALL_LANGS))
+$(call gb_Dictionary_add_root_file,$(1),$(2)/description.xml)
+else
+$(call gb_Dictionary__add_description_translations,$(1),$(2)/description.xml)
+endif
+$(call gb_Dictionary_add_root_file,$(1),$(2)/dictionaries.xcu)
+$(call gb_Dictionary_add_file,$(1),META-INF/manifest.xml,$(2)/META-INF/manifest.xml)
+
+$(call gb_Dictionary_get_target,$(1)) : $(call gb_PackageSet_get_target,$(call gb_Dictionary_get_packagesetname,$(1)))
+$(call gb_Dictionary_get_target,$(1)) :| $(dir $(call gb_Dictionary_get_target,$(1))).dir
+$(call gb_Dictionary_get_clean_target,$(1)) : $(call gb_PackageSet_get_clean_target,$(call gb_Dictionary_get_packagesetname,$(1)))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_Dictionary_get_target,$(1)),$(call gb_Dictionary_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Dictionary)
+
+endef
+
+# gb_Dictionary__add_description_translation_impl dictionary desctarget descxml
+define gb_Dictionary__add_description_translation_impl
+$(call gb_DescriptionTranslateTarget_DescriptionTranslateTarget,$(2),$(3),$(gb_Dictionary_ALL_LANGS))
+$(call gb_Dictionary_add_generated_file,$(1),description.xml,$(call gb_DescriptionTranslateTarget_get_target,$(2)))
+
+$(call gb_Dictionary_get_target,$(1)) : $(call gb_DescriptionTranslateTarget_get_target,$(2))
+$(call gb_Dictionary_get_clean_target,$(1)) : $(call gb_DescriptionTranslateTarget_get_clean_target,$(2))
+
+endef
+
+# gb_Dictionary__add_description_translations dictionary descxml
+define gb_Dictionary__add_description_translations
+$(call gb_Dictionary__add_description_translation_impl,$(1),$(basename $(2)),$(2))
+
+endef
+
+# gb_Dictionary__add_file dictionary package-base destfile sourcefile
+define gb_Dictionary__add_file
+$(call gb_Package_add_file,$(call gb_Dictionary_get_packagename,$(2)),$(gb_Dictionary_INSTDIR)/$(1)/$(3),$(4))
+
+endef
+
+# Adds a file from $(SRCDIR) to the dictionary under chosen name
+#
+# gb_Dictionary_add_file dictionary destfile sourcefile
+define gb_Dictionary_add_file
+$(call gb_Dictionary__add_file,$(1),$(1),$(2),$(3))
+
+endef
+
+# Adds several files from $(SRCDIR) to the dictionary at once
+#
+# The files are put into the chosen directory.
+#
+# gb_Dictionary_add_files dictionary destdir file(s)
+define gb_Dictionary_add_files
+$(foreach file,$(3),$(call gb_Dictionary_add_file,$(1),$(2)/$(notdir $(file)),$(file)))
+
+endef
+
+# Adds an arbitrary file to the dictionary under chosen name
+#
+# gb_Dictionary_add_file dictionary destfile sourcefile
+define gb_Dictionary_add_generated_file
+$(call gb_Dictionary__add_file,$(1),$(1)_generated,$(2),$(subst $(WORKDIR)/,,$(3)))
+$(call gb_PackageSet_add_package,$(call gb_Dictionary_get_packagesetname,$(1)),$(call gb_Dictionary_get_packagename,$(1)_generated))
+
+endef
+
+# Adds several arbitrary files to the dictionary at once
+#
+# The files are put into the chosen directory.
+#
+# gb_Dictionary_add_files dictionary destdir file(s)
+define gb_Dictionary_add_generated_files
+$(foreach file,$(3),$(call gb_Dictionary_add_generated_file,$(1),$(2)/$(notdir $(file)),$(file)))
+
+endef
+
+# Adds a localized xcu file, which needs special handling because it may be
+# in $(WORKDIR) or $(SRCDIR) depending on whether translations are built.
+#
+# gb_Dictionary_add_localized_xcu_file dictionary destdir file
+define gb_Dictionary_add_localized_xcu_file
+ifeq ($(gb_WITH_LANG),)
+$(call gb_Dictionary__add_file,$(1),$(1),$(2)/$(notdir $(3)),$(strip $(3)))
+else
+$(call gb_Dictionary__add_file,$(1),$(1)_generated,$(2)/$(notdir $(3)),$(subst $(WORKDIR)/,,$(call gb_XcuFile_for_extension,$(strip $(3)))))
+$(call gb_PackageSet_add_package,$(call gb_Dictionary_get_packagesetname,$(1)),$(call gb_Dictionary_get_packagename,$(1)_generated))
+endif
+
+endef
+
+# Adds a file to the root dir of the dictionary
+#
+# gb_Dictionary_add_root_file dictionary file
+define gb_Dictionary_add_root_file
+$(call gb_Dictionary_add_file,$(1),$(notdir $(2)),$(2))
+
+endef
+
+# Adds several files to the root dir of the dictionary
+#
+# gb_Dictionary_add_root_files dictionary file(s)
+define gb_Dictionary_add_root_files
+$(foreach file,$(2),$(call gb_Dictionary_add_root_file,$(1),$(file)))
+
+endef
+
+define gb_Dictionary__add_thesaurus
+$(call gb_Dictionary__add_file,$(1),$(1)_generated,$(notdir $(3)),$(subst $(WORKDIR)/,,$(3)))
+$(call gb_PackageSet_add_package,$(call gb_Dictionary_get_packagesetname,$(1)),$(call gb_Dictionary_get_packagename,$(1)_generated))
+
+endef
+
+# Adds a thesaurus to the dictionary
+#
+# An index for the thesaurus is generated and added to the dictionary as
+# well.
+#
+# gb_Dictionary_add_thesaurus dictionary thesaurus
+define gb_Dictionary_add_thesaurus
+$(call gb_ThesaurusIndexTarget_ThesaurusIndexTarget,$(2))
+$(call gb_Dictionary_add_root_file,$(1),$(2))
+$(call gb_Dictionary__add_thesaurus,$(1),$(2),$(call gb_ThesaurusIndexTarget_get_target,$(2)))
+
+endef
+
+# Adds several thesauri to the dictionary at once
+#
+# Indexes for the thesauri are generated and added to the dictionary as
+# well.
+#
+# gb_Dictionary_add_thesauri dictionary thesauri
+define gb_Dictionary_add_thesauri
+$(foreach thesaurus,$(2),$(call gb_Dictionary_add_thesaurus,$(1),$(thesaurus)))
+
+endef
+
+# gb_Dictionary__translate_propertyfile_impl dictionary destfile propertyfile propertyname lang
+define gb_Dictionary__translate_propertyfile_impl
+$(call gb_PropertiesTranslateTarget_PropertiesTranslateTarget,$(4),$(3),$(5))
+$(call gb_Dictionary_add_generated_file,$(1),$(2),$(call gb_PropertiesTranslateTarget_get_target,$(4)))
+
+endef
+
+# gb_Dictionary__translate_propertyfile dictionary destdir propertyfile propertyname lang
+define gb_Dictionary__translate_propertyfile
+$(call gb_Dictionary__translate_propertyfile_impl,$(1),$(2)$(notdir $(4)).properties,$(3),$(4),$(5))
+
+endef
+
+# gb_Dictionary__add_propertyfile_translations dictionary destfile propertyfile
+define gb_Dictionary__add_propertyfile_translations
+$(foreach lang,$(gb_Dictionary_ALL_LANGS),$(call gb_Dictionary__translate_propertyfile,$(1),$(dir $(2)),$(3),$(subst en_US,$(subst -,_,$(lang)),$(basename $(3))),$(lang)))
+
+endef
+
+# Adds a .property file to the dictionary under chosen name
+#
+# The file is localized automatically.
+#
+# gb_Dictionary_add_propertyfile dictionary destfile propertyfile
+define gb_Dictionary_add_propertyfile
+$(call gb_Dictionary__add_file,$(1),$(1),$(2),$(3))
+$(call gb_Dictionary__add_propertyfile_translations,$(1),$(2),$(3))
+
+endef
+
+# Adds several .property files to the dictionary at once
+#
+# The files are put into chosen directory. They are localized automatically.
+#
+# gb_Dictionary_add_propertyfiles dictionary destdir propertyfile(s)
+define gb_Dictionary_add_propertyfiles
+$(foreach propertyfile,$(3),$(call gb_Dictionary_add_propertyfile,$(1),$(2)/$(notdir $(propertyfile)),$(propertyfile)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/Executable.mk b/solenv/gbuild/Executable.mk
new file mode 100644
index 000000000..7c8cf1994
--- /dev/null
+++ b/solenv/gbuild/Executable.mk
@@ -0,0 +1,173 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# Executable class
+
+# defined by platform
+# gb_Executable_Executable_platform
+
+gb_Executable_LAYER_DIRS := \
+ UREBIN:$(INSTROOT)/$(LIBO_URE_BIN_FOLDER) \
+ OOO:$(INSTROOT)/$(LIBO_BIN_FOLDER) \
+ SDKBIN:$(INSTDIR)/$(SDKDIRNAME)/bin \
+ NONE:$(gb_Executable_BINDIR) \
+
+gb_Executable_LAYER_DIRS_FOR_BUILD := \
+ UREBIN:$(INSTROOT_FOR_BUILD)/$(LIBO_URE_BIN_FOLDER_FOR_BUILD) \
+ OOO:$(INSTROOT_FOR_BUILD)/$(LIBO_BIN_FOLDER_FOR_BUILD) \
+ SDKBIN:$(INSTDIR_FOR_BUILD)/$(SDKDIRNAME_FOR_BUILD)/bin \
+ NONE:$(gb_Executable_BINDIR_FOR_BUILD) \
+
+$(dir $(call gb_Executable_get_runtime_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_Executable_get_runtime_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_Executable_get_runtime_target,%) :
+ touch $@
+
+.PHONY : $(call gb_Executable_get_clean_target,%)
+$(call gb_Executable_get_clean_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_Executable_get_target,$*) \
+ $(call gb_Executable_get_runtime_target,$*) \
+ $(AUXTARGETS))
+
+gb_Executable__get_dir_for_layer = $(patsubst $(1):%,%,$(filter $(1):%,$(call gb_Executable_LAYER_DIRS)))
+gb_Executable__get_dir_for_layer_for_build = $(patsubst $(1):%,%,$(filter $(1):%,$(call gb_Executable_LAYER_DIRS_FOR_BUILD)))
+gb_Executable__get_dir_for_exe = $(call gb_Executable__get_dir_for_layer,$(call gb_Executable_get_layer,$(1)))
+gb_Executable__get_dir_for_exe_for_build = $(call gb_Executable__get_dir_for_layer_for_build,$(call gb_Executable_get_layer,$(1)))
+
+define gb_Executable_Executable
+$(call gb_Postprocess_register_target,AllExecutables,Executable,$(1))
+ifeq (,$$(findstring $(1),$$(gb_Executable_KNOWN)))
+$$(eval $$(call gb_Output_info,Currently known executables: $(sort $(gb_Executable_KNOWN)),ALL))
+$$(eval $$(call gb_Output_error,Executable $(1) must be registered in Repository.mk or RepositoryExternal.mk))
+endif
+$(call gb_Executable__Executable_impl,$(1),$(call gb_Executable_get_linktarget,$(1)))
+
+endef
+
+# call gb_Executable__Executable_impl,exe,linktarget
+define gb_Executable__Executable_impl
+$(call gb_LinkTarget_LinkTarget,$(2),Executable_$(1),$(call gb_Executable_get_layer,$(1)))
+$(call gb_LinkTarget_set_targettype,$(2),Executable)
+$(call gb_LinkTarget_add_libs,$(2),$(gb_STDLIBS))
+$(call gb_Executable_get_runtime_target,$(1)) :| $(dir $(call gb_Executable_get_runtime_target,$(1))).dir
+$(call gb_Executable_get_runtime_target,$(1)) : $(call gb_Executable_get_target_for_build,$(1))
+$(call gb_Executable_get_clean_target,$(1)) : $(call gb_LinkTarget_get_clean_target,$(2))
+$(call gb_Executable_get_clean_target,$(1)) : AUXTARGETS :=
+$(call gb_Executable_Executable_platform,$(1),$(2),$(gb_Executable_BINDIR)/$(1).lib)
+ifeq ($(OS),EMSCRIPTEN)
+$(call gb_LinkTarget_get_target,$(call gb_Executable_get_linktarget,$(1))) : $(call gb_CustomTarget_get_workdir,static/emscripten_fs_image)/soffice.data.js.link
+endif
+
+$$(eval $$(call gb_Module_register_target,$(call gb_Executable_get_target,$(1)),$(call gb_Executable_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Executable)
+
+endef
+
+define gb_Executable_set_targettype_gui
+$(call gb_Executable_get_linktarget_target,$(1)) : TARGETGUI := $(2)
+endef
+
+# forward the call to the gb_LinkTarget implementation
+# (note: because the function name is in $(1), the other args are shifted by 1)
+define gb_Executable__forward_to_Linktarget
+$(call gb_LinkTarget_$(subst gb_Executable_,,$(1)),$(call gb_Executable_get_linktarget,$(2)),$(3),$(4),Executable_$(2))
+
+endef
+
+# copy pasta for forwarding: this could be (and was) done more elegantly, but
+# these here can be found by both git grep and ctags
+gb_Executable_add_cobject = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_cobjects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_cxxobject = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_cxxobjects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_objcobject = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_objcobjects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_objcxxobject = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_objcxxobjects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_cxxclrobject = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_cxxclrobjects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_grammar = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_grammars = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_scanner = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_scanners = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_exception_objects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_generated_cobjects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_generated_exception_objects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_generated_objcobjects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_generated_objcxxobjects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_cflags = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_cxxflags = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_objcflags = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_objcxxflags = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_cxxclrflags = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_defs = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_include = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_ldflags = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_ldflags = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_x86 = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_libs = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_disable_standard_system_libs = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_system_darwin_frameworks = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_system_win32_libs = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_library_path_flags = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_api = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_sdk_api = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_udk_api = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_internal_api = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_internal_bootstrap_api = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_internal_comprehensive_api = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_library_objects = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_libraries = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_static_libraries = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_external = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_externals = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_custom_headers = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_package = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_packages = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_unpacked = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_sdi_headers = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_precompiled_header = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_reuse_precompiled_header = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_common_precompiled_header = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_nativeres = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_warnings_not_errors = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_warnings_disabled = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_external_code = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_generated_cxx_suffix = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_clang = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_set_clang_precompiled_header = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_use_vclmain = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Executable_add_prejs = $(call gb_Executable__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+
+# Run-time use
+
+# Add dependencies needed for running the executable
+#
+# gb_Executable_add_runtime_dependencies executable dependencies
+define gb_Executable_add_runtime_dependencies
+$(call gb_Executable_get_runtime_target,$(1)) : $(2)
+
+endef
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/Extension.mk b/solenv/gbuild/Extension.mk
new file mode 100644
index 000000000..0dce9757b
--- /dev/null
+++ b/solenv/gbuild/Extension.mk
@@ -0,0 +1,494 @@
+# -*- 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/.
+#
+
+# Extension class
+
+# platform
+# gb_Extension_LICENSEFILE_DEFAULT
+
+gb_Extension__get_preparation_target = $(WORKDIR)/Extension/$(1).prepare
+
+gb_Extension_ZIPCOMMAND := zip $(if $(findstring s,$(MAKEFLAGS)),-q)
+gb_Extension_XRMEXDEPS := $(call gb_Executable_get_runtime_dependencies,xrmex)
+gb_Extension_XRMEXCOMMAND := $(call gb_Executable_get_command,xrmex)
+
+gb_Extension_PROPMERGEDEPS := $(call gb_Executable_get_runtime_dependencies,propex)
+gb_Extension_PROPMERGECOMMAND := $(call gb_Executable_get_command,propex)
+
+gb_Extension_TREEXDEPS := $(call gb_Executable_get_runtime_dependencies,treex)
+gb_Extension_TREEXCOMMAND := $(call gb_Executable_get_command,treex)
+
+gb_Extension_HELPEXDEPS := $(call gb_Executable_get_runtime_dependencies,helpex)
+gb_Extension_HELPEXCOMMAND := $(call gb_Executable_get_command,helpex)
+gb_Extension_HELPINDEXERDEPS := $(call gb_Executable_get_runtime_dependencies,HelpIndexer)
+gb_Extension_HELPINDEXERCOMMAND := $(call gb_Executable_get_command,HelpIndexer)
+gb_Extension_HELPLINKERDEPS := $(call gb_Executable_get_runtime_dependencies,HelpLinker)
+gb_Extension_HELPLINKERCOMMAND := $(call gb_Executable_get_command,HelpLinker)
+# does not contain en-US because it is special cased in gb_Extension_Extension
+gb_Extension_TRANS_LANGS := $(filter-out en-US,$(gb_WITH_LANG))
+gb_Extension_ALL_LANGS := en-US $(gb_Extension_TRANS_LANGS)
+
+# target ensuring delivery of the extension to instdir
+gb_Extension__get_final_target = $(WORKDIR)/Extension/$(1).final
+
+# Substitute platform or copy if no platform has been set
+define gb_Extension__subst_platform
+$(if $(PLATFORM),\
+ sed \
+ -e 's/@PLATFORM@/$(PLATFORM)/' \
+ -e 's/@EXEC_EXTENSION@/$(gb_Executable_EXT)/' \
+ -e 's/@SHARED_EXTENSION@/$(gb_Library_DLLEXT)/' \
+ $(1) > $(2),\
+ cp -f $(1) $(2))
+endef
+
+$(call gb_Extension_get_workdir,%)/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+# remove extension directory in workdir and oxt file in workdir
+$(call gb_Extension_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),OXT,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f -r $(call gb_Extension_get_workdir,$*) && \
+ rm -f $(call gb_Extension__get_preparation_target,$*) \
+ $(call gb_Extension_get_target,$*) \
+ )
+
+$(call gb_Extension__get_final_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && touch $@)
+
+# preparation target to delay adding files produced by e.g. UnpackedTarball
+$(call gb_Extension__get_preparation_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && touch $@)
+
+ifeq ($(strip $(gb_WITH_LANG)),)
+$(call gb_Extension_get_workdir,%)/description.xml : $(gb_Helper_LANGSTARGET)
+ $(call gb_Output_announce,$*/description.xml,$(true),CPY,3)
+ $(call gb_Trace_StartRange,$*/description.xml,CPY)
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(call gb_Extension_get_workdir,$*) && \
+ cp -f $(LOCATION)/description.xml $@)
+ $(call gb_Trace_EndRange,$*/description.xml,CPY)
+else
+$(call gb_Extension_get_workdir,%)/description.xml : $(gb_Extension_XRMEXDEPS) $(gb_Helper_LANGSTARGET)
+ $(call gb_Output_announce,$*/description.xml,$(true),XRM,3)
+ $(call gb_Trace_StartRange,$*/description.xml,XRM)
+ MERGEINPUT=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(POFILES)) && \
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(call gb_Extension_get_workdir,$*) && \
+ $(gb_Extension_XRMEXCOMMAND) \
+ -i $(filter %.xml,$^) \
+ -o $@ \
+ -m $${MERGEINPUT} \
+ -l all) && \
+ rm -rf $${MERGEINPUT}
+ $(call gb_Trace_EndRange,$*/description.xml,XRM)
+
+endif
+
+# rule to create oxt package in workdir
+# --filesync makes sure that all files in the oxt package will be removed that no longer are in $(FILES)
+$(call gb_Extension_get_target,%) : \
+ $(call gb_Extension_get_workdir,%)/description.xml
+ $(call gb_Output_announce,$*,$(true),OXT,3)
+ $(call gb_Trace_StartRange,$*,OXT)
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(call gb_Extension_get_rootdir,$*)/META-INF \
+ $(if $(LICENSE),$(call gb_Extension_get_rootdir,$*)/registration) && \
+ $(call gb_Extension__subst_platform,$(call gb_Extension_get_workdir,$*)/description.xml,$(call gb_Extension_get_rootdir,$*)/description.xml) && \
+ $(call gb_Extension__subst_platform,$(LOCATION)/META-INF/manifest.xml,$(call gb_Extension_get_rootdir,$*)/META-INF/manifest.xml) && \
+ $(if $(LICENSE),cp -f $(LICENSE) $(call gb_Extension_get_rootdir,$*)/registration &&) \
+ $(if $(and $(gb_Extension_TRANS_LANGS),$(DESCRIPTION)),cp $(foreach lang,$(gb_Extension_TRANS_LANGS),$(call gb_Extension_get_workdir,$*)/description-$(lang).txt) $(call gb_Extension_get_rootdir,$*) &&) \
+ cd $(call gb_Extension_get_rootdir,$*) && \
+ ZIPFILES=$(call gb_var2file,$(shell $(gb_MKTEMP)),500,$(sort $(FILES))) && \
+ $(gb_Extension_ZIPCOMMAND) -rX --filesync --must-match \
+ $(call gb_Extension_get_target,$*) \
+ `cat $${ZIPFILES} | tr -d '\r'` && rm $${ZIPFILES})
+ $(call gb_Trace_EndRange,$*,OXT)
+
+# set file list and location of manifest and description files
+# register target and clean target
+# add deliverable
+# add dependency for outdir target to workdir target (pattern rule for delivery is in Package.mk)
+#
+# gb_Extension_Extension extension srcdir nodeliver
+define gb_Extension_Extension
+$(call gb_Extension_get_target,$(1)) : DESCRIPTION :=
+$(call gb_Extension_get_target,$(1)) : FILES := META-INF description.xml
+$(call gb_Extension_get_target,$(1)) : LICENSE :=
+$(call gb_Extension_get_target,$(1)) : LOCATION := $(SRCDIR)/$(2)
+$(call gb_Extension_get_target,$(1)) : PLATFORM := $(PLATFORMID)
+$(call gb_Extension_get_target,$(1)) : $(SRCDIR)/$(2)/META-INF/manifest.xml
+$(call gb_Extension_get_workdir,$(1))/description.xml : \
+ $(SRCDIR)/$(2)/description.xml
+$(call gb_Extension_get_workdir,$(1))/description.xml :| \
+ $(call gb_Extension__get_preparation_target,$(1))
+$(call gb_Extension__get_final_target,$(1)) : $(call gb_Extension_get_target,$(1))
+
+$(if $(filter nodeliver,$(3)),,$(call gb_Extension__Extension_deliver,$(1),Extension/$(1)))
+
+ifneq ($(strip $(gb_WITH_LANG)),)
+$(call gb_Extension_get_target,$(1)) : \
+ POFILES := $(wildcard $(foreach lang,$(gb_TRANS_LANGS),$(gb_POLOCATION)/$(lang)/$(2).po))
+$(call gb_Extension_get_workdir,$(1))/description.xml : \
+ $(wildcard $(foreach lang,$(gb_TRANS_LANGS),$(gb_POLOCATION)/$(lang)/$(2).po))
+$(foreach lang,$(gb_TRANS_LANGS),$(gb_POLOCATION)/$(lang)/$(2).po) :
+endif
+
+$(foreach lang,$(gb_Extension_ALL_LANGS), \
+ $(call gb_Extension__compile_help_onelang,$(1),$(lang)))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_Extension__get_final_target,$(1)),$(call gb_Extension_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Extension,$(call gb_Extension__get_final_target,$(1)))
+
+endef
+
+# Ensure delivery of the extension to instdir.
+#
+# gb_Extension__Extension_deliver extension package-name
+define gb_Extension__Extension_deliver
+$(call gb_GeneratedPackage_GeneratedPackage,$(2),$(dir $(call gb_Extension_get_rootdir,$(1))))
+$(call gb_GeneratedPackage_add_dir,$(2),$(INSTROOT)/$(LIBO_SHARE_FOLDER)/extensions/$(1),$(notdir $(call gb_Extension_get_rootdir,$(1))))
+
+$(call gb_GeneratedPackage_get_target,$(2)) : $(call gb_Extension_get_target,$(1))
+$(call gb_Extension__get_final_target,$(1)) : $(call gb_GeneratedPackage_get_target,$(2))
+
+endef
+
+# adding a file creates a dependency to it
+# file is copied to $(WORKDIR)
+define gb_Extension_add_file
+$(call gb_Extension_get_target,$(1)) : FILES += $(2)
+$(call gb_Extension_get_target,$(1)) : $(call gb_Extension_get_rootdir,$(1))/$(2)
+$(3) :| $(call gb_Extension__get_preparation_target,$(1))
+$(call gb_Extension_get_rootdir,$(1))/$(2) : $(3)
+ mkdir -p $$(dir $$@) && \
+ cp -f $(3) $$@
+
+endef
+
+# Add several files at once
+#
+# This function avoids the need to specify each file's name twice. The
+# files are added directly under specified path in the extension,
+# without any subpath. If no path is specified, they are added directly
+# to the root dir of the extension.
+define gb_Extension_add_files
+$(foreach file,$(3),$(call gb_Extension_add_file,$(1),$(if $(strip $(2)),$(strip $(2))/)$(notdir $(file)),$(file)))
+
+endef
+
+# add a library from workdir; DO NOT use gb_Library_get_target
+define gb_Extension_add_library
+$(call gb_Extension_add_file,$(1),$(call gb_Library_get_runtime_filename,$(2)),\
+ $(call gb_Library_get_linktarget_target,$(2)))
+
+endef
+
+define gb_Extension_add_libraries
+$(foreach lib,$(2),$(call gb_Extension_add_library,$(1),$(lib)))
+
+endef
+
+# add an executable
+define gb_Extension_add_executable
+$(call gb_Extension_add_file,$(1),$(notdir $(call gb_Executable_get_target,$(2))),\
+ $(call gb_Executable_get_target,$(2)))
+
+endef
+
+define gb_Extension_add_executables
+$(foreach exe,$(2),$(call gb_Extension_add_executable,$(1),$(exe)))
+
+endef
+
+# localize .properties file
+# source file is copied to $(WORKDIR)
+define gb_Extension_localize_properties
+$(foreach lang,$(gb_Extension_ALL_LANGS),\
+ $(call gb_Extension__localize_properties_onelang,$(1),$(subst en_US,$(subst -,_,$(lang)),$(2)),$(3),$(lang)))
+
+endef
+
+
+# add an .xhp help file, to be localized and compiled
+# $(1): extension identifier
+# $(2): absolute path prefix of en-US source file without $(3) (resp. $(4))
+# suffix
+# $(3): relative path of (target) .xhp file (e.g.,
+# com.sun.wiki-publisher/wiki.xhp)
+# $(4): optional relative path of source .xhp file, when it differs from $(3)
+# (i.e., if $(4) is empty the en-US source file is $(2)/$(3), otherwise it
+# is $(2)/$(4))
+define gb_Extension_add_helpfile
+$(foreach lang,$(gb_Extension_ALL_LANGS), \
+ $(call gb_Extension__localize_helpfile_onelang,$(1),$(2),$(3),$(4),$(lang)) \
+ $(call gb_Extension__add_compiled_help_dependency_onelang,$(1),$(lang)))
+
+endef
+
+# add a list of .xhp help files, to be localized and compiled
+# $(1): extension identifier
+# $(2): absolute path prefix of en-US source files without $(3) suffixes
+# $(3): list of relative paths of .xhp files (see gb_Extension_add_helpfile)
+define gb_Extension_add_helpfiles
+$(foreach helpfile,$(3), \
+ $(call gb_Extension_add_helpfile,$(1),$(2),$(helpfile),))
+
+endef
+
+# add a help.tree file, to be localized and compiled
+# $(1): extension identifier
+# $(2): absolute path prefix of en-US source file without $(3) (resp. $(4))
+# suffix
+# $(3): relative path of (target) help.tree file (e.g.,
+# com.sun.wiki-publisher/help.tree)
+# $(4): relative path of source help.tree file
+# $(5): relative path of localized xhp files (PlatformID included)
+define gb_Extension_add_helptreefile
+$(foreach lang,$(gb_Extension_ALL_LANGS), \
+ $(call gb_Extension__localize_helptreefile_onelang,$(1),$(2),$(3),$(4),$(lang),$(5)) \
+ $(call gb_Extension__add_compiled_help_dependency_onelang,$(1),$(lang)))
+
+endef
+
+# Use the given file as description-en-US.txt
+define gb_Extension_use_default_description
+$(call gb_Extension_add_file,$(1),description-en-US.txt,$(SRCDIR)/$(2))
+$(call gb_Extension_get_target,$(1)) : DESCRIPTION := $(true)
+ifneq ($(strip $(gb_WITH_LANG)),)
+$(call gb_Extension_get_target,$(1)) : FILES += $(foreach lang,$(gb_Extension_TRANS_LANGS),description-$(lang).txt)
+endif
+
+endef
+
+# Use the default license file
+define gb_Extension_use_default_license
+$(call gb_Extension_get_target,$(1)) : FILES += registration
+$(call gb_Extension_get_target,$(1)) : LICENSE := $(gb_Extension_LICENSEFILE_DEFAULT)
+$(call gb_Extension_get_target,$(1)) : $(gb_Extension_LICENSEFILE_DEFAULT)
+
+endef
+
+define gb_Extension_use_unpacked
+$(call gb_Extension__get_preparation_target,$(1)) \
+ :| $(call gb_UnpackedTarball_get_final_target,$(2))
+
+endef
+
+# Add a dependency on an ExternalProject.
+#
+# call gb_Extension_use_external_project,extension,externalproject
+define gb_Extension_use_external_project
+$(call gb_Extension__get_preparation_target,$(1)) \
+ :| $(call gb_ExternalProject_get_target,$(2))
+
+endef
+
+define gb_Extension__localize_properties_onelang
+$(call gb_Extension_get_target,$(1)) : FILES += $(2)
+ifneq ($(filter-out en-US,$(4)),)
+ifneq ($(filter-out qtz,$(4)),)
+$(call gb_Extension_get_rootdir,$(1))/$(2) : \
+ POFILE := $(gb_POLOCATION)/$(or $(5),$(4))/$(patsubst /%/,%,$(subst $(SRCDIR),,$(dir $(3)))).po
+$(call gb_Extension_get_rootdir,$(1))/$(2) : \
+ $(gb_POLOCATION)/$(or $(5),$(4))/$(patsubst /%/,%,$(subst $(SRCDIR),,$(dir $(3)))).po
+$(gb_POLOCATION)/$(or $(5),$(4))/$(patsubst /%/,%,$(subst $(SRCDIR),,$(dir $(3)))).po :
+endif
+endif
+$(call gb_Extension_get_target,$(1)) : $(call gb_Extension_get_rootdir,$(1))/$(2)
+$(call gb_Extension_get_rootdir,$(1))/$(2) \
+ :| $(call gb_Extension__get_preparation_target,$(1))
+$(call gb_Extension_get_rootdir,$(1))/$(2) : $(3) \
+ $(gb_Extension_PROPMERGEDEPS)
+ $$(call gb_Output_announce,$(2),$(true),PRP,3)
+ $$(call gb_Trace_StartRange,$(2),PRP)
+ $$(call gb_Helper_abbreviate_dirs, \
+ mkdir -p $$(dir $$@) && \
+ $(if $(filter qtz,$(4)), \
+ $(subst $$,$$$$,$(gb_Extension_PROPMERGECOMMAND)) -i $$< -o $$@ -m -l $(4) \
+ , \
+ $(if $(filter-out en-US,$(4)), \
+ MERGEINPUT=`$(gb_MKTEMP)` && \
+ echo $$(POFILE) > $$$${MERGEINPUT} && \
+ $(subst $$,$$$$,$(gb_Extension_PROPMERGECOMMAND)) -i $$< -o $$@ -m $$$${MERGEINPUT} -l $(4) && \
+ rm -rf $$$${MERGEINPUT} \
+ , \
+ cp -f $$< $$@ \
+ ) \
+ ) \
+ )
+ $$(call gb_Trace_EndRange,$(2),PRP)
+
+endef
+
+# localize one .xhp help file for one language; the result is stored as
+# help/$(4)/$(3) in the extension's workdir; as a special case, if $(4) is
+# "en-US", the source file is just copied, not passed through helpex
+# $(1): extension identifier
+# $(2): absolute path prefix of en-US source file without $(3) (resp. $(4))
+# suffix
+# $(3): relative path of (target) .xhp file (see
+# gb_Extension_add_helpfile)
+# $(4): optional relative path of source .xhp file (see
+# gb_Extension_add_helpfile)
+# $(5): language
+define gb_Extension__localize_helpfile_onelang
+$(call gb_Extension_get_rootdir,$(1))/help/$(5).done : HELPFILES += $(3)
+$(call gb_Extension_get_rootdir,$(1))/help/$(5).done : \
+ $(call gb_Extension_get_workdir,$(1))/help/$(5)/$(3)
+$(call gb_Extension_get_rootdir,$(1))/help/$(5)-xhp.done : \
+ $(call gb_Extension_get_workdir,$(1))/help/$(5)/$(3)
+ifneq ($(filter-out en-US,$(5)),)
+ifneq ($(filter-out qtz,$(5)),)
+$(call gb_Extension_get_workdir,$(1))/help/$(5)/$(3) : \
+ POFILE := $(gb_POLOCATION)/$(5)$(subst $(SRCDIR),,$(2))$(patsubst %/,/%.po,$(patsubst ./,.po,$(dir $(or $(4),$(3)))))
+$(call gb_Extension_get_workdir,$(1))/help/$(5)/$(3) : \
+ $(gb_POLOCATION)/$(5)$(subst $(SRCDIR),,$(2))$(patsubst %/,/%.po,$(patsubst ./,.po,$(dir $(or $(4),$(3)))))
+$(gb_POLOCATION)/$(5)$(subst $(SRCDIR),,$(2))$(patsubst %/,/%.po,$(patsubst ./,.po,$(dir $(or $(4),$(3))))) :
+endif
+endif
+$(call gb_Extension_get_workdir,$(1))/help/$(5)/$(3) : \
+ $(if $(filter-out en-US,$(5)),$(gb_Extension_HELPEXDEPS)) | \
+ $(call gb_Extension_get_workdir,$(1))/help/.dir
+$(call gb_Extension_get_workdir,$(1))/help/$(5)/$(3) : \
+ $(2)/$(or $(4),$(3))
+ $$(call gb_Output_announce,$(1) $(3) $(5),$(true),XHP,3)
+ $$(call gb_Trace_StartRange,$(1) $(3) $(5),XHP)
+ $$(call gb_Helper_abbreviate_dirs, \
+ mkdir -p $$(dir $$@) && \
+ $(if $(filter qtz,$(5)), \
+ $$(gb_Extension_HELPEXCOMMAND) -i $$< -o $$@ -l $(5) -m \
+ , \
+ $(if $(filter-out en-US,$(5)), \
+ MERGEINPUT=`$(gb_MKTEMP)` && \
+ echo $$(POFILE) > $$$${MERGEINPUT} && \
+ $$(gb_Extension_HELPEXCOMMAND) -i $$< -o $$@ -l $(5) \
+ -m $$$${MERGEINPUT} && \
+ rm -rf $$$${MERGEINPUT} \
+ , \
+ cp $$< $$@ \
+ ) \
+ ) && \
+ touch $(call gb_Extension_get_rootdir,$(1))/help/$(5)-xhp.done \
+ )
+ $$(call gb_Trace_EndRange,$(1) $(3) $(5),XHP)
+
+endef
+
+# localize one help.tree for one language; the result is stored as
+# help/$(4)/$(3) in the extension's workdir;
+# $(1): extension identifier
+# $(2): absolute path prefix of en-US source file without $(3) (resp. $(4))
+# suffix
+# $(3): relative path of (target) help.tree file (see
+# gb_Extension_add_helptreefile)
+# $(4): relative path of source help.tree file (see
+# gb_Extension_add_helptreefile)
+# $(5): language
+# $(6): relative path of localized xhp files (PlatformID included)
+define gb_Extension__localize_helptreefile_onelang
+$(call gb_Extension_get_rootdir,$(1))/help/$(5).done : \
+ $(call gb_Extension_get_rootdir,$(1))/help/$(5)/$(3)
+ifneq ($(filter-out en-US,$(5)),)
+ifneq ($(filter-out qtz,$(5)),)
+$(call gb_Extension_get_rootdir,$(1))/help/$(5)/$(3) : \
+ POFILE := $(gb_POLOCATION)/$(5)$(subst $(SRCDIR),,$(2))$(patsubst %/,/%.po,$(patsubst ./,.po,$(dir $(4))))
+$(call gb_Extension_get_rootdir,$(1))/help/$(5)/$(3) : \
+ $(gb_POLOCATION)/$(5)$(subst $(SRCDIR),,$(2))$(patsubst %/,/%.po,$(patsubst ./,.po,$(dir $(4))))
+$(gb_POLOCATION)/$(5)$(subst $(SRCDIR),,$(2))$(patsubst %/,/%.po,$(patsubst ./,.po,$(dir $(4)))) :
+endif
+endif
+$(call gb_Extension_get_rootdir,$(1))/help/$(5)/$(3) : \
+ $(call gb_Extension_get_rootdir,$(1))/help/$(5)-xhp.done
+$(call gb_Extension_get_rootdir,$(1))/help/$(5)/$(3) : \
+ $(gb_Extension_TREEXDEPS) | \
+ $(2)/$(4)
+$(call gb_Extension_get_rootdir,$(1))/help/$(5)/$(3) : \
+ $(2)/$(or $(4),$(3))
+ $$(call gb_Output_announce,$(1) $(3) $(5),$(true),TRE,3)
+ $$(call gb_Trace_StartRange,$(1) $(3) $(5),TRE)
+ $$(call gb_Helper_abbreviate_dirs, \
+ mkdir -p $$(dir $$@) && \
+ $(if $(filter qtz,$(5)), \
+ $(subst $$,$$$$,$(gb_Extension_TREEXCOMMAND)) -i $$< -o $$@ -l $(5) -m \
+ -r $$(call gb_Extension_get_workdir,$(1))/help/$(5)/$(6) \
+ , \
+ $(if $(filter-out en-US,$(5)), \
+ MERGEINPUT=`$(gb_MKTEMP)` && \
+ echo $$(POFILE) > $$$${MERGEINPUT} && \
+ $(subst $$,$$$$,$(gb_Extension_TREEXCOMMAND)) -i $$< -o $$@ -l $(5) \
+ -m $$$${MERGEINPUT} \
+ -r $$(call gb_Extension_get_workdir,$(1))/help/$(5)/$(6) && \
+ rm -rf $$$${MERGEINPUT} \
+ , \
+ $(subst $$,$$$$,$(gb_Extension_TREEXCOMMAND)) -i $$< -o $$@ -l $(5) \
+ -r $$(call gb_Extension_get_workdir,$(1))/help/$(5)/$(6) \
+ ) \
+ ) \
+ )
+ $$(call gb_Trace_EndRange,$(1) $(3) $(5),XHP)
+
+endef
+
+# compile help for one language; the result is stored as help/$(3)/ in the
+# extension's rootdir and marked for zipping into the .oxt
+# $(1): extension identifier
+# $(2): language
+# Target-specific HELPFILES: list of relative paths of .xhp files (see
+# gb_Extension_add_helpfile)
+define gb_Extension__compile_help_onelang
+$(call gb_Extension_get_rootdir,$(1))/help/$(2).done : \
+ $(gb_Extension_HELPINDEXERDEPS) \
+ $(gb_Extension_HELPLINKERDEPS) \
+ $(SRCDIR)/xmlhelp/util/embed.xsl \
+ $(SRCDIR)/xmlhelp/util/idxcaption.xsl \
+ $(SRCDIR)/xmlhelp/util/idxcontent.xsl | \
+ $(call gb_Extension_get_rootdir,$(1))/help/.dir
+ $$(call gb_Output_announce,$(1) $(2),$(true),XHC,3)
+ $$(call gb_Trace_StartRange,$(1) $(2),XHC)
+ $$(call gb_Helper_abbreviate_dirs, \
+ mkdir -p $$(basename $$@) && \
+ $$(gb_Extension_HELPLINKERCOMMAND) -mod help \
+ -extlangsrc $(call gb_Extension_get_workdir,$(1))/help/$(2) \
+ -sty $(SRCDIR)/xmlhelp/util/embed.xsl \
+ -extlangdest $$(basename $$@) \
+ -idxcaption $(SRCDIR)/xmlhelp/util/idxcaption.xsl \
+ -idxcontent $(SRCDIR)/xmlhelp/util/idxcontent.xsl \
+ $$(HELPFILES) && \
+ (cd $(call gb_Extension_get_workdir,$(1))/help/$(2) && \
+ $$(gb_Extension_ZIPCOMMAND) -r $$(basename $$@)/help.jar \
+ $$(HELPFILES)) && \
+ $$(gb_Extension_HELPINDEXERCOMMAND) -lang $(2) -mod help \
+ -dir $$(basename $$@) && \
+ rm -fr $$(basename $$@)/caption $$(basename $$@)/content && \
+ touch $$@)
+ $$(call gb_Trace_EndRange,$(1) $(2),XHC)
+
+endef
+
+# establish the dependency that actually causes inclusion of the compiled help
+# into the .oxt, for one language; in principle, this would only need to be done
+# once per language iff the extension uses any help -- currently it is done from
+# each individual gb_Extension_add_helpfile call (and thus requires $strip
+# to remove duplicates from FILES)
+# $(1): extension identifier
+# $(2): language
+define gb_Extension__add_compiled_help_dependency_onelang
+$(call gb_Extension_get_target,$(1)) : FILES += help/$(2)
+$(call gb_Extension_get_target,$(1)) : \
+ $(call gb_Extension_get_rootdir,$(1))/help/$(2).done
+$(call gb_Extension_get_rootdir,$(1))/help/$(2).done \
+ :| $(call gb_Extension__get_preparation_target,$(1))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/ExtensionPackage.mk b/solenv/gbuild/ExtensionPackage.mk
new file mode 100644
index 000000000..6a86aa027
--- /dev/null
+++ b/solenv/gbuild/ExtensionPackage.mk
@@ -0,0 +1,95 @@
+# -*- 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/.
+#
+
+# ExtensionPackage class
+#
+# Unpacks a binary .oxt file into the instdir extension directory and
+# writes a file-list.
+
+$(call gb_ExtensionPackage_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),OXP,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(INSTROOT)/$(LIBO_SHARE_FOLDER)/extensions/$* \
+ $(call gb_ExtensionPackage_get_target,$*))
+
+$(call gb_ExtensionPackage_get_preparation_target,%) :
+ mkdir -p $(dir $@) && touch $@
+
+$(call gb_ExtensionPackage_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),OXP,3)
+ $(call gb_Trace_StartRange,$*,OXP)
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) \
+ && rm -rf $(INSTROOT)/$(LIBO_SHARE_FOLDER)/extensions/$* \
+ && unzip -q $(ZIPFILE) -d $(INSTROOT)/$(LIBO_SHARE_FOLDER)/extensions/$* \
+ && zipinfo -1 $(ZIPFILE) | grep -v '/$$' \
+ | sed s+^+$(INSTROOT)/$(LIBO_SHARE_FOLDER)/extensions/$*/+ > $@)
+ $(call gb_Trace_EndRange,$*,OXP)
+
+# call gb_ExtensionPackage_ExtensionPackage_internal,package,oxt
+define gb_ExtensionPackage_ExtensionPackage_internal
+$(if $(2),,$(call gb_Output_error,need 2 parameters))
+$(call gb_ExtensionPackage_get_target,$(1)) : ZIPFILE := $(2)
+$(call gb_ExtensionPackage_get_target,$(1)) : $(2)
+$(call gb_ExtensionPackage_get_target,$(1)) :| \
+ $(INSTROOT)/$(LIBO_SHARE_FOLDER)/extensions/.dir
+
+endef
+
+# call gb_ExtensionPackage_ExtensionPackage,package,oxt
+define gb_ExtensionPackage_ExtensionPackage
+$(call gb_ExtensionPackage_ExtensionPackage_internal,$(1),$(2))
+$(2) : $(call gb_ExtensionPackage_get_preparation_target,$(1))
+ touch $$@
+
+$$(eval $$(call gb_Module_register_target,$(call gb_ExtensionPackage_get_target,$(1)),$(call gb_ExtensionPackage_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),ExtensionPackage)
+
+endef
+
+# call gb_ExtensionPackage_use_external_project,package,externalproject
+define gb_ExtensionPackage_use_external_project
+$(call gb_ExtensionPackage_get_preparation_target,$(1)) : \
+ $(call gb_ExternalProject_get_target,$(2))
+
+endef
+
+# ExtensionPackage class
+#
+# This is less boring than writing a dozen 1-line ExtensionPackage files.
+
+$(call gb_ExtensionPackageSet_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),OXS,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(call gb_ExtensionPackageSet_get_target,$*))
+
+$(call gb_ExtensionPackageSet_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),OXS,3)
+ $(call gb_Trace_MakeMark,$*,OXS)
+ mkdir -p $(dir $@) && touch $@
+
+# call gb_ExtensionPackageSet_ExtensionPackageSet,set
+define gb_ExtensionPackageSet_ExtensionPackageSet
+$$(eval $$(call gb_Module_register_target,$(call gb_ExtensionPackageSet_get_target,$(1)),$(call gb_ExtensionPackageSet_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),ExtensionPackageSet)
+
+endef
+
+# call gb_ExtensionPackageSet_add_extension,set,package,oxt-filename
+define gb_ExtensionPackageSet_add_extension
+$(call gb_ExtensionPackage_ExtensionPackage_internal,$(2),$(TARFILE_LOCATION)/$(3))
+
+$(call gb_ExtensionPackageSet_get_target,$(1)) : \
+ $(call gb_ExtensionPackage_get_target,$(2))
+$(call gb_ExtensionPackageSet_get_clean_target,$(1)) : \
+ $(call gb_ExtensionPackage_get_clean_target,$(2))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/ExternalExecutable.mk b/solenv/gbuild/ExternalExecutable.mk
new file mode 100644
index 000000000..7a0fd996d
--- /dev/null
+++ b/solenv/gbuild/ExternalExecutable.mk
@@ -0,0 +1,216 @@
+# -*- 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/.
+#
+
+# class ExternalExecutable
+
+# ExternalExecutable is a little helper for using executables that might
+# either come from system or be built internally.
+#
+# === Setup ===
+#
+# An ExternalExecutable command consists of 4 parts:
+# * precommand: any command line variables that need to be set
+# * internal: unspecified command(s), possibly including calls of gdb,
+# valgrind or icerun
+# * executable: the executable, with or without path
+# * arguments: command line arguments that are specific for either
+# external or internal call, or that are common for _all_ uses of the
+# executable
+#
+# The configuration is done in RepositoryExternal.mk by defining function
+# gb_ExternalExecutable__register_EXECUTABLE, which can call up to 4
+# functions:
+# * gb_ExternalExecutable_set_external / gb_ExternalExecutable_set_internal
+# * gb_ExternalExecutable_set_precommand
+# * gb_ExternalExecutable_add_dependencies
+# * gb_ExternalExecutable_add_arguments.
+# If neither gb_ExternalExecutable_set_external nor
+# gb_ExternalExecutable_set_internal is used, the executable defaults to
+# the ExternalExecutable's name. Due to that, nothing needs to be set
+# for an external executable in the typical case.
+#
+# All external executables must be registered (by listing the executable
+# name in gb_ExternalExecutable_register_executables call). This is done in
+# Repository.mk .
+#
+# === Usage ===
+#
+# The call site(s) should always use both of the following functions:
+# * gb_ExternalExecutable_get_command: the complete command for the
+# executable
+# * gb_ExternalExecutable_get_dependencies: all run-time dependencies
+# needed by the command.
+
+## Infrastructure functions
+
+# The list of registered executables.
+gb_ExternalExecutable_REGISTERED_EXECUTABLES :=
+
+define gb_ExternalExecutable__add_executable
+$(if $(filter $(executable),$(gb_ExternalExecutable_REGISTERED_EXECUTABLES)),\
+ $(call gb_Output_error,external executable $(executable) has already been registered) \
+)
+gb_ExternalExecutable_REGISTERED_EXECUTABLES += $(1)
+
+endef
+
+# Register one or more external executables.
+#
+# gb_ExternalExecutable_register_executables executable(s)
+define gb_ExternalExecutable_register_executables
+$(foreach executable,$(1),$(call gb_ExternalExecutable__add_executable,$(executable)))
+
+endef
+
+define gb_ExternalExecutable__process_registration
+$(if $(filter undefined,$(origin gb_ExternalExecutable__register_$(executable))),\
+ $(call gb_Output_error,there is no definition for external executable $(executable)) \
+)
+$(call gb_ExternalExecutable__register_$(executable))
+
+endef
+
+# Collect definitions for registered executables.
+#
+# The registration functions will be run.
+#
+# gb_ExternalExecutable_collect_registrations
+define gb_ExternalExecutable_collect_registrations
+$(eval $(foreach executable,$(gb_ExternalExecutable_REGISTERED_EXECUTABLES),\
+ $(call gb_ExternalExecutable__process_registration,$(executable)))
+)
+
+endef
+
+define gb_ExternalExecutale__check_registration
+$(if $(filter $(1),$(gb_ExternalExecutable_REGISTERED_EXECUTABLES)),,\
+ $(call gb_Output_error,external executable $(1) has not been registered) \
+)
+
+endef
+
+## Setup functions
+
+# Set the executable as external
+#
+# Optionally set a specific executable call to use.
+# Example:
+# $(call gb_ExternalExecutable_set_external,genbrk,$(SYSTEM_GENBRK))
+#
+# gb_ExternalExecutable_set_external executable call?
+define gb_ExternalExecutable_set_external
+$(if $(2),gb_ExternalExecutable_$(1)_EXECUTABLE := $(2))
+
+endef
+
+# FIXME need to subst in some more $$ in gb_Helper_set_ld_path here - ugly
+# but other uses (gb_CppunitTest_CPPTESTPRECOMMAND) require less $$ - ugly
+define gb_ExternalExecutable__set_internal
+$(if $(3),,$(if $(filter $(WORKDIR_FOR_BUILD)/UnpackedTarball,$(2)),\
+ $(call gb_Output_error,depending directly on executable $(2) from UnpackedTarball is not allowed. Use the UnpackedTarball target as dependency.)))
+gb_ExternalExecutable_$(1)_EXECUTABLE := $(2)
+gb_ExternalExecutable_$(1)_DEPENDENCIES := $(if $(3),$(call gb_Executable_get_target_for_build,$(3)),$(2))
+gb_ExternalExecutable_$(1)_PRECOMMAND := $(subst $$,$$$$,$(gb_Helper_set_ld_path)) $(BUILDTOOLTRACE)
+
+endef
+
+# Set the executable as internal
+#
+# Optionally set a specific executable target to use (if the target
+# $(gb_Executable_BINDIR_FOR_BUILD)/$(1)$(gb_Executable_EXT_for_build) is
+# not suitable). Also optionally, set the ExternalProject that builds
+# the executable. This is needed to create proper dependency for
+# executables that are not bundled # with libreoffice, so they are used
+# directly from workdir/UnpackedTarball/*.
+#
+# gb_ExternalExecutable_set_internal executable call? external?
+define gb_ExternalExecutable_set_internal
+$(call gb_ExternalExecutable__set_internal,$(1),$(if $(strip $(2)),$(2),$(gb_Executable_BINDIR_FOR_BUILD)/$(1)$(gb_Executable_EXT_for_build)),$(strip $(3)))
+
+endef
+
+# Set pre-command for the executable
+#
+# This call should set any command line variables needed for the
+# executable to run.
+#
+# gb_ExternalExecutable_set_precommand executable precommand
+define gb_ExternalExecutable_set_precommand
+gb_ExternalExecutable_$(1)_PRECOMMAND := $(2) $(BUILDTOOLTRACE)
+
+endef
+
+# Add dependencies needed for running the executable
+#
+# Note that the dependencies should in most (if not all) cases be
+# _for_build targets, or there might be problems in cross-compilation
+# Specifically, not using _for_build target would mean either:
+# * the target is built before the command even if it is not necessary
+# (not really a problem, but might be a nuisance)
+# * the build breaks because the target is not known. This might happen
+# if there is a difference in configuration between build and host
+# phases.
+#
+# gb_ExternalExecutable_add_dependencies executable dependencies
+define gb_ExternalExecutable_add_dependencies
+gb_ExternalExecutable_$(1)_DEPENDENCIES += $(2)
+
+endef
+
+# Add arguments needed for running the executable
+#
+# This should only contain arguments that differ between external and
+# internal executable call or that are common for all call sites.
+#
+# gb_ExternalExecutable_add_arguments executable arguments
+define gb_ExternalExecutable_add_arguments
+gb_ExternalExecutable_$(1)_ARGUMENTS += $(2)
+
+endef
+
+## User functions
+
+gb_ExternalExecutable__get_internal := $(ICECREAM_RUN)
+
+define gb_ExternalExecutable__get_executable
+$(if $(gb_ExternalExecutable_$(1)_EXECUTABLE),$(gb_ExternalExecutable_$(1)_EXECUTABLE),$(1))
+endef
+
+define gb_ExternalExecutable__get_command
+$(call gb_ExternalExecutale__check_registration,$(1))
+$(gb_ExternalExecutable_$(1)_PRECOMMAND) \
+ $(call gb_ExternalExecutable__get_internal,$(1)) \
+ $(call gb_ExternalExecutable__get_executable,$(1)) \
+ $(gb_ExternalExecutable_$(1)_ARGUMENTS)
+endef
+
+# Return the command for running an external executable.
+#
+# The command includes the required shell variables, if any (e.g.,
+# LD_LIBRARY_PATH for internally built executables), and icerun wrapper
+# for limiting the maximum number of processes, if available.
+#
+# gb_ExternalExecutable_get_command executable
+define gb_ExternalExecutable_get_command
+$(strip $(call gb_ExternalExecutable__get_command,$(1)))
+endef
+
+define gb_ExternalExecutable__get_dependencies
+$(call gb_ExternalExecutale__check_registration,$(1))
+$(gb_ExternalExecutable_$(1)_DEPENDENCIES)
+endef
+
+# Return the dependencies needed for running an external executable.
+#
+# gb_ExternalExecutable_get_dependencies executable
+define gb_ExternalExecutable_get_dependencies
+$(strip $(call gb_ExternalExecutable__get_dependencies,$(1)))
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/ExternalPackage.mk b/solenv/gbuild/ExternalPackage.mk
new file mode 100644
index 000000000..05bfa6d0c
--- /dev/null
+++ b/solenv/gbuild/ExternalPackage.mk
@@ -0,0 +1,207 @@
+# -*- 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/.
+#
+
+# ExternalPackage class
+
+# This class extends Package to reliably deliver header files (and
+# possibly other kinds of files) from unpacked tarballs. The problem
+# with using Package is that the unpacked files' timestamps do not
+# depend on the extraction time; when the project's tarball is updated,
+# some header files might have been changed, but it is likely their
+# timestamps will be older than these of the headers delivered from the
+# previous version, so the delivered headers will not be updated.
+#
+# Uff, I hope this is at least partially understandable :-)
+#
+# Note: An ExternalPackage object can be used in functions that expect a
+# Package (e.g., gb_LinkTarget_use_package(s)).
+
+$(dir $(call gb_ExternalPackage_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_ExternalPackage_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_ExternalPackage_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),EPK,2)
+ $(call gb_Trace_MakeMark,$*,EPK)
+ touch $@
+
+$(call gb_ExternalPackage_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),EPK,2)
+ rm -f $(call gb_ExternalPackage_get_target,$*)
+
+# Create and register a new ExternalPackage
+#
+# The base directory of the package is the directory of the unpacked
+# tarball.
+#
+# gb_ExternalPackage_ExternalPackage name unpacked
+define gb_ExternalPackage_ExternalPackage
+$(call gb_ExternalPackage_ExternalPackage_internal,$(1),$(2))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_ExternalPackage_get_target,$(1)),$(call gb_ExternalPackage_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),ExternalPackage)
+
+endef
+
+# Create a new ExternalPackage
+#
+# This function should only be used in implementations of other gbuild
+# classes.
+#
+# gb_ExternalPackage_ExternalPackage_internal name unpacked
+define gb_ExternalPackage_ExternalPackage_internal
+$(call gb_Package_Package_internal,$(1),$(call gb_UnpackedTarball_get_dir,$(2)))
+$(call gb_Package_use_unpacked,$(1),$(2))
+
+$(call gb_ExternalPackage_get_target,$(1)) : $(call gb_Package_get_target,$(1))
+$(call gb_ExternalPackage_get_target,$(1)) :| $(dir $(call gb_ExternalPackage_get_target,$(1))).dir
+$(call gb_ExternalPackage_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(1))
+
+gb_ExternalPackage_UNPACKED_$(1) := $(2)
+
+endef
+
+# Set output dir for the package's files.
+#
+# Default is $(INSTROOT).
+#
+# gb_ExternalPackage_set_outdir package outdir
+define gb_ExternalPackage_set_outdir
+$(call gb_Package_set_outdir,$(1),$(2))
+
+endef
+
+# Mark a source file to be used outside of this module
+#
+# This results in the timestamp of the file being updated, so a possible
+# change is recognized properly by other files depending on it.
+#
+# gb_ExternalPackage_mark_generated_file package file
+define gb_ExternalPackage_mark_generated_file
+$(call gb_UnpackedTarball_get_dir,$(gb_ExternalPackage_UNPACKED_$(1)))/$(2) : \
+ $(call gb_ExternalProject_get_target,$(gb_ExternalPackage_PROJECT_$(1)))
+$(if $(suffix $(2)),\
+ $(call gb_UnpackedTarbal__ensure_pattern_rule,$(gb_ExternalPackage_UNPACKED_$(1)),$(suffix $(2))),\
+ $(call gb_UnpackedTarbal__make_file_rule,$(gb_ExternalPackage_UNPACKED_$(1)),$(2)) \
+)
+
+endef
+
+# Mark several source files to be used outside of this module
+#
+# gb_ExternalProject_mark_generated_files package file(s)
+define gb_ExternalPackage_mark_generated_files
+$(foreach file,$(2),$(call gb_ExternalPackage_mark_generated_file,$(1),$(file)))
+
+endef
+
+define gb_ExternalPackage_add_symbolic_link
+$(call gb_Package_add_symbolic_link,$(1),$(2),$(3))
+
+endef
+
+# Add a file
+#
+# See gb_Package_add_file for details.
+#
+# gb_ExternalPackage_add_file package dest src
+define gb_ExternalPackage_add_file
+$(if $(4),$(call gb_Output_error,gb_ExternalPackage_add_file: $(1) 4: $(4)))
+$(call gb_ExternalPackage_mark_generated_file,$(1),$(3))
+$(call gb_Package_add_file,$(1),$(2),$(3))
+
+endef
+
+# Add several files at once
+#
+# See gb_Package_add_files for details.
+#
+# gb_ExternalPackage_add_files package destdir file(s)
+define gb_ExternalPackage_add_files
+$(call gb_ExternalPackage_mark_generated_files,$(1),$(3))
+$(call gb_Package_add_files,$(1),$(2),$(3))
+
+endef
+
+# Add several files at once
+#
+# See gb_Package_add_files_with_dir for details.
+#
+# gb_ExternalPackage_add_files_with_dir package destdir file(s)
+define gb_ExternalPackage_add_files_with_dir
+$(call gb_ExternalPackage_mark_generated_files,$(1),$(3))
+$(call gb_Package_add_files_with_dir,$(1),$(2),$(3))
+
+endef
+
+define gb_ExternalPackage__add_file
+$(call gb_UnpackedTarball_mark_output_file,$(gb_ExternalPackage_UNPACKED_$(1)),$(2))
+
+endef
+
+# Add an unpacked file
+#
+# See gb_Package_add_file for details.
+#
+# gb_ExternalPackage_add_unpacked_file package dest src
+define gb_ExternalPackage_add_unpacked_file
+$(call gb_Package_add_file,$(1),$(2),$(3))
+$(call gb_ExternalPackage__add_file,$(1),$(3))
+
+endef
+
+define gb_ExternalPackage__add_files
+$(foreach file,$(2),$(call gb_ExternalPackage__add_file,$(1),$(file)))
+
+endef
+
+# Add several unpacked files at once
+#
+# See gb_Package_add_files for details.
+#
+# gb_ExternalPackage_add_unpacked_files package destdir file(s)
+define gb_ExternalPackage_add_unpacked_files
+$(call gb_Package_add_files,$(1),$(2),$(3))
+$(call gb_ExternalPackage__add_files,$(1),$(3))
+
+endef
+
+# Add several unpacked files at once
+#
+# See gb_Package_add_files_with_dir for details.
+#
+# gb_ExternalPackage_add_unpacked_files_with_dir package destdir file(s)
+define gb_ExternalPackage_add_unpacked_files_with_dir
+$(call gb_Package_add_files_with_dir,$(1),$(2),$(3))
+$(call gb_ExternalPackage__add_files,$(1),$(3))
+
+endef
+
+# Package files from unpacked tarball of an external project
+#
+# gb_ExternalPackage_use_unpacked package unpacked
+define gb_ExternalPackage_use_unpacked
+$(call gb_Package_use_unpacked,$(1),$(2))
+
+endef
+
+# Package files from build of an external project
+#
+# gb_ExternalPackage_use_external_project package external
+define gb_ExternalPackage_use_external_project
+$(call gb_Package_use_external_project,$(1),$(2))
+
+$(if $(gb_ExternalPackage_PROJECT_$(1)),$(call gb_Output_error,gb_ExternalPackage_use_external_project: only one project allowed))
+gb_ExternalPackage_PROJECT_$(1) := $(2)
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/ExternalProject.mk b/solenv/gbuild/ExternalProject.mk
new file mode 100644
index 000000000..5227e6c13
--- /dev/null
+++ b/solenv/gbuild/ExternalProject.mk
@@ -0,0 +1,238 @@
+# -*- 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/.
+#
+
+# class ExternalProject
+
+# Handles build of an external project
+
+# Build of an external typically uses three gbuild classes:
+# ExternalProject, ExternalPackage or Package, and UnpackedTarball. The
+# first step is to prepare sources using UnpackedTarball. The tarball is
+# passed to an ExternalProject, which handles the build proper and the
+# results are delivered by an ExternalPackage (or Package, again;
+# Package is sufficient if no files--e.g., headers--from the unpacked
+# tarball need to be delivered.)
+#
+# An ExternalProject always uses one UnpackedTarball with the same name.
+# The dependency structure ensures that any change on a dependency
+# of the ExternalProject will cause the UnpackedTarball to be unpacked
+# again, so the ExternalProject always does a clean build and is not at
+# the mercy of the external's build system's dubious incremental builds.
+#
+# ExternalProject target
+# => ExternalProject state target(s) (these actually build stuff)
+# => UnpackedTarball target (unpack the tarball)
+# => UnpackedTarball prepare target
+# => ExternalProject prepare target
+# => stuff the external depends upon
+#
+# ExternalProject has no gbuild abstraction for actually building the
+# external code, so it is necessary to define rule(s) and recipe(s) to
+# handle it. It does not matter if there are several rules handling
+# separate phases of the build (e.g., configure, build, install) or if
+# the whole build is handled by one rule.
+#
+# ExternalProject uses two directories during the build: state dir
+# serves to keep file targets that mark state of the build progress
+# (e.g., "configure done", "build done") and the targets are accessible
+# via gb_ExternalProject_get_state_target. It is highly advised to
+# register them using gb_ExternalProject_register_targets. The second
+# directory is work dir, accessible only from recipes via variable
+# $(EXTERNAL_WORKDIR).
+
+$(dir $(call gb_ExternalProject_get_statedir,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_ExternalProject_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_ExternalProject_get_preparation_target,%) :
+ touch $@
+
+$(call gb_ExternalProject_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),PRJ,3)
+ $(call gb_Trace_MakeMark,$*,PRJ)
+ touch $@
+
+.PHONY : $(call gb_ExternalProject_get_clean_target,%)
+$(call gb_ExternalProject_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),PRJ,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf \
+ $(call gb_ExternalProject_get_target,$*) \
+ $(call gb_ExternalProject_get_statedir,$*) \
+ )
+
+# Define a new external project, using an unpacked tarball of the same name
+#
+# gb_ExternalProject_ExternalProject project
+define gb_ExternalProject_ExternalProject
+$(call gb_ExternalProject_get_target,$(1)) : EXTERNAL_WORKDIR := $(call gb_UnpackedTarball_get_dir,$(1))
+
+$(call gb_ExternalProject_get_preparation_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+$(call gb_ExternalProject_get_preparation_target,$(1)) :| $(dir $(call gb_ExternalProject_get_target,$(1))).dir
+$(call gb_UnpackedTarball_get_preparation_target,$(1)) : $(call gb_ExternalProject_get_preparation_target,$(1))
+$(call gb_ExternalProject_get_clean_target,$(1)) : $(call gb_UnpackedTarball_get_clean_target,$(1))
+$(call gb_ExternalProject_get_target,$(1)) : $(call gb_UnpackedTarball_get_target,$(1))
+$(call gb_ExternalProject_get_target,$(1)) :| $(dir $(call gb_ExternalProject_get_target,$(1))).dir
+
+$$(eval $$(call gb_Module_register_target,$(call gb_ExternalProject_get_target,$(1)),$(call gb_ExternalProject_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),ExternalProject)
+
+endef
+
+# Depend on an unpacked tarball
+#
+# This is needed to express dependencies on header-only projects, which
+# do not have any ExternalProject.
+#
+# gb_ExternalProject_use_unpacked project unpacked
+define gb_ExternalProject_use_unpacked
+$(call gb_ExternalProject_get_preparation_target,$(1)) : $(call gb_UnpackedTarball_get_target,$(2))
+
+endef
+
+# Register a target in state directory
+#
+# This function defines proper dependencies for the target to ensure
+# that:
+# * the main target is updated if this target is updated
+# * this target is updated if the unpacked tarball has changed.
+#
+# gb_ExternalProject_register_target project target
+define gb_ExternalProject_register_target
+$(call gb_ExternalProject_get_target,$(1)) : $(call gb_ExternalProject_get_state_target,$(1),$(2))
+$(call gb_ExternalProject_get_state_target,$(1),$(2)) : $(call gb_UnpackedTarball_get_target,$(1))
+$(call gb_ExternalProject_get_state_target,$(1),$(2)) :| $(dir $(call gb_ExternalProject_get_state_target,$(1),$(2))).dir
+
+endef
+
+# Register several targets at once
+#
+# gb_ExternalProject_register_targets project target(s)
+define gb_ExternalProject_register_targets
+$(foreach target,$(2),$(call gb_ExternalProject_register_target,$(1),$(target)))
+
+endef
+
+# Make an external Project depend on another ExternalProject
+define gb_ExternalProject_use_external_project
+$(call gb_ExternalProject_get_preparation_target,$(1)) : $(call gb_ExternalProject_get_target,$(2))
+
+endef
+
+# call gb_ExternalProject_use_external_projects,project,projects
+define gb_ExternalProject_use_external_projects
+$(foreach ext,$(2),$(call gb_ExternalProject_use_external_project,$(1),$(ext)))
+endef
+
+# Make an ExternalProject depend on an external
+#
+# this forwards to functions that must be defined in RepositoryExternal.mk.
+# $(eval $(call gb_ExternalProject_use_external,library,external))
+define gb_ExternalProject_use_external
+$(if $(filter undefined,$(origin gb_ExternalProject__use_$(2))),\
+ $(error gb_ExternalProject_use_external: unknown external: $(2)),\
+ $(call gb_ExternalProject__use_$(2),$(1)))
+endef
+
+define gb_ExternalProject_use_externals
+$(foreach external,$(2),$(call gb_ExternalProject_use_external,$(1),$(external)))
+endef
+
+# Make an external project depend on a package
+#
+# This is most useful for depending on output files created by another
+# ExternalProject.
+#
+# gb_ExternalProject_use_package external package
+define gb_ExternalProject_use_package
+$(call gb_ExternalProject_get_preparation_target,$(1)) : $(call gb_Package_get_target,$(2))
+
+endef
+
+# Make an external project depend on several packages at once
+#
+# gb_ExternalProject_use_packages external package(s)
+define gb_ExternalProject_use_packages
+$(foreach package,$(2),$(call gb_ExternalProject_use_package,$(1),$(package)))
+
+endef
+
+# Make an external project depend on a StaticLibrary
+#
+# Realistically there are some externals that do not have a usable build
+# system, and other externals that do may depend on those.
+#
+# gb_ExternalProject_use_static_libraries external staticlibraries
+define gb_ExternalProject_use_static_libraries
+$(call gb_ExternalProject_get_preparation_target,$(1)) : \
+ $(foreach lib,$(2),$(call gb_StaticLibrary_get_target,$(lib)))
+
+endef
+
+# Make an external project depend on a Library
+#
+# Realistically there are some externals that do not have a usable build
+# system, and other externals that do may depend on those.
+#
+# gb_ExternalProject_use_libraries external libraries
+define gb_ExternalProject_use_libraries
+ifneq (,$$(filter-out $(gb_Library_KNOWNLIBS) $(gb_LinkTarget__syslib),$(2)))
+$$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL))
+$$(eval $$(call gb_Output_error,Cannot link against library/libraries $$(filter-out $(gb_Library_KNOWNLIBS) $(gb_LinkTarget__syslib),$(2)). Libraries must be registered in Repository.mk or RepositoryExternal.mk))
+endif
+ifneq (,$$(filter $$(gb_MERGEDLIBS),$(2)))
+$$(eval $$(call gb_Output_error,Cannot link against library/libraries $$(filter $$(gb_MERGEDLIBS),$(2)) because they are merged.))
+endif
+
+$(call gb_ExternalProject_get_preparation_target,$(1)) : \
+ $(foreach lib,$(2),$(call gb_Library_get_target,$(lib)))
+
+endef
+
+# Make an external project depend on a Jar file
+#
+# gb_ExternalProject_use_jars external jars
+define gb_ExternalProject_use_jars
+$(call gb_ExternalProject_get_preparation_target,$(1)) : \
+ $(foreach jar,$(2),$(call gb_Jar_get_target,$(jar)))
+
+endef
+
+# Returns flags to include in CFLAGS/CXXFLAGS to enable optimizations and/or debugging.
+# gb_ExternalProject_get_build_flags project
+gb_ExternalProject_get_build_flags = $(call gb_LinkTarget__get_debugflags,ExternalProject_$(1))
+
+# Returns flags to include in LDFLAGS to enable optimizations and/or debugging.
+# gb_ExternalProject_get_link_flags project
+gb_ExternalProject_get_link_flags = $(LDFLAGS) $(USE_LD) $(call gb_LinkTarget__get_debugldflags,ExternalProject_$(1))
+
+# Run a target command
+#
+# This provides a wrapper that changes to the right directory,
+# touches the 'target' if successful and also provides
+# the ability to hide the output if there is no failure
+# gb_ExternalProject_run,run_target,command,optional_extra_sub_directory,optional_log_filename)
+# default log_filename is <run_target>.log
+#
+
+define gb_ExternalProject_run
+$(if $(findstring YES,$(UNPACKED_IS_BIN_TARBALL)),\
+ touch $@,
+$(call gb_Helper_print_on_error,cd $(EXTERNAL_WORKDIR)/$(3) && \
+ unset Platform && \
+ $(if $(WRAPPERS),export $(WRAPPERS) &&) \
+ $(if $(NMAKE),export $(NMAKE) &&) \
+ $(if $(gb_COMPILER_SETUP),export $(gb_COMPILER_SETUP) &&) \
+ $(2) && touch $@,$(EXTERNAL_WORKDIR)/$(if $(3),$(3)/,)$(if $(4),$(4),$(1).log))
+)
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/Gallery.mk b/solenv/gbuild/Gallery.mk
new file mode 100644
index 000000000..56d5157ef
--- /dev/null
+++ b/solenv/gbuild/Gallery.mk
@@ -0,0 +1,183 @@
+# -*- 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/.
+#
+
+# class Gallery
+
+# Handles creation of image galleries.
+
+gb_Gallery_TRANSLATE := $(SRCDIR)/solenv/bin/desktop-translate.py
+gb_Gallery_INSTDIR := $(LIBO_SHARE_FOLDER)/gallery
+
+define gb_Gallery__command
+$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_Gallery_get_workdir,$(2))/* && \
+ RESPONSEFILE=$(call gb_var2file,$(shell $(call gb_MKTEMP)),100,$(GALLERY_FILES)) && \
+ $(call gb_Helper_print_on_error,\
+ $(call gb_Executable_get_command,gengal,$(ICECREAM_RUN)) \
+ --build-tree \
+ --destdir $(GALLERY_BASEDIR) \
+ --name "$(GALLERY_NAME)" \
+ --path $(call gb_Gallery_get_workdir,$(2)) \
+ --filenames $(call gb_Helper_make_url,$$RESPONSEFILE) \
+ -env:UserInstallation=$(call gb_Helper_make_url,$(call gb_Gallery_get_workdir,$(2))/user),\
+ $@.log \
+ ) && \
+ rm $$RESPONSEFILE && \
+ touch $@ \
+)
+endef
+
+define gb_Gallery__command_str
+cp -f $(GALLERY_STRFILE) $@ && \
+$(call gb_ExternalExecutable_get_command,python) \
+ $(gb_Gallery_TRANSLATE) \
+ --ext "str" --key "name" \
+ -d $(GALLERY_WORKDIR) \
+ $(GALLERY_ULFFILE)
+endef
+
+gb_Gallery__get_final_target = $(WORKDIR)/Gallery/$(1).final
+
+$(dir $(call gb_Gallery_get_target,$(1))).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_Gallery_get_target,$(1)))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_Gallery_get_target,%) : \
+ $(call gb_Executable_get_runtime_dependencies,gengal)
+ $(call gb_Output_announce,$*,$(true),GAL,1)
+ $(call gb_Trace_StartRange,$*,GAL)
+ $(call gb_Gallery__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,GAL)
+
+$(call gb_Gallery__get_final_target,%) :
+ touch $@
+
+# difficult to determine source dep for this one...
+$(call gb_Gallery_get_workdir,%).ulf : \
+ $(call gb_Executable_get_runtime_dependencies,ulfex)
+ $(call gb_CustomTarget_ulfex__command,$@,$(GALLERY_ULFFILE),\
+ $(foreach lang,$(gb_TRANS_LANGS),\
+ $(gb_POLOCATION)/$(lang)/extras/source/gallery/share.po))
+
+$(call gb_Gallery_get_workdir,%).str : $(gb_Gallery_TRANSLATE) \
+ $(call gb_ExternalExecutable_get_dependencies,python)
+ $(call gb_Output_announce,$*,$(true),STR,1)
+ $(call gb_Trace_StartRange,$*,STR)
+ $(call gb_Gallery__command_str,$@,$*)
+ $(call gb_Trace_EndRange,$*,STR)
+
+# there must be a rule for these since they are targets due to Package
+$(call gb_Gallery_get_workdir,%).sdg :
+ touch $@
+$(call gb_Gallery_get_workdir,%).sdv :
+ touch $@
+$(call gb_Gallery_get_workdir,%).thm :
+ touch $@
+
+.PHONY : $(call gb_Gallery_get_clean_target,%)
+$(call gb_Gallery_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),GAL,1)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf \
+ $(call gb_Gallery__get_final_target,$*) \
+ $(call gb_Gallery_get_target,$*) \
+ $(call gb_Gallery_get_target,$*).log \
+ $(call gb_Gallery_get_workdir,$*) \
+ )
+
+# the theme package
+gb_Gallery_get_packagename = Gallery/$(1)
+# the files package
+gb_Gallery_get_files_packagename = Gallery/Files/$(1)
+
+# Create a gallery.
+#
+# basedir less one directory will be stripped from paths of the files when they are
+# inserted into the gallery.
+#
+# gb_Gallery_Gallery gallery basedir name
+define gb_Gallery_Gallery
+$(call gb_Gallery__Gallery_impl,$(1),$(call gb_Gallery_get_packagename,$(1)),$(2),$(3))
+
+# setup the files package - we install all of these too
+$(call gb_Package_Package_internal,$(call gb_Gallery_get_files_packagename,$(1)),$(SRCDIR)/$(2))
+$(call gb_Gallery__get_final_target,$(1)) : $(call gb_Package_get_target,$(call gb_Gallery_get_files_packagename,$(1)))
+$(call gb_Gallery_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(call gb_Gallery_get_files_packagename,$(1)))
+
+endef
+
+
+gb_Gallery_basedir = $(patsubst %/,%,$(dir $(SRCDIR)/$(1)))
+
+# TODO: we process the same ulf file for every gallery. That does not
+# make sense.
+#
+# gb_Gallery__Gallery_impl gallery package basedir name
+define gb_Gallery__Gallery_impl
+$(call gb_Package_Package_internal,$(2),$(call gb_Gallery_get_workdir,$(1)))
+$(call gb_Package_add_file,$(2),$(gb_Gallery_INSTDIR)/$(1).sdg,$(1).sdg)
+$(call gb_Package_add_file,$(2),$(gb_Gallery_INSTDIR)/$(1).sdv,$(1).sdv)
+$(call gb_Package_add_file,$(2),$(gb_Gallery_INSTDIR)/$(1).thm,$(1).thm)
+$(call gb_Package_add_file,$(2),$(gb_Gallery_INSTDIR)/$(1).str,$(1).str)
+
+# strip URL, without / to help the internal gallery system
+$(call gb_Gallery_get_target,$(1)) : GALLERY_BASEDIR := $(call gb_Helper_make_url,$(call gb_Gallery_basedir,$(3)))
+$(call gb_Gallery_get_target,$(1)) : GALLERY_FILES :=
+$(call gb_Gallery_get_target,$(1)) : GALLERY_NAME := $(1)
+$(call gb_Gallery_get_workdir,$(1))/$(1).str : GALLERY_STRFILE := $(SRCDIR)/$(3)/$(1).str
+$(call gb_Gallery_get_workdir,$(1))/$(1).str : GALLERY_ULFFILE := $(call gb_Gallery_get_workdir,$(1))/$(1).ulf
+$(call gb_Gallery_get_workdir,$(1))/$(1).str : GALLERY_WORKDIR := $(call gb_Gallery_get_workdir,$(1))
+$(call gb_Gallery_get_workdir,$(1))/$(1).ulf : GALLERY_BASEDIR := $(3)
+$(call gb_Gallery_get_workdir,$(1))/$(1).ulf : GALLERY_ULFFILE := $(call gb_Gallery_basedir,$(3))/share/gallery_names.ulf
+
+$(call gb_Gallery_get_workdir,$(1))/$(1).ulf : \
+ $(call gb_Gallery_basedir,$(3))/share/gallery_names.ulf \
+ $(call gb_Gallery_get_target,$(1)) # that rule pre-cleans our output directory
+
+$(call gb_Gallery_get_workdir,$(1))/$(1).str : $(call gb_Gallery_get_workdir,$(1))/$(1).ulf
+
+$(call gb_Gallery_get_workdir,$(1))/$(1).sdg \
+$(call gb_Gallery_get_workdir,$(1))/$(1).sdv \
+$(call gb_Gallery_get_workdir,$(1))/$(1).thm : $(call gb_Gallery_get_target,$(1))
+$(call gb_Gallery__get_final_target,$(1)) : $(call gb_Package_get_target,$(2))
+
+$(call gb_Gallery_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(2))
+$(call gb_Gallery_get_target,$(1)) :| $(dir $(call gb_Gallery_get_target,$(1))).dir \
+ $(call gb_Gallery_get_workdir,$(1))/.dir
+
+$$(eval $$(call gb_Module_register_target,$(call gb_Gallery__get_final_target,$(1)),$(call gb_Gallery_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Gallery,$(call gb_Gallery__get_final_target,$(1)))
+
+endef
+
+# Add a file to the gallery.
+#
+# The file is given by path relative to $(SRCDIR).
+#
+# gb_Gallery_add_file gallery file
+define gb_Gallery_add_file
+$(call gb_Gallery_get_target,$(1)) : $(SRCDIR)/$(3)
+$(call gb_Gallery_get_target,$(1)) : GALLERY_FILES += $(call gb_Helper_make_url,$(SRCDIR)/$(3))
+$(call gb_Package_add_file,$(call gb_Gallery_get_files_packagename,$(1)),$(2)/$(notdir $(3)),$(notdir $(3)))
+
+endef
+
+# Add several files to the gallery at once.
+#
+# The files are given by path relative to $(SRCDIR).
+#
+# gb_Gallery_add_files gallery file(s)
+define gb_Gallery_add_files
+$(foreach fname,$(3),$(call gb_Gallery_add_file,$(1),$(2),$(fname)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/GeneratedPackage.mk b/solenv/gbuild/GeneratedPackage.mk
new file mode 100644
index 000000000..92f176436
--- /dev/null
+++ b/solenv/gbuild/GeneratedPackage.mk
@@ -0,0 +1,106 @@
+# -*- 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/.
+#
+
+# class GeneratedPackage
+
+# Enables to deliver whole directories (of generated files) to instdir.
+#
+# GeneratedPackage shall be used as a substitution for Package when the
+# names of the produced files are not known in advance (in older times,
+# we used Zip in these places). It shall only be used to deliver files
+# for installation.
+#
+# If you know the filenames in advance, use Package. Laziness is not an
+# excuse.
+
+gb_GeneratedPackage__get_srcdir = $(lastword $(subst <>, ,$(1)))
+gb_GeneratedPackage__get_destdir = $(firstword $(subst <>, ,$(1)))
+
+$(dir $(call gb_GeneratedPackage_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_GeneratedPackage_get_target,%))%.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+# require all added directories to exist
+$(call gb_GeneratedPackage_get_target,%) :| $(foreach pair,$(PACKAGE_DIRS),$(PACKAGE_SOURCEDIR)/$(call gb_GeneratedPackage__get_srcdir,$(pair)))
+
+# split in two commands to avoid running into commandline/environment size limits
+# on windows with all languages the processing of help can truncate the find command otherwise
+$(call gb_GeneratedPackage_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),GPK,2)
+ $(call gb_Trace_StartRange,$*,GPK)
+ $(if $(PACKAGE_DIRS),,$(call gb_Output_error,no dirs were added))
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(foreach pair,$(PACKAGE_DIRS),$(call gb_GeneratedPackage__get_destdir,$(pair))) \
+ && mkdir -p $(foreach pair,$(PACKAGE_DIRS),$(dir $(call gb_GeneratedPackage__get_destdir,$(pair)))) \
+ $(foreach pair,$(PACKAGE_DIRS),&& cp -R $(PACKAGE_SOURCEDIR)/$(call gb_GeneratedPackage__get_srcdir,$(pair)) $(call gb_GeneratedPackage__get_destdir,$(pair))) \
+ )
+ $(call gb_Helper_abbreviate_dirs,\
+ $(FIND) $(foreach pair,$(PACKAGE_DIRS),$(call gb_GeneratedPackage__get_destdir,$(pair))) \( -type f -o -type l \) -print | LC_ALL=C $(SORT) > $@ \
+ )
+ $(call gb_Trace_EndRange,$*,GPK)
+
+.PHONY : $(call gb_GeneratedPackage_get_clean_target,%)
+$(call gb_GeneratedPackage_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),GPK,2)
+ rm -rf $(call gb_GeneratedPackage_get_target,$*) $(PACKAGE_DIRS)
+
+# Create a generated package.
+#
+# gb_GeneratedPackage_GeneratedPackage package srcdir
+define gb_GeneratedPackage_GeneratedPackage
+$(call gb_GeneratedPackage_get_target,$(1)) : PACKAGE_DIRS :=
+$(call gb_GeneratedPackage_get_target,$(1)) : PACKAGE_SOURCEDIR := $(2)
+$(call gb_GeneratedPackage_get_clean_target,$(1)) : PACKAGE_DIRS :=
+
+$(call gb_GeneratedPackage_get_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+$(call gb_GeneratedPackage_get_target,$(1)) :| $(dir $(call gb_GeneratedPackage_get_target,$(1))).dir
+
+$$(eval $$(call gb_Module_register_target,$(call gb_GeneratedPackage_get_target,$(1)),$(call gb_GeneratedPackage_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),GeneratedPackage)
+
+endef
+
+# Depend on a custom target.
+#
+# gb_GeneratedPackage_use_customtarget package custom-target
+define gb_GeneratedPackage_use_customtarget
+$(call gb_GeneratedPackage_get_target,$(1)) : $(call gb_CustomTarget_get_target,$(2))
+
+endef
+
+# Depend on an unpacked tarball.
+#
+# gb_GeneratedPackage_use_unpacked package unpacked
+define gb_GeneratedPackage_use_unpacked
+$(call gb_GeneratedPackage_get_target,$(1)) : $(call gb_UnpackedTarball_get_target,$(2))
+
+endef
+
+# Depend on an external project.
+#
+# gb_GeneratedPackage_use_external_project package project
+define gb_GeneratedPackage_use_external_project
+$(call gb_GeneratedPackage_get_target,$(1)) : $(call gb_ExternalProject_get_target,$(2))
+
+endef
+
+# Add a dir to the package.
+#
+# The srcdir will be copied to instdir as destdir.
+#
+# gb_GeneratedPackage_add_dir package destdir srcdir
+define gb_GeneratedPackage_add_dir
+$(call gb_GeneratedPackage_get_target,$(1)) : PACKAGE_DIRS += $(strip $(2))<>$(strip $(3))
+$(call gb_GeneratedPackage_get_clean_target,$(1)) : PACKAGE_DIRS += $(2)
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/HelpTarget.mk b/solenv/gbuild/HelpTarget.mk
new file mode 100644
index 000000000..64ec6e278
--- /dev/null
+++ b/solenv/gbuild/HelpTarget.mk
@@ -0,0 +1,836 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+# This gbuild module handles building of localized help packs. The main
+# entry point is class HelpTarget; the other classes should be
+# considered private implementation details and not used directly from
+# outside of this file.
+#
+# All defined objects must be named <help-module>/<lang>. If this naming
+# scheme is not followed, bad things will happen!
+
+# Overview of classes and dependencies
+
+# class task depends on
+# HelpTranslatePartTarget l10n of xhp files in one dir xhp file(s)
+# HelpTranslateTarget l10n of xhp files HelpTranslatePartTarget
+# HelpTreeTarget l10n of tree file tree file
+# HelpLinkTarget linking help module HelpTranslateTarget
+# HelpTreeTarget
+# HelpJarTarget creating jar of xhp files HelpLinkTarget
+# HelpIndexTarget indexing help module HelpLinkTarget
+# HelpTarget creating help pack HelpIndexTarget
+# HelpJarTarget
+# extra added files
+
+# class HelpTranslatePartTarget
+
+# Translates .xhp files in one directory.
+
+gb_HelpTranslatePartTarget_DEPS := $(call gb_Executable_get_runtime_dependencies,helpex)
+gb_HelpTranslatePartTarget_COMMAND := $(call gb_Executable_get_command,helpex)
+
+define gb_HelpTranslatePartTarget__command
+HELPFILES=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(sort $(filter %.xhp,$(3)))) && \
+$(call gb_Helper_abbreviate_dirs, \
+ $(if $(filter-out qtz,$(HELP_LANG)), \
+ POFILES=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(sort $(POFILES))) && \
+ $(gb_HelpTranslatePartTarget_COMMAND) \
+ -l $(HELP_LANG) \
+ -mi $${HELPFILES} \
+ -m $${POFILES} \
+ -o $(call gb_HelpTranslatePartTarget_get_workdir,$(2)) && \
+ rm -f $${POFILES} \
+ , \
+ $(gb_HelpTranslatePartTarget_COMMAND) \
+ -l $(HELP_LANG) \
+ -mi $${HELPFILES} \
+ -m \
+ -o $(call gb_HelpTranslatePartTarget_get_workdir,$(2)) \
+ ) \
+) && \
+touch $@ && \
+rm -f $${HELPFILES}
+
+endef
+
+$(dir $(call gb_HelpTranslatePartTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpTranslatePartTarget_get_target,%) : $(gb_HelpTranslatePartTarget_DEPS)
+ $(call gb_Output_announce,$*,$(true),HPX,1)
+ $(call gb_Trace_StartRange,$*,HPX)
+ $(call gb_HelpTranslatePartTarget__command,$@,$*,$^)
+ $(call gb_Trace_EndRange,$*,HPX)
+
+.PHONY : $(call gb_HelpTranslatePartTarget_get_clean_target,%)
+$(call gb_HelpTranslatePartTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),HPX,1)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf \
+ $(call gb_HelpTranslatePartTarget_get_target,$*) \
+ $(call gb_HelpTranslatePartTarget_get_workdir,$*) \
+ )
+
+# Translate a set of .xhp files from one directory.
+#
+# gb_HelpTranslatePartTarget_HelpTranslatePartTarget target lang dir
+define gb_HelpTranslatePartTarget_HelpTranslatePartTarget
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) : HELP_LANG := $(2)
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) : POFILES := $(3)
+
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) : $(3)
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) :| $(dir $(call gb_HelpTranslatePartTarget_get_target,$(1))).dir
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) :| $(call gb_HelpTranslatePartTarget_get_workdir,$(1))/.dir
+
+endef
+
+define gb_HelpTranslatePartTarget_add_file
+$(call gb_HelpTranslatePartTarget_get_target,$(1)) : $(2)
+
+endef
+
+# class HelpTranslateTarget
+
+# Translates a set of .xhp files.
+
+gb_HelpTranslateTarget__get_lang = $(lastword $(subst /, ,$(1)))
+
+gb_HelpTranslateTarget__get_partname = $(call gb_HelpTranslateTarget__get_lang,$(1))/$(patsubst %/,%,$(2))
+gb_HelpTranslateTarget__get_part_workdir = $(call gb_HelpTranslatePartTarget_get_workdir,$(call gb_HelpTranslateTarget__get_partname,$(1),$(2)))
+
+gb_HelpTranslateTarget_get_translated_target = $(call gb_HelpTranslatePartTarget_get_translated_target,$(call gb_HelpTranslateTarget__get_partname,$(1),$(dir $(2))),$(notdir $(2)))
+gb_HelpTranslateTarget__get_any_translated_target = $(abspath $(call gb_HelpTranslatePartTarget_get_translated_target,,$(1)))
+gb_HelpTranslateTarget_get_workdir = $(call gb_HelpTranslateTarget__get_part_workdir,$(1),$(2))
+
+$(dir $(call gb_HelpTranslateTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpTranslateTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpTranslateTarget_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),XHP,2)
+ $(call gb_Trace_MakeMark,$*,XHP)
+ touch $@
+
+$(call gb_HelpTranslateTarget__get_any_translated_target,%) :
+ touch $@
+
+.PHONY : $(call gb_HelpTranslateTarget_get_clean_target,%)
+$(call gb_HelpTranslateTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),XHP,2)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_HelpTranslateTarget_get_target,$*) \
+ )
+
+# Localizes a set of .xhp files to one language.
+#
+# gb_HelpTranslateTarget_HelpTranslateTarget module
+define gb_HelpTranslateTarget_HelpTranslateTarget
+$(call gb_HelpTranslateTarget_get_target,$(1)) :| $(dir $(call gb_HelpTranslateTarget_get_target,$(1))).dir
+
+endef
+
+# use wildcard to avoid spurious rebuilds if translation is missing
+# gb_HelpTranslateTarget__make_part module part lang dir
+define gb_HelpTranslateTarget__make_part
+$(call gb_HelpTranslatePartTarget_HelpTranslatePartTarget,$(2),$(3),$(wildcard $(gb_POLOCATION)/$(3)/$(patsubst %/,%,$(4)).po))
+
+$(call gb_HelpTranslateTarget_get_target,$(1)) : $(call gb_HelpTranslatePartTarget_get_target,$(2))
+$(call gb_HelpTranslateTarget_get_clean_target,$(1)) : $(call gb_HelpTranslatePartTarget_get_clean_target,$(2))
+
+endef
+
+# gb_HelpTranslateTarget__add_file module dir file
+define gb_HelpTranslateTarget__add_file
+$(call gb_HelpTranslatePartTarget_add_file,$(call gb_HelpTranslateTarget__get_partname,$(1),$(2)),$(SRCDIR)/$(3).xhp)
+$(call gb_HelpTranslateTarget_get_translated_target,$(1),$(3)) : $(call gb_HelpTranslateTarget_get_target,$(1))
+
+endef
+
+# gb_HelpTranslateTarget__add_files_impl module lang dir(s) file(s)
+define gb_HelpTranslateTarget__add_files_impl
+$(foreach part,$(3),$(call gb_HelpTranslateTarget__make_part,$(1),$(call gb_HelpTranslateTarget__get_partname,$(1),$(part)),$(2),$(part)))
+$(foreach file,$(4),$(call gb_HelpTranslateTarget__add_file,$(1),$(dir $(file)),$(file)))
+
+endef
+
+# gb_HelpTranslateTarget__add_files module file(s)
+define gb_HelpTranslateTarget__add_files
+$(call gb_HelpTranslateTarget__add_files_impl,$(1),$(call gb_HelpTranslateTarget__get_lang,$(1)),$(sort $(dir $(2))),$(2))
+
+endef
+
+# gb_HelpTranslateTarget_add_file module file
+define gb_HelpTranslateTarget_add_file
+$(call gb_HelpTranslateTarget__add_files,$(1),$(2))
+
+endef
+
+# gb_HelpTranslateTarget_add_files module file(s)
+define gb_HelpTranslateTarget_add_files
+$(call gb_HelpTranslateTarget__add_files,$(1),$(2))
+
+endef
+
+# class HelpTree
+
+# Translates a .tree file.
+
+gb_HelpTreeTarget_DEPS := $(call gb_Executable_get_runtime_dependencies,treex)
+gb_HelpTreeTarget_COMMAND := $(call gb_Executable_get_command,treex)
+
+define gb_HelpTreeTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ $(if $(filter-out qtz,$(HELP_LANG)), \
+ POFILES=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(POFILES)) && \
+ $(gb_HelpTreeTarget_COMMAND) \
+ -i $(HELP_TREE) \
+ -l $(HELP_LANG) \
+ -m $${POFILES} \
+ -o $@ \
+ -r $(HELP_TEXTDIR) && \
+ rm -f $${POFILES} \
+ , \
+ $(gb_HelpTreeTarget_COMMAND) \
+ -i $(HELP_TREE) \
+ -l $(HELP_LANG) \
+ -m \
+ -o $@ \
+ -r $(HELP_TEXTDIR) \
+ ) \
+)
+
+endef
+
+$(dir $(call gb_HelpTreeTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpTreeTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpTreeTarget_get_target,%) : $(gb_HelpTreeTarget_DEPS)
+ $(if $(HELP_TEXTDIR),,$(call gb_Output_error,HelpTreeTarget: no help text dir for .tree was set))
+ $(if $(HELP_TREE),,$(call gb_Output_error,HelpTreeTarget: no .tree file to translate was set))
+ $(call gb_Output_announce,$*,$(true),TRE,1)
+ $(call gb_Trace_StartRange,$*,TRE)
+ $(call gb_HelpTreeTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,TRE)
+
+.PHONY : $(call gb_HelpTreeTarget_get_clean_target,%)
+$(call gb_HelpTreeTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),TRE,1)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_HelpTreeTarget_get_target,$*) \
+ )
+
+# Translate a .tree file.
+#
+# gb_HelpTreeTarget_HelpTreeTarget target lang
+define gb_HelpTreeTarget_HelpTreeTarget
+$(call gb_HelpTreeTarget_get_target,$(1)) : HELP_LANG := $(2)
+$(call gb_HelpTreeTarget_get_target,$(1)) : HELP_TEXTDIR :=
+$(call gb_HelpTreeTarget_get_target,$(1)) : HELP_TREE :=
+$(call gb_HelpTreeTarget_get_target,$(1)) : POFILES :=
+
+$(call gb_HelpTreeTarget_get_target,$(1)) :| $(dir $(call gb_HelpTreeTarget_get_target,$(1))).dir
+
+endef
+
+# gb_HelpTreeTarget__set_pofiles target pofiles
+define gb_HelpTreeTarget__set_pofiles
+$(call gb_HelpTreeTarget_get_target,$(1)) : POFILES := $(2)
+$(call gb_HelpTreeTarget_get_target,$(1)) : $(2)
+
+endef
+
+# use wildcard to avoid spurious rebuilds if translation is missing
+# gb_HelpTreeTarget_set_treefile target treefile
+define gb_HelpTreeTarget_set_treefile
+$(call gb_HelpTreeTarget__set_pofiles,$(1),$(wildcard $(gb_POLOCATION)/$(lastword $(subst /, ,$(1)))/$(patsubst %/,%,$(dir $(2))).po))
+
+$(call gb_HelpTreeTarget_get_target,$(1)) : HELP_TREE := $(SRCDIR)/$(2).tree
+$(call gb_HelpTreeTarget_get_target,$(1)) : $(SRCDIR)/$(2).tree
+
+endef
+
+# gb_HelpTreeTarget_set_helptextdir target dir
+define gb_HelpTreeTarget_set_helptextdir
+$(call gb_HelpTreeTarget_get_target,$(1)) : HELP_TEXTDIR := $(2)
+
+endef
+
+# class HelpLinkTarget
+
+# Links a help module.
+
+gb_HelpLinkTarget_HELPLINKERDEPS := $(call gb_Executable_get_runtime_dependencies,HelpLinker)
+gb_HelpLinkTarget_HELPLINKERCOMMAND := $(call gb_Executable_get_command,HelpLinker)
+gb_HelpLinkTarget_COMPACTTARGET := $(SRCDIR)/xmlhelp/util/compact.xsl
+gb_HelpLinkTarget_EMBEDTARGET := $(SRCDIR)/xmlhelp/util/embed.xsl
+gb_HelpLinkTarget_IDXCAPTIONTARGET := $(SRCDIR)/xmlhelp/util/idxcaption.xsl
+gb_HelpLinkTarget_IDXCONTENTTARGET := $(SRCDIR)/xmlhelp/util/idxcontent.xsl
+gb_HelpLinkTarget_DEPS := \
+ $(gb_HelpLinkTarget_HELPLINKERDEPS) \
+ $(gb_HelpLinkTarget_COMPACTTARGET) \
+ $(gb_HelpLinkTarget_EMBEDTARGET) \
+ $(gb_HelpLinkTarget_IDXCAPTIONTARGET) \
+ $(gb_HelpLinkTarget_IDXCONTENTTARGET)
+
+# delete index files here too just to be on the safe side...
+# the index files in the .idxl dir are created by HelpIndexer,
+# the ones outside the dir by HelpLinker
+define gb_HelpLinkTarget__command
+ $(if $(HELP_INDEXED),rm -rf $(addprefix $(HELP_WORKDIR)/,$(HELP_INDEXED)) && \)
+RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,\
+ -lang $(HELP_LANG) \
+ -mod $(HELP_MODULE) \
+ $(if $(HELP_INDEXED),,-noindex) \
+ -nolangroot \
+ -o $(WORKDIR)/dummy.zip \
+ -src $(HELP_SRCDIR) \
+ -zipdir $(HELP_WORKDIR) \
+ -compact $(gb_HelpLinkTarget_COMPACTTARGET) \
+ -idxcaption $(gb_HelpLinkTarget_IDXCAPTIONTARGET) \
+ -idxcontent $(gb_HelpLinkTarget_IDXCONTENTTARGET) \
+ -sty $(gb_HelpLinkTarget_EMBEDTARGET) \
+ $(if $(HELP_CONFIGFILE),-add $(HELP_MODULE).cfg $(HELP_CONFIGFILE)) \
+ $(if $(HELP_TREE),-add $(HELP_MODULE).tree $(HELP_TREE)) \
+ $(foreach file,$(HELP_ADD_FILES),-add $(notdir $(file)) $(file)) \
+ $(foreach extra,$(HELP_EXTRA_ADD_FILES),-add $(subst $(COMMA), ,$(extra))) \
+ $(HELP_FILES) \
+ $(if $(HELP_LINKED_MODULES),\
+ $(shell cat $(foreach module,$(HELP_LINKED_MODULES),$(call gb_HelpTarget_get_filelist,$(module)))) \
+ ) \
+) && \
+$(gb_HelpLinkTarget_HELPLINKERCOMMAND) @$${RESPONSEFILE} && \
+touch $@ && \
+rm -f $${RESPONSEFILE}
+endef
+
+
+$(dir $(call gb_HelpLinkTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpLinkTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpLinkTarget_get_target,%) : $(gb_HelpLinkTarget_DEPS)
+ $(call gb_Output_announce,$*,$(true),HLK,3)
+ $(call gb_Trace_StartRange,$*,HLK)
+ $(call gb_HelpLinkTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,HLK)
+
+.PHONY : $(call gb_HelpLinkTarget_get_clean_target,%)
+$(call gb_HelpLinkTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),HLK,3)
+ rm -f $(call gb_HelpLinkTarget_get_target,$*)
+
+# Create a help linking target.
+#
+# depend on makefile to re-build when files are removed
+#
+# gb_HelpLinkTarget_HelpLinkTarget name module lang workdir
+define gb_HelpLinkTarget_HelpLinkTarget
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_ADD_FILES :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_CONFIGFILE :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_EXTRA_ADD_FILES :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_FILES :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_INDEXED :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_MODULE := $(2)
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_LANG := $(3)
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_LINKED_MODULES :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_SRCDIR :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_TREE :=
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_WORKDIR := $(4)
+
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+$(call gb_HelpLinkTarget_get_target,$(1)) :| $(dir $(call gb_HelpLinkTarget_get_target,$(1))).dir
+
+$(4)/$(2).tree : $(call gb_HelpLinkTarget_get_target,$(1))
+
+endef
+
+# gb_HelpLinkTarget_set_configfile target configfile
+define gb_HelpLinkTarget_set_configfile
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_CONFIGFILE := $(2)
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(2)
+
+endef
+
+# gb_HelpLinkTarget_set_sourcedir target source
+define gb_HelpLinkTarget_set_sourcedir
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_SRCDIR := $(2)
+
+endef
+
+# gb_HelpLinkTarget_set_treefile target treefile
+define gb_HelpLinkTarget_set_treefile
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_TREE := $(2)
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(2)
+
+endef
+
+# gb_HelpLinkTarget_set_indexed target indexfiles
+define gb_HelpLinkTarget_set_indexed
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_INDEXED := $(2)
+$(addprefix $(call gb_HelpTarget_get_workdir,$(1))/,$(2)) : $(call gb_HelpIndexTarget_get_target,$(1))
+
+endef
+
+# gb_HelpLinkTarget_add_helpfile target helpfile
+define gb_HelpLinkTarget_add_helpfile
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_FILES += $(2)
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(2)
+
+endef
+
+# Add an arbitrary file to the help pack.
+#
+# The file will be added to the root directory of the pack.
+#
+# gb_HelpLinkTarget_add_file target file
+define gb_HelpLinkTarget_add_file
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_ADD_FILES += $(2)
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(2)
+
+endef
+
+# Add an arbitrary file to the help pack under a new name.
+#
+# The file will be added to the root directory of the pack.
+#
+# gb_HelpLinkTarget_add_renamed_file target filename file
+define gb_HelpLinkTarget_add_renamed_file
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_EXTRA_ADD_FILES += $(strip $(2)),$(strip $(3))
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(3)
+$(call gb_HelpTarget_get_workdir,$(1))/$(2) : $(call gb_HelpLinkTarget_get_target,$(1))
+ touch $$@
+
+endef
+
+# Link with help files from another help module.
+#
+# gb_HelpLinkTarget_use_linked_module target help
+define gb_HelpLinkTarget_use_linked_module
+$(call gb_HelpLinkTarget_get_target,$(1)) : HELP_LINKED_MODULES += $(2)
+
+endef
+
+# class HelpIndexTarget
+
+# Creates a full-text search index for a help module.
+
+gb_HelpIndexTarget_DEPS := $(call gb_Executable_get_runtime_dependencies,HelpIndexer)
+gb_HelpIndexTarget_COMMAND := $(call gb_Executable_get_command,HelpIndexer)
+
+# first delete the index stuff since when it is generated an existing _0.cfs
+# will not be overwritten; instead a new _1.cfs etc. created until disk is full
+define gb_HelpIndexTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ (\
+ rm -rf $(HELP_WORKDIR)/$(HELP_MODULE).idxl \
+ && $(gb_HelpIndexTarget_COMMAND) \
+ -dir $(HELP_WORKDIR) \
+ -lang $(HELP_LANG) \
+ -mod $(HELP_MODULE) \
+ && touch $@ \
+ ) \
+ || ( rm -rf $(HELP_MODULE).* ; false )
+)
+endef
+
+$(dir $(call gb_HelpIndexTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpIndexTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpIndexTarget_get_target,%) : $(gb_HelpIndexTarget_DEPS)
+ $(call gb_Output_announce,$*,$(true),HIX,3)
+ $(call gb_Trace_StartRange,$*,HIX)
+ $(call gb_HelpIndexTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,HIX)
+
+.PHONY : $(call gb_HelpIndexTarget_get_clean_target,%)
+$(call gb_HelpIndexTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),HIX,3)
+ rm -f $(call gb_HelpIndexTarget_get_target,$*)
+
+# Create a help indexing target.
+#
+# gb_HelpIndexTarget_HelpIndexTarget target module lang workdir
+define gb_HelpIndexTarget_HelpIndexTarget
+$(call gb_HelpIndexTarget_get_target,$(1)) : HELP_LANG := $(3)
+$(call gb_HelpIndexTarget_get_target,$(1)) : HELP_MODULE := $(2)
+$(call gb_HelpIndexTarget_get_target,$(1)) : HELP_WORKDIR := $(4)
+
+$(call gb_HelpIndexTarget_get_target,$(1)) :| $(dir $(call gb_HelpIndexTarget_get_target,$(1))).dir
+
+endef
+
+# class HelpJarTarget
+
+# Packs help files processed by HelpLinker into a jar in the workdir.
+
+gb_HelpJarTarget_COMMAND := zip
+
+define gb_HelpJarTarget__get_command
+cd $(HELP_WORKDIR) && \
+$(gb_HelpJarTarget_COMMAND) -q -0 -rX --filesync --must-match $(HELP_MODULE).jar text/$(HELP_MODULE) && \
+touch $@
+endef
+
+$(dir $(call gb_HelpJarTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpJarTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_HelpJarTarget_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),HEJ,3)
+ $(call gb_Trace_StartRange,$*,HEJ)
+ $(call gb_HelpJarTarget__get_command,$@,$*)
+ $(call gb_Trace_EndRange,$*,HEJ)
+
+$(call gb_HelpJarTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),HEJ,3)
+ rm -f $(call gb_HelpJarTarget_get_target,$*)
+
+# gb_HelpJarTarget_HelpJarTarget target module workdir
+define gb_HelpJarTarget_HelpJarTarget
+$(call gb_HelpJarTarget_get_target,$(1)) : HELP_MODULE := $(2)
+$(call gb_HelpJarTarget_get_target,$(1)) : HELP_WORKDIR := $(3)
+
+$(call gb_HelpJarTarget_get_target,$(1)) :| $(dir $(call gb_HelpJarTarget_get_target,$(1))).dir
+
+$(3)/$(2).jar : $(call gb_HelpJarTarget_get_target,$(1))
+
+endef
+
+# class HelpTarget
+
+# Creates one language version of a help module.
+#
+# Provides a filelist called HelpTarget/<name>, that is not built by
+# default (i.e., the user of HelpTarget has to explicitly depend on the
+# Package).
+
+gb_HelpTarget_DEFAULT_LANG := en-US
+
+gb_HelpTarget__get_module = $(patsubst %/$(call gb_HelpTarget__get_lang,$(1)),%,$(1))
+gb_HelpTarget__get_lang = $(lastword $(subst /, ,$(1)))
+gb_HelpTarget__test_default_lang = $(filter $(gb_HelpTarget_DEFAULT_LANG),$(1))
+gb_HelpTarget__is_default_lang = $(call gb_HelpTarget__test_default_lang,$(call gb_HelpTarget__get_lang,$(1)))
+
+define gb_HelpTarget__get_helpdir
+$(if $(call gb_HelpTarget__is_default_lang,$(1)) \
+ ,$(SRCDIR)/$(2) \
+ ,$(call gb_HelpTranslateTarget_get_workdir,$(1),$(2)) \
+)
+endef
+
+define gb_HelpTarget__get_helpfile
+$(if $(call gb_HelpTarget__is_default_lang,$(1)) \
+ ,$(SRCDIR)/$(2).xhp \
+ ,$(call gb_HelpTranslateTarget_get_translated_target,$(1),$(2)) \
+)
+endef
+
+define gb_HelpTarget__get_treefile
+$(if $(call gb_HelpTarget__is_default_lang,$(1)) \
+ ,$(SRCDIR)/$(2).tree \
+ ,$(call gb_HelpTreeTarget_get_target,$(1)) \
+)
+endef
+
+define gb_HelpTarget__command
+$(if $(ENABLE_HTMLHELP),,$(call gb_Output_announce,$(2),$(true),HLP,4))
+$(if $(ENABLE_HTMLHELP),,$(call gb_Trace_MakeMark,$(2),HLP))
+touch $@
+endef
+
+$(dir $(call gb_HelpTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_HelpTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+# Translation of the module's .xhp files and all used modules is done.
+# Also creates the list for gb_HelpTarget_get_filelist.
+$(call gb_HelpTarget_get_translation_target,%) :
+ rm -f $@ && mv $(call gb_var2file,$@.tmp,100,$(strip $(HELP_FILES))) $@
+
+# Translation of the module's .xhp files and all used and linked modules
+# is done.
+$(call gb_HelpTarget_get_linked_target,%) :
+ touch $@
+
+$(call gb_HelpTarget_get_target,%) :
+ $(call gb_HelpTarget__command,$@,$*)
+
+.PHONY : $(call gb_HelpTarget_get_clean_target,%)
+$(call gb_HelpTarget_get_clean_target,%) :
+ifeq ($(ENABLE_HTMLHELP),)
+ $(call gb_Output_announce,$*,$(false),HLP,4)
+endif
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf \
+ $(call gb_HelpTarget_get_linked_target,$*) \
+ $(call gb_HelpTarget_get_target,$*) \
+ $(call gb_HelpTarget_get_translation_target,$*) \
+ $(call gb_HelpTarget_get_workdir,$*) \
+ )
+
+gb_HelpTarget_get_packagename = HelpTarget/$(1)
+
+# Create a help target.
+#
+# depend on makefile to re-build filelist when files are removed
+#
+# gb_HelpTarget_HelpTarget target module lang
+define gb_HelpTarget_HelpTarget
+$(call gb_HelpTarget_get_target,$(1)) : HELP_MODULE := $(2)
+$(call gb_HelpTarget_get_target,$(1)) : HELP_LANG := $(3)
+
+$(call gb_HelpTarget_get_translation_target,$(1)) : HELP_FILES :=
+$(call gb_HelpTarget_get_translation_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+
+$(call gb_HelpTarget__HelpTarget_impl,$(1),$(2),$(3),$(call gb_HelpTarget_get_workdir,$(1)),$(call gb_HelpTarget_get_packagename,$(1)))
+
+endef
+
+# gb_HelpTarget__HelpTarget_impl target module lang workdir package
+define gb_HelpTarget__HelpTarget_impl
+$(if $(call gb_HelpTarget__test_default_lang,$(3)),,$(call gb_HelpTarget__HelpTarget_impl_lang,$(1),$(2),$(3),$(4)))
+
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpLinkTarget_HelpLinkTarget,$(1),$(2),$(3),$(4))
+$(call gb_HelpIndexTarget_HelpIndexTarget,$(1),$(2),$(3),$(4))
+$(call gb_HelpJarTarget_HelpJarTarget,$(1),$(2),$(4))
+$(call gb_Package_Package_internal,$(5),$(4))
+endif
+
+$(call gb_HelpTarget_get_linked_target,$(1)) : $(call gb_HelpTarget_get_translation_target,$(1))
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpLinkTarget_get_target,$(1)) : $(call gb_HelpTarget_get_linked_target,$(1))
+$(call gb_HelpLinkTarget_get_target,$(1)) :| $(call gb_HelpTarget_get_workdir,$(1))/.dir
+$(call gb_HelpTarget_get_target,$(1)) : $(call gb_HelpLinkTarget_get_target,$(1))
+$(call gb_Package_get_preparation_target,$(5)) : $(call gb_HelpTarget_get_target,$(1))
+endif
+
+$(call gb_HelpTarget_get_linked_target,$(1)) :| $(dir $(call gb_HelpTarget_get_linked_target,$(1))).dir
+$(call gb_HelpTarget_get_target,$(1)) :| $(dir $(call gb_HelpTarget_get_target,$(1))).dir
+$(call gb_HelpTarget_get_translation_target,$(1)) :| $(dir $(call gb_HelpTarget_get_translation_target,$(1))).dir
+
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_HelpLinkTarget_get_clean_target,$(1))
+endif
+
+endef
+
+# gb_HelpTarget__HelpTarget_impl_lang target module lang workdir
+define gb_HelpTarget__HelpTarget_impl_lang
+$(call gb_HelpTranslateTarget_HelpTranslateTarget,$(1),$(3))
+$(call gb_HelpTreeTarget_HelpTreeTarget,$(1),$(3))
+
+$(call gb_HelpTarget_get_translation_target,$(1)) : $(call gb_HelpTranslateTarget_get_target,$(1))
+$(call gb_HelpTreeTarget_get_target,$(1)) : $(call gb_HelpTarget_get_linked_target,$(1))
+
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_HelpTranslateTarget_get_clean_target,$(1))
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_HelpTreeTarget_get_clean_target,$(1))
+
+endef
+
+# need a rule for these because these are targets for the Package
+$(WORKDIR)/HelpTarget/%.tree :
+ touch $@
+$(WORKDIR)/HelpTarget/%.jar :
+ touch $@
+$(WORKDIR)/HelpTarget/%.db :
+ touch $@
+$(WORKDIR)/HelpTarget/%.ht :
+ touch $@
+$(WORKDIR)/HelpTarget/%.key :
+ touch $@
+$(WORKDIR)/HelpTarget/%.idxl/_0.cfs :
+ touch $@
+$(WORKDIR)/HelpTarget/%.idxl/segments_3 :
+ touch $@
+$(WORKDIR)/HelpTarget/%.idxl/segments.gen :
+ touch $@
+
+# Get list of the various index files.
+#
+# gb_HelpTarget__add_index_files target module
+define gb_HelpTarget__get_index_files
+$(foreach suffix,.db .ht .idxl/_0.cfs .idxl/segments_3 .idxl/segments.gen .key,$(addsuffix $(suffix),$(call gb_HelpTarget__get_module,$(1))))
+endef
+
+# gb_HelpTarget__add_file target file
+define gb_HelpTarget__add_file
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_Package_add_file,$(call gb_HelpTarget_get_packagename,$(1)),$(LIBO_SHARE_HELP_FOLDER)/$(call gb_HelpTarget__get_lang,$(1))/$(2),$(2))
+endif
+
+endef
+
+# Set config. file used for the help module.
+#
+# The configfile is relative to $(SRCDIR) and without extension.
+#
+# gb_HelpTarget_set_configfile target configfile
+define gb_HelpTarget_set_configfile
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpLinkTarget_set_configfile,$(1),$(SRCDIR)/$(2).cfg)
+$(call gb_HelpTarget__add_file,$(1),$(call gb_HelpTarget__get_module,$(1)).cfg)
+endif
+
+endef
+
+# gb_HelpTarget_set_helpdir target helpdir
+define gb_HelpTarget_set_helpdir
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpLinkTarget_set_sourcedir,$(1),$(call gb_HelpTarget__get_helpdir,$(1),$(2)))
+endif
+
+endef
+
+# gb_HelpTarget_set_treefile target treefile textdir
+define gb_HelpTarget_set_treefile
+$(if $(call gb_HelpTarget__is_default_lang,$(1)),,\
+ $(call gb_HelpTreeTarget_set_treefile,$(1),$(2)) \
+ $(call gb_HelpTreeTarget_set_helptextdir,$(1),$(call gb_HelpTarget__get_helpdir,$(1),$(3))) \
+)
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpLinkTarget_set_treefile,$(1),$(call gb_HelpTarget__get_treefile,$(1),$(2)))
+$(call gb_HelpTarget__add_file,$(1),$(call gb_HelpTarget__get_module,$(1)).tree)
+endif
+
+endef
+
+# Produce full text search index, bookmark list, etc.
+#
+# gb_HelpTarget_set_indexed target
+define gb_HelpTarget_set_indexed
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpLinkTarget_set_indexed,$(1),$(call gb_HelpTarget__get_index_files,$(1)))
+$(foreach file,$(call gb_HelpTarget__get_index_files,$(1)),$(call gb_HelpTarget__add_file,$(1),$(file)))
+
+$(call gb_HelpIndexTarget_get_target,$(1)) : $(call gb_HelpLinkTarget_get_target,$(1))
+$(call gb_HelpTarget_get_target,$(1)) : $(call gb_HelpIndexTarget_get_target,$(1))
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_HelpIndexTarget_get_clean_target,$(1))
+endif
+
+endef
+
+# gb_HelpTarget__add_jar target
+define gb_HelpTarget__add_jar
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpTarget__add_file,$(1),$(call gb_HelpTarget__get_module,$(1)).jar)
+$(call gb_HelpJarTarget_get_target,$(1)) : $(call gb_HelpLinkTarget_get_target,$(1))
+$(call gb_HelpTarget_get_target,$(1)) : $(call gb_HelpJarTarget_get_target,$(1))
+$(call gb_HelpTarget_get_clean_target,$(1)) : $(call gb_HelpJarTarget_get_clean_target,$(1))
+endif
+
+endef
+
+define gb_HelpTarget__add_helpfile_impl
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpLinkTarget_add_helpfile,$(1),$(2))
+endif
+
+$(call gb_HelpTarget_get_translation_target,$(1)) : HELP_FILES += $(2)
+
+endef
+
+# gb_HelpTarget__add_helpfile target helpfile
+define gb_HelpTarget__add_helpfile
+$(call gb_HelpTarget__add_helpfile_impl,$(1),$(call gb_HelpTarget__get_helpfile,$(1),$(2)))
+
+endef
+
+# gb_HelpTarget_add_helpfile target helpfile
+define gb_HelpTarget_add_helpfile
+$(call gb_HelpTranslateTarget_add_file,$(1),$(2))
+$(call gb_HelpTarget__add_helpfile,$(1),$(2))
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpTarget__add_jar,$(1))
+endif
+
+endef
+
+# gb_HelpTarget_add_helpfiles target helpfile(s)
+define gb_HelpTarget_add_helpfiles
+$(call gb_HelpTranslateTarget_add_files,$(1),$(2))
+$(foreach helpfile,$(2),$(call gb_HelpTarget__add_helpfile,$(1),$(helpfile)))
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpTarget__add_jar,$(1))
+endif
+
+endef
+
+# gb_HelpTarget_add_file target file
+define gb_HelpTarget_add_file
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpLinkTarget_add_file,$(1),$(SRCDIR)/$(2))
+$(call gb_HelpTarget__add_file,$(1),$(notdir $(2)))
+endif
+
+endef
+
+# gb_HelpTarget_add_files target file(s)
+define gb_HelpTarget_add_files
+$(foreach file,$(2),$(call gb_HelpTarget_add_file,$(1),$(file)))
+
+endef
+
+# Add a localized file from helpdir under a new name.
+#
+# This is a hack needed for err.html in shared help module.
+#
+# gb_HelpTarget_add_helpdir_file target filename file
+define gb_HelpTarget_add_helpdir_file
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpLinkTarget_add_renamed_file,$(1),$(2),$(call gb_HelpTarget__get_helpfile,$(1),$(3)))
+$(call gb_HelpTarget__add_file,$(1),$(2))
+endif
+
+endef
+
+# gb_HelpTarget_use_module target module
+define gb_HelpTarget_use_module
+$(call gb_HelpTarget_get_translation_target,$(1)) : $(call gb_HelpTarget_get_translation_target,$(2))
+
+endef
+
+# gb_HelpTarget_use_modules target module(s)
+define gb_HelpTarget_use_modules
+$(foreach module,$(2),$(call gb_HelpTarget_use_module,$(1),$(module)))
+
+endef
+
+# gb_HelpTarget_use_linked_module target module
+define gb_HelpTarget_use_linked_module
+ifeq ($(ENABLE_HTMLHELP),)
+$(call gb_HelpLinkTarget_use_linked_module,$(1),$(2))
+$(call gb_HelpTarget_get_linked_target,$(1)) : $(call gb_HelpTarget_get_translation_target,$(2))
+endif
+
+endef
+
+# gb_HelpTarget_use_linked_modules target module(s)
+define gb_HelpTarget_use_linked_modules
+$(foreach module,$(2),$(call gb_HelpTarget_use_linked_module,$(1),$(module)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/Helper.mk b/solenv/gbuild/Helper.mk
new file mode 100644
index 000000000..a0441dc3a
--- /dev/null
+++ b/solenv/gbuild/Helper.mk
@@ -0,0 +1,354 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+gb_Helper_MISC := $(WORKDIR)/Misc
+
+# general purpose phony target
+gb_Helper_PHONY := $(gb_Helper_MISC)/PHONY
+
+# general purpose empty dummy target
+gb_Helper_MISCDUMMY := $(gb_Helper_MISC)/DUMMY
+
+# target for reacting to changes in the list of configured languages
+gb_Helper_LANGSTARGET := $(BUILDDIR)/config_$(gb_Side)_lang.mk.stamp
+
+.PHONY : $(WORKDIR)/Misc/PHONY
+$(gb_Helper_MISCDUMMY) :
+ @mkdir -p $(dir $@) && touch $@
+
+ifeq ($(SRCDIR),$(BUILDDIR))
+define gb_Helper_abbreviate_dirs
+S=$(SRCDIR) && \
+$(subst $(SRCDIR)/,$$S/,I=$(INSTDIR)) && \
+$(subst $(SRCDIR)/,$$S/,W=$(WORKDIR)) && \
+$(subst $(SRCDIR)/,$$S/,$(subst $(INSTDIR)/,$$I/,$(subst $(WORKDIR)/,$$W/,$(1))))
+endef
+else
+define gb_Helper_abbreviate_dirs
+S=$(SRCDIR) && \
+$(subst $(SRCDIR)/,$$S/,B=$(BUILDDIR)) && \
+$(subst $(SRCDIR)/,$$S/,$(subst $(BUILDDIR)/,$$B/,I=$(INSTDIR))) && \
+$(subst $(SRCDIR)/,$$S/,$(subst $(BUILDDIR)/,$$B/,W=$(WORKDIR))) && \
+$(subst $(SRCDIR)/,$$S/,$(subst $(BUILDDIR)/,$$B/,$(subst $(INSTDIR)/,$$I/,$(subst $(WORKDIR)/,$$W/,$(1)))))
+endef
+endif
+
+define gb_Helper_abbreviate_dirs_native
+$(call gb_Output_error,gb_Helper_abbreviate_dirs_native: use gb_Helper_abbreviate_dirs instead.)
+endef
+
+define gb_Helper_native_path
+$(call gb_Output_error,gb_Helper_native_path: Do not use. Should not be necessary.)
+endef
+
+# cygwin seems to eat one backslash when executing command, thus replace with '\\'
+define gb_Helper_windows_path
+$(subst /,\\,$(1))
+endef
+
+define gb_Helper_make_clean_target
+gb_$(1)_get_clean_target = $(WORKDIR)/Clean/$(1)/$$(1)
+
+endef
+
+define gb_Helper_make_dep_target
+gb_$(1)_get_dep_target = $(WORKDIR)/Dep/$(1)/$$(1).d
+
+endef
+
+define gb_Helper_make_clean_targets
+$(foreach targettype,$(1),\
+ $(call gb_Helper_make_clean_target,$(targettype)))
+
+endef
+
+define gb_Helper_make_dep_targets
+$(foreach targettype,$(1),\
+ $(call gb_Helper_make_dep_target,$(targettype)))
+
+endef
+
+# e.g. 'make CppunitTest_sw_macros_test'
+#
+# gb_Helper_make_userfriendly_targets target class build-target? clean-target?
+define gb_Helper_make_userfriendly_targets
+.PHONY: $(2) $(2)_$(1) $(2)_$(1).clean
+$(2): $(2)_$(1)
+$(2)_$(1) : $(if $(3),$(3),$(call gb_$(2)_get_target,$(1)))
+$(2)_$(1).clean : $(if $(4),$(4),$(call gb_$(2)_get_clean_target,$(1)))
+
+endef
+
+define gb_Helper_init_registries
+gb_Executable_VALIDGROUPS_INSTALLED := UREBIN SDK OOO
+gb_Executable_VALIDGROUPS_NOTINSTALLED := NONE
+gb_Executable_VALIDGROUPS := UREBIN SDK OOO NONE
+gb_Library_VALIDGROUPS_INSTALLED := OOOLIBS PLAINLIBS_URE PLAINLIBS_OOO PRIVATELIBS_URE RTVERLIBS UNOVERLIBS PLAINLIBS_SHLXTHDL
+gb_Library_VALIDGROUPS_NOTINSTALLED := PLAINLIBS_NONE PLAINLIBS_OXT EXTENSIONLIBS
+gb_Library_VALIDGROUPS := OOOLIBS PLAINLIBS_URE PLAINLIBS_OOO PRIVATELIBS_URE RTVERLIBS UNOVERLIBS PLAINLIBS_SHLXTHDL PLAINLIBS_NONE PLAINLIBS_OXT EXTENSIONLIBS
+gb_Jar_VALIDGROUPS_INSTALLED := URE OOO
+gb_Jar_VALIDGROUPS_NOTINSTALLED := OXT NONE
+gb_Jar_VALIDGROUPS := URE OOO OXT NONE
+
+$$(foreach group,$$(gb_Executable_VALIDGROUPS),$$(eval gb_Executable_$$(group) :=))
+$$(foreach group,$$(gb_Library_VALIDGROUPS),$$(eval gb_Library_$$(group) :=))
+$$(foreach group,$$(gb_Jar_VALIDGROUPS),$$(eval gb_Jar_$$(group) :=))
+
+endef
+
+define gb_Helper_collect_knownlibs
+gb_Library_KNOWNLIBS := $$(foreach group,$$(gb_Library_VALIDGROUPS),$$(gb_Library_$$(group)))
+gb_Executable_KNOWN := $$(foreach group,$$(gb_Executable_VALIDGROUPS),$$(gb_Executable_$$(group)))
+gb_Jar_KNOWN := $$(foreach group,$$(gb_Jar_VALIDGROUPS),$$(gb_Jar_$$(group)))
+gb_Fuzzers_KNOWN := $$(filter %fuzzer,$$(foreach group,$$(gb_Executable_VALIDGROUPS),$$(gb_Executable_$$(group))))
+
+endef
+
+define gb_Helper_process_executable_registrations
+$(foreach group,$(gb_Executable_VALIDGROUPS),\
+ $(foreach executable,$(gb_Executable_$(group)),\
+ $(if $(filter-out undefined,$(origin gb_Executable__register_$(executable))),\
+ $(call gb_Executable__register_$(executable)))))
+
+endef
+
+define gb_Helper__register_executables
+$(foreach group,$(gb_Executable_VALIDGROUPS),\
+ $(foreach target,$(2),\
+ $(if $(filter $(target),$(gb_Executable_$(group))),\
+ $(call gb_Output_error,gb_Helper_register_executables: already registered: $(target)))))
+$(if $(filter-out $(words $(2)),$(words $(sort $(2)))),\
+ $(call gb_Output_error,gb_Helper_register_executables: contains duplicates: $(2)))
+
+gb_Executable_$(1) += $(2)
+
+endef
+
+# $(call gb_Helper_register_executables,layer,exes)
+define gb_Helper_register_executables
+ifeq ($$(filter $(1),$$(gb_Executable_VALIDGROUPS_NOTINSTALLED)),)
+$$(eval $$(call gb_Output_error,$(1) is not a valid group for executables that are not installed. Valid groups are: $$(gb_Executable_VALIDGROUPS_NOTINSTALLED). Use gb_Helper_register_executables_for_install for installed executables.))
+endif
+$(call gb_Helper__register_executables,$(1),$(2))
+
+endef
+
+# $(call gb_Helper_register_executables_for_install,layer,installmodule,exes)
+define gb_Helper_register_executables_for_install
+$(if $(3),,$(call gb_Output_error,gb_Helper_register_executables_for_install: no executables - need 3 parameters))
+ifeq ($$(filter $(1),$$(gb_Executable_VALIDGROUPS_INSTALLED)),)
+$$(eval $$(call gb_Output_error,$(1) is not a valid group for installed executables. Valid groups are: $$(gb_Executable_VALIDGROUPS_INSTALLED). Use gb_Helper_register_executables for executables that are not installed.))
+endif
+$(call gb_Helper__register_executables,$(1),$(3))
+
+gb_Executable_MODULE_$(2) += $(3)
+
+endef
+
+define gb_Helper__register_libraries
+$(foreach group,$(gb_Library_VALIDGROUPS),\
+ $(foreach target,$(2),\
+ $(if $(filter $(target),$(gb_Library_$(group))),\
+ $(call gb_Output_error,gb_Helper_register_libraries: already registered: $(target)))))
+$(if $(filter-out $(words $(2)),$(words $(sort $(2)))),\
+ $(call gb_Output_error,gb_Helper_register_libraries: contains duplicates: $(2)))
+
+gb_Library_$(1) += $(2)
+
+endef
+
+# $(call gb_Helper_register_libraries,layer,libs)
+define gb_Helper_register_libraries
+ifeq ($$(filter $(1),$$(gb_Library_VALIDGROUPS_NOTINSTALLED)),)
+$$(eval $$(call gb_Output_error,$(1) is not a valid group for libraries that are not installed. Valid groups are: $$(gb_Library_VALIDGROUPS_NOTINSTALLED). Use gb_Helper_register_libraries_for_install for installed libraries.))
+endif
+$(call gb_Helper__register_libraries,$(1),$(2))
+
+endef
+
+# the first argument is the group, which sets rpaths etc.
+# the second argument is the install module, which describes in which distro package/msi a lib should show up
+# UGLY: for versioned libraries "sdk" module is hard-coded for now
+# $(call gb_Helper_register_libraries_for_install,layer,installmodule,libs)
+define gb_Helper_register_libraries_for_install
+$(if $(3),,$(call gb_Output_error,gb_Helper_register_libraries_for_install: no libraries - need 3 parameters))
+ifeq ($$(filter $(1),$$(gb_Library_VALIDGROUPS_INSTALLED)),)
+$$(eval $$(call gb_Output_error,$(1) is not a valid group for installed libraries. Valid groups are: $$(gb_Library_VALIDGROUPS_INSTALLED). Use gb_Helper_register_libraries for libraries that are not installed.))
+endif
+$(call gb_Helper__register_libraries,$(1),$(3))
+
+gb_Library_MODULE_$(2) += $(filter-out $(gb_MERGEDLIBS),$(3))
+
+$(if $(filter UNOVERLIBS RTVERLIBS,$(1)),\
+ gb_SdkLinkLibrary_MODULE_sdk += $(3))
+
+endef
+
+# a plugin is a library, why can't be dynamically linked and must be dlopen'd, but must be linked static
+define gb_Helper_register_plugins_for_install
+$(call gb_Helper_register_libraries_for_install,$(1),$(2),$(3))
+gb_Library_KNOWNPLUGINS += $(3)
+
+endef
+
+define gb_Helper__register_jars
+$(foreach group,$(gb_Jar_VALIDGROUPS),\
+ $(foreach target,$(2),\
+ $(if $(filter $(target),$(gb_Jar_$(group))),\
+ $(call gb_Output_error,gb_Helper_register_jars: already registered: $(target)))))
+$(if $(filter-out $(words $(2)),$(words $(sort $(2)))),\
+ $(call gb_Output_error,gb_Helper_register_jars: contains duplicates: $(2)))
+
+gb_Jar_$(1) += $(2)
+
+endef
+
+# $(call gb_Helper_register_jars,layer,jars)
+define gb_Helper_register_jars
+ifeq ($$(filter $(1),$$(gb_Jar_VALIDGROUPS_NOTINSTALLED)),)
+$$(eval $$(call gb_Output_error,$(1) is not a valid group for jars that are not installed. Valid groups are: $$(gb_Jar_VALIDGROUPS_NOTINSTALLED). Use gb_Helper_register_jars_for_install for installed jars.))
+endif
+$(call gb_Helper__register_jars,$(1),$(2))
+
+endef
+
+# $(call gb_Helper_register_jars_for_install,layer,installmodule,jars)
+define gb_Helper_register_jars_for_install
+$(if $(3),,$(call gb_Output_error,gb_Helper_register_jars_for_install: no jars - need 3 parameters))
+ifeq ($$(filter $(1),$$(gb_Jar_VALIDGROUPS_INSTALLED)),)
+$$(eval $$(call gb_Output_error,$(1) is not a valid group for installed jars. Valid groups are: $$(gb_Jar_VALIDGROUPS_INSTALLED). Use gb_Helper_register_jars for jars that are not installed.))
+endif
+$(call gb_Helper__register_jars,$(1),$(3))
+
+gb_Jar_MODULE_$(2) += $(3)
+
+endef
+
+define gb_Helper__register_packages
+$(foreach target,$(1),\
+ $(if $(filter $(target),$(gb_Package_REGISTERED)),\
+ $(call gb_Output_error,gb_Helper_register_packages: already registered: $(target))))
+$(if $(filter-out $(words $(1)),$(words $(sort $(1)))),\
+ $(call gb_Output_error,gb_Helper_register_packages: contains duplicates: $(1)))
+
+gb_Package_REGISTERED += $(1)
+
+endef
+
+# $(call gb_Helper_register_packages,packages)
+define gb_Helper_register_packages
+$(call gb_Helper__register_packages,$(1))
+
+endef
+
+# $(call gb_Helper_register_packages_for_install,installmodule,packages)
+define gb_Helper_register_packages_for_install
+$(if $(2),,$(call gb_Output_error,gb_Helper_register_packages_for_install: no packages - need 2 parameters))
+$(call gb_Helper__register_packages,$(2))
+
+gb_Package_MODULE_$(1) += $(2)
+
+endef
+
+define gb_Helper_register_mos
+gb_AllLangMoTarget_REGISTERED += $(1)
+
+endef
+
+# TODO: this should be extended to handle auto-installation.
+define gb_Helper_register_uiconfigs
+gb_UIConfig_REGISTERED += $(1)
+
+endef
+
+define gb_Helper_get_imagelists
+$(foreach ui,$(gb_UIConfig_REGISTERED),$(call gb_UIConfig_get_imagelist_target,$(ui)))
+endef
+
+# call gb_Helper_replace_if_different_and_touch,source,target,optional-touch-reference-file
+define gb_Helper_replace_if_different_and_touch
+if cmp -s $(1) $(2); then rm $(1); \
+else mv $(1) $(2) $(if $(3),&& touch -r $(3) $(2)); \
+fi
+endef
+
+# call gb_Helper_copy_if_different_and_touch,source,target,optional-touch-reference-file
+define gb_Helper_copy_if_different_and_touch
+if ! cmp -s $(1) $(2); then \
+ cp $(1) $(2) $(if $(3),&& touch -r $(3) $(2)); \
+fi
+endef
+
+define gb_Helper_define_if_set
+$(foreach def,$(1),$(if $(filter TRUE YES,$($(def))),-D$(def)))
+endef
+
+define gb_Helper_execute
+$(call gb_Executable_get_command,$(firstword $(1))) $(wordlist 2,$(words $(1)),$(1))
+endef
+
+# define gb_Helper_install registered-target target-to-install target-from-workdir
+define gb_Helper_install
+$(1) :| $(2)
+$(2) : $(3) | $(dir $(2)).dir
+$(call gb_Deliver_add_deliverable,$(2),$(3),$(2))
+endef
+
+# use if the installed target is the final target
+define gb_Helper_install_final
+$(1) : $(2) | $(dir $(1)).dir
+$(call gb_Deliver_add_deliverable,$(1),$(2),$(1))
+endef
+
+# call gb_Helper_optional,build_type,if-true,if-false
+define gb_Helper_optional
+$(if $(filter $(1),$(BUILD_TYPE)),$(2),$(3))
+endef
+
+# call gb_Helper_optionals_or,build_types,if-true,if-false
+define gb_Helper_optionals_or
+$(call gb_Helper_optional,$(1),$(2),$(3))
+endef
+
+# call gb_Helper_optionals_and,build_types,if-true,if-false
+define gb_Helper_optionals_and
+$(if $(strip $(filter-out $(filter $(1),$(BUILD_TYPE)),$(1))),$(3),$(2))
+endef
+
+ifeq ($(WITH_LOCALES),)
+define gb_Helper_optional_locale
+$(2)
+endef
+else
+define gb_Helper_optional_locale
+$(if $(filter $(1) $(1)_%,$(WITH_LOCALES)),$(2))
+endef
+endif
+
+define gb_Helper_print_on_error
+$(if $(gb_QUIET_EXTERNAL), \
+ $(if $(2), \
+ ( ( $(1) ) > $(2) 2>&1 || ( cat $(2) && false ) ), \
+ ( TEMPFILE=$(shell $(gb_MKTEMP)) && ( $(1) ) > $$TEMPFILE 2>&1 \
+ && rm $$TEMPFILE \
+ || ( cat $$TEMPFILE && rm $$TEMPFILE && false ) )), \
+ ( $(1) ))
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/InstallModule.mk b/solenv/gbuild/InstallModule.mk
new file mode 100644
index 000000000..ba009e030
--- /dev/null
+++ b/solenv/gbuild/InstallModule.mk
@@ -0,0 +1,88 @@
+# -*- 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/.
+#
+
+# InstallModule class
+
+$(dir $(call gb_InstallModule_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_InstallModule_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),IMO,3)
+ $(call gb_Trace_MakeMark,$*,IMO)
+ $(if $(INSTALL_MODULE_DEFINED),,$(call gb_Output_error,Something depends on install module $* which does not exist.))
+ touch $@
+
+$(call gb_InstallModule_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),IMO,3)
+ rm -f $(call gb_InstallModule_get_target,$*)
+
+define gb_InstallModule_InstallModule
+$(call gb_InstallModuleTarget_InstallModuleTarget,$(1))
+
+$(call gb_InstallModule_get_target,$(1)) : INSTALL_MODULE_DEFINED := $(true)
+$(call gb_InstallModule_get_target,$(1)) : $(call gb_InstallModuleTarget_get_target,$(1))
+$(call gb_InstallModule_get_target,$(1)) :| $(dir $(call gb_InstallModule_get_target,$(1))).dir
+$(call gb_InstallModule_get_clean_target,$(1)) : $(call gb_InstallModuleTarget_get_clean_target,$(1))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_InstallModule_get_target,$(1)),$(call gb_InstallModule_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),InstallModule)
+
+endef
+
+define gb_InstallModule_use_auto_install_libs
+$(call gb_InstallModuleTarget_use_auto_install_libs,$(1),$(2))
+
+endef
+
+define gb_InstallModule_add_defs
+$(call gb_InstallModuleTarget_add_defs,$(1),$(2))
+
+endef
+
+define gb_InstallModule_define_if_set
+$(call gb_InstallModuleTarget_define_if_set,$(1),$(2))
+
+endef
+
+define gb_InstallModule_define_value_if_set
+$(call gb_InstallModuleTarget_define_value_if_set,$(1),$(2))
+
+endef
+
+define gb_InstallModule_add_scpfile
+$(call gb_InstallModuleTarget_add_scpfile,$(1),$(2))
+
+endef
+
+define gb_InstallModule_add_scpfiles
+$(call gb_InstallModuleTarget_add_scpfiles,$(1),$(2))
+
+endef
+
+define gb_InstallModule_add_localized_scpfile
+$(call gb_InstallModuleTarget_add_localized_scpfile,$(1),$(2))
+
+endef
+
+define gb_InstallModule_add_localized_scpfiles
+$(call gb_InstallModuleTarget_add_localized_scpfiles,$(1),$(2))
+
+endef
+
+define gb_InstallModule_add_template
+$(call gb_InstallModuleTarget_add_template,$(1),$(2))
+
+endef
+
+define gb_InstallModule_add_templates
+$(call gb_InstallModuleTarget_add_templates,$(1),$(2))
+
+endef
+
+# vim: set shiftwidth=4 tabstop=4 noexpandtab:
diff --git a/solenv/gbuild/InstallModuleTarget.mk b/solenv/gbuild/InstallModuleTarget.mk
new file mode 100644
index 000000000..3ae5f67e0
--- /dev/null
+++ b/solenv/gbuild/InstallModuleTarget.mk
@@ -0,0 +1,312 @@
+# -*- 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/.
+#
+
+# Overview of dependencies and tasks of InstallModuleTarget
+# target task depends on
+
+# ScpTemplateTarget class
+
+gb_ScpTemplateTarget_TARGET := $(SRCDIR)/scp2/source/templates/modules.pl
+gb_ScpTemplateTarget_COMMAND := $(PERL) -w $(gb_ScpTemplateTarget_TARGET)
+
+gb_ScpTemplateTarget_LANGS := $(sort $(ALL_LANGS))
+
+# Pass first arg if make is running in silent mode, second arg otherwise
+define gb_ScpTemplateTarget__if_silent
+$(if $(findstring s,$(filter-out --%,$(MAKEFLAGS))),$(1),$(2))
+endef
+
+gb_ScpTemplateTarget_get_source = $(SRCDIR)/$(1).sct
+
+define gb_ScpTemplateTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ export COMPLETELANGISO_VAR='$(gb_ScpTemplateTarget_LANGS)' && \
+ $(gb_ScpTemplateTarget_COMMAND) \
+ $(call gb_ScpTemplateTarget__if_silent,,-verbose) \
+ -i $(SCP_TEMPLATE) \
+ -o $(1) \
+)
+endef
+
+$(dir $(call gb_ScpTemplateTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+# depend on configure output to rebuild everything
+$(call gb_ScpTemplateTarget_get_target,%) : \
+ $(gb_ScpTemplateTarget_TARGET) $(BUILDDIR)/config_$(gb_Side).mk
+ $(call gb_Output_announce,$*,$(true),SCT,1)
+ $(call gb_Trace_StartRange,$*,SCT)
+ $(call gb_ScpTemplateTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,SCT)
+
+.PHONY : $(call gb_ScpTemplateTarget_get_clean_target,%)
+$(call gb_ScpTemplateTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),SCT,1)
+ rm -f $(call gb_ScpTemplateTarget_get_target,$*)
+
+# gb_ScpTemplateTarget_ScpTemplateTarget(<target>)
+define gb_ScpTemplateTarget_ScpTemplateTarget
+$(call gb_ScpTemplateTarget_get_target,$(1)) : $(call gb_ScpTemplateTarget_get_source,$(1))
+$(call gb_ScpTemplateTarget_get_target,$(1)) :| $(dir $(call gb_ScpTemplateTarget_get_target,$(1))).dir
+$(call gb_ScpTemplateTarget_get_target,$(1)) : SCP_TEMPLATE := $(call gb_ScpTemplateTarget_get_source,$(1))
+
+endef
+
+# ScpPreprocessTarget class
+
+gb_ScpPreprocessTarget_DEPS := $(call gb_Executable_get_runtime_dependencies,cpp)
+gb_ScpPreprocessTarget_COMMAND := $(call gb_Executable_get_command,cpp)
+
+gb_ScpPreprocessTarget_get_source = $(SRCDIR)/$(1).scp
+
+define gb_ScpPreprocessTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ $(gb_ScpPreprocessTarget_COMMAND) \
+ -+ -P \
+ $(SCPDEFS) $(SCP_DEFS) \
+ $(SCP_INCLUDE) $(SCP_TEMPLATE_INCLUDE) \
+ $(if $(ENABLE_JAVA),-DENABLE_JAVA) \
+ $(SCP_SOURCE) > $(1) \
+)
+endef
+
+$(dir $(call gb_ScpPreprocessTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+# depend on configure output to rebuild everything
+$(call gb_ScpPreprocessTarget_get_target,%) : \
+ $(gb_ScpPreprocessTarget_DEPS) $(BUILDDIR)/config_$(gb_Side).mk
+ $(call gb_Output_announce,$*,$(true),SPP,2)
+ $(call gb_Trace_StartRange,$*,SPP)
+ $(call gb_ScpPreprocessTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,SPP)
+
+.PHONY : $(call gb_ScpPreprocessTarget_get_clean_target,%)
+$(call gb_ScpPreprocessTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),SPP,2)
+ rm -f $(call gb_ScpPreprocessTarget_get_target,$*)
+
+# gb_ScpPreprocessTarget_ScpPreprocessTarget(<target>)
+define gb_ScpPreprocessTarget_ScpPreprocessTarget
+$(call gb_ScpPreprocessTarget_get_target,$(1)) : SCP_SOURCE := $(call gb_ScpPreprocessTarget_get_source,$(1))
+$(call gb_ScpPreprocessTarget_get_target,$(1)) : $(call gb_ScpPreprocessTarget_get_source,$(1))
+$(call gb_ScpPreprocessTarget_get_target,$(1)) :| $(dir $(call gb_ScpPreprocessTarget_get_target,$(1))).dir
+
+endef
+
+# ScpMergeTarget class
+
+gb_ScpMergeTarget_get_source = $(SRCDIR)/$(1).ulf
+
+$(dir $(call gb_ScpMergeTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_ScpMergeTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(eval $(call gb_CustomTarget_ulfex_rule,\
+ $(call gb_ScpMergeTarget_get_target,%),\
+ $(call gb_ScpMergeTarget_get_source,%),\
+ $$(SCP_POFILES)))
+
+.PHONY : $(call gb_ScpMergeTarget_get_clean_target,%)
+$(call gb_ScpMergeTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),SUM,1)
+ rm -f $(call gb_ScpMergeTarget_get_target,$*)
+
+# gb_ScpMergeTarget_ScpMergeTarget(<target>)
+define gb_ScpMergeTarget_ScpMergeTarget
+$(call gb_ScpMergeTarget_get_target,$(1)) :| $(dir $(call gb_ScpMergeTarget_get_target,$(1))).dir
+$(call gb_ScpMergeTarget_get_target,$(1)) : \
+ SCP_POFILES := $(foreach lang,$(gb_TRANS_LANGS),$(gb_POLOCATION)/$(lang)/$(patsubst %/,%,$(dir $(1))).po)
+$(call gb_ScpMergeTarget_get_target,$(1)) : \
+ $(foreach lang,$(gb_TRANS_LANGS),$(gb_POLOCATION)/$(lang)/$(patsubst %/,%,$(dir $(1))).po)
+$(foreach lang,$(gb_TRANS_LANGS),$(gb_POLOCATION)/$(lang)/$(patsubst %/,%,$(dir $(1))).po) :
+
+endef
+
+# ScpTarget class
+
+gb_ScpTarget_TARGET := $(SRCDIR)/solenv/bin/pre2par.pl
+gb_ScpTarget_COMMAND := $(PERL) $(gb_ScpTarget_TARGET)
+
+define gb_ScpTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ $(gb_ScpTarget_COMMAND) -l $(SCP_ULF) -s $(SCP_SOURCE) -o $(1) \
+)
+endef
+
+$(dir $(call gb_ScpTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_ScpTarget_get_target,%) : $(gb_ScpTarget_TARGET)
+ $(call gb_Output_announce,$*,$(true),SCP,2)
+ $(call gb_Trace_StartRange,$*,SCP)
+ $(call gb_ScpTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,SCP)
+
+$(call gb_ScpTarget_get_external_target,%) :
+ touch $@
+
+.PHONY : $(call gb_ScpTarget_get_clean_target,%)
+$(call gb_ScpTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),SCP,2)
+ rm -f \
+ $(call gb_ScpTarget_get_target,$*) \
+ $(call gb_ScpTarget_get_external_target,$*)
+
+# gb_ScpTarget_ScpTarget(<target>)
+define gb_ScpTarget_ScpTarget
+$(call gb_ScpPreprocessTarget_ScpPreprocessTarget,$(1))
+
+$(call gb_ScpTarget_get_target,$(1)) : $(call gb_ScpPreprocessTarget_get_target,$(1))
+$(call gb_ScpTarget_get_target,$(1)) : $(call gb_ScpTarget_get_external_target,$(1))
+$(call gb_ScpTarget_get_external_target,$(1)) :| $(dir $(call gb_ScpTarget_get_target,$(1))).dir
+$(call gb_ScpPreprocessTarget_get_target,$(1)) : $(call gb_ScpTarget_get_external_target,$(1))
+$(call gb_ScpTarget_get_clean_target,$(1)) : $(call gb_ScpPreprocessTarget_get_clean_target,$(1))
+$(call gb_ScpTarget_get_target,$(1)) : SCP_SOURCE := $(call gb_ScpPreprocessTarget_get_target,$(1))
+$(call gb_ScpTarget_get_target,$(1)) : SCP_ULF := $(gb_Helper_PHONY)
+
+endef
+
+define gb_ScpTarget_set_localized
+ifneq ($(gb_WITH_LANG),)
+$(call gb_ScpMergeTarget_ScpMergeTarget,$(1))
+$(call gb_ScpTarget_get_target,$(1)) : SCP_ULF := $(call gb_ScpMergeTarget_get_target,$(1))
+$(call gb_ScpTarget_get_target,$(1)) : $(call gb_ScpMergeTarget_get_target,$(1))
+$(call gb_ScpTarget_get_clean_target,$(1)) : $(call gb_ScpMergeTarget_get_clean_target,$(1))
+else
+$(call gb_ScpTarget_get_target,$(1)) : SCP_ULF := $(call gb_ScpMergeTarget_get_source,$(1))
+$(call gb_ScpTarget_get_target,$(1)) : $(call gb_ScpMergeTarget_get_source,$(1))
+endif
+
+endef
+
+# InstallModuleTarget class
+
+# platform:
+# gb_InstallModuleTarget_InstallModuleTarget_platform
+
+define gb_InstallModuleTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(1) \
+ $(foreach scpfile,$(SCP_FILES),&& echo $(scpfile) >> $(1)) \
+)
+endef
+
+$(dir $(call gb_InstallModuleTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_InstallModuleTarget_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),INM,3)
+ $(call gb_Trace_StartRange,$*,INM)
+ $(call gb_InstallModuleTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,INM)
+
+$(call gb_InstallModuleTarget_get_external_target,%) :
+ touch $@
+
+.PHONY : $(call gb_InstallModuleTarget_get_clean_target,%)
+$(call gb_InstallModuleTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),INM,3)
+ rm -rf \
+ $(call gb_InstallModuleTarget_get_target,$*) \
+ $(call gb_InstallModuleTarget_get_external_target,$*)
+
+define gb_InstallModuleTarget_InstallModuleTarget
+$(call gb_InstallModuleTarget_get_target,$(1)) : \
+ $(call gb_InstallModuleTarget_get_external_target,$(1))
+$(call gb_InstallModuleTarget_get_external_target,$(1)) :| \
+ $(dir $(call gb_InstallModuleTarget_get_target,$(1))).dir
+
+$(call gb_InstallModuleTarget_get_target,$(1)) : SCP_FILES :=
+$(call gb_InstallModuleTarget_get_target,$(1)) : SCP_DEFS :=
+$(call gb_InstallModuleTarget_get_target,$(1)) : SCP_INCLUDE := -I$(SRCDIR)/scp2/inc -I$(WORKDIR) -I$(BUILDDIR)/config_$(gb_Side)
+$(call gb_InstallModuleTarget_get_target,$(1)) : SCP_TEMPLATE_INCLUDE :=
+$(call gb_InstallModuleTarget_use_custom_headers,$(1),scp2/macros)
+
+$(call gb_InstallModuleTarget_InstallModuleTarget_platform,$(1))
+
+endef
+
+define gb_InstallModuleTarget_add_defs
+$(call gb_InstallModuleTarget_get_target,$(1)) : SCP_DEFS += $(2)
+
+endef
+
+define gb_InstallModuleTarget_define_if_set
+$(call gb_InstallModuleTarget_add_defs,$(1),\
+ $(foreach def,$(2),$(if $(filter TRUE YES,$($(def))),-D$(def))) \
+)
+
+endef
+
+define gb_InstallModuleTarget_define_value_if_set
+$(call gb_InstallModuleTarget_add_defs,$(1),\
+ $(foreach def,$(2),$(if $($(def)),-D$(def)=\""$($(def))"\")) \
+)
+
+endef
+
+define gb_InstallModuleTarget_use_auto_install_libs
+$(call gb_InstallModuleTarget_get_external_target,$(1)) : $(foreach ai,$(2),$(call gb_AutoInstall_get_target,$(ai)))
+
+endef
+
+define gb_InstallModuleTarget_use_custom_header
+$(call gb_InstallModuleTarget_get_external_target,$(1)) : $(call gb_CustomTarget_get_target,$(2))
+$(call gb_InstallModuleTarget_get_target,$(1)) : SCP_INCLUDE += -I$(call gb_CustomTarget_get_workdir,$(2)) \
+
+endef
+
+define gb_InstallModuleTarget_use_custom_headers
+$(foreach customtarget,$(2),$(call gb_InstallModuleTarget_use_custom_header,$(1),$(customtarget)))
+
+endef
+
+define gb_InstallModuleTarget_add_scpfile
+$(call gb_ScpTarget_ScpTarget,$(2))
+$(call gb_InstallModuleTarget_get_target,$(1)) : $(call gb_ScpTarget_get_target,$(2))
+$(call gb_InstallModuleTarget_get_clean_target,$(1)) : $(call gb_ScpTarget_get_clean_target,$(2))
+$(call gb_InstallModuleTarget_get_target,$(1)) : SCP_FILES += $(call gb_ScpTarget_get_target,$(2))
+$(call gb_ScpTarget_get_external_target,$(2)) : $(call gb_InstallModuleTarget_get_external_target,$(1))
+
+endef
+
+define gb_InstallModuleTarget_add_scpfiles
+$(foreach scpfile,$(2),$(call gb_InstallModuleTarget_add_scpfile,$(1),$(scpfile)))
+
+endef
+
+define gb_InstallModuleTarget_add_localized_scpfile
+$(call gb_InstallModuleTarget_add_scpfile,$(1),$(2))
+$(call gb_ScpTarget_set_localized,$(2))
+
+endef
+
+define gb_InstallModuleTarget_add_localized_scpfiles
+$(foreach scpfile,$(2),$(call gb_InstallModuleTarget_add_localized_scpfile,$(1),$(scpfile)))
+
+endef
+
+define gb_InstallModuleTarget_add_template
+$(call gb_ScpTemplateTarget_ScpTemplateTarget,$(2))
+$(call gb_InstallModuleTarget_get_external_target,$(1)) : $(call gb_ScpTemplateTarget_get_target,$(2))
+$(call gb_InstallModuleTarget_get_clean_target,$(1)) : $(call gb_ScpTemplateTarget_get_clean_target,$(2))
+$(call gb_InstallModuleTarget_get_target,$(1)) : \
+ SCP_TEMPLATE_INCLUDE := $$(sort $$(SCP_TEMPLATE_INCLUDE) -I$(call gb_ScpTemplateTarget_get_dir,$(2)))
+
+endef
+
+define gb_InstallModuleTarget_add_templates
+$(foreach template,$(2),$(call gb_InstallModuleTarget_add_template,$(1),$(template)))
+
+endef
+
+# vim: set shiftwidth=4 tabstop=4 noexpandtab:
diff --git a/solenv/gbuild/InstallScript.mk b/solenv/gbuild/InstallScript.mk
new file mode 100644
index 000000000..096b3f4e5
--- /dev/null
+++ b/solenv/gbuild/InstallScript.mk
@@ -0,0 +1,84 @@
+# -*- 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/.
+#
+
+# InstallScript class
+
+gb_InstallScript_TARGET := $(SRCDIR)/solenv/bin/par2script.pl
+gb_InstallScript_COMMAND := $(PERL) $(gb_InstallScript_TARGET)
+
+gb_InstallScript__make_arglist = $(subst $(WHITESPACE),$(COMMA),$(strip $(1)))
+
+define gb_InstallScript__get_files
+$(notdir $(shell cat $(foreach module,$(1),$(call gb_InstallModule_get_filelist,$(module)))))
+endef
+
+define gb_InstallScript__get_dirs
+$(sort $(dir $(shell cat $(foreach module,$(1),$(call gb_InstallModule_get_filelist,$(module))))))
+endef
+
+# Pass first arg if make is running in silent mode, second arg otherwise
+define gb_InstallScript__if_silent
+$(if $(findstring s,$(filter-out --%,$(MAKEFLAGS))),$(1),$(2))
+endef
+
+define gb_InstallScript__command
+$(call gb_Helper_abbreviate_dirs,\
+ RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,\
+ $(call gb_InstallScript__make_arglist,\
+ $(call gb_InstallScript__get_files,$(SCP_MODULES))) \
+ ) && \
+ $(gb_InstallScript_COMMAND) \
+ $(call gb_InstallScript__if_silent,-q) \
+ -i $(call gb_InstallScript__make_arglist,$(call gb_InstallScript__get_dirs,$(SCP_MODULES))) \
+ -o $(1) \
+ @@$${RESPONSEFILE} && \
+ rm -f $${RESPONSEFILE} \
+)
+endef
+
+$(dir $(call gb_InstallScript_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_InstallScript_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_InstallScript_get_target,%) : $(gb_InstallScript_TARGET)
+ $(call gb_Output_announce,$*,$(true),INS,4)
+ $(call gb_Trace_StartRange,$*,INS)
+ $(call gb_InstallScript__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,INS)
+
+.PHONY : $(call gb_InstallScript_get_clean_target,%)
+$(call gb_InstallScript_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),INS,4)
+ rm -f $(call gb_InstallScript_get_target,$*)
+
+# gb_InstallScript_InstallScript(<target>)
+define gb_InstallScript_InstallScript
+$(call gb_InstallScript_get_target,$(1)) :| $(dir $(call gb_InstallScript_get_target,$(1))).dir
+$(call gb_InstallScript_get_target,$(1)) : SCP_MODULES :=
+
+$$(eval $$(call gb_Module_register_target,$(call gb_InstallScript_get_target,$(1)),$(call gb_InstallScript_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),InstallScript)
+
+endef
+
+define gb_InstallScript_use_module
+$(call gb_InstallScript_get_target,$(1)) : $(call gb_InstallModule_get_target,$(2))
+$(call gb_InstallScript_get_clean_target,$(1)) : $(call gb_InstallModule_get_clean_target,$(2))
+$(call gb_InstallScript_get_target,$(1)) : SCP_MODULES += $(2)
+
+endef
+
+define gb_InstallScript_use_modules
+$(foreach module,$(2),$(call gb_InstallScript_use_module,$(1),$(module)))
+
+endef
+
+# vim: set shiftwidth=4 tabstop=4 noexpandtab:
diff --git a/solenv/gbuild/InternalUnoApi.mk b/solenv/gbuild/InternalUnoApi.mk
new file mode 100644
index 000000000..dae0cb503
--- /dev/null
+++ b/solenv/gbuild/InternalUnoApi.mk
@@ -0,0 +1,82 @@
+# -*- 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/.
+#
+
+$(dir $(call gb_InternalUnoApi_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $(@)))
+
+$(dir $(call gb_InternalUnoApi_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $(@)))
+
+$(call gb_InternalUnoApi_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),UNI,5) \
+ $(call gb_Trace_MakeMark,$*,UNI)
+ touch $@
+
+.PHONY : $(call gb_InternalUnoApi_get_clean_target,%)
+$(call gb_InternalUnoApi_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),UNI,5) \
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_InternalUnoApi_get_target,$*))
+
+define gb_InternalUnoApi_InternalUnoApi
+$(call gb_UnoApiTarget_UnoApiTarget,$(1),$(2))
+$(call gb_UnoApiHeadersTarget_UnoApiHeadersTarget,$(1))
+
+$(call gb_InternalUnoApi_get_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(1))
+$(call gb_InternalUnoApi_get_target,$(1)) :| $(dir $(call gb_InternalUnoApi_get_target,$(1))).dir
+$(call gb_InternalUnoApi_get_clean_target,$(1)) : $(call gb_UnoApiHeadersTarget_get_clean_target,$(1))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_InternalUnoApi_get_target,$(1)),$(call gb_InternalUnoApi_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),InternalUnoApi)
+
+endef
+
+define gb_InternalUnoApi_add_idlfile
+$(call gb_UnoApiTarget_add_idlfile,$(1),$(2),$(3))
+
+endef
+
+define gb_InternalUnoApi_add_idlfiles
+$(call gb_UnoApiTarget_add_idlfiles,$(1),$(2),$(3))
+
+endef
+
+define gb_InternalUnoApi__use_api
+$(call gb_UnoApiTarget_use_api,$(1),$(2))
+$(call gb_UnoApiHeadersTarget_use_api,$(1),$(2))
+$(call gb_InternalUnoApi_get_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(2))
+
+endef
+
+define gb_InternalUnoApi_use_api
+$(foreach rdb,$(2),$(call gb_InternalUnoApi__use_api,$(1),$(rdb)))
+
+endef
+
+# Express that the rdb $(2) depends on rdb $(3).
+#
+# This information is already available in the UnoApiTarget definition
+# for $(2), but this may not be loaded if we are building from a
+# different module. Thus, this is a necessary hack to make generation of
+# headers on demand work.
+#
+# I suppose it would be possible to store the list of required rdbs for
+# a rdb to a file and then load it when headers' generation is requested,
+# but it feels like overkill...
+define gb_InternalUnoApi_define_api_dependency
+$(call gb_UnoApiHeadersTarget_use_api,$(2),$(3))
+
+endef
+
+define gb_InternalUnoApi_define_api_dependencies
+$(foreach dep,$(3),$(call gb_InternalUnoApi_define_api_dependency,$(1),$(2),$(dep)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/Jar.mk b/solenv/gbuild/Jar.mk
new file mode 100644
index 000000000..d1a84ceba
--- /dev/null
+++ b/solenv/gbuild/Jar.mk
@@ -0,0 +1,287 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# Jar class
+
+gb_Jar_JARCOMMAND := jar
+
+gb_Jar_LAYER_DIRS := \
+ URE:$(INSTROOT)/$(LIBO_URE_SHARE_JAVA_FOLDER) \
+ OOO:$(INSTROOT)/$(LIBO_SHARE_JAVA_FOLDER) \
+ OXT:$(WORKDIR)/Jar \
+ NONE:$(WORKDIR)/Jar \
+
+
+# location of files going to be packed into .jar file
+define gb_Jar_get_workdir
+$(call gb_JavaClassSet_get_classdir,$(call gb_Jar_get_classsetname,$(1)))
+endef
+
+# location of manifest file in workdir
+define gb_Jar_get_manifest_target
+$(call gb_Jar_get_workdir,$(1))/META-INF/MANIFEST.MF
+endef
+
+gb_Jar__get_layer = $(strip $(foreach group,$(gb_Jar_VALIDGROUPS),$(if $(filter $(1),$(gb_Jar_$(group))),$(group))))
+gb_Jar__get_dir_for_layer = $(patsubst $(1):%,%,$(filter $(1):%,$(gb_Jar_LAYER_DIRS)))
+gb_Jar_get_install_target = $(call gb_Jar__get_dir_for_layer,$(call gb_Jar__get_layer,$(1)))/$(1).jar
+
+# creates classset and META-INF folders if they don't exist
+# adds manifest version, class path, solarversion and content from sources to manifest file
+# creates the target folder of the jar file if it doesn't exist
+# creates the jar file
+# jar program does not remove the target in case of error, so rm it manually
+# XXX: PACKAGEDIRS need special treatment, because sometimes we need to
+# add into the jar another class hierarchy created outside of our class
+# set (e.g., by javamaker). Because jar does not allow two same root dirs
+# when creating the archive, we work around this deficiency by creating
+# the archive with the main class hierarchy and then updating it from
+# the other one(s), which seems to work .-)
+define gb_Jar__command
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(call gb_Jar_get_workdir,$(1))/META-INF && \
+ echo Manifest-Version: 1.0 > $(call gb_Jar_get_manifest_target,$(1)) && \
+ $(if $(JARCLASSPATH),$(SRCDIR)/solenv/bin/write_classpath.sh "$(call gb_Jar_get_manifest_target,$(1))" $(strip $(JARCLASSPATH)) &&) \
+ echo "Solar-Version: $(LIBO_VERSION_MAJOR).$(LIBO_VERSION_MINOR).$(LIBO_VERSION_MICRO).$(LIBO_VERSION_PATCH)" >> $(call gb_Jar_get_manifest_target,$(1)) && \
+ $(if $(MANIFEST),cat $(MANIFEST) >> $(call gb_Jar_get_manifest_target,$(1)) &&) \
+ mkdir -p $(dir $(2)) && cd $(call gb_Jar_get_workdir,$(1)) && \
+ $(gb_Jar_JARCOMMAND) cfm $(2) $(call gb_Jar_get_manifest_target,$(1)) \
+ META-INF $(PACKAGEROOTS) $(PACKAGEFILES) \
+ $(foreach root,$(PACKAGEDIRS),&& cd $(dir $(root)) && $(gb_Jar_JARCOMMAND) uf $(2) $(notdir $(root))) \
+ || (rm -f $(2); false) )
+endef
+
+# clean target reuses clean target of ClassSet
+.PHONY : $(call gb_Jar_get_clean_target,%)
+$(call gb_Jar_get_clean_target,%) : $(call gb_JavaClassSet_get_clean_target,$(call gb_Jar_get_classsetname,%))
+ $(call gb_Output_announce,$*,$(false),JAR,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_Jar_get_target,$*))
+
+# the workdir target is created by cd'ing to the target directory and adding/updating the files
+
+# rule for creating the jar file using the command defined above
+$(WORKDIR)/Jar/%.jar :
+ $(call gb_Output_announce,$*,$(true),JAR,3)
+ $(call gb_Trace_StartRange,$*,JAR)
+ $(call gb_Jar__command,$*,$@)
+ $(call gb_Trace_EndRange,$*,JAR)
+
+# call gb_Jar__make_installed_rule,jar
+define gb_Jar__make_installed_rule
+$(call gb_Jar_get_target,$(1)) :
+ $$(call gb_Jar__command,$(1),$(call gb_Jar_get_target,$(1)))
+
+endef
+
+# resets scoped variables (see explanations where they are set)
+# creates a class set and a dependency to it
+# registers target and clean target
+# adds jar files to DeliverLogTarget
+# call gb_Jar_Jar,jarname,java9modulename
+define gb_Jar_Jar
+ifeq (,$$(findstring $(1),$$(gb_Jar_KNOWN)))
+$$(eval $$(call gb_Output_info,Currently known jars are: $(sort $(gb_Jar_KNOWN)),ALL))
+$$(eval $$(call gb_Output_error,Jar $(1) must be registered in Repository.mk or RepositoryExternal.mk))
+endif
+$(call gb_Jar_get_target,$(1)) : MANIFEST :=
+$(call gb_Jar_get_target,$(1)) : JARCLASSPATH :=
+$(call gb_Jar_get_target,$(1)) : PACKAGEROOTS :=
+$(call gb_Jar_get_target,$(1)) : PACKAGEDIRS :=
+$(call gb_Jar_get_target,$(1)) : PACKAGEFILES :=
+$(call gb_Jar_get_target,$(1)) : \
+ $(call gb_JavaClassSet_get_target,$(call gb_Jar_get_classsetname,$(1)))
+$(call gb_JavaClassSet_JavaClassSet,$(call gb_Jar_get_classsetname,$(1)),$(2))
+$(eval $(call gb_Module_register_target,$(call gb_Jar_get_target,$(1)),$(call gb_Jar_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Jar,$(call gb_Jar_get_target,$(1)))
+
+# installed jars need a rule to build!
+$(if $(findstring $(INSTDIR),$(call gb_Jar_get_target,$(1))),$(call gb_Jar__make_installed_rule,$(1)))
+
+endef
+
+# source files are forwarded to the ClassSet
+define gb_Jar_add_sourcefile
+$(call gb_JavaClassSet_add_sourcefile,$(call gb_Jar_get_classsetname,$(1)),$(2))
+
+endef
+
+define gb_Jar_add_sourcefile_java9
+$(call gb_JavaClassSet_add_sourcefile_java9,$(call gb_Jar_get_classsetname,$(1)),$(2))
+
+endef
+
+
+# PACKAGEROOTS is the list of all root folders created by the JavaClassSet to pack into the jar (without META-INF as this is added automatically)
+define gb_Jar_set_packageroot
+$(call gb_Jar_get_target,$(1)) : PACKAGEROOTS := $(2)
+
+endef
+#
+# PACKAGEDIRS is the list of additional root directories to pack into the jar
+define gb_Jar_add_packagedir
+$(call gb_Jar_get_target,$(1)) : PACKAGEDIRS += $(2)
+
+endef
+
+define gb_Jar_add_packagedirs
+$(foreach packagedir,$(2),$(call gb_Jar_add_packagedir,$(1),$(packagedir)))
+
+endef
+
+# PACKAGEFILES is the list of all root files to pack into the jar
+define gb_Jar_add_packagefile
+$(call gb_Jar_get_target,$(1)) : PACKAGEFILES += $(2)
+$(call gb_Jar_get_target,$(1)) : $(call gb_Jar_get_workdir,$(1))/$(strip $(2))
+$(call gb_Jar_get_workdir,$(1))/$(strip $(2)) : $(3) $(call gb_JavaClassSet_get_target,$(call gb_Jar_get_classsetname,$(1)))
+ mkdir -p $$(dir $$@)
+ cp -rf $(3) $$@
+
+endef
+
+# gb_Jar_add_packagefiles jar target-dir file(s)
+define gb_Jar_add_packagefiles
+$(foreach file,$(3),$(call gb_Jar_add_packagefile,$(1),$(if $(strip $(2)),$(strip $(2))/)$(notdir $(file)),$(file)))
+
+endef
+
+define gb_Jar_add_sourcefiles
+$(foreach sourcefile,$(2),$(call gb_Jar_add_sourcefile,$(1),$(sourcefile)))
+
+endef
+
+define gb_Jar_add_sourcefiles_java9
+$(foreach sourcefile,$(2),$(call gb_Jar_add_sourcefile_java9,$(1),$(sourcefile)))
+
+endef
+
+define gb_Jar_add_generated_sourcefile
+$(call gb_JavaClassSet_add_generated_sourcefile,$(call gb_Jar_get_classsetname,$(1)),$(2))
+
+endef
+
+define gb_Jar_add_generated_sourcefiles
+$(foreach sourcefile,$(2),$(call gb_Jar_add_generated_sourcefile,$(1),$(sourcefile)))
+
+endef
+
+# JARCLASSPATH is the class path that is written to the manifest of the jar
+define gb_Jar_add_manifest_classpath
+$(call gb_Jar_get_target,$(1)) : JARCLASSPATH += $(2)
+
+endef
+
+# provide a manifest template containing jar specific information to be written into the manifest
+# it will be appended to the standard content that is written in the build command explicitly
+# the jar file gets a dependency to the manifest template
+define gb_Jar_set_manifest
+$(call gb_Jar_get_target,$(1)) : MANIFEST := $(2)
+$(call gb_Jar_get_target,$(1)) : $(2)
+
+endef
+
+# URE jars are not added to manifest classpath:
+gb_Jar_default_jars := $(gb_Jar_URE)
+
+# remember: classpath is "inherited" to ClassSet
+define gb_Jar_use_jar
+$(call gb_JavaClassSet_use_jar,$(call gb_Jar_get_classsetname,$(1)),$(2))
+$(if $(filter-out $(gb_Jar_default_jars),$(2)),\
+ $(call gb_Jar_add_manifest_classpath,$(1),$(2).jar))
+
+endef
+
+define gb_Jar_use_system_jar
+$(call gb_JavaClassSet_use_system_jar,$(call gb_Jar_get_classsetname,$(1)),$(2))
+$(call gb_Jar_add_manifest_classpath,$(1),$(call gb_Helper_make_url,$(2)))
+
+endef
+
+# call gb_Jar_use_external_jar,jar,externaljarfullpath,manifestentry
+define gb_Jar_use_external_jar
+$(if $(3),,$(call gb_Output_error,gb_Jar_use_external_jar: manifest entry missing))
+$(call gb_JavaClassSet_use_system_jar,$(call gb_Jar_get_classsetname,$(1)),$(2))
+$(call gb_Jar_add_manifest_classpath,$(1),$(3))
+
+endef
+
+# specify jars with imported modules
+define gb_Jar_use_jars
+$(foreach jar,$(2),$(call gb_Jar_use_jar,$(1),$(jar)))
+
+endef
+
+define gb_Jar_use_system_jars
+$(foreach jar,$(2),$(call gb_Jar_use_system_jar,$(1),$(jar)))
+
+endef
+
+# this forwards to functions that must be defined in RepositoryExternal.mk.
+# $(eval $(call gb_Jar_use_external,jar,external))
+define gb_Jar_use_external
+$(if $(value gb_Jar__use_$(2)),\
+ $(call gb_Jar__use_$(2),$(1)),\
+ $(error gb_Jar_use_external: unknown external: $(2)))
+
+endef
+
+define gb_Jar_use_externals
+$(foreach external,$(2),$(call gb_Jar_use_external,$(1),$(external)))
+
+endef
+
+define gb_Jar_use_customtarget
+$(call gb_JavaClassSet_use_customtarget,$(call gb_Jar_get_classsetname,$(1)),$(2))
+
+endef
+
+define gb_Jar_use_customtargets
+$(foreach customtarget,$(2),$(call gb_Jar_use_customtarget,$(1),$(customtarget)))
+
+endef
+
+# Add a dependency on an ExternalProject.
+#
+# call gb_Jar_use_external_project,jar,externalproject
+define gb_Jar_use_external_project
+$(call gb_JavaClassSet_use_external_project,$(call gb_Jar_get_classsetname,$(1)),$(2))
+endef
+
+# possible directories for jar files containing UNO services
+gb_Jar_COMPONENTPREFIXES := \
+ OOO:vnd.sun.star.expand:\dLO_JAVA_DIR/ \
+ URE:vnd.sun.star.expand:\dURE_INTERNAL_JAVA_DIR/ \
+ OXT:./ \
+ NONE:$(call gb_Helper_make_url,$(WORKDIR)/Jar/) \
+
+# get component prefix from layer name ("OOO", "URE", "OXT", "NONE")
+gb_Jar__get_componentprefix = \
+ $(patsubst $(1):%,%,$(or \
+ $(filter $(1):%,$(gb_Jar_COMPONENTPREFIXES)), \
+ $(call gb_Output_error,no ComponentTarget native prefix for layer '$(1)')))
+
+# layer must be specified explicitly in this macro (different to libraries)
+define gb_Jar_set_componentfile
+$(call gb_ComponentTarget_ComponentTarget,$(2),$(call gb_Jar__get_componentprefix,$(3)),$(notdir $(call gb_Jar_get_target,$(1))),$(4))
+$(call gb_Jar_get_target,$(1)) : $(call gb_ComponentTarget_get_target,$(2))
+$(call gb_Jar_get_clean_target,$(1)) : $(call gb_ComponentTarget_get_clean_target,$(2))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/JavaClassSet.mk b/solenv/gbuild/JavaClassSet.mk
new file mode 100644
index 000000000..0e402db67
--- /dev/null
+++ b/solenv/gbuild/JavaClassSet.mk
@@ -0,0 +1,195 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+gb_JavaClassSet_JAVACCOMMAND = $(ICECREAM_RUN) $(JAVACOMPILER) $(JAVACFLAGS) \
+ -encoding utf8 \
+ --release $(1) \
+ $(if $(JAVA_CLASSPATH_NOT_SET),-Xlint:-options)
+
+gb_JavaClassSet_JAVACDEBUG :=
+
+# Enforces correct dependency order for possibly generated stuff:
+# generated sources, jars/classdirs etc.
+gb_JavaClassSet_get_preparation_target = $(WORKDIR)/JavaClassSet/$(1).prepared
+
+ifneq ($(gb_DEBUGLEVEL),0)
+gb_JavaClassSet_JAVACDEBUG := -g
+endif
+
+# $(PACKAGEDIRS) inherited from Jar -- assumption is the last part of the path
+# is top-level java package directory
+# for Java 9 modules, invoke javac another time, with --patch-module so that
+# it finds all the class files for whose packages the module-info contains a
+# declaration
+define gb_JavaClassSet__command
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && \
+ $(if $(filter-out $(JARDEPS),$(4)), \
+ rm -rf $(call gb_JavaClassSet_get_classdir,$(2))/* && \
+ RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),500,\
+ $(filter-out $(JARDEPS) $(T_JAVA9FILES),$(4))) && \
+ $(if $(3),$(call gb_JavaClassSet_JAVACCOMMAND,$(JAVA_TARGET_VER)) \
+ $(gb_JavaClassSet_JAVACDEBUG) \
+ -classpath "$(T_CP)$(gb_CLASSPATHSEP)$(call gb_JavaClassSet_get_classdir,$(2))" \
+ -d $(call gb_JavaClassSet_get_classdir,$(2)) \
+ @$$RESPONSEFILE &&) \
+ rm -f $$RESPONSEFILE &&) \
+ $(if $(T_MODULENAME),\
+ RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),500,\
+ $(T_JAVA9FILES)) && \
+ $(if $(3),$(call gb_JavaClassSet_JAVACCOMMAND,9) \
+ $(gb_JavaClassSet_JAVACDEBUG) \
+ -classpath "$(T_CP)$(gb_CLASSPATHSEP)$(call gb_JavaClassSet_get_classdir,$(2))" \
+ --module-path "$(T_CP)$(gb_CLASSPATHSEP)$(call gb_JavaClassSet_get_classdir,$(2))" \
+ $(if $(T_MODULENAME),--patch-module $(T_MODULENAME)="$(subst $(WHITESPACE),$(gb_CLASSPATHSEP),$(strip $(dir $(PACKAGEDIRS))))") \
+ -d $(call gb_JavaClassSet_get_classdir,$(2)) \
+ @$$RESPONSEFILE &&) \
+ rm -f $$RESPONSEFILE &&) \
+ touch $(1))
+
+endef
+
+$(call gb_JavaClassSet_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),JCS,3)
+ $(call gb_Trace_StartRange,$*,JCS)
+ $(call gb_JavaClassSet__command,$@,$*,$?,$^)
+ $(call gb_Trace_EndRange,$*,JCS)
+
+$(call gb_JavaClassSet_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),JCS,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(dir $(call gb_JavaClassSet_get_target,$*))) \
+ $(call gb_JavaClassSet_get_preparation_target,$*)
+
+$(call gb_JavaClassSet_get_preparation_target,%) :
+ mkdir -p $(dir $@) && touch $@
+
+# depend on makefile to enforce a rebuild if files are removed from the classset
+# call gb_JavaClassSet_JavaClassSet,csname,java9modulename
+define gb_JavaClassSet_JavaClassSet
+$(call gb_JavaClassSet_get_target,$(1)) : \
+ $(gb_Module_CURRENTMAKEFILE) \
+ $(call gb_JavaClassSet_get_preparation_target,$(1))
+$(call gb_JavaClassSet_get_target,$(1)) : JARDEPS := \
+ $(gb_Module_CURRENTMAKEFILE) \
+ $(call gb_JavaClassSet_get_preparation_target,$(1))
+$(call gb_JavaClassSet_get_target,$(1)) : T_MODULENAME := $(2)
+$(call gb_JavaClassSet_get_target,$(1)) : T_JAVA9FILES :=
+
+endef
+
+define gb_JavaClassSet__get_sourcefile
+$(SRCDIR)/$(1).java
+endef
+
+define gb_JavaClassSet__get_generated_sourcefile
+$(WORKDIR)/$(1).java
+endef
+
+define gb_JavaClassSet_add_sourcefile
+$(call gb_JavaClassSet_get_target,$(1)) : $(call gb_JavaClassSet__get_sourcefile,$(2))
+
+endef
+
+define gb_JavaClassSet_add_sourcefiles
+$(foreach sourcefile,$(2),$(call gb_JavaClassSet_add_sourcefile,$(1),$(sourcefile)))
+
+endef
+
+define gb_JavaClassSet_add_sourcefile_java9
+$(call gb_JavaClassSet_get_target,$(1)) : $(call gb_JavaClassSet__get_sourcefile,$(2))
+$(call gb_JavaClassSet_get_target,$(1)) : T_JAVA9FILES += $(call gb_JavaClassSet__get_sourcefile,$(2))
+
+endef
+
+define gb_JavaClassSet_add_sourcefiles_java9
+$(foreach sourcefile,$(2),$(call gb_JavaClassSet_add_sourcefile_java9,$(1),$(sourcefile)))
+
+endef
+
+define gb_JavaClassSet_add_generated_sourcefile
+$(call gb_JavaClassSet_get_target,$(1)) : $(call gb_JavaClassSet__get_generated_sourcefile,$(2))
+$(call gb_JavaClassSet__get_generated_sourcefile,$(2)) :| $(call gb_JavaClassSet_get_preparation_target,$(1))
+
+endef
+
+define gb_JavaClassSet_add_generated_sourcefiles
+$(foreach sourcefile,$(2),$(call gb_JavaClassSet_add_generated_sourcefile,$(1),$(sourcefile)))
+
+endef
+
+define gb_JavaClassSet_add_classpath
+$(call gb_JavaClassSet_get_target,$(1)) : T_CP := $$(if $$(T_CP),$$(T_CP)$$(gb_CLASSPATHSEP))$(strip $(2))
+
+endef
+
+define gb_JavaClassSet_use_jar
+ifneq (,$$(filter-out $(gb_Jar_KNOWN),$(2)))
+$$(eval $$(call gb_Output_info,currently known jars are: $(sort $(gb_Jar_KNOWN)),ALL))
+$$(eval $$(call gb_Output_error,Cannot link against jar $$(filter-out $(gb_Jar_KNOWN),$(2)). Jars must be registered in Repository.mk or RepositoryExternal.mk))
+endif
+$(call gb_JavaClassSet_get_target,$(1)) : $(call gb_Jar_get_target,$(2))
+$(call gb_JavaClassSet_get_target,$(1)) : JARDEPS += $(call gb_Jar_get_target,$(2))
+$(call gb_JavaClassSet_add_classpath,$(1),$(call gb_Jar_get_target,$(2)))
+
+endef
+
+# this does not generate dependency on the jar
+define gb_JavaClassSet_use_system_jar
+$(call gb_JavaClassSet_add_classpath,$(1),$(2))
+
+endef
+
+define gb_JavaClassSet_use_jars
+$(foreach jar,$(2),$(call gb_JavaClassSet_use_jar,$(1),$(jar)))
+
+endef
+
+define gb_JavaClassSet_use_system_jars
+$(foreach jar,$(2),$(call gb_JavaClassSet_use_system_jar,$(1),$(jar)))
+
+endef
+
+# gb_JavaClassSet_use_jar_classset: Like gb_JavaClassSet_use_jar, but instead of
+# using the jar, use the directory tree with the class files that make up the
+# jar. This is sometimes necessary in JunitTests that have test classes in
+# packages that belong to a sealed jar.
+# $1: token identifying this JavaClassSet
+# $2: token identifying the Jar being used
+define gb_JavaClassSet_use_jar_classset
+$(call gb_JavaClassSet_get_target,$(1)) : $(call gb_JavaClassSet_get_target,$(call gb_Jar_get_classsetname,$(2)))
+$(call gb_JavaClassSet_get_target,$(1)) : JARDEPS += $(call gb_JavaClassSet_get_target,$(call gb_Jar_get_classsetname,$(2)))
+$(call gb_JavaClassSet_add_classpath,$(1),$(call gb_JavaClassSet_get_classdir,$(call gb_Jar_get_classsetname,$(2))))
+
+endef
+
+define gb_JavaClassSet_use_customtarget
+$(call gb_JavaClassSet_get_preparation_target,$(1)) : \
+ $(call gb_CustomTarget_get_target,$(2))
+$(call gb_JavaClassSet_add_classpath,$(1),$(call gb_CustomTarget_get_workdir,$(2)))
+
+endef
+
+define gb_JavaClassSet_use_external_project
+$(call gb_JavaClassSet_get_preparation_target,$(1)) : \
+ $(call gb_ExternalProject_get_target,$(2))
+
+endef
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/JunitTest.mk b/solenv/gbuild/JunitTest.mk
new file mode 100644
index 000000000..401c8ff5c
--- /dev/null
+++ b/solenv/gbuild/JunitTest.mk
@@ -0,0 +1,234 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+
+# JunitTest class
+
+gb_JunitTest_JAVACOMMAND := $(JAVAINTERPRETER) $(JAVAIFLAGS)
+
+
+.PHONY : $(call gb_JunitTest_get_clean_target,%)
+$(call gb_JunitTest_get_clean_target,%) : $(call gb_JavaClassSet_get_clean_target,$(call gb_JunitTest_get_classsetname,%))
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $@ $@.log)
+
+ifneq (,$(strip $(OOO_JUNIT_JAR)))
+
+.PHONY : $(call gb_JunitTest_get_target,%)
+$(call gb_JunitTest_get_target,%) :
+ifneq ($(gb_SUPPRESS_TESTS),)
+ @true
+else
+ $(call gb_Output_announce,$*,$(true),JUT,2)
+ $(call gb_Trace_StartRange,$*,JUT)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(call gb_JunitTest_get_userdir,$*) && \
+ mkdir -p $(call gb_JunitTest_get_userdir,$*)/user && \
+ cp $(SRCDIR)/qadevOOo/qa/registrymodifications.xcu $(call gb_JunitTest_get_userdir,$*)/user/ && \
+ ($(gb_TEST_ENV_VARS) $(ICECREAM_RUN) $(gb_JunitTest_JAVACOMMAND) \
+ -classpath "$(T_CP)" \
+ $(DEFS) \
+ org.junit.runner.JUnitCore \
+ $(CLASSES) > $@.log 2>&1 || \
+ (cat $@.log \
+ && echo "to rerun just this failed test without all others, run:" \
+ && echo && echo " make JunitTest_$*" && echo \
+ && echo "cd into the module dir to run the tests faster" \
+ && echo "Or to do interactive debugging, run two shells with:" \
+ && echo \
+ && echo " make debugrun" \
+ && echo " make gb_JunitTest_DEBUGRUN=T JunitTest_$*" \
+ && echo \
+ && false)))
+ $(CLEAN_CMD)
+ $(call gb_Trace_EndRange,$*,JUT)
+endif
+
+define gb_JunitTest_JunitTest
+$(call gb_JunitTest_get_target,$(1)) : T_CP := $(call gb_JavaClassSet_get_classdir,$(call gb_JunitTest_get_classsetname,$(1)))$$(gb_CLASSPATHSEP)$(OOO_JUNIT_JAR)$(if $(HAMCREST_JAR),$$(gb_CLASSPATHSEP)$(HAMCREST_JAR))$$(gb_CLASSPATHSEP)$(INSTROOT)/$(LIBO_URE_LIB_FOLDER)
+$(call gb_JunitTest_get_target,$(1)) : CLASSES :=
+$(eval $(call gb_JunitTest_JunitTest_platform,$(1)))
+
+$(call gb_JavaClassSet_JavaClassSet,$(call gb_JunitTest_get_classsetname,$(1)))
+$(call gb_JavaClassSet_use_system_jar,$(call gb_JunitTest_get_classsetname,$(1)),$(OOO_JUNIT_JAR))
+$(if $(HAMCREST_JAR),$(call gb_JavaClassSet_use_system_jar,$(call gb_JunitTest_get_classsetname,$(1)),$(HAMCREST_JAR)))
+$(call gb_JunitTest_get_target,$(1)) : $(call gb_JavaClassSet_get_target,$(call gb_JunitTest_get_classsetname,$(1)))
+$(eval $(call gb_Module_register_target,$(call gb_JunitTest_get_target,$(1)),$(call gb_JunitTest_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),JunitTest)
+
+endef
+
+define gb_JunitTest_set_defs
+$(call gb_JunitTest_get_target,$(1)) : DEFS := $(2)
+
+endef
+
+define gb_JunitTest_add_classes
+$(call gb_JunitTest_get_target,$(1)) : CLASSES += $(2)
+
+endef
+
+define gb_JunitTest_add_class
+$(call gb_JunitTest_add_classes,$(1),$(2))
+
+endef
+
+
+define gb_JunitTest_add_sourcefile
+$(call gb_JavaClassSet_add_sourcefile,$(call gb_JunitTest_get_classsetname,$(1)),$(2))
+
+endef
+
+define gb_JunitTest_add_sourcefiles
+$(foreach sourcefile,$(2),$(call gb_JunitTest_add_sourcefile,$(1),$(sourcefile)))
+
+endef
+
+define gb_JunitTest_use_jar
+$(call gb_JavaClassSet_use_jar,$(call gb_JunitTest_get_classsetname,$(1)),$(2))
+$(call gb_JunitTest_get_target,$(1)) : T_CP := $$(T_CP)$$(gb_CLASSPATHSEP)$(call gb_Jar_get_target,$(2))
+$(call gb_JunitTest_get_target,$(1)) : $(call gb_Jar_get_target,$(2))
+
+endef
+
+define gb_JunitTest_use_jars
+$(foreach jar,$(2),$(call gb_JunitTest_use_jar,$(1),$(jar)))
+
+endef
+
+# see gb_JavaClassSet_use_jar_classset
+define gb_JunitTest_use_jar_classset
+$(call gb_JavaClassSet_use_jar_classset,$(call gb_JunitTest_get_classsetname,$(1)),$(2))
+$(call gb_JunitTest_get_target,$(1)) : T_CP := $$(T_CP)$$(gb_CLASSPATHSEP)$(call gb_JavaClassSet_get_classdir,$(call gb_Jar_get_classsetname,$(2)))
+
+endef
+
+define gb_JunitTest_add_classpath
+$(call gb_JavaClassSet_add_classpath,$(call gb_JunitTest_get_classsetname,$(1)),$(2))
+$(call gb_JunitTest_get_target,$(1)) : T_CP := $$(T_CP)$$(gb_CLASSPATHSEP)$(2)
+
+endef
+
+define gb_JunitTest_use_system_jar
+$(call gb_JavaClassSet_use_system_jar,$(call gb_JunitTest_get_classsetname,$(1)),$(2))
+
+endef
+
+define gb_JunitTest_use_system_jars
+$(foreach jar,$(2),$(call gb_JunitTest_use_system_jar,$(1),$(jar)))
+
+endef
+
+# this forwards to functions that must be defined in RepositoryExternal.mk.
+# $(eval $(call gb_JunitTest_use_external,jar,external))
+define gb_JunitTest_use_external
+$(if $(value gb_JunitTest__use_$(2)),\
+ $(call gb_JunitTest__use_$(2),$(1)),\
+ $(error gb_JunitTest_use_external: unknown external: $(2)))
+
+endef
+
+define gb_JunitTest_use_externals
+$(foreach external,$(2),$(call gb_JunitTest_use_external,$(1),$(external)))
+
+endef
+
+define gb_JunitTest_use_customtarget
+$(call gb_JavaClassSet_use_customtarget,$(call gb_JunitTest_get_classsetname,$(1)),$(2))
+$(call gb_JunitTest_get_target,$(1)) : T_CP := $$(T_CP)$$(gb_CLASSPATHSEP)$(call gb_CustomTarget_get_workdir,$(2))
+
+endef
+
+define gb_JunitTest_use_customtargets
+$(foreach dependency,$(2),$(call gb_JunitTest_use_customtarget,$(1),$(dependency)))
+
+endef
+
+define gb_JunitTest_use_unoapi_jars
+$(eval $(call gb_JunitTest_use_jars,$(1),\
+ OOoRunner \
+ libreoffice \
+ test \
+))
+
+endef
+
+define gb_JunitTest_use_unoapi_test_class
+$(eval $(call gb_JunitTest_add_classes,$(1),\
+ org.openoffice.test.UnoApiTest \
+))
+
+endef
+
+# To be used by gb_JunitTest_set_unoapi_test_defaults
+# <module>_unoapi_1 => <module>_1 => <module> => <module>/qa/unoapi
+gb_JunitTest__unoapi_iter = $(subst _unoapi,,$(1))
+gb_JunitTest__unoapi_module = $(firstword $(subst _, ,$(gb_JunitTest__unoapi_iter)))
+gb_JunitTest__unoapi_dir = $(if $(2),$(2),$(gb_JunitTest__unoapi_module)/qa/unoapi)
+
+# $(1) = test name (prefer <module>_unoapi for defaults, example <module>_unoapi_1)
+# $(2) = test directory base (def: <module>_unoapi_1 => <module>_1/qa/unoapi)
+# $(3) = SCE file (def: <module>_1.sce)
+# $(4) = XCL file (def: knownissues.xcl)
+# $(5) = test document directory (def: testdocuments; use . for base)
+define gb_JunitTest_set_unoapi_test_defaults
+$(eval $(call gb_JunitTest_set_defs,$(1),\
+ $$(DEFS) \
+ -Dorg.openoffice.test.arg.sce=$(SRCDIR)/$(gb_JunitTest__unoapi_dir)/$(if $(3),$(3),$(gb_JunitTest__unoapi_iter).sce) \
+ -Dorg.openoffice.test.arg.xcl=$(SRCDIR)/$(gb_JunitTest__unoapi_dir)/$(if $(4),$(4),knownissues.xcl) \
+ -Dorg.openoffice.test.arg.tdoc=$(SRCDIR)/$(gb_JunitTest__unoapi_dir)/$(if $(5),$(5),testdocuments) \
+))
+
+$(eval $(call gb_JunitTest_use_unoapi_jars,$(1)))
+$(eval $(call gb_JunitTest_use_unoapi_test_class,$(1)))
+
+endef
+
+else # OOO_JUNIT_JAR
+
+.PHONY : $(call gb_JunitTest_get_target,$(1))
+$(call gb_JunitTest_get_target,%) :
+ifeq ($(gb_SUPPRESS_TESTS),)
+ $(call gb_Output_announce,$* (skipped - no Junit),$(true),JUT,2)
+endif
+ @true
+
+define gb_JunitTest_JunitTest
+$(eval $(call gb_Module_register_target,$(call gb_JunitTest_get_target,$(1)),$(call gb_JunitTest_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),JunitTest)
+
+endef
+
+gb_JunitTest_set_defs :=
+gb_JunitTest_add_classes :=
+gb_JunitTest_add_class :=
+gb_JunitTest_add_sourcefile :=
+gb_JunitTest_add_sourcefiles :=
+gb_JunitTest_use_jar :=
+gb_JunitTest_use_jars :=
+gb_JunitTest_use_jar_classset :=
+gb_JunitTest_use_system_jar :=
+gb_JunitTest_use_system_jars :=
+gb_JunitTest_use_external :=
+gb_JunitTest_use_externals :=
+gb_JunitTest_use_customtarget :=
+gb_JunitTest_use_customtargets :=
+
+endif # OOO_JUNIT_JAR
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/Library.mk b/solenv/gbuild/Library.mk
new file mode 100644
index 000000000..d82a261e0
--- /dev/null
+++ b/solenv/gbuild/Library.mk
@@ -0,0 +1,296 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+
+# Library class
+
+# defined globally in TargetLocations.mk
+# gb_Library_DLLDIR := $(WORKDIR)/LinkTarget/Library
+# defined by platform
+# gb_Library_DEFS
+# gb_Library_ILIBFILENAMES
+# gb_Library_FILENAMES
+# gb_Library_Library_platform
+
+gb_Library_LAYER_DIRS := \
+ URELIB:$(INSTROOT)/$(LIBO_URE_LIB_FOLDER) \
+ OOO:$(INSTROOT)/$(LIBO_LIB_FOLDER) \
+ SHLXTHDL:$(INSTROOT)/$(LIBO_LIB_FOLDER)/shlxthdl \
+ OXT:$(WORKDIR)/LinkTarget/ExtensionLibrary \
+ NONE:$(gb_Library_DLLDIR) \
+
+gb_Library_LAYER_DIRS_FOR_BUILD := \
+ URELIB:$(INSTROOT_FOR_BUILD)/$(LIBO_URE_LIB_FOLDER_FOR_BUILD) \
+ OOO:$(INSTROOT_FOR_BUILD)/$(LIBO_LIB_FOLDER_FOR_BUILD) \
+ SHLXTHDL:$(INSTROOT_FOR_BUILD)/$(LIBO_LIB_FOLDER_FOR_BUILD)/shlxthdl \
+ OXT:$(WORKDIR_FOR_BUILD)/LinkTarget/ExtensionLibrary \
+ NONE:$(gb_Library_DLLDIR_FOR_BUILD) \
+
+# EVIL: gb_StaticLibrary and gb_Library need the same deliver rule because they are indistinguishable on windows
+.PHONY : $(WORKDIR)/Clean/Library/%
+$(WORKDIR)/Clean/Library/% :
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_Library_get_exports_target,$*) \
+ $(AUXTARGETS))
+
+gb_Library__get_dir_for_layer = $(patsubst $(1):%,%,$(filter $(1):%,$(gb_Library_LAYER_DIRS)))
+gb_Library__get_dir_for_layer_for_build = $(patsubst $(1):%,%,$(filter $(1):%,$(call gb_Library_LAYER_DIRS_FOR_BUILD)))
+gb_Library_get_instdir = $(call gb_Library__get_dir_for_layer,$(call gb_Library_get_layer,$(1)))
+gb_Library_get_instdir_for_build = $(call gb_Library__get_dir_for_layer_for_build,$(call gb_Library_get_layer,$(1)))
+
+gb_Library_get_ilib_target = $(if $(filter $(1),$(gb_Library_RTVERLIBS) $(gb_Library_UNOVERLIBS)),$(call gb_Library_get_sdk_link_dir)/$(call gb_Library_get_ilibfilename,$(1)),$(gb_Library_DLLDIR)/$(call gb_Library_get_ilibfilename,$(1)))
+
+define gb_Library_Library
+$(call gb_Postprocess_register_target,AllLibraries,Library,$(1))
+ifeq (,$$(filter $(1),$$(gb_Library_KNOWNLIBS)))
+$$(eval $$(call gb_Output_info,Currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL))
+$$(eval $$(call gb_Output_error,Library $(1) must be registered in Repository.mk or RepositoryExternal.mk))
+endif
+
+$(if $(gb_Package_PRESTAGEDIR),\
+ $(if $(wildcard $(gb_Package_PRESTAGEDIR)/$(call gb_Library_get_instdir,$(1))/$(call gb_Library_get_runtime_filename,$(1))),\
+ $(call gb_Library__Library_impl_copy,$(0),$(call gb_Library_get_instdir,$(1))/$(call gb_Library_get_runtime_filename,$(1))),\
+ $(call gb_Library__Library_impl,$(1),$(call gb_Library_get_linktarget,$(1)))\
+ ),
+ $(call gb_Library__Library_impl,$(1),$(call gb_Library_get_linktarget,$(1)))\
+)
+
+endef
+
+define gb_Library__Library_impl_copy
+$(call gb_Package_Package,Library_Copy_$(1),$(gb_Package_PRESTAGEDIR))
+$(call gb_Package_add_file,Library_Copy_$(1),$(2),$(2))
+endef
+
+# Note: there may be targets in 3 different directories: the library itself,
+# the exports target (and other misc. MSVC files) (always in
+# $(WORKDIR)/LinkTarget), and the import library, which may be in SDK;
+# the first 2 are always created by gb_LinkTarget_LinkTarget
+# Also: the directory dependencies must be on the headers_target because
+# MSVC will write a PDB file when compiling objects.
+#
+# call gb_Library__Library_impl,library,linktarget
+define gb_Library__Library_impl
+$(call gb_LinkTarget_LinkTarget,$(2),Library_$(1),$(call gb_Library_get_layer,$(1)))
+$(call gb_LinkTarget_set_targettype,$(2),Library)
+$(call gb_LinkTarget_add_libs,$(2),$(gb_STDLIBS))
+$(call gb_LinkTarget_add_defs,$(2),\
+ $(gb_Library_DEFS) \
+)
+$(call gb_Library_get_exports_target,$(1)) : $(call gb_Library_get_target,$(1))
+$(call gb_LinkTarget_get_headers_target,$(2)) : \
+ | $(dir $(call gb_Library_get_ilib_target,$(1))).dir
+$(call gb_Library_get_clean_target,$(1)) : $(call gb_LinkTarget_get_clean_target,$(2))
+$(call gb_Library_get_clean_target,$(1)) : AUXTARGETS :=
+$(call gb_Library_Library_platform,$(1),$(2),$(call gb_Library_get_ilib_target,$(1)))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_Library_get_exports_target,$(1)),$(call gb_Library_get_clean_target,$(1))))
+
+$(call gb_Helper_make_userfriendly_targets,$(1),Library,$(call gb_Library_get_exports_target,$(1)))
+
+endef
+
+# we actually (ab)use ILIBTARGET here to store the unversioned symlink -
+# it serves a similar purpose to an MSVC import library, as input for linker
+# call gb_Library__add_soversion_link,library,linkname
+define gb_Library__add_soversion_link
+$(call gb_LinkTarget_set_ilibtarget,$(call gb_Library_get_linktarget,$(1)),$(2))
+
+endef
+
+define gb_Library__set_soversion_script
+$(call gb_LinkTarget_set_soversion_script,$(call gb_Library_get_linktarget,$(1)),$(2))
+$(call gb_Library__add_soversion_link,$(1),$(call gb_Library_get_versionlink_target,$(1)))
+
+endef
+
+# for libraries that maintain stable ABI: set SOVERSION and version script
+# $(call gb_Library_set_soversion_script,versionscript)
+define gb_Library_set_soversion_script
+$(if $(2),,$(call gb_Output_error,gb_Library_set_soversion_script: no script))
+$(if $(3),$(call gb_Output_error,gb_Library_set_soversion_script: too many arguments))
+$(call gb_Library__set_soversion_script_platform,$(1),$(2))
+endef
+
+gb_Library__get_component_var = $(call gb_Library__get_workdir_linktargetname,$(1))<>COMPONENTFILE
+gb_Library__get_component = $($(call gb_Library__get_component_var,$(1)))
+
+# The dependency from workdir component target to outdir library should ensure
+# that gb_CppunitTest_use_component can transitively depend on the library.
+# But the component target also must be delivered; use the target
+# gb_Library_get_exports_target for that purpose, since it is already
+# the "final" target of the Library...
+#
+# call gb_Library_set_componentfile,library,componentfile,rdb
+define gb_Library_set_componentfile
+$(call gb_ComponentTarget_ComponentTarget,$(2),\
+ $(call gb_Library__get_componentprefix,$(gb_Library__get_name)),\
+ $(call gb_Library_get_runtime_filename,$(gb_Library__get_name)),$(3))
+$(call gb_Library_get_exports_target,$(gb_Library__get_name)) :| \
+ $(call gb_ComponentTarget_get_target,$(2))
+$(call gb_ComponentTarget_get_target,$(2)) :| \
+ $(call gb_Library_get_target,$(gb_Library__get_name))
+$(call gb_Library_get_clean_target,$(gb_Library__get_name)) : \
+ $(call gb_ComponentTarget_get_clean_target,$(2))
+
+$(if $(call gb_Library__get_component,$(1)),$(error Can't have multiple component files per library))
+$(eval $(call gb_Library__get_component_var,$(1)) = $(2))
+
+endef
+
+# The implid is appended to the component file, separated by a dot.
+#
+# call gb_Library_add_componentimpl,library,implid
+define gb_Library_add_componentimpl
+$(if $(call gb_Library__get_component,$(1)),, \
+ $(error Set gb_Library_set_componentfile before using gb_Library_add_componentimpl))
+$(call gb_ComponentTarget_add_componentimpl,$(call gb_Library__get_component,$(1)),$(2))
+
+endef
+
+# call gb_Library_add_componentimpls,library,implids
+define gb_Library_add_componentimpls
+$(foreach comp,$(2),$(call gb_Library_add_componentimpl,$(1),$(comp)))
+endef
+
+gb_Library__get_name = $(if $(filter $(1),$(gb_MERGEDLIBS)),merged,$(1))
+
+gb_Library__get_componentprefix = \
+ $(call gb_Library__get_layer_componentprefix,$(call \
+ gb_Library_get_layer,$(1)))
+
+gb_Library__get_layer_componentprefix = \
+ $(patsubst $(1):%,%,$(or \
+ $(filter $(1):%,$(gb_Library__COMPONENTPREFIXES)), \
+ $(call gb_Output_error,no ComponentTarget native prefix for layer '$(1)')))
+
+# The \d gets turned into a dollar sign by a $(subst) call in
+# gb_ComponentTarget__command in ComponentTarget.mk. As far as I
+# understand, there is nothing magic to it, it is not some
+# Make/awk/sed/whatever syntax.
+
+gb_Library__COMPONENTPREFIXES := \
+ NONE:vnd.sun.star.expand:\dLO_BUILD_LIB_DIR/ \
+ OOO:vnd.sun.star.expand:\dLO_LIB_DIR/ \
+ URELIB:vnd.sun.star.expand:\dURE_INTERNAL_LIB_DIR/ \
+ OXT:./ \
+ SHLXTHDL:ERROR_NOT_ALLOWED \
+
+
+gb_Library_get_runtime_filename = $(call gb_Library_get_filename,$(1))
+gb_Library_get_runtime_filename_for_build = $(call gb_Library_get_filename_for_build,$(1))
+
+# instead of setting nodep use gb_Library_set_plugin_for_nodep
+#
+# call gb_Library_set_plugin_for,library,loader,nodep
+define gb_Library_set_plugin_for
+ifneq (,$$(filter-out $(gb_Library_KNOWNPLUGINS),$(1)))
+$$(eval $$(call gb_Output_info,currently known plugins are: $(sort $(gb_Library_KNOWNPLUGINS)),ALL))
+$$(eval $$(call gb_Output_error,Unknown plugin(s) '$$(filter-out $(gb_Library_KNOWNPLUGINS),$(1)))'. Plugins must be registered in Repository.mk or RepositoryExternal.mk))
+endif
+
+$(call gb_Library_get_linktarget_target,$(2)) : PLUGINS += $(1)
+$(eval $(call gb_LinkTarget__add_plugin,$(call gb_Library_get_linktarget,$(2)),$(1)))
+$(eval $(call gb_LinkTarget__set_plugin_for,$(call gb_Library_get_linktarget,$(1)),$(2),$(3),Library_$(1)))
+endef
+
+# call gb_Library_set_plugin_for_nodep,library,loader
+gb_Library_set_plugin_for_nodep = $(call gb_Library_set_plugin_for,$(1),$(2),$(true))
+
+# forward the call to the gb_LinkTarget implementation
+# (note: because the function name is in $(1), the other args are shifted by 1)
+define gb_Library__forward_to_Linktarget
+$(call gb_LinkTarget_$(subst gb_Library_,,$(1)),$(call gb_Library_get_linktarget,$(2)),$(3),$(4),Library_$(2))
+
+endef
+
+# copy pasta for forwarding: this could be (and was) done more elegantly, but
+# these here can be found by both git grep and ctags
+gb_Library_add_cobject = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_cobjects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_cxxobject = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_cxxobjects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_objcobject = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_objcobjects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_objcxxobject = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_objcxxobjects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_cxxclrobject = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_cxxclrobjects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_generated_cxxclrobjects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_asmobject = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_asmobjects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_exception_objects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_x64_generated_exception_objects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_generated_cobjects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_generated_exception_objects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_generated_objcobjects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_generated_objcxxobjects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_library_objects = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_grammar = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_grammars = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_scanner = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_scanners = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_cflags = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_cxxflags = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_objcxxflags = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_objcflags = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_cxxclrflags = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_defs = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_include = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_ldflags = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_ldflags = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_x64 = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_x86 = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_libs = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_disable_standard_system_libs = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_system_darwin_frameworks = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_system_win32_libs = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_library_path_flags = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_api = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_sdk_api = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_udk_api = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_internal_api = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_internal_bootstrap_api = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_internal_comprehensive_api = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_libraries = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_static_libraries = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_external = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_externals = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_custom_headers = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_package = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_packages = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_unpacked = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_sdi_headers = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_precompiled_header = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_reuse_precompiled_header = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_common_precompiled_header = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_export_objects_list = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_add_nativeres = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_nativeres = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_visibility_default = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_warnings_not_errors = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_warnings_disabled = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_external_code = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_generated_cxx_suffix = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_clang = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_clang_precompiled_header = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_use_vclmain = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_Library_set_is_ure_library_or_dependency = $(call gb_Library__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/LinkTarget.mk b/solenv/gbuild/LinkTarget.mk
new file mode 100644
index 000000000..cc98d18bd
--- /dev/null
+++ b/solenv/gbuild/LinkTarget.mk
@@ -0,0 +1,2264 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+#the following user-defined variables are supported:
+# YACCFLAGS
+# LEXFLAGS
+# CPPFLAGS
+# CFLAGS
+# CXXFLAGS
+# OBJCFLAGS
+# OBJCXXFLAGS
+# LDFLAGS
+
+# defined by platform
+# gb_AsmObject_get_source (.asm on Windows, .s elsewhere)
+# gb_AsmObject__command
+# gb_CObject__command_pattern
+# gb_LinkTarget_CXXFLAGS
+# gb_LinkTarget_LDFLAGS
+# gb_LinkTarget_INCLUDE
+# gb_YaccTarget__command(grammar-file, stem-for-message, source-target, include-target)
+
+# Same happens for the gb_LinkTarget_add_libs calls from RepositoryExternal.mk. But we have no real
+# way to separate for gbuild internal and external gb_LinkTarget_add_libs calls.
+# So this flags these call parameters with an @ postfix. But now these must be filtered out, so this
+# defines that filter, just in case we need to change it because it conflicts with some parameters.
+# FYI: on Windows, gb_Library_use_system_win32_libs also calls gb_LinkTarget_add_libs; easy to miss.
+gb_LinkTarget__syslib = %@
+
+# debug flags, if the LinkTarget is named in the list of libraries of ENABLE_SYMBOLS_FOR
+gb_LinkTarget__get_debugflags= \
+ $(if $(ENABLE_OPTIMIZED),$(gb_COMPILEROPTFLAGS), \
+ $(if $(ENABLE_OPTIMIZED_DEBUG),$(gb_COMPILERDEBUGOPTFLAGS),$(gb_COMPILERNOOPTFLAGS))) \
+ $(if $(call gb_target_symbols_enabled,$(1)),$(gb_DEBUGINFO_FLAGS))
+
+# T_LDFLAGS is just expanded once. Override the flags here, so that the linker and compiler use the same.
+ifeq (EMSCRIPTEN,$(OS))
+gb_LinkTarget__get_debugldflags=$(call gb_LinkTarget__get_debugflags,$1)
+else
+# similar for LDFLAGS, use linker optimization flags in non-debug case,
+# but moreover strip debug from libraries for which debuginfo is not wanted
+# (some libraries reuse .o files from other libraries, notably unittests)
+gb_LinkTarget__get_stripldflags=$(if $(strip $(CFLAGS)$(CXXFLAGS)$(OBJCFLAGS)$(OBJCXXFLAGS)$(LDFLAGS)),,$(gb_LINKERSTRIPDEBUGFLAGS))
+gb_LinkTarget__get_debugldflags=$(if $(call gb_target_symbols_enabled,$(1)),$(gb_LINKER_DEBUGINFO_FLAGS),$(gb_LINKEROPTFLAGS) $(call gb_LinkTarget__get_stripldflags,$(1)))
+endif
+
+# generic cflags/cxxflags to use (optimization flags, debug flags)
+# user supplied CFLAGS/CXXFLAGS override default debug/optimization flags
+# call gb_LinkTarget__get_cflags,linktargetmakefilename
+gb_LinkTarget__get_cflags=$(if $(CFLAGS),$(CFLAGS),$(call gb_LinkTarget__get_debugflags,$(1)))
+gb_LinkTarget__get_objcflags=$(if $(OBJCFLAGS),$(OBJCFLAGS),$(call gb_LinkTarget__get_debugflags,$(1)))
+gb_LinkTarget__get_cxxflags=$(if $(CXXFLAGS),$(CXXFLAGS),$(call gb_LinkTarget__get_debugflags,$(1)))
+gb_LinkTarget__get_objcxxflags=$(if $(OBJCXXFLAGS),$(OBJCXXFLAGS),$(call gb_LinkTarget__get_debugflags,$(1)))
+gb_LinkTarget__get_cxxclrflags=$(call gb_LinkTarget__get_debugflags,$(1))
+# call gb_LinkTarget__get_ldflags,linktargetmakefilename
+gb_LinkTarget__get_ldflags=$(if $(LDFLAGS),$(LDFLAGS),$(call gb_LinkTarget__get_debugldflags,$(1)))
+
+gb_LinkTarget_LAYER_LINKPATHS := \
+ URELIB:URELIB. \
+ UREBIN:URELIB. \
+ SDKBIN:URELIB. \
+ OOO:URELIB+OOO. \
+ SHLXTHDL:. \
+ OXT:OXT. \
+ NONE:URELIB+OOO+NONE. \
+
+
+# Used to run a compiler plugin tool.
+#
+# At least for now, these definitions are generic enough so that they can be
+# shared across all current use cases (COMPILER_EXTERNAL_TOOL,
+# COMPILER_PLUGIN_TOOL) on all relevant toolchains (GCC?, Clang, clang-cl). If
+# it ever becomes necessary, they can be moved to e.g.
+# platform/com_{GCC,MSC}_class.mk and made different there.
+#
+# $(call gb_CObject__tool_command,relative-source,source,compiler-plugins)
+define gb_CObject__tool_command
+$(call gb_Helper_abbreviate_dirs,\
+ ICECC=no CCACHE_DISABLE=1 \
+ $(gb_CC) \
+ $(DEFS) \
+ $(T_LTOFLAGS) \
+ $(if $(VISIBILITY),,$(gb_VISIBILITY_FLAGS)) \
+ $(if $(WARNINGS_NOT_ERRORS),$(if $(ENABLE_WERROR),$(if $(PLUGIN_WARNINGS_AS_ERRORS),$(gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS))),$(gb_CFLAGS_WERROR)) \
+ $(if $(3),$(gb_COMPILER_PLUGINS)) \
+ $(T_CFLAGS) $(T_CFLAGS_APPEND) \
+ $(if $(EXTERNAL_CODE),$(gb_CXXFLAGS_Wundef),$(gb_DEFS_INTERNAL)) \
+ -c $(2) \
+ $(INCLUDE) \
+ )
+endef
+define gb_ObjCObject__tool_command
+$(call gb_Helper_abbreviate_dirs,\
+ ICECC=no CCACHE_DISABLE=1 \
+ $(gb_CC) \
+ $(DEFS) \
+ $(T_LTOFLAGS) \
+ $(if $(VISIBILITY),,$(gb_VISIBILITY_FLAGS)) \
+ $(if $(WARNINGS_NOT_ERRORS),$(if $(ENABLE_WERROR),$(if $(PLUGIN_WARNINGS_AS_ERRORS),$(gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS))),$(gb_CFLAGS_WERROR)) \
+ $(if $(3),$(gb_COMPILER_PLUGINS)) \
+ $(T_OBJCFLAGS) $(T_OBJCFLAGS_APPEND) \
+ $(if $(EXTERNAL_CODE),$(gb_CXXFLAGS_Wundef),$(gb_DEFS_INTERNAL)) \
+ -c $(2) \
+ $(INCLUDE) \
+ )
+endef
+define gb_CxxObject__tool_command
+$(call gb_Helper_abbreviate_dirs,\
+ ICECC=no CCACHE_DISABLE=1 \
+ $(gb_CXX) \
+ $(DEFS) \
+ $(T_LTOFLAGS) \
+ $(if $(VISIBILITY),,$(gb_VISIBILITY_FLAGS)) \
+ $(if $(WARNINGS_NOT_ERRORS),$(if $(ENABLE_WERROR),$(if $(PLUGIN_WARNINGS_AS_ERRORS),$(gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS))),$(gb_CFLAGS_WERROR)) \
+ $(if $(3),$(gb_COMPILER_PLUGINS)) \
+ $(T_CXXFLAGS) $(T_CXXFLAGS_APPEND) \
+ $(if $(EXTERNAL_CODE),$(gb_CXXFLAGS_Wundef),$(gb_DEFS_INTERNAL)) \
+ -c $(2) \
+ $(INCLUDE) \
+ )
+endef
+define gb_ObjCxxObject__tool_command
+$(call gb_Helper_abbreviate_dirs,\
+ ICECC=no CCACHE_DISABLE=1 \
+ $(gb_CXX) \
+ $(DEFS) \
+ $(T_LTOFLAGS) \
+ $(if $(VISIBILITY),,$(gb_VISIBILITY_FLAGS)) \
+ $(if $(WARNINGS_NOT_ERRORS),$(if $(ENABLE_WERROR),$(if $(PLUGIN_WARNINGS_AS_ERRORS),$(gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS))),$(gb_CFLAGS_WERROR)) \
+ $(if $(3),$(gb_COMPILER_PLUGINS)) \
+ $(T_OBJCXXFLAGS) $(T_OBJCXXFLAGS_APPEND) \
+ $(if $(EXTERNAL_CODE),$(gb_CXXFLAGS_Wundef),$(gb_DEFS_INTERNAL)) \
+ -c $(2) \
+ $(INCLUDE) \
+ )
+endef
+define gb_CxxClrObject__tool_command
+$(call gb_Helper_abbreviate_dirs,\
+ ICECC=no CCACHE_DISABLE=1 \
+ $(gb_CXX) \
+ $(DEFS) \
+ $(T_LTOFLAGS) \
+ $(if $(VISIBILITY),,$(gb_VISIBILITY_FLAGS)) \
+ $(if $(WARNINGS_NOT_ERRORS),$(if $(ENABLE_WERROR),$(if $(PLUGIN_WARNINGS_AS_ERRORS),$(gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS))),$(gb_CFLAGS_WERROR)) \
+ $(if $(3),$(gb_COMPILER_PLUGINS)) \
+ $(T_CXXCLRFLAGS) $(T_CXXCLRFLAGS_APPEND) \
+ $(if $(EXTERNAL_CODE),$(gb_CXXFLAGS_Wundef),$(gb_DEFS_INTERNAL)) \
+ -c $(2) \
+ $(INCLUDE) \
+ )
+endef
+
+
+# Overview of dependencies and tasks of LinkTarget
+#
+# target task depends on
+# LinkTarget linking AsmObject CObject CxxObject GenCObject GenCxxObject ObjCObject ObjCxxObject GenObjCObject GenObjCxxObject GenNasmObject CxxClrObject
+# LinkTarget/headers
+# LinkTarget/dep joined dep file AsmObject/dep CObject/dep CxxObject/dep GenCObject/dep GenCxxObject/dep ObjCObject/dep ObjCxxObject/dep GenObjCObject/dep GenObjCxxObject/dep GenNasmObject/dep CxxClrObject/dep GenCxxClrObject/dep
+# | LinkTarget/headers
+# LinkTarget/headers all headers available
+# including own generated
+# PCH precompiled headers LinkTarget/headers
+# CObject plain c compile | LinkTarget/headers
+# CxxObject c++ compile | LinkTarget/headers PCH
+# GenCObject plain c compile from | LinkTarget/headers
+# generated source
+# GenCxxObject C++ compile from | LinkTarget/headers PCH
+# generated source
+# ObjCObject objective c compile | LinkTarget/headers
+# ObjCxxObject objective c++ compile | LinkTarget/headers
+# GenObjCObject objective c compile from | LinkTarget/headers
+# generated source
+# GenObjCxxObject objective c++ compile from | LinkTarget/headers
+# generated source
+# GenNasmObject nasm compile from | LinkTarget/headers
+# generated source
+# CxxClrObject C++ CLR compile | LinkTarget/headers
+# GenCxxClrObject C++ CLR compile from | LinkTarget/headers
+# generated source
+#
+# AsmObject asm compile | LinkTarget
+#
+# CObject/dep dependencies these targets generate empty dep files
+# CxxObject/dep dependencies that are populated upon compile
+# GenCObject/dep dependencies
+# GenCxxObject/dep dependencies
+# ObjCObject/dep dependencies
+# ObjCxxObject/dep dependencies
+# GenObjCObject/dep dependencies
+# GenObjCxxObject/dep dependencies
+# GenNasmObject/dep dependencies
+# CxxClrObject/dep dependencies
+# GenCxxClrObject/dep dependencies
+# AsmObject/dep dependencies
+
+# LinkTarget/headers means gb_LinkTarget_get_headers_target etc.
+# dependencies prefixed with | are build-order only dependencies
+
+
+# check that objects are only linked into one link target:
+# multiple linking may cause problems because different link targets may
+# require different compiler flags
+define gb_Object__owner
+$$(if $$(OBJECTOWNER),\
+ $$(call gb_Output_error,fdo#47246: $(1) is linked in by $$(OBJECTOWNER) $(2)))$(2)
+endef
+
+# For every object there is a dep file (if gb_FULLDEPS is active).
+# The dep file depends on the object: the Object__command also updates the
+# dep file as a side effect.
+# In the dep file rule just touch it so it's newer than the object.
+
+# Setting FORCE_COMPILE allows forcing compilation for specific sources,
+# usually used to force running a tool on the sources (see compilerplugins/README).
+# If set, it'll force all considered sources for rebuild. But it's possible
+# to explicitly specify gbuild build targets where running of the tool will be skipped
+# (where 'all' means everything, '-' prepended means to not enable, '/' appended means
+# everything in the directory; there is no ordering, more specific overrides
+# more general, and disabling takes precedence).
+# Example: FORCE_COMPILE="all -sw/ -Library_sc"
+
+# Detect whether forced compile should be used for the given gbuild target.
+# enable if: no "-TARGET" defined AND [module is enabled OR "TARGET" defined]
+# call gb_LinkTarget__force_compile,linktargetmakefilename
+gb_LinkTarget__force_compile = \
+ $(and $(if $(filter -$(1),$(FORCE_COMPILE)),,$(true)),\
+ $(or $(gb_Module_CURRENTMODULE_FORCE_COMPILE),\
+ $(filter $(1),$(FORCE_COMPILE))))
+
+# This one only exists to force .c/.cxx "rebuilds" when running a compiler tool.
+.PHONY: force_compile_target
+force_compile_target:
+ifneq ($(FORCE_COMPILE),)
+gb_FORCE_COMPILE_TARGET := force_compile_target
+endif
+
+# A tool is run either if FORCE_COMPILE is not set (in that case it's always run,
+# because the target is not up to date), or if FORCE_COMPILE is set then
+# the tool is run only if the value of FORCE_COMPILE includes the target.
+gb_LinkTarget__tool_compile_enabled = \
+ $(if $(FORCE_COMPILE),$(T_FORCE_COMPILE),$(true))
+
+# CObject class
+
+gb_CObject_get_source = $(1)/$(2).c
+
+ifneq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(call gb_CObject_get_target,%) : $(call gb_CObject_get_source,$(SRCDIR),%) $(gb_FORCE_COMPILE_TARGET)
+ $(call gb_Output_announce,$*.c,$(true),C ,3)
+ $(call gb_Trace_StartRange,$*.c,C )
+ $(if $(call gb_LinkTarget__tool_compile_enabled),$(call gb_CObject__tool_command,$*,$<,$(COMPILER_PLUGINS)))
+ $(call gb_Trace_EndRange,$*.c,C )
+else
+$(call gb_CObject_get_target,%) : $(call gb_CObject_get_source,$(SRCDIR),%)
+ $(call gb_Output_announce,$*.c,$(true),$(if $(COMPILER_TEST),C? ,C ),3)
+ $(call gb_Trace_StartRange,$*.c,$(if $(COMPILER_TEST),C? ,C ))
+ $(call gb_CObject__command_pattern,$@,$(T_CFLAGS) $(T_CFLAGS_APPEND),$<,$(call gb_CObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_CC))
+ $(call gb_Trace_EndRange,$*.c,$(if $(COMPILER_TEST),C? ,C ))
+endif
+
+# Note: if the *Object_dep_target does not exist it will be created by
+# concat-deps as PHONY
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_CObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_CObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# CxxObject class
+
+gb_CxxObject_get_source = $(1)/$(2).cxx
+
+# Only enable PCH if the PCH_CXXFLAGS and the PCH_DEFS (from the linktarget)
+# are the same as the T_CXXFLAGS and DEFS we want to use for this object. This
+# should usually be the case. The DEFS/T_CXXFLAGS would have to be manually
+# overridden for one object file for them to differ. PCH_CXXFLAGS/PCH_DEFS
+# should never be overridden on an object -- they should be the same as for the
+# whole linktarget. In general it should be cleaner to use a static library
+# compiled with different flags and link that in rather than mixing different
+# flags in one linktarget. If OBJECT_HAS_EXTRA_CXXFLAGS is set, the object
+# has explicitly set additional CXXFLAGS, so in that case avoid using the PCH.
+# T_PCH_EXTRA_CXXFLAGS is used when some object requires extra flags when using
+# the PCH, but they are intended (gb_PrecompiledHeader_pch_with_obj).
+define gb_CxxObject__set_pchflags
+ifneq ($(gb_ENABLE_PCH),)
+ifneq ($(strip $$(PCH_NAME)),)
+ifeq ($(OBJECT_HAS_EXTRA_CXXFLAGS),)
+ifeq ($$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS)),$$(sort $$(T_CXXFLAGS) $$(T_CXXFLAGS_APPEND) $$(DEFS)))
+$$@ : PCHFLAGS := $$(call gb_PrecompiledHeader_get_enableflags,$$(PCH_NAME),$$(PCH_LINKTARGETMAKEFILENAME),$$(PCH_HEADER)) $$(T_PCH_EXTRA_CXXFLAGS)
+else
+$$(warning No precompiled header available for $$*.cxx .)
+$$(info precompiled header flags : $$(sort $$(PCH_CXXFLAGS) $$(PCH_DEFS)))
+$$(info . object flags : $$(sort $$(T_CXXFLAGS) $$(T_CXXFLAGS_APPEND) $$(DEFS)))
+$$(error Incorrect precompiled header setup or internal gbuild error.)
+$$@ : PCHFLAGS :=
+endif
+endif
+endif
+endif
+endef
+
+ifneq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(call gb_CxxObject_get_target,%) : $(call gb_CxxObject_get_source,$(SRCDIR),%) $(gb_FORCE_COMPILE_TARGET)
+ $(call gb_Output_announce,$*.cxx,$(true),CXX,3)
+ $(call gb_Trace_StartRange,$*.cxx,CXX)
+ $(if $(call gb_LinkTarget__tool_compile_enabled),$(call gb_CxxObject__tool_command,$*,$<,$(COMPILER_PLUGINS)))
+ $(call gb_Trace_EndRange,$*.cxx,CXX)
+else
+$(call gb_CxxObject_get_target,%) : $(call gb_CxxObject_get_source,$(SRCDIR),%)
+ $(call gb_Output_announce,$*.cxx,$(true),$(if $(COMPILER_TEST),CPT,CXX),3)
+ $(call gb_Trace_StartRange,$*.cxx,$(if $(COMPILER_TEST),CPT,CXX))
+ $(eval $(gb_CxxObject__set_pchflags))
+ $(call gb_CObject__command_pattern,$@,$(T_CXXFLAGS) $(T_CXXFLAGS_APPEND) $(if $(COMPILER_TEST),$(gb_COMPILER_TEST_FLAGS)),$<,$(call gb_CxxObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_CXX))
+ $(call gb_Trace_EndRange,$*.cxx,$(if $(COMPILER_TEST),CPT,CXX))
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_CxxObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_CxxObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CxxObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# GenCObject class
+
+gb_GenCObject_get_source = $(WORKDIR)/$(1).c
+
+ifneq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(call gb_GenCObject_get_target,%) : $(gb_FORCE_COMPILE_TARGET)
+ $(call gb_Output_announce,$*.c,$(true),C ,3)
+ $(call gb_Trace_StartRange,$*.c,C )
+ test -f $(call gb_GenCObject_get_source,$*) || (echo "Missing generated source file $(call gb_GenCObject_get_source,$*)" && false)
+ $(if $(call gb_LinkTarget__tool_compile_enabled),$(call gb_CObject__tool_command,$*,$(call gb_GenCObject_get_source,$*),$(COMPILER_PLUGINS)))
+ $(call gb_Trace_EndRange,$*.c,C )
+else
+$(call gb_GenCObject_get_target,%) :
+ $(call gb_Output_announce,$*.c,$(true),C ,3)
+ $(call gb_Trace_StartRange,$*.c,C )
+ test -f $(call gb_GenCObject_get_source,$*) || (echo "Missing generated source file $(call gb_GenCObject_get_source,$*)" && false)
+ $(call gb_CObject__command_pattern,$@,$(T_CFLAGS) $(T_CFLAGS_APPEND),$(call gb_GenCObject_get_source,$*),$(call gb_GenCObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_CC))
+ $(call gb_Trace_EndRange,$*.c,C )
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_GenCObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_GenCObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_GenCObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# GenCxxObject class
+
+gb_GenCxxObject_get_source = $(WORKDIR)/$(1).$(gb_LinkTarget_CXX_SUFFIX_$(call gb_LinkTarget__get_workdir_linktargetname,$(2)))
+
+ifneq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(call gb_GenCxxObject_get_target,%) : $(gb_FORCE_COMPILE_TARGET)
+ $(call gb_Output_announce,$(subst $(BUILDDIR)/,,$(GEN_CXX_SOURCE)),$(true),CXX,3)
+ $(call gb_Trace_StartRange,$(subst $(BUILDDIR)/,,$(GEN_CXX_SOURCE)),CXX)
+ test -f $(GEN_CXX_SOURCE) || (echo "Missing generated source file $(GEN_CXX_SOURCE)" && false)
+ $(if $(call gb_LinkTarget__tool_compile_enabled),$(call gb_CxxObject__tool_command,$*,$(GEN_CXX_SOURCE),$(COMPILER_PLUGINS)))
+ $(call gb_Trace_EndRange,$(subst $(BUILDDIR)/,,$(GEN_CXX_SOURCE)),CXX)
+else
+$(call gb_GenCxxObject_get_target,%) :
+ $(call gb_Output_announce,$(subst $(BUILDDIR)/,,$(GEN_CXX_SOURCE)),$(true),CXX,3)
+ $(call gb_Trace_StartRange,$(subst $(BUILDDIR)/,,$(GEN_CXX_SOURCE)),CXX)
+ test -f $(GEN_CXX_SOURCE) || (echo "Missing generated source file $(GEN_CXX_SOURCE)" && false)
+ $(eval $(gb_CxxObject__set_pchflags))
+ $(call gb_CObject__command_pattern,$@,$(T_CXXFLAGS) $(T_CXXFLAGS_APPEND),$(GEN_CXX_SOURCE),$(call gb_GenCxxObject_get_dep_target,$*),$(COMPILER_PLUGINS),$(T_CXX))
+ $(call gb_Trace_EndRange,$(subst $(BUILDDIR)/,,$(GEN_CXX_SOURCE)),CXX)
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_GenCxxObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_GenCxxObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_GenCxxObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# GenCxxClrObject class
+
+gb_GenCxxClrObject_get_source = $(WORKDIR)/$(1).$(gb_LinkTarget_CXX_SUFFIX_$(call gb_LinkTarget__get_workdir_linktargetname,$(2)))
+
+ifneq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(call gb_GenCxxClrObject_get_target,%) : $(gb_FORCE_COMPILE_TARGET)
+ $(call gb_Output_announce,$(subst $(BUILDDIR)/,,$(GEN_CXXCLR_SOURCE)),$(true),CLR,3)
+ $(call gb_Trace_StartRange,$(subst $(BUILDDIR)/,,$(GEN_CXXCLR_SOURCE)),CLR)
+ test -f $(GEN_CXXCLR_SOURCE) || (echo "Missing generated source file $(GEN_CXXCLR_SOURCE)" && false)
+ $(if $(call gb_LinkTarget__tool_compile_enabled),$(call gb_CxxClrObject__tool_command,$*,$(GEN_CXXCLR_SOURCE),$(COMPILER_PLUGINS)))
+ $(call gb_Trace_EndRange,$(subst $(BUILDDIR)/,,$(GEN_CXXCLR_SOURCE)),CLR)
+else
+$(call gb_GenCxxClrObject_get_target,%) :
+ $(call gb_Output_announce,$(subst $(BUILDDIR)/,,$(GEN_CXXCLR_SOURCE)),$(true),CLR,3)
+ $(call gb_Trace_StartRange,$(subst $(BUILDDIR)/,,$(GEN_CXXCLR_SOURCE)),CLR)
+ test -f $(GEN_CXXCLR_SOURCE) || (echo "Missing generated source file $(GEN_CXXCLR_SOURCE)" && false)
+ $(call gb_CObject__command_pattern,$@,$(T_CXXCLRFLAGS) $(T_CXXCLRFLAGS_APPEND),$(GEN_CXXCLR_SOURCE),$(call gb_GenCxxClrObject_get_dep_target,$*),$(COMPILER_PLUGINS),)
+ $(call gb_Trace_EndRange,$(subst $(BUILDDIR)/,,$(GEN_CXXCLR_SOURCE)),CLR)
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_GenCxxClrObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_GenCxxClrObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_GenCxxClrObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# YaccTarget class
+
+# XXX: This is more complicated than necessary, but we cannot just use
+# the generated C++ file as the main target, because we need to let the
+# header depend on that to ensure the header is present before anything
+# tries to use it.
+
+gb_YaccTarget_get_source = $(1)/$(2).y
+
+.PHONY : $(call gb_YaccTarget_get_clean_target,%)
+$(call gb_YaccTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),YAC,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_YaccTarget_get_grammar_target,$*) $(call gb_YaccTarget_get_header_target,$*) $(call gb_YaccTarget_get_target,$*))
+
+$(call gb_YaccTarget_get_target,%) : $(call gb_YaccTarget_get_source,$(SRCDIR),%)
+ $(call gb_YaccTarget__command,$<,$*,$@,$(call gb_YaccTarget_get_header_target,$*),$(call gb_YaccTarget_get_grammar_target,$*))
+
+# call gb_YaccTarget_YaccTarget,yacctarget
+define gb_YaccTarget_YaccTarget
+$(call gb_YaccTarget_get_grammar_target,$(1)) : $(call gb_YaccTarget_get_target,$(1))
+ touch $$@
+$(call gb_YaccTarget_get_header_target,$(1)) : $(call gb_YaccTarget_get_target,$(1))
+ touch $$@
+
+endef
+
+# LexTarget class
+
+gb_LexTarget_get_source = $(1)/$(2).l
+
+.PHONY : $(call gb_LexTarget_get_clean_target,%)
+$(call gb_LexTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),LEX,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_LexTarget_get_scanner_target,$*) $(call gb_LexTarget_get_target,$*))
+
+$(call gb_LexTarget_get_target,%) : $(call gb_LexTarget_get_source,$(SRCDIR),%)
+ $(call gb_Output_announce,$*,$(true),LEX,3)
+ $(call gb_Trace_StartRange,$*,LEX)
+ $(call gb_LexTarget__command,$<,$*,$@,$(call gb_LexTarget_get_scanner_target,$*))
+ $(call gb_Trace_EndRange,$*,LEX)
+
+# gb_LexTarget_LexTarget(scanner-file)
+define gb_LexTarget_LexTarget
+$(call gb_LexTarget_get_scanner_target,$(1)) : $(call gb_LexTarget_get_target,$(1))
+ touch $$@
+
+endef
+
+# gb_LexTarget__command(scanner-file, stem-for-message, done-pseudo-target, source-target)
+define gb_LexTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(3)) && \
+ $(FLEX) $(T_LEXFLAGS) -o$(4) $(1) && touch $(3) )
+endef
+
+
+# ObjCxxObject class
+#
+
+gb_ObjCxxObject_get_source = $(1)/$(2).mm
+
+ifneq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(call gb_ObjCxxObject_get_target,%) : $(call gb_ObjCxxObject_get_source,$(SRCDIR),%) $(gb_FORCE_COMPILE_TARGET)
+ $(call gb_Output_announce,$*.mm,$(true),OCX,3)
+ $(call gb_Trace_StartRange,$*.mm,OCX)
+ $(if $(call gb_LinkTarget__tool_compile_enabled),$(call gb_ObjCxxObject__tool_command,$*,$<,$(COMPILER_PLUGINS)))
+ $(call gb_Trace_EndRange,$*.mm,OCX)
+else
+$(call gb_ObjCxxObject_get_target,%) : $(call gb_ObjCxxObject_get_source,$(SRCDIR),%)
+ $(call gb_Output_announce,$*.mm,$(true),$(if $(COMPILER_TEST),O?X,OCX),3)
+ $(call gb_Trace_StartRange,$*.mm,$(if $(COMPILER_TEST),O?X,OCX))
+ $(call gb_CObject__command_pattern,$@,$(T_OBJCXXFLAGS) $(T_OBJCXXFLAGS_APPEND),$<,$(call gb_ObjCxxObject_get_dep_target,$*),$(COMPILER_PLUGINS),)
+ $(call gb_Trace_EndRange,$*.mm,$(if $(COMPILER_TEST),O?X,OCX))
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_ObjCxxObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_ObjCxxObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_ObjCxxObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# ObjCObject class
+#
+
+gb_ObjCObject_get_source = $(1)/$(2).m
+
+ifneq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(call gb_ObjCObject_get_target,%) : $(call gb_ObjCObject_get_source,$(SRCDIR),%) $(gb_FORCE_COMPILE_TARGET)
+ $(call gb_Output_announce,$*.m,$(true),OCC,3)
+ $(call gb_Trace_StartRange,$*.m,OCC)
+ $(if $(call gb_LinkTarget__tool_compile_enabled),$(call gb_ObjCObject__tool_command,$*,$<,$(COMPILER_PLUGINS)))
+ $(call gb_Trace_EndRange,$*.m,OCC)
+else
+$(call gb_ObjCObject_get_target,%) : $(call gb_ObjCObject_get_source,$(SRCDIR),%)
+ $(call gb_Output_announce,$*.m,$(true),$(if $(COMPILER_TEST),O?C,OCC),3)
+ $(call gb_Trace_StartRange,$*.m,$(if $(COMPILER_TEST),O?C,OCC))
+ $(call gb_CObject__command_pattern,$@,$(T_OBJCFLAGS) $(T_OBJCFLAGS_APPEND),$<,$(call gb_ObjCObject_get_dep_target,$*),$(COMPILER_PLUGINS),)
+ $(call gb_Trace_EndRange,$*.m,$(if $(COMPILER_TEST),O?C,OCC))
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_ObjCObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_ObjCObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_ObjCObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# GenObjCObject class
+
+gb_GenObjCObject_get_source = $(WORKDIR)/$(1).m
+
+ifneq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(call gb_GenObjCObject_get_target,%) : $(gb_FORCE_COMPILE_TARGET)
+ $(call gb_Output_announce,$*.m,$(true),OCC,3)
+ $(call gb_Trace_StartRange,$*.m,OCC)
+ test -f $(call gb_GenObjCObject_get_source,$*) || (echo "Missing generated source file $(call gb_GenObjCObject_get_source,$*)" && false)
+ $(if $(call gb_LinkTarget__tool_compile_enabled),$(call gb_ObjCObject__tool_command,$*,$(call gb_GenObjCObject_get_source,$*),$(COMPILER_PLUGINS)))
+ $(call gb_Trace_EndRange,$*.m,OCC)
+else
+$(call gb_GenObjCObject_get_target,%) :
+ $(call gb_Output_announce,$*.m,$(true),OCC,3)
+ $(call gb_Trace_StartRange,$*.m,OCC)
+ test -f $(call gb_GenObjCObject_get_source,$*) || (echo "Missing generated source file $(call gb_GenObjCObject_get_source,$*)" && false)
+ $(call gb_CObject__command_pattern,$@,$(T_OBJCFLAGS) $(T_OBJCFLAGS_APPEND),$(call gb_GenObjCObject_get_source,$*),$(call gb_GenObjCObject_get_dep_target,$*),$(COMPILER_PLUGINS),)
+ $(call gb_Trace_EndRange,$*.m,OCC)
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_GenObjCObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_GenObjCObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_GenObjCObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# GenObjCxxObject class
+
+gb_GenObjCxxObject_get_source = $(WORKDIR)/$(1).mm
+
+ifneq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(call gb_GenObjCxxObject_get_target,%) : $(gb_FORCE_COMPILE_TARGET)
+ $(call gb_Output_announce,$*.mm,$(true),OCX,3)
+ $(call gb_Trace_StartRange,$*.mm,OCX)
+ test -f $(call gb_GenObjCxxObject_get_source,$*) || (echo "Missing generated source file $(call gb_GenObjCxxObject_get_source,$*)" && false)
+ $(if $(call gb_LinkTarget__tool_compile_enabled),$(call gb_ObjCxxObject__tool_command,$*,$(call gb_GenObjCxxObject_get_source,$*),$(COMPILER_PLUGINS)))
+ $(call gb_Trace_EndRange,$*.mm,OCX)
+else
+$(call gb_GenObjCxxObject_get_target,%) :
+ $(call gb_Output_announce,$*.mm,$(true),OCX,3)
+ $(call gb_Trace_StartRange,$*.mm,OCX)
+ test -f $(call gb_GenObjCxxObject_get_source,$*) || (echo "Missing generated source file $(call gb_GenObjCxxObject_get_source,$*)" && false)
+ $(call gb_CObject__command_pattern,$@,$(T_OBJCXXFLAGS) $(T_OBJCXXFLAGS_APPEND),$(call gb_GenObjCxxObject_get_source,$*),$(call gb_GenObjCxxObject_get_dep_target,$*),$(COMPILER_PLUGINS),)
+ $(call gb_Trace_EndRange,$*.mm,OCX)
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_GenObjCxxObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_GenObjCxxObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_GenObjCxxObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+# GenNasmObject class
+
+gb_GenNasmObject_get_source = $(WORKDIR)/$(1)
+
+$(call gb_GenNasmObject_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),ASM,3)
+ $(call gb_Trace_StartRange,$*,ASM)
+ test -f $(call gb_GenNasmObject_get_source,$*) || (echo "Missing generated source file $(call gb_GenNasmObject_get_source,$*)" && false)
+ mkdir -p $(dir $@) $(dir $(call gb_GenNasmObject_get_dep_target,$*)) && cd $(SRCDIR) && \
+ $(NASM) $(T_NASMFLAGS) $(T_NASMFLAGS_APPEND) -I$(dir $(call gb_GenNasmObject_get_source,$*)) \
+ $(call gb_GenNasmObject_get_source,$*) -o $@ && \
+ echo "$@ : $(call gb_GenNasmObject_get_source,$*)" > $(call gb_GenNasmObject_get_dep_target,$*)
+ $(call gb_Trace_EndRange,$*,ASM)
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_GenNasmObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_GenNasmObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_GenNasmObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# CxxClrObject class
+#
+
+gb_CxxClrObject_get_source = $(1)/$(2).cxx
+
+ifneq ($(COMPILER_EXTERNAL_TOOL)$(COMPILER_PLUGIN_TOOL),)
+$(call gb_CxxClrObject_get_target,%) : $(call gb_CxxClrObject_get_source,$(SRCDIR),%) $(gb_FORCE_COMPILE_TARGET)
+ $(call gb_Output_announce,$*.cxx,$(true),CLR,3)
+ $(call gb_Trace_StartRange,$*.cxx,CLR)
+ $(if $(call gb_LinkTarget__tool_compile_enabled),$(call gb_CxxClrObject__tool_command,$*,$<,$(COMPILER_PLUGINS)))
+ $(call gb_Trace_EndRange,$*.cxx,CLR)
+else
+$(call gb_CxxClrObject_get_target,%) : $(call gb_CxxClrObject_get_source,$(SRCDIR),%)
+ $(call gb_Output_announce,$*.cxx,$(true),$(if $(COMPILER_TEST),C?R,CLR),3)
+ $(call gb_Trace_StartRange,$*.cxx,$(if $(COMPILER_TEST),C?R,CLR))
+ $(call gb_CObject__command_pattern,$@,$(T_CXXCLRFLAGS) $(T_CXXCLRFLAGS_APPEND),$<,$(call gb_CxxClrObject_get_dep_target,$*),$(COMPILER_PLUGINS),)
+ $(call gb_Trace_EndRange,$*.cxx,$(if $(COMPILER_TEST),C?R,CLR))
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_CxxClrObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_CxxClrObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CxxClrObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# AsmObject class
+
+$(call gb_AsmObject_get_target,%) : $(call gb_AsmObject_get_source,$(SRCDIR),%)
+ $(call gb_AsmObject__command,$@,$*,$<,$(call gb_AsmObject_get_dep_target,$*))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_AsmObject_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_AsmObject_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_AsmObject_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+
+endif
+
+
+# LinkTarget class
+
+gb_LinkTarget_DEFAULTDEFS := $(gb_GLOBALDEFS)
+
+.PHONY : $(WORKDIR)/Clean/LinkTarget/%
+$(WORKDIR)/Clean/LinkTarget/% :
+ $(call gb_Output_announce,$(LINKTARGETMAKEFILENAME),$(false),LNK,4)
+ RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),200,\
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_dep_target,$(object))) \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_dwo_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_dep_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_dwo_target,$(object))) \
+ $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
+ $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_dep_target,$(object))) \
+ $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_dwo_target,$(object))) \
+ $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
+ $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_dep_target,$(object))) \
+ $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_dwo_target,$(object))) \
+ $(foreach object,$(CXXCLROBJECTS),$(call gb_CxxClrObject_get_target,$(object))) \
+ $(foreach object,$(CXXCLROBJECTS),$(call gb_CxxClrObject_get_dep_target,$(object))) \
+ $(foreach object,$(CXXCLROBJECTS),$(call gb_CxxClrObject_get_dwo_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_dep_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_dwo_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_dwo_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_dwo_target,$(object))) \
+ $(foreach object,$(GENOBJCOBJECTS),$(call gb_GenObjCObject_get_target,$(object))) \
+ $(foreach object,$(GENOBJCOBJECTS),$(call gb_GenObjCObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENOBJCOBJECTS),$(call gb_GenObjCObject_get_dwo_target,$(object))) \
+ $(foreach object,$(GENOBJCXXOBJECTS),$(call gb_GenObjCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENOBJCXXOBJECTS),$(call gb_GenObjCxxObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENOBJCXXOBJECTS),$(call gb_GenObjCxxObject_get_dwo_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_dwo_target,$(object))) \
+ $(foreach object,$(GENCXXCLROBJECTS),$(call gb_GenCxxClrObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXCLROBJECTS),$(call gb_GenCxxClrObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENCXXCLROBJECTS),$(call gb_GenCxxClrObject_get_dwo_target,$(object))) \
+ $(call gb_LinkTarget_get_target,$(LINKTARGET)) \
+ $(call gb_LinkTarget_get_dep_target,$(LINKTARGET)) \
+ $(if $(gb_PARTIAL_BUILD),, \
+ $(call gb_LinkTarget_get_dep_libraries_target,$(LINKTARGET)) \
+ $(call gb_LinkTarget_get_dep_externals_target,$(LINKTARGET)) \
+ $(call gb_LinkTarget_get_dep_statics_target,$(LINKTARGET)) \
+ ) \
+ $(call gb_LinkTarget_get_headers_target,$(LINKTARGET)) \
+ $(call gb_LinkTarget_get_objects_list,$(LINKTARGET)) \
+ $(call gb_LinkTarget_get_pch_timestamp,$(LINKTARGETMAKEFILENAME)) \
+ $(call gb_LinkTarget_get_pch_reuse_timestamp,$(LINKTARGETMAKEFILENAME)) \
+ $(ILIBTARGET) \
+ $(AUXTARGETS)) && \
+ cat $${RESPONSEFILE} /dev/null | $(if $(filter WNT,$(OS)),env -i PATH="$$PATH") xargs -n 200 rm -fr && \
+ rm -f $${RESPONSEFILE}
+
+
+# cat the deps of all objects in one file, then we need only open that one file
+# call gb_LinkTarget__command_dep,dep_target,linktargetname
+define gb_LinkTarget__command_dep
+$(call gb_Output_announce,LNK:$(2).d,$(true),DEP,1)
+ $(call gb_Trace_StartRange,LNK:$(2),DEP)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && \
+ RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),200,\
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_dep_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_dep_target,$(object))) \
+ $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_dep_target,$(object)))\
+ $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_dep_target,$(object)))\
+ $(foreach object,$(CXXCLROBJECTS),$(call gb_CxxClrObject_get_dep_target,$(object)))\
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_dep_target,$(object)))\
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENOBJCOBJECTS),$(call gb_GenObjCObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENOBJCXXOBJECTS),$(call gb_GenObjCxxObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_dep_target,$(object))) \
+ $(foreach object,$(GENCXXCLROBJECTS),$(call gb_GenCxxClrObject_get_dep_target,$(object))) \
+ ) && \
+ $(call gb_Executable_get_command,concat-deps) $${RESPONSEFILE} > $(1)) && \
+ rm -f $${RESPONSEFILE}
+ $(call gb_Trace_EndRange,LNK:$(2),DEP)
+
+endef
+
+# call gb_LinkTarget__command_objectlist,linktarget
+define gb_LinkTarget__command_objectlist
+TEMPFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),200,\
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
+ $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
+ $(foreach object,$(CXXCLROBJECTS),$(call gb_CxxClrObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENOBJCOBJECTS),$(call gb_GenObjCObject_get_target,$(object))) \
+ $(foreach object,$(GENOBJCXXOBJECTS),$(call gb_GenObjCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXCLROBJECTS),$(call gb_GenCxxClrObject_get_target,$(object))) \
+ $(PCHOBJS) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),$(shell cat $(extraobjectlist)))) && \
+mv $${TEMPFILE} $(1)
+
+endef
+
+$(WORKDIR)/LinkTarget/%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+# Target for the .exports of the shared library, to speed up incremental build.
+# This deliberately does nothing if the file exists; the file is actually
+# written in gb_LinkTarget__command_dynamiclink.
+# Put this pattern rule here so it overrides the one below.
+# (this is rather ugly: because of % the functions cannot be used)
+$(WORKDIR)/LinkTarget/Library/%.exports :
+ $(if $(wildcard $@),,mkdir -p $(dir $@) && touch $@)
+
+# This recipe actually also builds the dep-target as a side-effect, which
+# is an optimization to reduce incremental build time.
+# (with exception for concat-dep executable itself which does not exist yet...)
+$(WORKDIR)/LinkTarget/% : $(gb_Helper_MISCDUMMY)
+ $(call gb_LinkTarget__command_impl,$@,$*)
+
+# call gb_LinkTarget__make_installed_rule,linktarget
+define gb_LinkTarget__make_installed_rule
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_LinkTarget_get_headers_target,$(1))
+ $$(call gb_LinkTarget__command_impl,$(call gb_LinkTarget_get_target,$(1)),$(call gb_LinkTarget__get_workdir_linktargetname,$(1)))
+
+endef
+
+define gb_LinkTarget__add_linked_libs
+$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS += $(2)
+
+endef
+
+# it's not possible to use a pattern rule for files in INSTDIR because
+# it would inevitably conflict with the pattern rule for Package
+# (especially since external libraries are delivered via Package)
+# call gb_LinkTarget__command_impl,linktargettarget,linktargetname
+define gb_LinkTarget__command_impl
+ $(if $(gb_FULLDEPS),
+ $(if $(ENABLE_CUSTOMTARGET_COMPONENTS),$(if $(gb_PARTIAL_BUILD),,
+ $(call gb_LinkTarget__command_dep_libraries,$(call gb_LinkTarget_get_dep_libraries_target,$(2)).tmp,$(2))
+ mv $(call gb_LinkTarget_get_dep_libraries_target,$(2)).tmp $(call gb_LinkTarget_get_dep_libraries_target,$(2))
+ $(call gb_LinkTarget__command_dep_externals,$(call gb_LinkTarget_get_dep_externals_target,$(2)).tmp,$(2))
+ mv $(call gb_LinkTarget_get_dep_externals_target,$(2)).tmp $(call gb_LinkTarget_get_dep_externals_target,$(2))
+ $(call gb_LinkTarget__command_dep_statics,$(call gb_LinkTarget_get_dep_statics_target,$(2)).tmp,$(2))
+ mv $(call gb_LinkTarget_get_dep_statics_target,$(2)).tmp $(call gb_LinkTarget_get_dep_statics_target,$(2))))
+ $(if $(findstring concat-deps,$(2)),,
+ $(call gb_LinkTarget__command_dep,$(call gb_LinkTarget_get_dep_target,$(2)).tmp,$(2))
+ mv $(call gb_LinkTarget_get_dep_target,$(2)).tmp $(call gb_LinkTarget_get_dep_target,$(2))))
+ $(if $(filter $(2),$(foreach lib,$(gb_MERGEDLIBS),$(call gb_Library__get_workdir_linktargetname,$(lib)))),
+ $(if $(filter $(true),$(call gb_LinkTarget__is_build_lib,$(2))),
+ $(call gb_LinkTarget__command,$(1),$(2)),
+ mkdir -p $(dir $(1)) && echo invalid - merged lib > $(1)
+ $(if $(SOVERSIONSCRIPT),&& echo invalid - merged lib > $(WORKDIR)/LinkTarget/$(2))),
+ $(if $(filter-out CompilerTest,$(TARGETTYPE)),
+ $(call gb_LinkTarget__command,$(1),$(2))))
+ $(call gb_LinkTarget__command_objectlist,$(WORKDIR)/LinkTarget/$(2).objectlist)
+endef
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,%) : $(call gb_Executable_get_runtime_dependencies,concat-deps)
+ $(call gb_LinkTarget__command_dep,$@,$*)
+
+$(dir $(call gb_LinkTarget_get_dep_target,%))/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+ifeq ($(ENABLE_CUSTOMTARGET_COMPONENTS),TRUE)
+ifeq (,$(gb_PARTIAL_BUILD))
+
+define gb_LinkTarget__static_dep_x_template
+
+define gb_LinkTarget__command_dep_$(1)
+$$(call gb_Output_announce,LNK:$$(2).d.$(1),$$(true),DEP,1)
+mkdir -p $$(dir $$(1)) && \
+TEMPFILE=$$(call gb_var2file,$$(shell $$(gb_MKTEMP)),200,\
+ $$(call gb_LinkTarget__get_all_$(1),$$(2))) && \
+ $$(call gb_Helper_replace_if_different_and_touch,$$$${TEMPFILE},$$(1))
+
+endef
+
+$$(call gb_LinkTarget_get_dep_$(1)_target,%) : ;
+ $$(call gb_LinkTarget__command_dep_$(1),$$@,$$*)
+
+endef # gb_LinkTarget__static_dep_x_template
+
+$(eval $(call gb_LinkTarget__static_dep_x_template,libraries))
+$(eval $(call gb_LinkTarget__static_dep_x_template,externals))
+$(eval $(call gb_LinkTarget__static_dep_x_template,statics))
+
+endif # !gb_PARTIAL_BUILD
+endif # ENABLE_CUSTOMTARGET_COMPONENTS
+endif # gb_FULLDEPS
+
+# Ok, this is some dark voodoo: When declaring a linktarget with
+# gb_LinkTarget_LinkTarget we set SELF in the headertarget to name of the
+# target. When the rule for the headertarget is executed and SELF does not
+# match the target name, we are depending on a linktarget that was never
+# declared. In a full build exclusively in gbuild that should never happen.
+define gb_LinkTarget__get_headers_check
+ifneq ($$(SELF),$$*)
+$$(eval $$(call gb_Output_error,used LinkTarget $$* not defined))
+endif
+$$@ : COMMAND := $$(call gb_Helper_abbreviate_dirs, touch $$@)
+
+endef
+
+$(WORKDIR)/Headers/%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+# sadly because of the subdirectories can't have pattern deps on .dir here
+$(WORKDIR)/Headers/% :
+ $(eval $(gb_LinkTarget__get_headers_check))
+ $(COMMAND)
+
+# Explanation of some of the targets:
+# - gb_LinkTarget_get_headers_target is the target that guarantees all headers
+# from the linked against libraries and the linktargets own generated headers
+# are generated.
+# - gb_LinkTarget_get_target links the objects into a file in WORKDIR.
+# gb_LinkTarget_get_target depends on gb_LinkTarget_get_headers_target.
+# gb_LinkTarget_get_target depends additionally on the objects, which in turn
+# depend build-order only on the gb_LinkTarget_get_headers_target. The build
+# order-only dependency ensures all headers to be there for compiling and
+# dependency generation without causing all objects to be rebuild when one
+# header changes. Only the ones with an explicit dependency in their generated
+# dependency file will be rebuild.
+#
+# gb_LinkTarget_get_target is the target that links the objects into a file in
+# WORKDIR
+# Explanation of some of the variables:
+# - AUXTARGETS are the additionally generated files that need to be cleaned out
+# on clean.
+# - PCH_CXXFLAGS and PCH_DEFS are the flags that the precompiled headers will
+# be compiled with. They should never be overridden in a single object
+# files.
+# - TARGETTYPE is the type of linktarget as some platforms need very different
+# command to link different targettypes.
+# - LIBRARY_X64 is only relevant for building a x64 library on windows.
+# - PE_X86 is only relevant for building a x86 binaries on Windows.
+#
+# Since most variables are set on the linktarget and not on the object, the
+# object learns about these setting via GNU makes scoping of target variables.
+# Therefore it is important that objects are only directly depended on by the
+# linktarget. This for example means that you cannot build a single object
+# alone, because then you would directly depend on the object.
+#
+# A note about flags: because the overriding the global variables with a target
+# local variable of the same name is considered obscure, the target local
+# variables have a T_ prefix.
+#
+# call gb_LinkTarget_LinkTarget,linktarget,linktargetmakefilename,layer
+define gb_LinkTarget_LinkTarget
+$(call gb_LinkTarget_get_clean_target,$(1)) : LINKTARGET := $(1)
+$(call gb_LinkTarget_get_clean_target,$(1)) : LINKTARGETMAKEFILENAME := $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS :=
+$(call gb_LinkTarget_get_headers_target,$(1)) : SELF := $(call gb_LinkTarget__get_workdir_linktargetname,$(1))
+$(call gb_LinkTarget_get_headers_target,$(1)) : \
+ | $(dir $(call gb_LinkTarget_get_headers_target,$(1))).dir \
+ $(dir $(call gb_LinkTarget_get_target,$(1))).dir \
+ $(dir $(WORKDIR)/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1))).dir
+$(call gb_LinkTarget_get_target,$(1)) : ILIBTARGET :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : COBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : YACCOBJECT :=
+$(call gb_LinkTarget_get_target,$(1)) : T_YACCFLAGS := $$(gb_LinkTarget_YYACFLAGS) $(YACCFLAGS)
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : LEXOBJECT :=
+$(call gb_LinkTarget_get_target,$(1)) : T_LEXFLAGS := $$(gb_LinkTarget_LEXFLAGS) $(LEXFLAGS)
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : OBJCOBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : CXXCLROBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : ASMOBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : GENCOBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : GENOBJCOBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : GENNASMOBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : GENOBJCXXOBJECTS :=
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : GENCXXCLROBJECTS :=
+$(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS := $$(gb_LinkTarget_CFLAGS)
+$(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS_APPEND :=
+$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS)
+$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS_APPEND :=
+$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $$(gb_LinkTarget_CXXFLAGS)
+$(call gb_LinkTarget_get_target,$(1)) : OBJECT_HAS_EXTRA_CXXFLAGS :=
+$(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS := $$(gb_LinkTarget_OBJCXXFLAGS)
+$(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS_APPEND :=
+$(call gb_LinkTarget_get_target,$(1)) : T_OBJCFLAGS := $$(gb_LinkTarget_OBJCFLAGS)
+$(call gb_LinkTarget_get_target,$(1)) : T_OBJCFLAGS_APPEND :=
+$(call gb_LinkTarget_get_target,$(1)) : T_NASMFLAGS := $$(NAFLAGS)
+$(call gb_LinkTarget_get_target,$(1)) : T_NASMFLAGS_APPEND :=
+$(call gb_LinkTarget_get_target,$(1)) : T_CXXCLRFLAGS := $$(gb_LinkTarget_CXXCLRFLAGS)
+$(call gb_LinkTarget_get_target,$(1)) : T_CXXCLRFLAGS_APPEND :=
+$(call gb_LinkTarget_get_target,$(1)) : DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
+$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $$(gb_LinkTarget_DEFAULTDEFS) $(CPPFLAGS)
+$(call gb_LinkTarget_get_target,$(1)) : INCLUDE := -I$$(SRCDIR)/include $$(gb_LinkTarget_INCLUDE)
+$(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $$(gb_LinkTarget_LDFLAGS) $(call gb_LinkTarget_get_linksearchpath_for_layer,$(3)) $(call gb_LinkTarget__get_ldflags,$(2))
+$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS :=
+$(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS :=
+$(call gb_LinkTarget_get_target,$(1)) : T_LIBS :=
+$(call gb_LinkTarget_get_target,$(1)) : T_STDLIBS_CXX := $(gb_STDLIBS_CXX)
+$(call gb_LinkTarget_get_target,$(1)) : TARGETTYPE :=
+$(call gb_LinkTarget_get_target,$(1)) : LIBRARY_X64 :=
+$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME :=
+$(call gb_LinkTarget_get_target,$(1)) : PCH_HEADER :=
+$(call gb_LinkTarget_get_target,$(1)) : PCH_LINKTARGETMAKEFILENAME :=
+$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS :=
+$(call gb_LinkTarget_get_target,$(1)) : PCHOBJEX :=
+$(call gb_LinkTarget_get_target,$(1)) : PCHOBJNOEX :=
+$(call gb_LinkTarget_get_target,$(1)) : T_PCH_EXTRA_CXXFLAGS :=
+$(call gb_LinkTarget_get_target,$(1)) : PE_X86 :=
+$(call gb_LinkTarget_get_target,$(1)) : PDBFILE :=
+$(call gb_LinkTarget_get_target,$(1)) : TARGETGUI :=
+$(call gb_LinkTarget_get_target,$(1)) : EXTRAOBJECTLISTS :=
+$(call gb_LinkTarget_get_target,$(1)) : NATIVERES :=
+$(call gb_LinkTarget_get_target,$(1)) : VISIBILITY :=
+$(call gb_LinkTarget_get_target,$(1)) : WARNINGS_NOT_ERRORS :=
+$(call gb_LinkTarget_get_target,$(1)) : WARNINGS_DISABLED :=
+$(call gb_LinkTarget_get_target,$(1)) : PLUGIN_WARNINGS_AS_ERRORS :=
+$(call gb_LinkTarget_get_target,$(1)) : EXTERNAL_CODE :=
+$(call gb_LinkTarget_get_target,$(1)) : SOVERSIONSCRIPT :=
+$(call gb_LinkTarget_get_target,$(1)) : COMPILER_TEST :=
+$(call gb_LinkTarget_get_target,$(1)) : T_SYMBOLS := $(if $(call gb_target_symbols_enabled,$(2)),$(true),$(false))
+$(call gb_LinkTarget_get_target,$(1)) : T_FORCE_COMPILE := $(if $(call gb_LinkTarget__force_compile,$(2)),$(true),$(false))
+$(call gb_LinkTarget_get_target,$(1)) : T_CC :=
+$(call gb_LinkTarget_get_target,$(1)) : T_CXX :=
+$(call gb_LinkTarget_get_target,$(1)) : T_USE_LD := $(USE_LD)
+$(call gb_LinkTarget_get_target,$(1)) : T_LTOFLAGS := $(gb_LTOFLAGS)
+$(call gb_LinkTarget_get_target,$(1)) : T_PREJS :=
+
+ifeq ($(gb_FULLDEPS),$(true))
+ifeq (depcache:,$(filter depcache,$(.FEATURES)):$(gb_PARTIAL_BUILD))
+-includedepcache $(call gb_LinkTarget_get_dep_target,$(1))
+else
+-include $(call gb_LinkTarget_get_dep_target,$(1))
+endif
+$(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCOBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : CXXCLROBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : ASMOBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENCOBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENOBJCOBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENOBJCXXOBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENNASMOBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXCLROBJECTS :=
+$(call gb_LinkTarget_get_dep_target,$(1)) : YACCOBJECTS :=
+endif # gb_FULLDEPS
+
+gb_LinkTarget_CXX_SUFFIX_$(call gb_LinkTarget__get_workdir_linktargetname,$(1)) := cxx
+
+# installed linktargets need a rule to build!
+$(if $(findstring $(INSTDIR),$(1)),$(call gb_LinkTarget__make_installed_rule,$(1)))
+
+$(call gb_PrecompiledHeader_generate_timestamp_rule,$(2))
+
+endef # gb_LinkTarget_LinkTarget
+
+# call gb_LinkTarget_set_soversion_script,linktarget,soversionscript
+define gb_LinkTarget_set_soversion_script
+$(call gb_LinkTarget_get_target,$(1)) : $(2)
+$(call gb_LinkTarget_get_target,$(1)) : SOVERSIONSCRIPT := $(2)
+
+endef
+
+# call gb_LinkTarget_add_defs,linktarget,defines
+define gb_LinkTarget_add_defs
+$(call gb_LinkTarget_get_target,$(1)) : DEFS += $(2)
+$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS += $(2)
+endef
+
+# call gb_LinkTarget_add_cflags,linktarget,cflags
+define gb_LinkTarget_add_cflags
+$(call gb_LinkTarget_get_target,$(1)) : T_CFLAGS_APPEND += $(2)
+endef
+
+# call gb_LinkTarget_add_cxxflags,linktarget,cxxflags
+define gb_LinkTarget_add_cxxflags
+$(call gb_LinkTarget_get_target,$(1)) : T_CXXFLAGS_APPEND += $(2)
+$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS += $(2)
+endef
+
+# call gb_LinkTarget_add_objcxxflags,linktarget,objcxxflags
+define gb_LinkTarget_add_objcxxflags
+$(call gb_LinkTarget_get_target,$(1)) : T_OBJCXXFLAGS_APPEND += $(2)
+endef
+
+# call gb_LinkTarget_add_objcflags,linktarget,objcflags
+define gb_LinkTarget_add_objcflags
+$(call gb_LinkTarget_get_target,$(1)) : T_OBJCFLAGS_APPEND += $(2)
+
+endef
+
+# call gb_LinkTarget_add_nasmflags,linktarget,nasmflags
+define gb_LinkTarget_add_nasmflags
+$(call gb_LinkTarget_get_target,$(1)) : T_NASMFLAGS_APPEND += $(2)
+endef
+
+# call gb_LinkTarget_add_cxxclrflags,linktarget,cxxclrflags
+define gb_LinkTarget_add_cxxclrflags
+$(call gb_LinkTarget_get_target,$(1)) : T_CXXCLRFLAGS_APPEND += $(2)
+endef
+
+# call gb_LinkTarget__add_include,linktarget,includes
+define gb_LinkTarget__add_include
+$(call gb_LinkTarget_get_target,$(1)) : INCLUDE += -I$(2)
+
+endef
+
+# call gb_LinkTarget__check_srcdir_paths,linktarget,includepaths
+define gb_LinkTarget__check_srcdir_paths
+$(if $(filter-out $(wildcard $(2)),$(2)),\
+ $(call gb_Output_error,gb_LinkTarget_set_include: include paths $(filter-out $(wildcard $(2)),$(2)) do not exist) \
+)
+endef
+
+# call gb_LinkTarget_set_include,linktarget,includes
+define gb_LinkTarget_set_include
+$(call gb_LinkTarget__check_srcdir_paths,$(1),\
+ $(patsubst -I%,%,$(filter -I$(SRCDIR)/%,$(filter-out -I$(INSTDIR)/% -I$(WORKDIR)/%,$(2)))))
+$(call gb_LinkTarget_get_target,$(1)) : INCLUDE := $(2)
+
+endef
+
+# call gb_LinkTarget_add_ldflags,linktarget,ldflags
+define gb_LinkTarget_add_ldflags
+$(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS += $(2)
+
+endef
+
+# real use in RepositoryExternal.mk
+# call gb_LinkTarget_set_ldflags,linktarget,ldflags
+define gb_LinkTarget_set_ldflags
+$(call gb_LinkTarget_get_target,$(1)) : T_LDFLAGS := $(2)
+
+endef
+
+# call gb_LinkTarget_add_libs,linktarget,libs
+define gb_LinkTarget_add_libs
+$(call gb_LinkTarget_get_target,$(1)) : T_LIBS += $(2)
+$(if $(call gb_LinkTarget__is_merged,$(1)),\
+ $(call gb_Library_get_linktarget_target,merged) : T_LIBS += $(2))
+ifeq ($(ENABLE_CUSTOMTARGET_COMPONENTS),TRUE)
+$(if $(gb_DEBUG_STATIC),$$(info $$(call gb_LinkTarget__get_all_libraries_var,$(1)) += $(filter-out $(call gb_LinkTarget__get_all_libraries,$(1)),$(patsubst %,$(gb_LinkTarget__syslib),$(2)))))
+$$(eval $$(call gb_LinkTarget__get_all_libraries_var,$(1)) += $(filter-out $(call gb_LinkTarget__get_all_libraries,$(1)),$(patsubst %,$(gb_LinkTarget__syslib),$(2))))
+ifeq (,$(gb_PARTIAL_BUILD))
+$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS += $(filter-out $(call gb_LinkTarget__get_all_libraries,$(1)),$(patsubst %,$(gb_LinkTarget__syslib),$(2)))
+endif
+endif
+
+endef
+
+# remove platform specific standard libraries for linktarget $(1)
+# assumption is that adding these standard libs is always useful, but in very
+# exceptional cases this disable method may be used
+# call gb_LinkTarget_disable_standard_system_libs,linktarget
+define gb_LinkTarget_disable_standard_system_libs
+$(call gb_LinkTarget_get_target,$(1)) : T_LIBS := $$(filter-out $$(gb_STDLIBS),$$(T_LIBS))
+$(call gb_LinkTarget_get_target,$(1)) : T_STDLIBS_CXX :=
+
+endef
+
+# call gb_LinkTarget__use_api,linktarget,api
+define gb_LinkTarget__use_api
+$(call gb_LinkTarget_get_headers_target,$(1)) : $(call gb_UnoApiHeadersTarget_get_target,$(2))
+$(call gb_LinkTarget__add_include,$(1),$(call gb_UnoApiHeadersTarget_get_dir,$(2)))
+
+endef
+
+# call gb_LinkTarget_use_api,linktarget,apis
+define gb_LinkTarget_use_api
+$(foreach api,$(2),$(call gb_LinkTarget__use_api,$(1),$(api)))
+
+endef
+
+# call gb_LinkTarget_use_udk_api,linktarget
+define gb_LinkTarget_use_udk_api
+$(call gb_LinkTarget__use_api,$(1),udkapi)
+endef
+
+# call gb_LinkTarget_use_sdk_api,linktarget
+define gb_LinkTarget_use_sdk_api
+$(call gb_LinkTarget__use_api,$(1),udkapi)
+$(call gb_LinkTarget__use_api,$(1),offapi)
+endef
+
+# call gb_LinkTarget__use_internal_api_one,linktarget,api,apiprefix
+define gb_LinkTarget__use_internal_api_one
+$(call gb_LinkTarget_get_headers_target,$(1)) :| \
+ $(call gb_UnoApiHeadersTarget_get_$(3)target,$(2))
+$(call gb_LinkTarget__add_include,$(1),$(call gb_UnoApiHeadersTarget_get_$(3)dir,$(2)))
+
+endef
+
+# call gb_LinkTarget__use_internal_api,linktarget,apis,apiprefix
+define gb_LinkTarget__use_internal_api
+$(foreach api,$(2),$(call gb_LinkTarget__use_internal_api_one,$(1),$(api),$(3)))
+
+endef
+
+# call gb_LinkTarget_use_internal_api,linktarget,api
+define gb_LinkTarget_use_internal_api
+$(call gb_LinkTarget__use_internal_api,$(1),$(2))
+
+endef
+
+# call gb_LinkTarget_use_internal_bootstrap_api,linktarget,api
+define gb_LinkTarget_use_internal_bootstrap_api
+$(call gb_LinkTarget__use_internal_api,$(1),$(2),bootstrap_)
+
+endef
+
+# call gb_LinkTarget_use_internal_comprehensive_api,linktarget,api
+define gb_LinkTarget_use_internal_comprehensive_api
+$(call gb_LinkTarget__use_internal_api,$(1),$(2),comprehensive_)
+
+endef
+
+define gb_PrintDeps_info
+$(info LibraryDep: $(1) links against $(2))
+endef
+
+# returns $(true), if the target class really calls a linker.
+# call gb_LinkTarget_does_real_link,linktarget
+gb_LinkTarget_does_real_link = $(if $(filter Executable CppunitTest $(if $(DISABLE_DYNLOADING),,Library), \
+ $(call gb_LinkTarget__get_workdir_linktargetclass,$(1))),$(true))
+
+# avoid problem when a module is built partially but other modules that define
+# needed libraries is not yet built: prevent invocation of pattern rule
+# for library with invalid parameters by depending on the header target
+define gb_LinkTarget__lib_dummy_depend
+$(call gb_Library_get_target,$(1)) :| $(call gb_Library_get_headers_target,$(1))
+
+endef
+
+define gb_LinkTarget__generate_all_x_accessors
+gb_LinkTarget__get_all_$(1)_var = $$(call gb_LinkTarget__get_workdir_linktargetname,$$(1))<>ALL_$(2)
+gb_LinkTarget__get_all_$(1) = $$($$(call gb_LinkTarget__get_all_$(1)_var,$$(1)))
+gb_Library__get_all_$(1) = $$($$(call gb_LinkTarget__get_all_$(1)_var,$$(call gb_Library_get_linktarget,$$(1))))
+gb_Executable__get_all_$(1) = $$($$(call gb_LinkTarget__get_all_$(1)_var,$$(call gb_Executable_get_linktarget,$$(1))))
+gb_ExternalProject__get_all_$(1) = $$($$(call gb_LinkTarget__get_all_$(1)_var,$$(call gb_ExternalProject__get_workdir_linktargetname,$$(1))))
+gb_CppunitTest__get_all_$(1) = $$($$(call gb_LinkTarget__get_all_$(1)_var,$$(call gb_CppunitTest__get_workdir_linktargetname,$$(1))))
+
+endef
+
+$(eval $(call gb_LinkTarget__generate_all_x_accessors,libraries,LIBRARIES))
+gb_LinkTarget__filter_lo_libraries = $(filter-out $(gb_LinkTarget__syslib),$(1))
+gb_LinkTarget__get_all_lo_libraries = $(call gb_LinkTarget__filter_lo_libraries,$(call gb_LinkTarget__get_all_libraries,$(1)))
+gb_LinkTarget__filter_sys_libraries = $(filter $(gb_LinkTarget__syslib),$(1))
+gb_LinkTarget__get_all_sys_libraries = $(call gb_LinkTarget__filter_sys_libraries,$(call gb_LinkTarget__get_all_libraries,$(1)))
+$(eval $(call gb_LinkTarget__generate_all_x_accessors,externals,EXTERNALS))
+$(eval $(call gb_LinkTarget__generate_all_x_accessors,statics,STATICS))
+
+# call gb_LinkTarget__register_type,type,linktarget,type list
+define gb_LinkTarget__register_type
+ifeq ($(ENABLE_CUSTOMTARGET_COMPONENTS),TRUE)
+ifeq (,$(DISABLE_DYNLOADING))
+$$(error ENABLE_CUSTOMTARGET_COMPONENTS just works with DISABLE_DYNLOADING)
+endif
+$(foreach type,$(3),$(if $(filter $(type),$(call gb_LinkTarget__get_all_$(1),$(2))),, \
+ $(if $(gb_DEBUG_STATIC),$$(info $(call gb_LinkTarget__get_all_$(1)_var,$(2)) += $(type))) \
+ $$(eval $(call gb_LinkTarget__get_all_$(1)_var,$(2)) += $(type)) \
+))
+endif
+
+endef
+
+# call gb_LinkTarget__use_libraries,linktarget,requestedlibs,actuallibs,linktargetmakefilename
+define gb_LinkTarget__use_libraries
+
+# used by bin/module-deps.pl
+ifneq ($(ENABLE_PRINT_DEPS),)
+# exclude libraries in Library_merged
+ifeq ($(filter $(1),$(foreach lib,$(gb_MERGEDLIBS),$(call gb_Library_get_linktarget,$(lib)))),)
+$$(eval $$(call gb_PrintDeps_info,$(4),$(3)))
+endif
+endif
+
+$(call gb_LinkTarget_get_target,$(1)) : LINKED_LIBS += $(3)
+
+ifeq (,$(DISABLE_DYNLOADING))
+# depend on the exports of the library, not on the library itself
+# for faster incremental builds when the ABI is unchanged.
+# export files are created from the library, so this also ensures the library exists.
+$(foreach lib,$(call gb_LinkTarget__filter_lo_libraries,$(3)),$(if $(filter $(lib),$(gb_Library_KNOWNLIBS)), \
+ $$(eval $(call gb_LinkTarget_get_target,$(1)) : $(call gb_Library_get_exports_target,$(lib))) \
+))
+
+else # DISABLE_DYNLOADING
+# depend on the now-static libraries themself, but only if the target actually links to it
+ifneq (,$(call gb_LinkTarget_does_real_link,$(1)))
+$(call gb_LinkTarget_get_target,$(1)) : T_LIBS += $(call gb_LinkTarget__filter_sys_libraries,$(3))
+$(if $(filter-out Library,gb_LinkTarget__get_workdir_linktargetclass,$(1)), \
+ $(foreach lib,$(call gb_LinkTarget__filter_lo_libraries,$(3)),$(if $(filter $(lib),$(gb_Library_KNOWNLIBS)), \
+ $$(eval $(call gb_LinkTarget_get_target,$(1)) : $(call gb_Library_get_linktarget_target,$(lib))) \
+ )))
+endif
+endif # DISABLE_DYNLOADING
+
+$(call gb_LinkTarget__register_type,libraries,$(1),$(3))
+
+$(foreach lib,$(call gb_LinkTarget__filter_lo_libraries,$(2)),$(if $(filter $(lib),$(gb_Library_KNOWNLIBS)), \
+ $(eval $(call gb_LinkTarget_get_headers_target,$(1)) : $(call gb_Library_get_headers_target,$(lib))) \
+ $(call gb_LinkTarget__lib_dummy_depend,$(lib)) \
+))
+
+endef # gb_LinkTarget__use_libraries
+
+# libraries which are merged but need to be built for gb_BUILD_HELPER_TOOLS
+gb_BUILD_HELPER_LIBS := $(foreach lib, \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ i18nlangtag \
+ reg \
+ sal \
+ salhelper \
+ sax \
+ store \
+ tl \
+ ucbhelper \
+ unoidl \
+ xmlreader \
+ , $(call gb_Library__get_workdir_linktargetname,$(lib)))
+
+# tools libmerged depends on, so they link against gb_BUILD_HELPER_LIBS
+gb_BUILD_HELPER_TOOLS := $(foreach exe,\
+ cppumaker \
+ svidl \
+ unoidl-check \
+ unoidl-write \
+ , $(call gb_Executable__get_workdir_linktargetname,$(exe)))
+
+# call gb_LinkTarget__is_build_lib,linktargetname
+define gb_LinkTarget__is_build_lib
+$(if $(filter $(call gb_LinkTarget__get_workdir_linktargetname,$(1)),$(call gb_BUILD_HELPER_LIBS)),$(true))
+endef
+
+# call gb_LinkTarget__is_build_tool,linktargetname
+define gb_LinkTarget__is_build_tool
+$(if $(filter $(call gb_LinkTarget__get_workdir_linktargetname,$(1)),$(call gb_BUILD_HELPER_TOOLS)),$(true))
+endef
+
+define gb_LinkTarget__is_merged
+$(filter $(1),$(foreach lib,$(gb_MERGEDLIBS),$(call gb_Library_get_linktarget,$(lib))))
+endef
+
+# call gb_LinkTarget_use_libraries,linktarget,libs
+define gb_LinkTarget_use_libraries
+ifneq (,$$(filter-out $(gb_Library_KNOWNLIBS) $(gb_LinkTarget__syslib),$(2)))
+$$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL))
+$$(eval $$(call gb_Output_error,Cannot link against library/libraries '$$(filter-out $(gb_Library_KNOWNLIBS) $(gb_LinkTarget__syslib),$(2))'. Libraries must be registered in Repository.mk or RepositoryExternal.mk))
+endif
+ifneq (,$$(filter $(2),$(gb_Library_KNOWNPLUGINS)))
+ifneq (,$$(filter $(1),$$(foreach plugin,$(gb_Library_KNOWNPLUGINS),$(call gb_Library__get_workdir_linktargetname,$(plugin)))))
+$$(eval $$(call gb_Output_error,Cannot link against plugin library/libraries '$$(filter $(2),$(gb_Library_KNOWNPLUGINS))'. Only plugins are allowed to do that.))
+endif
+endif
+
+ifeq ($(call gb_LinkTarget__is_build_tool,$(1))$(call gb_LinkTarget__is_build_lib,$(1)),$(true))
+$(call gb_LinkTarget__use_libraries,$(1),$(2),$(2),$(4))
+else
+# $$(3) = Always just depend on non-merged libs. If any dependency is merged, but you aren't, also depend on "merged".
+$(call gb_LinkTarget__use_libraries,$(1),$(2),$(strip \
+ $(filter-out $(gb_MERGEDLIBS),$(2)) \
+ $(if $(filter $(gb_MERGEDLIBS),$(2)),$(if $(call gb_LinkTarget__is_merged,$(1)),,merged)) \
+ ),$(4))
+endif
+
+endef
+
+# avoid problem when a module is built partially but other modules that define
+# needed static libraries is not yet built: prevent invocation of pattern rule
+# for static library with invalid parameters by depending on the header target
+define gb_LinkTarget__static_lib_dummy_depend
+$(call gb_StaticLibrary_get_target,$(1)) :| \
+ $(call gb_StaticLibrary_get_headers_target,$(1))
+
+endef
+
+# for a StaticLibrary, dependent libraries are not actually linked in
+# call gb_LinkTarget_use_static_libraries,linktarget,staticlibs
+define gb_LinkTarget_use_static_libraries
+$(call gb_LinkTarget_get_target,$(1)) : LINKED_STATIC_LIBS += $$(if $$(filter-out StaticLibrary,$$(TARGETTYPE)),$(2))
+$(if $(call gb_LinkTarget__is_merged,$(1)),\
+ $(call gb_Library_get_linktarget_target,merged) : \
+ LINKED_STATIC_LIBS += $$(if $$(filter-out StaticLibrary,$$(TARGETTYPE)),$(2)))
+
+# depend on the static libraries, but only if the target actually links to it
+ifneq (,$(call gb_LinkTarget_does_real_link,$(1)))
+# make has a size limit for the prerequisites string, which will be exceeded for some larger static links,
+# like soffice.bin, but there seems to be no limit for makefile lines...
+$(foreach lib,$(2), \
+ $$(eval $(call gb_LinkTarget_get_target,$(1)): $(call gb_StaticLibrary_get_linktarget_target,$(lib))))
+endif
+
+$(call gb_LinkTarget__register_type,statics,$(1),$(2))
+
+$(call gb_LinkTarget_get_headers_target,$(1)) : \
+ $(foreach lib,$(2),$(call gb_StaticLibrary_get_headers_target,$(lib)))
+$(foreach lib,$(2),$(call gb_LinkTarget__static_lib_dummy_depend,$(lib)))
+
+endef # gb_LinkTarget_use_static_libraries
+
+# call gb_LinkTarget_add_cobject,linktarget,sourcefile,cflags,linktargetmakefilename
+define gb_LinkTarget_add_cobject
+$(if $(wildcard $(call gb_CObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_CObject_get_source,$(SRCDIR),$(2)))))
+$(call gb_LinkTarget_get_target,$(1)) : COBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : COBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CObject_get_target,$(2))
+$(call gb_CObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_CObject_get_target,$(2)) : T_CFLAGS += $(call gb_LinkTarget__get_cflags,$(4)) $(3)
+$(call gb_CObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : COBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CObject_get_dep_target,$(2))
+$(call gb_CObject_get_dep_target,$(2)) :| $(dir $(call gb_CObject_get_dep_target,$(2))).dir
+$(call gb_CObject_get_target,$(2)) :| $(dir $(call gb_CObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_cxxobject_internal,linktarget,sourcefile,cxxflags,linktargetmakefilename,exceptionflags
+# The purpose of the exceptionflags extra argument is to differentiate between usage that just needs
+# exception flags and usage that adds other flags. Using a PCH requires the same cxxflags as the ones used
+# to create the PCH, so non-empty cxxflags here mean the object cannot use the PCH, and the add_exception_cxxobject
+# variant passes the necessary flags by setting the extra argument.
+define gb_LinkTarget_add_cxxobject_internal
+$(if $(wildcard $(call gb_CxxObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_CxxObject_get_source,$(SRCDIR),$(2)))))
+$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : CXXOBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CxxObject_get_target,$(2))
+$(call gb_CxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_CxxObject_get_target,$(2)) : T_CXXFLAGS += $(call gb_LinkTarget__get_cxxflags,$(4)) $(3) $(5)
+$(call gb_CxxObject_get_target,$(2)) : OBJECT_HAS_EXTRA_CXXFLAGS := $(if $(strip $(3)),1)
+$(call gb_CxxObject_get_target,$(2)) : \
+ OBJECTOWNER := $(if $(6),,$(call gb_Object__owner,$(2),$(1)))
+ifneq ($(gb_ENABLE_PCH),)
+ifeq ($(6),)
+$(call gb_CxxObject_get_target,$(2)) : $(call gb_LinkTarget_get_pch_timestamp,$(4))
+endif
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : CXXOBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CxxObject_get_dep_target,$(2))
+$(call gb_CxxObject_get_dep_target,$(2)) :| $(dir $(call gb_CxxObject_get_dep_target,$(2))).dir
+$(call gb_CxxObject_get_target,$(2)) :| $(dir $(call gb_CxxObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_cxxobject,linktarget,sourcefile,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_cxxobject
+$(call gb_LinkTarget_add_cxxobject_internal,$(1),$(2),$(3),$(4))
+endef
+
+# call gb_LinkTarget_add_objcobject,linktarget,sourcefile,objcflags,linktargetmakefilename
+define gb_LinkTarget_add_objcobject
+$(if $(wildcard $(call gb_ObjCObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_ObjCObject_get_source,$(SRCDIR),$(2)))))
+$(call gb_LinkTarget_get_target,$(1)) : OBJCOBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : OBJCOBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_ObjCObject_get_target,$(2))
+$(call gb_ObjCObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_ObjCObject_get_target,$(2)) : T_OBJCFLAGS += $(call gb_LinkTarget__get_objcflags,$(4)) $(3)
+$(call gb_ObjCObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCOBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCObject_get_dep_target,$(2))
+$(call gb_ObjCObject_get_dep_target,$(2)) :| $(dir $(call gb_ObjCObject_get_dep_target,$(2))).dir
+$(call gb_ObjCObject_get_target,$(2)) :| $(dir $(call gb_ObjCObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_objcxxobject,linktarget,sourcefile,objcxxflags,linktargetmakefilename
+define gb_LinkTarget_add_objcxxobject
+$(if $(wildcard $(call gb_ObjCxxObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_ObjCxxObject_get_source,$(SRCDIR),$(2)))))
+$(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : OBJCXXOBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_ObjCxxObject_get_target,$(2))
+$(call gb_ObjCxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_ObjCxxObject_get_target,$(2)) : T_OBJCXXFLAGS += $(call gb_LinkTarget__get_objcxxflags,$(4)) $(3)
+$(call gb_ObjCxxObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : OBJCXXOBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_ObjCxxObject_get_dep_target,$(2))
+$(call gb_ObjCxxObject_get_dep_target,$(2)) :| $(dir $(call gb_ObjCxxObject_get_dep_target,$(2))).dir
+$(call gb_ObjCxxObject_get_target,$(2)) :| $(dir $(call gb_ObjCxxObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_cxxclrobject,linktarget,sourcefile,cxxclrflags,linktargetmakefilename
+define gb_LinkTarget_add_cxxclrobject
+$(if $(wildcard $(call gb_CxxClrObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_CxxClrObject_get_source,$(SRCDIR),$(2)))))
+$(call gb_LinkTarget_get_target,$(1)) : CXXCLROBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : CXXCLROBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_CxxClrObject_get_target,$(2))
+$(call gb_CxxClrObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_CxxClrObject_get_target,$(2)) : T_CXXCLRFLAGS += $(call gb_LinkTarget__get_cxxclrflags,$(4)) $(3)
+$(call gb_CxxClrObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : CXXCLROBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_CxxClrObject_get_dep_target,$(2))
+$(call gb_CxxClrObject_get_dep_target,$(2)) :| $(dir $(call gb_CxxClrObject_get_dep_target,$(2))).dir
+$(call gb_CxxClrObject_get_target,$(2)) :| $(dir $(call gb_CxxClrObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_asmobject,linktarget,sourcefile
+define gb_LinkTarget_add_asmobject
+$(if $(wildcard $(call gb_AsmObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_AsmObject_get_source,$(SRCDIR),$(2)))))
+$(call gb_LinkTarget_get_target,$(1)) : ASMOBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : ASMOBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_AsmObject_get_target,$(2))
+$(call gb_AsmObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_AsmObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : ASMOBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_AsmObject_get_dep_target,$(2))
+$(call gb_AsmObject_get_dep_target,$(2)) :| $(dir $(call gb_AsmObject_get_dep_target,$(2))).dir
+$(call gb_AsmObject_get_target,$(2)) :| $(dir $(call gb_AsmObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_generated_c_object,linktarget,sourcefile,cflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_c_object
+$(call gb_LinkTarget_get_target,$(1)) : GENCOBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : GENCOBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCObject_get_target,$(2))
+$(call gb_GenCObject_get_target,$(2)) : $(call gb_GenCObject_get_source,$(2))
+# Often gb_GenCObject_get_source does not have its own rule and is only a byproduct.
+# That's why we need this order-only dependency on gb_Helper_MISCDUMMY
+$(call gb_GenCObject_get_source,$(2)) : | $(gb_Helper_MISCDUMMY)
+$(call gb_GenCObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_GenCObject_get_target,$(2)) : WARNINGS_NOT_ERRORS := $(true)
+$(call gb_GenCObject_get_target,$(2)) : T_CFLAGS += $(call gb_LinkTarget__get_cflags,$(4)) $(3)
+$(call gb_GenCObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENCOBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCObject_get_dep_target,$(2))
+$(call gb_GenCObject_get_dep_target,$(2)) :| $(dir $(call gb_GenCObject_get_dep_target,$(2))).dir
+$(call gb_GenCObject_get_target,$(2)) :| $(dir $(call gb_GenCObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_generated_cxx_object_internal,linktarget,sourcefile,cxxflags,linktargetmakefilename,exceptionflags
+define gb_LinkTarget_add_generated_cxx_object_internal
+$(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : GENCXXOBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCxxObject_get_target,$(2))
+$(call gb_GenCxxObject_get_target,$(2)) : $(call gb_GenCxxObject_get_source,$(2),$(1))
+# Often gb_GenCxxObject_get_source does not have its own rule and is only a byproduct.
+# That's why we need this order-only dependency on gb_Helper_MISCDUMMY
+$(call gb_GenCxxObject_get_source,$(2),$(1)) : | $(gb_Helper_MISCDUMMY)
+$(call gb_GenCxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_GenCxxObject_get_target,$(2)) : WARNINGS_NOT_ERRORS := $(true)
+$(call gb_GenCxxObject_get_target,$(2)) : T_CXXFLAGS += $(call gb_LinkTarget__get_cxxflags,$(4)) $(3) $(5)
+$(call gb_GenCxxObject_get_target,$(2)) : OBJECT_HAS_EXTRA_CXXFLAGS := $(if $(strip $(3)),1)
+$(call gb_GenCxxObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+$(call gb_GenCxxObject_get_target,$(2)) : GEN_CXX_SOURCE := $(call gb_GenCxxObject_get_source,$(2),$(1))
+ifneq ($(gb_ENABLE_PCH),)
+$(call gb_GenCxxObject_get_target,$(2)) : $(call gb_LinkTarget_get_pch_timestamp,$(4))
+endif
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXOBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCxxObject_get_dep_target,$(2))
+$(call gb_GenCxxObject_get_dep_target,$(2)) :| $(dir $(call gb_GenCxxObject_get_dep_target,$(2))).dir
+$(call gb_GenCxxObject_get_target,$(2)) :| $(dir $(call gb_GenCxxObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_generated_cxx_object,linktarget,sourcefile,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_cxx_object
+$(call gb_LinkTarget_add_generated_cxx_object_internal,$(1),$(2),$(3),$(4))
+endef
+
+# call gb_LinkTarget_add_generated_objc_object,linktarget,sourcefile,cflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_objc_object
+$(call gb_LinkTarget_get_target,$(1)) : GENOBJCOBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : GENOBJCOBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenObjCObject_get_target,$(2))
+$(call gb_GenObjCObject_get_target,$(2)) : $(call gb_GenObjCObject_get_source,$(2))
+# Often gb_GenObjCObject_get_source does not have its own rule and is only a byproduct.
+# That's why we need this order-only dependency on gb_Helper_MISCDUMMY
+$(call gb_GenObjCObject_get_source,$(2)) : | $(gb_Helper_MISCDUMMY)
+$(call gb_GenObjCObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_GenObjCObject_get_target,$(2)) : WARNINGS_NOT_ERRORS := $(true)
+$(call gb_GenObjCObject_get_target,$(2)) : T_OBJCFLAGS += $(call gb_LinkTarget__get_objcflags,$(4)) $(3)
+$(call gb_GenObjCObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENOBJCOBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenObjCObject_get_dep_target,$(2))
+$(call gb_GenObjCObject_get_dep_target,$(2)) :| $(dir $(call gb_GenObjCObject_get_dep_target,$(2))).dir
+$(call gb_GenObjCObject_get_target,$(2)) :| $(dir $(call gb_GenObjCObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_generated_nasm_object,linktarget,sourcefile,nasmflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_nasm_object
+$(call gb_LinkTarget_get_target,$(1)) : GENNASMOBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : GENNASMOBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenNasmObject_get_target,$(2))
+$(call gb_GenNasmObject_get_target,$(2)) : $(call gb_GenNasmObject_get_source,$(2))
+# Often gb_GenNasmObject_get_source does not have its own rule and is only a byproduct.
+# That's why we need this order-only dependency on gb_Helper_MISCDUMMY
+$(call gb_GenNasmObject_get_source,$(2)) : | $(gb_Helper_MISCDUMMY)
+$(call gb_GenNasmObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_GenNasmObject_get_target,$(2)) : T_NASMFLAGS += $(call gb_LinkTarget__get_nasmflags,$(4)) $(3)
+$(call gb_GenNasmObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENNASMOBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenNasmObject_get_dep_target,$(2))
+$(call gb_GenNasmObject_get_dep_target,$(2)) :| $(dir $(call gb_GenNasmObject_get_dep_target,$(2))).dir
+$(call gb_GenNasmObject_get_target,$(2)) :| $(dir $(call gb_GenNasmObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_generated_objcxx_object,linktarget,sourcefile,cflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_objcxx_object
+$(call gb_LinkTarget_get_target,$(1)) : GENOBJCXXOBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : GENOBJCXXOBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenObjCxxObject_get_target,$(2))
+$(call gb_GenObjCxxObject_get_target,$(2)) : $(call gb_GenObjCxxObject_get_source,$(2))
+# Often gb_GenObjCxxObject_get_source does not have its own rule and is only a byproduct.
+# That's why we need this order-only dependency on gb_Helper_MISCDUMMY
+$(call gb_GenObjCxxObject_get_source,$(2)) : | $(gb_Helper_MISCDUMMY)
+$(call gb_GenObjCxxObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_GenObjCxxObject_get_target,$(2)) : WARNINGS_NOT_ERRORS := $(true)
+$(call gb_GenObjCxxObject_get_target,$(2)) : T_OBJCXXFLAGS += $(call gb_LinkTarget__get_objcxxflags,$(4)) $(3)
+$(call gb_GenObjCxxObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENOBJCXXOBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenObjCxxObject_get_dep_target,$(2))
+$(call gb_GenObjCxxObject_get_dep_target,$(2)) :| $(dir $(call gb_GenObjCxxObject_get_dep_target,$(2))).dir
+$(call gb_GenObjCxxObject_get_target,$(2)) :| $(dir $(call gb_GenObjCxxObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# call gb_LinkTarget_add_generated_cxxclrobject,linktarget,sourcefile,cxxclrflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_cxxclrobject
+$(call gb_LinkTarget_get_target,$(1)) : GENCXXCLROBJECTS += $(2)
+$(call gb_LinkTarget_get_clean_target,$(1)) : GENCXXCLROBJECTS += $(2)
+
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_GenCxxClrObject_get_target,$(2))
+$(call gb_GenCxxClrObject_get_target,$(2)) : $(call gb_GenCxxClrObject_get_source,$(2),$(1))
+$(call gb_GenCxxClrObject_get_target,$(2)) : | $(call gb_LinkTarget_get_headers_target,$(1))
+$(call gb_GenCxxClrObject_get_target,$(2)) : T_CXXCLRFLAGS += $(call gb_LinkTarget__get_cxxclrflags,$(4)) $(3)
+$(call gb_GenCxxClrObject_get_target,$(2)) : \
+ OBJECTOWNER := $(call gb_Object__owner,$(2),$(1))
+$(call gb_GenCxxClrObject_get_target,$(2)) : GEN_CXXCLR_SOURCE := $(call gb_GenCxxClrObject_get_source,$(2),$(1))
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_LinkTarget_get_dep_target,$(1)) : GENCXXCLROBJECTS += $(2)
+$(call gb_LinkTarget_get_dep_target,$(1)) : $(call gb_GenCxxClrObject_get_dep_target,$(2))
+$(call gb_GenCxxClrObject_get_dep_target,$(2)) :| $(dir $(call gb_GenCxxClrObject_get_dep_target,$(2))).dir
+$(call gb_GenCxxClrObject_get_target,$(2)) :| $(dir $(call gb_GenCxxClrObject_get_dep_target,$(2))).dir
+endif
+
+endef
+
+# Add a bison grammar to the build.
+# call gb_LinkTarget_add_grammar,linktarget,yaccfile,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_grammar
+$(call gb_YaccTarget_YaccTarget,$(2))
+$(call gb_LinkTarget_add_generated_exception_object,$(1),YaccTarget/$(2),$(3) $(if $(filter GCC,$(COM)),-Wno-unused-macros),$(4))
+$(call gb_GenCxxObject_get_target,YaccTarget/$(2)): PLUGIN_WARNINGS_AS_ERRORS := $(true)
+$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_YaccTarget_get_clean_target,$(2))
+$(call gb_LinkTarget_get_headers_target,$(1)) : $(call gb_YaccTarget_get_header_target,$(2))
+$(call gb_LinkTarget__add_include,$(1),$(dir $(call gb_YaccTarget_get_header_target,$(2))))
+
+endef
+
+# Add bison grammars to the build.
+# call gb_LinkTarget_add_grammars,linktarget,yaccfiles,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_grammars
+$(foreach grammar,$(2),$(call gb_LinkTarget_add_grammar,$(1),$(grammar),$(3),$(4)))
+endef
+
+# Add a flex scanner to the build.
+# call gb_LinkTarget_add_scanner,linktarget,lexfile,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_scanner
+$(call gb_LexTarget_LexTarget,$(2))
+$(call gb_LinkTarget_add_generated_exception_object,$(1),LexTarget/$(2),$(3) $(if $(filter GCC,$(COM)),-Wno-unused-macros),$(4))
+$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_LexTarget_get_clean_target,$(2))
+
+endef
+
+# Add flex scanners to the build.
+# call gb_LinkTarget_add_scanners,linktarget,lexfiles,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_scanners
+$(foreach scanner,$(2),$(call gb_LinkTarget_add_scanner,$(1),$(scanner),$(3),$(4)))
+
+endef
+
+# call gb_LinkTarget_add_exception_object,linktarget,sourcefile,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_exception_object
+$(call gb_LinkTarget_add_cxxobject_internal,$(1),$(2),$(3),$(4),$(gb_LinkTarget_EXCEPTIONFLAGS))
+endef
+
+# call gb_LinkTarget__use_linktarget_objects,linktarget,linktargets
+define gb_LinkTarget__use_linktarget_objects
+$(call gb_LinkTarget_get_target,$(1)) : $(foreach linktarget,$(2),$(call gb_LinkTarget_get_target,$(linktarget)))
+ifneq ($(OS),iOS)
+$(call gb_LinkTarget_get_target,$(1)) : EXTRAOBJECTLISTS += $(foreach linktarget,$(2),$(call gb_LinkTarget_get_objects_list,$(linktarget)))
+endif
+
+endef
+
+# call gb_LinkTarget_use_library_objects,linktarget,libs
+define gb_LinkTarget_use_library_objects
+ifneq (,$$(filter-out $(gb_Library_KNOWNLIBS),$(2)))
+$$(eval $$(call gb_Output_info,currently known libraries are: $(sort $(gb_Library_KNOWNLIBS)),ALL))
+$$(eval $$(call gb_Output_error,Cannot import objects library/libraries $$(filter-out $(gb_Library_KNOWNLIBS),$(2)). Libraries must be registered in Repository.mk or RepositoryExternal.mk))
+endif
+$(call gb_LinkTarget__use_linktarget_objects,$(1),$(foreach lib,$(2),$(call gb_Library_get_linktarget,$(lib))))
+$(call gb_LinkTarget_get_headers_target,$(1)) : \
+ $(foreach lib,$(2),$(call gb_Library_get_headers_target,$(lib)))
+
+endef
+
+# call gb_LinkTarget_use_executable_objects,linktarget,exes
+define gb_LinkTarget_use_executable_objects
+$(call gb_LinkTarget__use_linktarget_objects,$(1),$(foreach exe,$(2),$(call gb_Executable_get_linktarget,$(exe))))
+
+endef
+
+# call gb_LinkTarget_add_cobjects,linktarget,sourcefiles,cflags,linktargetmakefilename
+define gb_LinkTarget_add_cobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_cobject,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_cxxobjects,linktarget,sourcefiles,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_cxxobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_cxxobject,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_objcobjects,linktarget,sourcefiles,objcflags,linktargetmakefilename
+define gb_LinkTarget_add_objcobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_objcobject,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_objcxxobjects,linktarget,sourcefiles,objcxxflags,linktargetmakefilename
+define gb_LinkTarget_add_objcxxobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_objcxxobject,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_cxxclrobjects,linktarget,sourcefiles,cxxclrflags,linktargetmakefilename
+define gb_LinkTarget_add_cxxclrobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_cxxclrobject,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_asmobjects,linktarget,sourcefiles,asmflags,linktargetmakefilename
+define gb_LinkTarget_add_asmobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_asmobject,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_exception_objects,linktarget,sourcefiles,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_exception_objects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_exception_object,$(1),$(obj),$(3),$(4)))
+endef
+
+#only useful for building x64 libraries on windows
+# call gb_LinkTarget_add_x64_generated_exception_objects,linktarget,sourcefiles,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_x64_generated_exception_objects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_exception_object,$(1),$(obj),$(3),$(4)))
+$(foreach obj,$(2),$(eval $(call gb_GenCxxObject_get_target,$(obj)) : CXXOBJECT_X64 := YES))
+endef
+
+# call gb_LinkTarget_add_generated_cobjects,linktarget,sourcefiles,cflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_cobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_c_object,$(1),$(obj),$(3),$(4)))
+endef
+
+#only useful for building x64 libraries on windows
+# call gb_LinkTarget_add_x64_generated_cobjects,linktarget,sourcefiles,cflags,linktargetmakefilename
+define gb_LinkTarget_add_x64_generated_cobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_c_object,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_generated_exception_object,linktarget,sourcefile,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_exception_object
+$(call gb_LinkTarget_add_generated_cxx_object_internal,$(1),$(2),$(3),$(4),$(gb_LinkTarget_EXCEPTIONFLAGS))
+endef
+
+# call gb_LinkTarget_add_generated_exception_objects,linktarget,sourcefile,cxxflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_exception_objects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_exception_object,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_generated_objcobjects,linktarget,sourcefiles,cflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_objcobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_objc_object,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_generated_objcxxobjects,linktarget,sourcefiles,cflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_objcxxobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_objcxx_object,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_generated_nasmobjects,linktarget,sourcefiles,cflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_nasmobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_nasm_object,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_add_generated_cxxclrobjects,linktarget,sourcefiles,cxxclrflags,linktargetmakefilename
+define gb_LinkTarget_add_generated_cxxclrobjects
+$(foreach obj,$(2),$(call gb_LinkTarget_add_generated_cxxclrobject,$(1),$(obj),$(3),$(4)))
+endef
+
+# call gb_LinkTarget_set_targettype,linktarget,targettype
+define gb_LinkTarget_set_targettype
+$(call gb_LinkTarget_get_target,$(1)) : TARGETTYPE := $(2)
+
+endef
+
+# call gb_LinkTarget_set_x64,linktarget,boolean
+define gb_LinkTarget_set_x64
+$(call gb_LinkTarget_get_target,$(1)) : LIBRARY_X64 := $(2)
+
+endef
+
+# call gb_LinkTarget_set_x86,linktarget,boolean
+define gb_LinkTarget_set_x86
+$(call gb_LinkTarget_get_target,$(1)) : PE_X86 := $(2)
+
+endef
+
+# call gb_LinkTarget_set_ilibtarget,linktarget,ilibfilename
+define gb_LinkTarget_set_ilibtarget
+ifeq (,$(DISABLE_DYNLOADING))
+$(call gb_LinkTarget_get_clean_target,$(1)) \
+$(call gb_LinkTarget_get_target,$(1)) : ILIBTARGET := $(2)
+endif
+
+endef
+
+# Add a file that is built by the LinkTarget command and define
+# a dummy touch rule for it so it can be tracked via dependencies.
+# The assumption is that the file is created by linking; in case it does not
+# exist there is some problem. This can be caused on WNT by re-naming DLL
+# files (which are aux-targets) but not the import .lib files (which
+# are the LinkTargets) and doing an incremental build.
+# call gb_LinkTarget_add_auxtarget,linktarget,auxtarget
+define gb_LinkTarget_add_auxtarget
+$(2) : $(call gb_LinkTarget_get_target,$(1))
+ if test -e $$@; then \
+ touch -r $$< $$@; \
+ else \
+ rm -f $$<; \
+ echo "ERROR: aux-target $$@ missing, library deleted, please try running make again"; \
+ false; \
+ fi
+
+$(call gb_LinkTarget_get_clean_target,$(1)) : AUXTARGETS += $(2)
+
+endef
+
+# call gb_LinkTarget_add_auxtargets,linktarget,auxtargets
+define gb_LinkTarget_add_auxtargets
+$(foreach aux,$(2),$(call gb_LinkTarget_add_auxtarget,$(1),$(aux)))
+
+endef
+
+# call gb_LinkTarget__use_custom_headers,linktarget,customtarget
+define gb_LinkTarget__use_custom_headers
+$(call gb_LinkTarget_get_headers_target,$(1)) :| \
+ $(call gb_CustomTarget_get_target,$(2))
+$(call gb_LinkTarget__add_include,$(1),$(call gb_CustomTarget_get_workdir,$(2)))
+
+endef
+
+# call gb_LinkTarget_use_custom_headers,linktarget,customtargets
+define gb_LinkTarget_use_custom_headers
+$(foreach customtarget,$(2),$(call gb_LinkTarget__use_custom_headers,$(1),$(customtarget)))
+
+endef
+
+# add SDI (svidl) headers
+# call gb_LinkTarget_add_sdi_headers,linktarget,sditargets
+define gb_LinkTarget_add_sdi_headers
+$(call gb_LinkTarget_get_headers_target,$(1)) : $(foreach sdi,$(2),$(call gb_SdiTarget_get_target,$(sdi)))
+$(call gb_LinkTarget_get_clean_target,$(1)) : $(foreach sdi,$(2),$(call gb_SdiTarget_get_clean_target,$(sdi)))
+
+endef
+
+# call gb_LinkTarget__set_precompiled_header_variables,linktarget,pchcxxfile,pchtarget,linktargetmakefilename
+define gb_LinkTarget__set_precompiled_header_variables
+$(call gb_LinkTarget_get_target,$(1)) : PCH_NAME := $(3)
+$(call gb_LinkTarget_get_target,$(1)) : PCH_HEADER := $(patsubst %.cxx,%.hxx,$(2))
+$(call gb_LinkTarget_get_target,$(1)) : PCH_LINKTARGETMAKEFILENAME := $(4)
+
+$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS := $$(DEFS)
+$(call gb_LinkTarget_get_target,$(1)) : PCH_CXXFLAGS := $$(T_CXXFLAGS) $(call gb_LinkTarget__get_cxxflags,$(4)) $(gb_LinkTarget_EXCEPTIONFLAGS)
+
+$(call gb_LinkTarget_get_target,$(1)) : DEFS += -DPCH_LEVEL=$(gb_ENABLE_PCH)
+$(call gb_LinkTarget_get_target,$(1)) : PCH_DEFS += -DPCH_LEVEL=$(gb_ENABLE_PCH)
+
+endef
+
+# call gb_LinkTarget__set_precompiled_header_impl,linktarget,pchcxxfile,pchtarget,linktargetmakefilename
+define gb_LinkTarget__set_precompiled_header_impl
+$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_PrecompiledHeader_get_clean_target,$(3))
+$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : $(call gb_CxxObject_get_source,$(SRCDIR),$(2))
+$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : $(patsubst %.cxx,%.hxx,$(call gb_CxxObject_get_source,$(SRCDIR),$(2)))
+$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : $(call gb_PrecompiledHeader_get_flags_file,$(3),$(4))
+
+$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : $(call gb_LinkTarget_get_headers_target,$(1))
+
+$(call gb_PrecompiledHeader_get_target,$(3),$(4)) : VISIBILITY :=
+
+$(call gb_LinkTarget_get_pch_timestamp,$(4)) : $(call gb_PrecompiledHeader_get_target,$(3),$(4))
+
+$(call gb_LinkTarget__set_precompiled_header_variables,$(1),$(2),$(3),$(4))
+
+ifeq ($(gb_FULLDEPS),$(true))
+-include $(call gb_PrecompiledHeader_get_dep_target,$(3),$(4))
+endif
+
+endef
+
+# call gb_LinkTarget__add_precompiled_header_object,linktarget,pchcxxfile,pchtarget,linktargetmakefilename
+define gb_LinkTarget__add_precompiled_header_object
+# Clang-style
+ifneq ($(BUILDING_PCH_WITH_OBJ),)
+$(call gb_LinkTarget_add_exception_object,$(1),$(2),,$(4))
+$(call gb_CxxObject_get_target,$(2)) : T_PCH_EXTRA_CXXFLAGS += $(gb_PrecompiledHeader_pch_with_obj)
+endif
+# MSVC-style
+$(call gb_LinkTarget_get_target,$(1)) : PCHOBJEX = $(call gb_PrecompiledHeader_get_objectfile, $(call gb_PrecompiledHeader_get_target,$(3),$(4)))
+$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS = $$(PCHOBJEX)
+
+endef
+
+# 'compiler' set comes only from gb_LinkTarget_set_clang_precompiled_header
+# call gb_LinkTarget_set_precompiled_header,linktarget,pchcxxfile,,linktargetmakefilename,compiler
+define gb_LinkTarget_set_precompiled_header
+ifneq ($(gb_ENABLE_PCH),)
+$(call gb_LinkTarget__set_precompiled_header_impl,$(1),$(2),$(notdir $(2)),$(4))
+$(call gb_PrecompiledHeader_generate_rules,$(notdir $(2)),$(1),$(4),$(2),$(5))
+endif
+ifneq ($(gb_ENABLE_PCH)$(BLOCK_PCH),)
+$(call gb_LinkTarget__add_precompiled_header_object,$(1),$(2),$(notdir $(2)),$(4))
+endif
+
+endef
+
+# It seems complicated to forward the clang setting to the PCH rules, so use an extra
+# function to set it manually. This variant should be used if gb_LinkTarget_use_clang is used.
+# call gb_LinkTarget_set_clang_precompiled_header,linktarget,pchcxxfile,,linktargetmakefilename
+define gb_LinkTarget_set_clang_precompiled_header
+$(call gb_LinkTarget_set_precompiled_header,$(1),$(2),$(3),$(4),$(LO_CLANG_CXX))
+endef
+
+# call gb_LinkTarget__reuse_precompiled_header_impl,linktarget,pchcxxfile,pchtarget,linktargetmakefilename
+# Use the PCH as if it was LinkTarget's own, but do nothing with the PCH itself, just depend on it.
+define gb_LinkTarget__reuse_precompiled_header_impl
+$(call gb_LinkTarget__set_precompiled_header_variables,$(1),$(2),$(3),$(4))
+
+$(call gb_LinkTarget_get_pch_timestamp,$(4)) : $(call gb_LinkTarget_get_pch_reuse_timestamp,$(4))
+
+# We need to depend on a special for_reuse target that depends on the linktarget that owns the PCH.
+# Depending directly on the PCH could cause that PCH to be built with this linktarget's flags.
+$(call gb_LinkTarget_get_pch_reuse_timestamp,$(4)) : $(call gb_PrecompiledHeader_get_for_reuse_target,$(3),$(4))
+ $(call gb_PrecompiledHeader_check_flags,$(4),$(2),\
+ $(call gb_PrecompiledHeader_get_target,$(3),$(4)),\
+ $(call gb_PrecompiledHeader_get_flags_file,$(3),$(4)),\
+ $(gb_PrecompiledHeader_cxxflags_includes))
+ $$(call gb_PrecompiledHeader__copy_reuse_files,$(1),$(3),$(4))
+ mkdir -p $$(dir $$@) && touch $$@
+
+endef
+
+# call gb_LinkTarget__add_reuse_precompiled_header_object,linktarget,pchcxxfile,pchtarget,linktargetmakefilename
+define gb_LinkTarget__add_reuse_precompiled_header_object
+# Clang-style
+ifneq ($(BUILDING_PCH_WITH_OBJ),)
+# We need to link in also the PCH's object file. Again, rely on a special for_reuse target for dependencies.
+$(if $(wildcard $(call gb_CxxObject_get_source,$(SRCDIR),$(2))),,$(eval $(call gb_Output_error,No such source file $(call gb_CxxObject_get_source,$(SRCDIR),$(2)))))
+$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS += $(2)
+endif
+# MSVC-style
+$(call gb_LinkTarget_get_target,$(1)) : PCHOBJEX = $(call gb_PrecompiledHeader_get_objectfile, $(call gb_PrecompiledHeader_get_target,$(3),$(4)))
+$(call gb_LinkTarget_get_target,$(1)) : PCHOBJS = $$(PCHOBJEX)
+
+endef
+
+# call gb_LinkTarget__reuse_precompiled_header_workarounds,linktarget,pchcxxfile,pchtarget,linktargetmakefilename
+define gb_LinkTarget__reuse_precompiled_header_workarounds
+ifeq ($(COM_IS_CLANG),TRUE)
+$(call gb_LinkTarget_add_defs,$(1),$(gb_CXXFLAGS_include)$(SRCDIR)/pch/inc/clangfix.hxx)
+$(call gb_LinkTarget_add_defs,$(1),$(gb_CXXFLAGS_no_pch_warnings))
+endif
+$(if $(filter precompiled_system,$(3)), $(call gb_LinkTarget_add_defs,$(1),-DBOOST_ALL_NO_LIB))
+endef
+
+# call gb_LinkTarget_reuse_precompiled_header,linktarget,pchcxxfile,,linktargetmakefilename
+define gb_LinkTarget_reuse_precompiled_header
+ifeq ($(gb_DISABLE_PCH_REUSE),$(false))
+ifneq ($(gb_ENABLE_PCH),)
+$(call gb_LinkTarget__reuse_precompiled_header_impl,$(1),$(2),$(notdir $(2)),$(4))
+$(call gb_LinkTarget__reuse_precompiled_header_workarounds,$(1),$(2),$(notdir $(2)),$(4))
+endif
+ifneq ($(gb_ENABLE_PCH)$(BLOCK_PCH),)
+$(call gb_LinkTarget__add_reuse_precompiled_header_object,$(1),$(2),$(notdir $(2)),$(4))
+endif
+endif
+
+endef
+
+# call gb_LinkTarget_use_common_precompiled_header,linktarget,,,linktargetmakefilename
+define gb_LinkTarget_use_common_precompiled_header
+$(call gb_LinkTarget_reuse_precompiled_header,$(1),pch/inc/pch/precompiled_system,,$(4))
+
+endef
+
+# use a header package, possibly from another module
+# call gb_LinkTarget_use_package,linktarget,package
+define gb_LinkTarget_use_package
+$(call gb_LinkTarget_get_headers_target,$(1)) :| \
+ $(call gb_Package_get_target,$(strip $(2)))
+$(call gb_Package_get_target,$(strip $(2))): RDEPENDS += $(call gb_LinkTarget__get_workdir_linktargetname,$(1))
+
+endef
+
+# call gb_LinkTarget_use_packages,linktarget,packages
+define gb_LinkTarget_use_packages
+$(foreach package,$(2),$(call gb_LinkTarget_use_package,$(1),$(package)))
+endef
+
+# use a GeneratedPackage, possibly from another module
+# call gb_LinkTarget_use_generated_package,linktarget,package
+define gb_LinkTarget_use_generated_package
+$(call gb_LinkTarget_get_headers_target,$(1)) :| \
+ $(call gb_GeneratedPackage_get_target,$(strip $(2)))
+
+endef
+
+# Use sources from unpacked tarball of an external project
+# call gb_LinkTarget_use_unpacked,linktarget,unpackedtarget
+define gb_LinkTarget_use_unpacked
+$(call gb_LinkTarget_get_headers_target,$(1)) :| $(call gb_UnpackedTarball_get_final_target,$(2))
+
+endef
+
+# Use artifacts from ExternalProject (i. e. configure) of an external project
+# example in expat: StaticLibrary depends on ExternalProject outcome
+# call gb_LinkTarget_use_external_project,linktarget,externalproject,full-dep
+define gb_LinkTarget_use_external_project
+$(call gb_LinkTarget_get_target,$(1)) :| $(call gb_ExternalProject_get_target,$(2))
+$(call gb_LinkTarget_get_headers_target,$(1)) :| \
+ $(if $(3),$(call gb_ExternalProject_get_target,$(2)),$(call gb_UnpackedTarball_get_final_target,$(2)))
+
+endef
+
+# this forwards to functions that must be defined in RepositoryExternal.mk.
+# Automatically forward for libmerged library too when linktarget is merged.
+#
+# call gb_LinkTarget_use_external,linktarget,external
+define gb_LinkTarget_use_external
+$(if $(filter undefined,$(origin gb_LinkTarget__use_$(2))),\
+ $(error gb_LinkTarget_use_external: unknown external: $(2)) \
+, \
+ $(if $(gb_PARTIAL_BUILD),,$(if $(call gb_LinkTarget__is_merged,$(1)), \
+ $(call gb_LinkTarget__use_$(2),$(call gb_Library_get_linktarget,merged)))) \
+ $(call gb_LinkTarget__use_$(2),$(1)) \
+)
+
+$(call gb_LinkTarget__register_type,externals,$(1),$(2))
+
+endef
+
+# $(call gb_LinkTarget_use_externals,library,externals)
+gb_LinkTarget_use_externals = \
+ $(foreach external,$(2),$(call gb_LinkTarget_use_external,$(1),$(external)))
+
+# call gb_LinkTarget_set_visibility_default,linktarget
+define gb_LinkTarget_set_visibility_default
+$(call gb_LinkTarget_get_target,$(1)) : VISIBILITY := default
+ifneq ($(gb_ENABLE_PCH),)
+ifneq ($(strip $$(PCH_NAME)),)
+$(call gb_PrecompiledHeader_get_target,$$(PCH_NAME),$$(PCH_LINKTARGETMAKEFILENAME)) : VISIBILITY := default
+endif
+endif
+
+endef
+
+# call gb_LinkTarget_set_warnings_not_errors,linktarget
+define gb_LinkTarget_set_warnings_not_errors
+$(call gb_LinkTarget_get_target,$(1)) : WARNINGS_NOT_ERRORS := $(true)
+
+endef
+
+# call gb_LinkTarget_set_warnings_disabled,linktarget
+define gb_LinkTarget_set_warnings_disabled
+$(call gb_LinkTarget_get_target,$(1)) : WARNINGS_DISABLED := $(true)
+
+endef
+
+# call gb_LinkTarget_set_external_code,linktarget
+define gb_LinkTarget_set_external_code
+$(call gb_LinkTarget_get_target,$(1)) : EXTERNAL_CODE := $(true)
+
+endef
+
+# Set suffix of C++ files, if different from 'cxx'
+#
+# This is useful for external libraries.
+#
+# call gb_LinkTarget_set_generated_cxx_suffix,linktarget,used-suffix
+define gb_LinkTarget_set_generated_cxx_suffix
+gb_LinkTarget_CXX_SUFFIX_$(call gb_LinkTarget__get_workdir_linktargetname,$(1)) := $(2)
+
+endef
+
+# C/C++ files will be build with Clang (if possible) instead of the default compiler.
+# call gb_LinkTarget_use_clang,linktarget,,linktargetmakefilename
+define gb_LinkTarget_use_clang
+$(call gb_LinkTarget_get_target,$(1)) : T_CC := $(LO_CLANG_CC)
+$(call gb_LinkTarget_get_target,$(1)) : T_CXX := $(LO_CLANG_CXX)
+$(call gb_LinkTarget_get_target,$(1)) : T_USE_CLANG := $(true)
+$(call gb_LinkTarget_get_target,$(1)) : T_USE_LD := $(or $(CLANG_USE_LD),$(USE_LD))
+$(call gb_LinkTarget_get_target,$(1)) : T_LTOFLAGS := $(if $(LO_CLANG_CXX),$(gb_CLANG_LTOFLAGS),$(gb_LTOFLAGS))
+endef
+
+# call gb_LinkTarget_use_vclmain,linktarget
+define gb_LinkTarget_use_vclmain
+$(call gb_LinkTarget_use_static_libraries,$(1),vclmain)
+
+endef # gb_LinkTarget_use_vclmain
+
+# Used by URE libraries that need to keep binary compatibility.
+# Reset some flags that make sense for our internal libraries but might
+# break public ABI.
+# (clang-cl's -Zc:dllexportInlines- would not only be a problem for the URE libraries themselves but
+# also for any libraries they depend on. While that does not appear to be a problem for -Zc:inline
+# for neither MSVC nor clang-cl, it should not really hurt to also switch that off not only for the
+# URE libraries themselves but also for their dependencies.)
+# call gb_LinkTarget_set_is_ure_library_or_dependency,linktarget,,linktargetmakefilename
+define gb_LinkTarget_set_is_ure_library_or_dependency
+$(call gb_LinkTarget_add_cxxflags,$(1),$(gb_CXXFLAGS_ZCINLINE_OFF))
+ifeq ($(HAVE_DLLEXPORTINLINES),TRUE)
+$(call gb_LinkTarget_add_cxxflags,$(1),-Zc:dllexportInlines)
+endif
+
+endef
+
+gb_LinkTarget__get_plugins_var = $(call gb_LinkTarget__get_workdir_linktargetname,$(1))<>PLUGINS
+gb_LinkTarget__get_plugins = $($(call gb_LinkTarget__get_plugins_var,$(1)))
+gb_Library__get_plugins = $($(call gb_LinkTarget__get_plugins_var,$(call gb_Library_get_linktarget,$(1))))
+
+define gb_LinkTarget__add_plugin
+$(call gb_LinkTarget__get_plugins_var,$(1)) += $(2)
+
+endef
+
+# Instead of setting nodep use gb_LinkTarget__set_plugin_for_nodep
+#
+# call gb_LinkTarget__set_plugin_for,linktarget,loader,nodep
+define gb_LinkTarget__set_plugin_for
+ifeq (,$(filter $(1),$(foreach plugin,$(gb_Library_KNOWNPLUGINS),$(call gb_Library_get_linktarget,$(plugin)))))
+$$(eval $$(call gb_Output_error,Unknown plugin(s) '$(filter $(1),$(foreach plugin,$(gb_Library_KNOWNPLUGINS),$(call gb_Library_get_linktarget,$(plugin))))'. Plugins must be registered in Repository.mk or RepositoryExternal.mk))
+endif
+ifneq (,$(filter $(1),$(foreach lib,$(gb_MERGEDLIBS),$(call gb_Library_get_linktarget,$(lib)))))
+$$(eval $$(call gb_Output_error,Plugins can't be in mergelibs))
+endif
+ifeq ($(call gb_LinkTarget__is_build_tool,$(1)),$(true))
+$$(eval $$(call gb_Output_error,Plugin support for build tools not implemented))
+endif
+
+$(if $(filter $(2),$(gb_Library_KNOWNLOADERS)),,gb_Library_KNOWNLOADERS += $(2))
+$(if $(3),,$(call gb_LinkTarget_use_libraries,$(1),$(2),,$(4)))
+
+endef
+
+# call gb_LinkTarget__set_plugin_for_nodep,linktarget,loader
+gb_LinkTarget__set_plugin_for_nodep = $(call gb_LinkTarget__set_plugin_for,$(1),$(2),$(true))
+
+# call gb_LinkTarget_add_prejs,linktarget,js_file
+define gb_LinkTarget_add_prejs
+ifeq (EMSCRIPTEN,$(OS))
+$(call gb_LinkTarget_get_target,$(1)) : T_PREJS += $(2)
+$(call gb_LinkTarget_get_target,$(1)) : $(2)
+endif
+
+endef
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/Module.mk b/solenv/gbuild/Module.mk
new file mode 100644
index 000000000..bb915f503
--- /dev/null
+++ b/solenv/gbuild/Module.mk
@@ -0,0 +1,495 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+
+# Overview of dependencies and tasks of Module
+#
+# target task depends on
+# Module build the product all product targets
+# excluding tests recursive Modules
+# Module/unitcheck run unit tests all unit tests
+# recursive Module/checks
+# Module/slowcheck run all slow unit tests
+# Module/screenshot create all screenshots
+# Module/subsequentcheck run system tests all system tests
+# Module/uicheck run uitests all uitests
+# recursive Module/subsequentchecks
+# build (global) build the product top-level Module
+# unitcheck (global) run unit tests top-level Module/unitcheck
+# slowcheck (global) run slow unit tests top-level Module/slowcheck
+# screenshot (global) create all screenshots top-level Module/screenshot
+# subsequentcheck (global) run system tests top-level Module/subsequentcheck
+# perfcheck (global) run performance unit tests top-level Module/perfcheck
+# uicheck (global) run the uitests run all uitests
+
+
+# Module class
+
+gb_Module_ALLMODULES :=
+gb_Module_MODULELOCATIONS :=
+gb_Module_TARGETSTACK :=
+gb_Module_L10NTARGETSTACK :=
+gb_Module_CHECKTARGETSTACK :=
+gb_Module_SLOWCHECKTARGETSTACK :=
+gb_Module_SCREENSHOTTARGETSTACK :=
+gb_Module_SUBSEQUENTCHECKTARGETSTACK :=
+gb_Module_PERFCHECKTARGETSTACK :=
+gb_Module_UICHECKTARGETSTACK :=
+gb_Module_CLEANTARGETSTACK :=
+
+# The currently read gbuild makefile.
+#
+# gbuild classes should use this if they need to depend on their makefile
+# (e.g., to make sure a zip file is rebuilt if files are removed from it).
+# Because makefiles may include other makefiles, it is not safe to rely
+# on $(MAKEFILE_LIST).
+gb_Module_CURRENTMAKEFILE :=
+
+$(call gb_Module_get_nonl10n_target,%) :
+ $(call gb_Output_announce,$*,$(true),BIN,5)
+ $(call gb_Trace_MakeMark,$*,BIN)
+ -$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ touch $@)
+
+.PHONY : $(call gb_Module_get_clean_target,%)
+$(call gb_Module_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),MOD,5)
+ $(call gb_Output_announce_title,module $* cleared.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_Module_get_target,$*) $(call gb_Module_get_nonl10n_target,$*) $(call gb_Module_get_l10n_target,$*) $(call gb_Module_get_check_target,$*) $(call gb_Module_get_slowcheck_target,$*) $(call gb_Module_get_screenshot_target,$*) $(call gb_Module_get_subsequentcheck_target,$*) $(call gb_Module_get_perfcheck_target,$*) $(call gb_Module_get_uicheck,$*))
+
+$(call gb_Module_get_l10n_target,%) :
+ $(call gb_Output_announce,$*,$(true),LOC,5)
+ $(call gb_Trace_MakeMark,$*,LOC)
+ $(call gb_Output_announce_title,module $* done.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ touch $@)
+
+$(call gb_Module_get_check_target,%) :
+ $(call gb_Output_announce,$*,$(true),CHK,5)
+ $(call gb_Trace_MakeMark,$*,CHK)
+ $(call gb_Output_announce_title,module $* checks done.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ touch $@)
+
+$(call gb_Module_get_slowcheck_target,%) :
+ $(call gb_Output_announce,$*,$(true),SLC,5)
+ $(call gb_Trace_MakeMark,$*,SLC)
+ $(call gb_Output_announce_title,module $* slowchecks done.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ touch $@)
+
+$(call gb_Module_get_screenshot_target,%) :
+ $(call gb_Output_announce,$*,$(true),SCR,5)
+ $(call gb_Trace_MakeMark,$*,SCR)
+ $(call gb_Output_announce_title,module $* screenshots done.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ touch $@)
+
+$(call gb_Module_get_subsequentcheck_target,%) :
+ $(call gb_Output_announce,$*,$(true),SCK,5)
+ $(call gb_Trace_MakeMark,$*,SCK)
+ $(call gb_Output_announce_title,module $* subsequentchecks done.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ touch $@)
+
+$(call gb_Module_get_perfcheck_target,%) :
+ $(call gb_Output_announce,$*,$(true),PFC,5)
+ $(call gb_Trace_MakeMark,$*,PFC)
+ $(call gb_Output_announce_title,module $* perfchecks done.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ touch $@)
+
+$(call gb_Module_get_uicheck_target,%) :
+ $(call gb_Output_announce,$*,$(true),UIT,5)
+ $(call gb_Trace_MakeMark,$*,UIT)
+ $(call gb_Output_announce_title,module $* uicheck done.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ touch $@)
+
+$(call gb_Module_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),MOD,5)
+ $(call gb_Trace_MakeMark,$*,MOD)
+ $(call gb_Output_announce_title,module $* done.)
+ -$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && \
+ touch $@)
+
+.PHONY : build build-l10n-only build-non-l10n-only unitcheck slowcheck screenshot subsequentcheck perfcheck uicheck clean check debugrun help showmodules translations
+.DEFAULT_GOAL := build
+
+ifeq ($(gb_Side),build)
+build-tools : $(gb_BUILD_TOOLS)
+ $(call gb_Output_announce,loaded tools: $(gb_BUILD_TOOLS),$(true),ALL,6)
+ $(call gb_Trace_MakeMark,$(gb_BUILD_TOOLS),ALL)
+ $(call gb_Output_announce_title,build-tools done.)
+ $(call gb_Output_announce_bell)
+endif
+
+build :
+ $(call gb_Output_announce,top level modules: $(foreach module,$(filter-out deliverlog $(WORKDIR)/bootstrap,$^),$(notdir $(module))),$(true),ALL,6)
+ $(call gb_Trace_MakeMark,top level modules: $(foreach module,$(filter-out deliverlog $(WORKDIR)/bootstrap,$^),$(notdir $(module))),ALL)
+ $(if $(gb_VERBOSE),$(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(true),ALL,6))
+ $(call gb_Output_announce_title,build done.)
+ $(call gb_Output_announce_bell)
+
+build-l10n-only :
+ $(call gb_Output_announce,top level modules: $(foreach module,$(filter-out deliverlog $(WORKDIR)/bootstrap,$^),$(notdir $(module))),$(true),LOC,6)
+ $(call gb_Trace_MakeMark,top level modules: $(foreach module,$(filter-out deliverlog $(WORKDIR)/bootstrap,$^),$(notdir $(module))),LOC)
+ $(if $(gb_VERBOSE),$(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(true),LOC,6))
+ $(call gb_Output_announce_title,l10n done.)
+ $(call gb_Output_announce_bell)
+
+build-non-l10n-only :
+ $(call gb_Output_announce,top level modules: $(foreach module,$(filter-out deliverlog $(WORKDIR)/bootstrap,$^),$(notdir $(module))),$(true),BIN,6)
+ $(call gb_Trace_MakeMark,top level modules: $(foreach module,$(filter-out deliverlog $(WORKDIR)/bootstrap,$^),$(notdir $(module))),BIN)
+ $(if $(gb_VERBOSE),$(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(true),BIN,6))
+ $(call gb_Output_announce_title,non-l10n done.)
+ $(call gb_Output_announce_bell)
+
+unitcheck :
+ $(if $(gb_VERBOSE),$(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(true),CHK,6))
+ $(call gb_Output_announce_title,all unittests checked.)
+ $(call gb_Output_announce_bell)
+
+slowcheck :
+ $(if $(gb_VERBOSE),$(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(true),SLC,6))
+ $(call gb_Output_announce_title,all slowtests checked.)
+ $(call gb_Output_announce_bell)
+
+screenshot :
+ $(if $(gb_VERBOSE),$(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(true),SCR,6))
+ $(call gb_Output_announce_title,all screenshots checked.)
+ $(call gb_Output_announce_bell)
+
+# removing the dependency on build for now until we can make a full build with gbuild
+#subsequentcheck : build
+subsequentcheck :
+ $(if $(gb_VERBOSE),$(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(true),SCK,6))
+ $(call gb_Output_announce_title,all subsequent tests checked.)
+ $(call gb_Output_announce_bell)
+
+perfcheck :
+ $(if $(gb_VERBOSE),$(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(true),PFC,6))
+ $(call gb_Output_announce_title,all perftests checked.)
+ $(call gb_Output_announce_bell)
+
+uicheck : build
+ $(if $(gb_VERBOSE),$(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(true),UIT,6))
+ $(call gb_Output_announce_title,all uicheck checked.)
+ $(call gb_Output_announce_bell)
+
+clean :
+ $(if $(gb_VERBOSE),$(call gb_Output_announce,top level modules: $(foreach module,$^,$(notdir $(module))),$(false),ALL,6))
+ $(call gb_Output_announce,loaded modules: $(sort $(gb_Module_ALLMODULES)),$(false),ALL,6)
+ $(call gb_Output_announce_title,all cleared.)
+ $(call gb_Output_announce_bell)
+
+check : unitcheck slowcheck
+ $(call gb_Output_announce_title,all tests checked.)
+ $(call gb_Output_announce_bell)
+
+debugrun :
+ $(call gb_Module_DEBUGRUNCOMMAND)
+
+help :
+ @cat $(SRCDIR)/solenv/gbuild/gbuild.help.txt
+
+showmodules :
+ $(info $(strip $(gb_Module_ALLMODULES)))
+ @true
+
+translations : $(WORKDIR)/pot.done
+
+$(WORKDIR)/pot.done : $(foreach exec,cfgex helpex localize propex ulfex xrmex treex, \
+ $(call gb_Executable_get_target_for_build,$(exec)))
+ $(call gb_Output_announce,$(subst .pot,,$(subst $(WORKDIR)/,,$@)),$(true),POT,1)
+ $(call gb_Trace_MakeMark,$(subst .pot,,$(subst $(WORKDIR)/,,$@)),POT)
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@) && $(call gb_Helper_execute,localize) $(SRCDIR) $(dir $@)/pot \
+ && $(FIND) $(dir $@)/pot -type f -printf "%P\n" | sed -e "s/\.pot/.po/" | LC_ALL=C $(SORT) > $(dir $@)/LIST \
+ && touch $@)
+
+# enable if: no "-MODULE/" defined AND ["all" defined OR "MODULE/" defined]
+# $(1) is module name, $(2) is directory name two levels up (for externals it's 'external')
+gb_Module__symbols_enabled = \
+ $(and $(if $(filter -$(1)/,$(gb_ENABLE_SYMBOLS_FOR)),,$(true)),\
+ $(if $(filter -$(2)/,$(gb_ENABLE_SYMBOLS_FOR)),,$(true)),\
+ $(filter all $(1)/,$(gb_ENABLE_SYMBOLS_FOR)))
+# enable if: no "-MODULE/" defined AND ["all" defined OR "MODULE/" defined]
+# $(1) is module name, $(2) is directory name two levels up (for externals it's 'external')
+gb_Module__force_compile = \
+ $(and $(if $(filter -$(1)/,$(FORCE_COMPILE)),,$(true)),\
+ $(if $(filter -$(2)/,$(FORCE_COMPILE)),,$(true)),\
+ $(filter all $(1)/,$(FORCE_COMPILE)))
+
+define gb_Module_Module
+gb_Module_ALLMODULES += $(1)
+gb_Module_MODULELOCATIONS += $(1):$(dir $(realpath $(lastword $(MAKEFILE_LIST))))
+gb_Module_TARGETSTACK := $(call gb_Module_get_target,$(1)) $(gb_Module_TARGETSTACK)
+gb_Module_L10NTARGETSTACK := $(call gb_Module_get_l10n_target,$(1)) $(gb_Module_L10NTARGETSTACK)
+gb_Module_CHECKTARGETSTACK := $(call gb_Module_get_check_target,$(1)) $(gb_Module_CHECKTARGETSTACK)
+gb_Module_SLOWCHECKTARGETSTACK := $(call gb_Module_get_slowcheck_target,$(1)) $(gb_Module_SLOWCHECKTARGETSTACK)
+gb_Module_SCREENSHOTTARGETSTACK := $(call gb_Module_get_screenshot_target,$(1)) $(gb_Module_SCREENSHOTTARGETSTACK)
+gb_Module_UICHECKTARGETSTACK := $(call gb_Module_get_uicheck_target,$(1)) $(gb_Module_UICHECKTARGETSTACK)
+gb_Module_SUBSEQUENTCHECKTARGETSTACK := $(call gb_Module_get_subsequentcheck_target,$(1)) $(gb_Module_SUBSEQUENTCHECKTARGETSTACK)
+gb_Module_PERFCHECKTARGETSTACK := $(call gb_Module_get_perfcheck_target,$(1)) $(gb_Module_PERFCHECKTARGETSTACK)
+gb_Module_CLEANTARGETSTACK := $(call gb_Module_get_clean_target,$(1)) $(gb_Module_CLEANTARGETSTACK)
+gb_Module_CURRENTMODULE_SYMBOLS_ENABLED := $(call gb_Module__symbols_enabled,$(1),$(notdir $(realpath $(dir $(realpath $(lastword $(MAKEFILE_LIST))))../)))
+gb_Module_CURRENTMODULE_FORCE_COMPILE := $(call gb_Module__force_compile,$(1),$(notdir $(realpath $(dir $(realpath $(lastword $(MAKEFILE_LIST))))../)))
+gb_Module_CURRENTMODULE_NAME := $(1)
+$(call gb_Helper_make_userfriendly_targets,$(1),Module)
+$(if $(filter-out libreoffice instsetoo_native android ios,$(1)),\
+ $(call gb_Postprocess_register_target,AllModulesButInstsetNative,Module,$(1)))
+
+$(call gb_Postprocess_get_target,AllModuleTests) : $(call gb_Module_get_check_target,$(1))
+$(call gb_Postprocess_get_target,AllModuleSlowtests) : $(call gb_Module_get_slowcheck_target,$(1))
+$(call gb_Postprocess_get_target,AllModuleScreenshots) : $(call gb_Module_get_screenshot_target,$(1))
+$(call gb_Postprocess_get_target,AllModuleUITest) : $(call gb_Module_get_uicheck_target,$(1))
+
+endef
+
+# This is called inside the included file and pushes one target on each stack.
+# This has to be called with full late evaluation ($$(eval $$(call ))) and
+# should never be inlined ($(call )) as the calls defining it might be sourced
+# before gb_Module.
+define gb_Module_register_target
+gb_Module_CURRENTTARGET := $(1)
+gb_Module_CURRENTCLEANTARGET := $(2)
+
+endef
+
+# Here we include the file (in it there will be a call to gb_Module_register_target)
+define gb_Module__read_targetfile
+gb_Module_CURRENTTARGET :=
+gb_Module_CURRENTCLEANTARGET :=
+gb_Module_CURRENTMAKEFILE := $(patsubst $(1):%,%,$(filter $(1):%,$(gb_Module_MODULELOCATIONS)))$(2).mk
+include $(patsubst $(1):%,%,$(filter $(1):%,$(gb_Module_MODULELOCATIONS)))$(2).mk
+gb_Module_CURRENTMAKEFILE :=
+ifneq ($$(words $$(gb_Module_CURRENTTARGET)) $$(words $$(gb_Module_CURRENTCLEANTARGET)),1 1)
+$$(eval $$(call gb_Output_error,No $(3) registered while reading $(patsubst $(1):%,%,$(filter $(1):%,$(gb_Module_MODULELOCATIONS)))$(2).mk!))
+endif
+
+endef
+
+define gb_Module_add_target
+$(if $(filter AllLang% Dictionary% Package_registry,$(2)),$(warning target $(2) should be a l10n target))
+$(call gb_Module__read_targetfile,$(1),$(2),target)
+
+$(call gb_Module_get_nonl10n_target,$(1)) : $$(gb_Module_CURRENTTARGET)
+$(call gb_Module_get_clean_target,$(1)) : $$(gb_Module_CURRENTCLEANTARGET)
+
+endef
+
+define gb_Module_add_l10n_target
+$(if $(filter AllLang% CustomTarget_autotextshare Dictionary% Package_registry,$(2)),,$(warning target $(2) should not be a l10n target))
+$(call gb_Module__read_targetfile,$(1),$(2),target)
+
+$(call gb_Module_get_l10n_target,$(1)) : $$(gb_Module_CURRENTTARGET)
+$(call gb_Module_get_clean_target,$(1)) : $$(gb_Module_CURRENTCLEANTARGET)
+
+endef
+
+define gb_Module_add_check_target
+$(call gb_Module__read_targetfile,$(1),$(2),check target)
+
+$(call gb_Module_get_check_target,$(1)) : $$(gb_Module_CURRENTTARGET)
+$(call gb_Module_get_clean_target,$(1)) : $$(gb_Module_CURRENTCLEANTARGET)
+
+endef
+
+define gb_Module_add_slowcheck_target
+$(call gb_Module__read_targetfile,$(1),$(2),slowcheck target)
+
+$(call gb_Module_get_slowcheck_target,$(1)) : $$(gb_Module_CURRENTTARGET)
+$(call gb_Module_get_clean_target,$(1)) : $$(gb_Module_CURRENTCLEANTARGET)
+
+endef
+
+define gb_Module_add_screenshot_target
+$(call gb_Module__read_targetfile,$(1),$(2),screenshot target)
+
+$(call gb_Module_get_screenshot_target,$(1)) : $$(gb_Module_CURRENTTARGET)
+$(call gb_Module_get_clean_target,$(1)) : $$(gb_Module_CURRENTCLEANTARGET)
+
+endef
+
+# has order dependency on AllModulesButInstsetNative to be able to run
+# subsequentcheck in the same make process on "make check"
+define gb_Module_add_subsequentcheck_target
+$(call gb_Module__read_targetfile,$(1),$(2),subsequentcheck target)
+
+$(call gb_Module_get_subsequentcheck_target,$(1)) : $$(gb_Module_CURRENTTARGET)
+$$(gb_Module_CURRENTTARGET) :| \
+ $(call gb_Postprocess_get_target,AllModulesButInstsetNative) \
+ $(call gb_Package_get_target,instsetoo_native_setup) \
+ $(call gb_Package_get_target,instsetoo_native_setup_ure)
+$(call gb_Module_get_clean_target,$(1)) : $$(gb_Module_CURRENTCLEANTARGET)
+
+endef
+
+define gb_Module_add_perfcheck_target
+$(call gb_Module__read_targetfile,$(1),$(2),perfcheck target)
+
+$(call gb_Module_get_perfcheck_target,$(1)) : $$(gb_Module_CURRENTTARGET)
+$(call gb_Module_get_clean_target,$(1)) : $$(gb_Module_CURRENTCLEANTARGET)
+
+endef
+
+define gb_Module_add_uicheck_target
+$(call gb_Module__read_targetfile,$(1),$(2),uicheck target)
+
+$(call gb_Module_get_uicheck_target,$(1)) : $$(gb_Module_CURRENTTARGET)
+$$(gb_Module_CURRENTTARGET) :| \
+ $(call gb_Postprocess_get_target,AllModulesButInstsetNative) \
+ $(call gb_Package_get_target,instsetoo_native_setup) \
+ $(call gb_Package_get_target,instsetoo_native_setup_ure)
+$(call gb_Module_get_uicheck_target,$(1)) : $$(gb_Module_CURRENTTARGET)
+$(call gb_Module_get_clean_target,$(1)) : $$(gb_Module_CURRENTCLEANTARGET)
+
+endef
+
+define gb_Module__modulefile
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_Module_MODULELOCATIONS)))/$(2)/Module_$(2).mk
+endef
+
+define gb_Module_add_moduledir
+$(if $(wildcard $(call gb_Module__modulefile,$(1),$(2))),,$(call gb_Output_error,Module does not exist: $(call gb_Module__modulefile,$(1),$(2))))
+include $(call gb_Module__modulefile,$(1),$(2))
+$(call gb_Module_get_target,$(1)) : $$(firstword $$(gb_Module_TARGETSTACK))
+$(call gb_Module_get_l10n_target,$(1)) : $$(firstword $$(gb_Module_L10NTARGETSTACK))
+$(call gb_Module_get_check_target,$(1)) : $$(firstword $$(gb_Module_CHECKTARGETSTACK))
+$(call gb_Module_get_slowcheck_target,$(1)) : $$(firstword $$(gb_Module_SLOWCHECKTARGETSTACK))
+$(call gb_Module_get_screenshot_target,$(1)) : $$(firstword $$(gb_Module_SCREENSHOTTARGETSTACK))
+$(call gb_Module_get_subsequentcheck_target,$(1)) : $$(firstword $$(gb_Module_SUBSEQUENTCHECKTARGETSTACK))
+$(call gb_Module_get_perfcheck_target,$(1)) : $$(firstword $$(gb_Module_PERFCHECKTARGETSTACK))
+$(call gb_Module_get_uicheck_target,$(1)) : $$(firstword $$(gb_Module_UICHECKTARGETSTACK))
+$(call gb_Module_get_clean_target,$(1)) : $$(firstword $$(gb_Module_CLEANTARGETSTACK))
+gb_Module_TARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_TARGETSTACK)),$$(gb_Module_TARGETSTACK))
+gb_Module_L10NTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_L10NTARGETSTACK)),$$(gb_Module_L10NTARGETSTACK))
+gb_Module_CHECKTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_CHECKTARGETSTACK)),$$(gb_Module_CHECKTARGETSTACK))
+gb_Module_SLOWCHECKTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_SLOWCHECKTARGETSTACK)),$$(gb_Module_SLOWCHECKTARGETSTACK))
+gb_Module_SCREENSHOTTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_SCREENSHOTTARGETSTACK)),$$(gb_Module_SCREENSHOTTARGETSTACK))
+gb_Module_SUBSEQUENTCHECKTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_SUBSEQUENTCHECKTARGETSTACK)),$$(gb_Module_SUBSEQUENTCHECKTARGETSTACK))
+gb_Module_PERFCHECKTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_PERFCHECKTARGETSTACK)),$$(gb_Module_PERFCHECKTARGETSTACK))
+gb_Module_UICHECKTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_UICHECKTARGETSTACK)),$$(gb_Module_UICHECKTARGETSTACK))
+gb_Module_CLEANTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_CLEANTARGETSTACK)),$$(gb_Module_CLEANTARGETSTACK))
+
+endef
+
+define gb_Module_add_targets
+$(call gb_Module_get_target,$(1)) : $(call gb_Module_get_nonl10n_target,$(1))
+$(foreach target,$(2),$(call gb_Module_add_target,$(1),$(target)))
+
+endef
+
+define gb_Module_add_l10n_targets
+$(call gb_Module_get_target,$(1)) : $(call gb_Module_get_l10n_target,$(1))
+$(foreach target,$(2),$(call gb_Module_add_l10n_target,$(1),$(target)))
+
+endef
+
+gb_Module_add_targets_for_build = $(call gb_Module_add_targets,$(1),$(2))
+
+define gb_Module_add_check_targets
+$(foreach target,$(2),$(call gb_Module_add_check_target,$(1),$(target)))
+
+endef
+
+define gb_Module_add_slowcheck_targets
+$(foreach target,$(2),$(call gb_Module_add_slowcheck_target,$(1),$(target)))
+
+endef
+
+define gb_Module_add_screenshot_targets
+$(foreach target,$(2),$(call gb_Module_add_screenshot_target,$(1),$(target)))
+
+endef
+
+define gb_Module_add_subsequentcheck_targets
+$(foreach target,$(2),$(call gb_Module_add_subsequentcheck_target,$(1),$(target)))
+
+endef
+
+define gb_Module_add_perfcheck_targets
+$(foreach target,$(2),$(call gb_Module_add_perfcheck_target,$(1),$(target)))
+
+endef
+
+define gb_Module_add_moduledirs
+$(foreach target,$(sort $(2)),$(call gb_Module_add_moduledir,$(1),$(target)))
+
+endef
+
+define gb_Module_add_uicheck_targets
+$(foreach target,$(2),$(call gb_Module_add_uicheck_target,$(1),$(target)))
+
+endef
+
+define gb_Module_make_global_targets
+ifneq ($$(gb_Module_TARGETSTACK),)
+$$(eval $$(call gb_Output_error,Corrupted module target stack!1))
+endif
+
+include $(1)
+
+build : build-non-l10n-only build-l10n-only
+build-non-l10n-only : $$(firstword $$(gb_Module_TARGETSTACK))
+build-l10n-only : $$(firstword $$(gb_Module_L10NTARGETSTACK))
+unitcheck : $$(firstword $$(gb_Module_CHECKTARGETSTACK))
+slowcheck : $$(firstword $$(gb_Module_SLOWCHECKTARGETSTACK))
+screenshot : $$(firstword $$(gb_Module_SCREENSHOTTARGETSTACK))
+ifeq ($(WINDOWS_BUILD_SIGNING),TRUE)
+screenshot : $(call gb_CustomTarget_get_workdir,postprocess/signing)/signing.done
+endif
+subsequentcheck : $$(firstword $$(gb_Module_SUBSEQUENTCHECKTARGETSTACK))
+perfcheck : $$(firstword $$(gb_Module_PERFCHECKTARGETSTACK))
+uicheck : build $$(firstword $$(gb_Module_UICHECKTARGETSTACK))
+clean : $$(firstword $$(gb_Module_CLEANTARGETSTACK))
+
+ifneq ($$(words $$(gb_Module_TARGETSTACK)),1)
+$$(eval $$(call gb_Output_error,Corrupted module target stack! $(gb_Module_TARGETSTACK)))
+endif
+
+gb_Module_TARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_TARGETSTACK)),$$(gb_Module_TARGETSTACK))
+gb_Module_L10NTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_L10NTARGETSTACK)),$$(gb_Module_L10NTARGETSTACK))
+gb_Module_CHECKTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_CHECKTARGETSTACK)),$$(gb_Module_CHECKTARGETSTACK))
+gb_Module_SLOWCHECKTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_SLOWCHECKTARGETSTACK)),$$(gb_Module_SLOWCHECKTARGETSTACK))
+gb_Module_SCREENSHOTTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_SCREENSHOTTARGETSTACK)),$$(gb_Module_SCREENSHOTTARGETSTACK))
+gb_Module_SUBSEQUENTCHECKTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_SUBSEQUENTCHECKTARGETSTACK)),$$(gb_Module_SUBSEQUENTCHECKTARGETSTACK))
+gb_Module_UICHECKTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_UICHECKTARGETSTACK)),$$(gb_Module_UICHECKTARGETSTACK))
+gb_Module_PERFCHECKTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_PERFCHECKTARGETSTACK)),$$(gb_Module_PERFCHECKTARGETSTACK))
+gb_Module_CLEANTARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_CLEANTARGETSTACK)),$$(gb_Module_CLEANTARGETSTACK))
+
+ifneq ($$(and $$(gb_Module_TARGETSTACK),$$(gb_Module_CHECKTARGETSTACK),$$(gb_Module_SLOWCHECKTARGETSTACK),$$(gb_Module_SCREENSHOTTARGETSTACK),$$(gb_Module_SUBSEQUENTCHECKTARGETSTACK),$$(gb_Module_UICHECKTARGETSTACK),$$(gb_Module_PERFCHECKTARGETSTACK),$$(gb_Module_L10NTARGETSTACK)),)
+$$(eval $$(call gb_Output_error,Corrupted module target stack!3))
+endif
+
+$$(eval $$(gb_Extensions_final_hook))
+endef
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/Output.mk b/solenv/gbuild/Output.mk
new file mode 100644
index 000000000..c4b992df4
--- /dev/null
+++ b/solenv/gbuild/Output.mk
@@ -0,0 +1,157 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# user notifications and formatting
+
+define gb_Output__format_type
+[$(word 2,$(1) build clean) $(2)]
+endef
+
+define gb_Output__format_target
+$(1)
+endef
+
+define gb_Output_error
+$(error $(1))
+endef
+
+define gb_Output_announce_title
+endef
+
+define gb_Output_announce_bell
+endef
+
+define gb_Output_info
+$(info [info $(2)] $(1))
+endef
+
+define gb_Output_warn
+$(warning $(NEWLINE)[WARN $(2)] !!!$(NEWLINE)[WARN $(2)] !!! $(1)$(NEWLINE)[WARN $(2)] !!!)
+endef
+
+gb_Output_ESCAPE := $(shell echo|awk 'BEGIN { printf "%c", 27 }' -)
+gb_Output_BELL := $(shell echo|awk 'BEGIN { printf "%c", 7 }' -)
+
+# default to color output, if interactive
+ifeq ($(origin gb_COLOR),undefined)
+ifneq ($(MAKE_TERMOUT),)
+# Cygwin mintty has issues where gb_Output_error is swallowed
+ifneq ($(OS),WNT)
+gb_COLOR=$(true)
+endif
+endif
+endif
+
+# only enable colorized output if
+# - gb_COLOR is set
+# - we have a known term
+gb_KNOWN_TERM:=Eterm aterm gnome kterm linux putty rxvt rxvt-unicode screen xterm xterm xtermc cygwin
+gb_KNOWN_TERM+=$(patsubst %,%-color,$(gb_KNOWN_TERM))
+gb_KNOWN_TERM+=$(patsubst %-color,%-256color,$(gb_KNOWN_TERM))
+gb_KNOWN_TERM+=$(patsubst %-color,%+256color,$(gb_KNOWN_TERM))
+gb_KNOWN_TERM+=$(patsubst %,screen.%,$(gb_KNOWN_TERM))
+ifneq ($(strip $(gb_COLOR)),)
+ifneq ($(filter $(TERM),$(gb_KNOWN_TERM)),)
+
+gb_Output_COLOR_RESET := $(gb_Output_ESCAPE)[0m
+gb_Output_COLOR_RESETANDESCAPE := $(gb_Output_COLOR_RESET)$(gb_Output_ESCAPE)
+
+gb_Output_COLOR_OUTBUILD_LEVEL1 := $(gb_Output_COLOR_RESETANDESCAPE)[37;40m
+gb_Output_COLOR_OUTBUILD_LEVEL2 := $(gb_Output_COLOR_RESETANDESCAPE)[37;40m
+gb_Output_COLOR_OUTBUILD_LEVEL3 := $(gb_Output_COLOR_RESETANDESCAPE)[37;40m
+gb_Output_COLOR_OUTBUILD_LEVEL4 := $(gb_Output_COLOR_RESETANDESCAPE)[37;40m
+gb_Output_COLOR_OUTBUILD_LEVEL5 := $(gb_Output_COLOR_RESETANDESCAPE)[37;1;46m
+gb_Output_COLOR_OUTBUILD_LEVEL6 := $(gb_Output_COLOR_RESETANDESCAPE)[37;1;44m
+
+gb_Output_COLOR_INBUILD_LEVEL1 := $(gb_Output_COLOR_RESETANDESCAPE)[36;40m
+gb_Output_COLOR_INBUILD_LEVEL2 := $(gb_Output_COLOR_RESETANDESCAPE)[36;1;40m
+gb_Output_COLOR_INBUILD_LEVEL3 := $(gb_Output_COLOR_RESETANDESCAPE)[32;40m
+gb_Output_COLOR_INBUILD_LEVEL4 := $(gb_Output_COLOR_RESETANDESCAPE)[32;1;40m
+gb_Output_COLOR_INBUILD_LEVEL5 := $(gb_Output_COLOR_RESETANDESCAPE)[37;1;46m
+gb_Output_COLOR_INBUILD_LEVEL6 := $(gb_Output_COLOR_RESETANDESCAPE)[37;1;44m
+
+gb_Output_COLOR_OUTCLEAN_LEVEL1 := $(gb_Output_COLOR_RESETANDESCAPE)[37;40m
+gb_Output_COLOR_OUTCLEAN_LEVEL2 := $(gb_Output_COLOR_RESETANDESCAPE)[37;40m
+gb_Output_COLOR_OUTCLEAN_LEVEL3 := $(gb_Output_COLOR_RESETANDESCAPE)[37;40m
+gb_Output_COLOR_OUTCLEAN_LEVEL4 := $(gb_Output_COLOR_RESETANDESCAPE)[37;40m
+gb_Output_COLOR_OUTCLEAN_LEVEL5 := $(gb_Output_COLOR_RESETANDESCAPE)[33;1;41m
+gb_Output_COLOR_OUTCLEAN_LEVEL6 := $(gb_Output_COLOR_RESETANDESCAPE)[37;1;41m
+
+gb_Output_COLOR_INCLEAN_LEVEL1 := $(gb_Output_COLOR_RESETANDESCAPE)[33;40m
+gb_Output_COLOR_INCLEAN_LEVEL2 := $(gb_Output_COLOR_RESETANDESCAPE)[33;1;40m
+gb_Output_COLOR_INCLEAN_LEVEL3 := $(gb_Output_COLOR_RESETANDESCAPE)[31;40m
+gb_Output_COLOR_INCLEAN_LEVEL4 := $(gb_Output_COLOR_RESETANDESCAPE)[31;1;40m
+gb_Output_COLOR_INCLEAN_LEVEL5 := $(gb_Output_COLOR_RESETANDESCAPE)[33;1;41m
+gb_Output_COLOR_INCLEAN_LEVEL6 := $(gb_Output_COLOR_RESETANDESCAPE)[37;1;41m
+
+gb_Output_COLOR_ERROR := $(gb_Output_COLOR_RESETANDESCAPE)[37;1;41m
+
+define gb_Output__format_type
+$(subst :, ,$(word 2,$(1) \
+ $(gb_Output_COLOR_OUTBUILD_LEVEL$(3))[$(gb_Output_COLOR_INBUILD_LEVEL$(3))$(subst $(WHITESPACE),:,$(2))$(gb_Output_COLOR_OUTBUILD_LEVEL$(3))] \
+ $(gb_Output_COLOR_OUTCLEAN_LEVEL$(3))[$(gb_Output_COLOR_INCLEAN_LEVEL$(3))$(subst $(WHITESPACE),:,$(2))$(gb_Output_COLOR_OUTCLEAN_LEVEL$(3))]))$(gb_Output_COLOR_RESET)
+endef
+
+define gb_Output_info
+$(info $(gb_Output_COLOR_OUTBUILD_LEVEL6)[$(gb_Output_COLOR_INBUILD_LEVEL6)info $(2)$(gb_Output_COLOR_OUTBUILD_LEVEL6)]$(gb_Output_COLOR_RESET) $(1))
+endef
+
+define gb_Output_warn
+$(warning $(NEWLINE)$(gb_Output_COLOR_OUTCLEAN_LEVEL6)[$(gb_Output_COLOR_INCLEAN_LEVEL6)WARN $(2)$(gb_Output_COLOR_OUTCLEAN_LEVEL6)]$(gb_Output_COLOR_RESET) !!!$(NEWLINE)$(gb_Output_COLOR_OUTCLEAN_LEVEL6)[$(gb_Output_COLOR_INCLEAN_LEVEL6)WARN $(2)$(gb_Output_COLOR_OUTCLEAN_LEVEL6)]$(gb_Output_COLOR_RESET) !!! $(1)$(NEWLINE)$(gb_Output_COLOR_OUTCLEAN_LEVEL6)[$(gb_Output_COLOR_INCLEAN_LEVEL6)WARN $(2)$(gb_Output_COLOR_OUTCLEAN_LEVEL6)]$(gb_Output_COLOR_RESET) !!!)
+endef
+
+define gb_Output_error
+$(error $(gb_Output_COLOR_ERROR)$(1)$(gb_Output_COLOR_RESET))
+endef
+
+endif
+endif
+
+# only enable title output if
+# - gb_TITLES is set
+# - we have a known term
+ifneq ($(strip $(gb_TITLES)),)
+ifneq ($(filter $(TERM),$(gb_KNOWN_TERM)),)
+define gb_Output_announce_title
+$(info $(gb_Output_ESCAPE)]2;gbuild: $(1)$(gb_Output_BELL)$(gb_Output_ESCAPE)[A)
+endef
+
+$(call gb_Output_announce_title,...)
+
+endif
+endif
+
+# only enable bell output if
+# - gb_BELL is set
+# - gb_TTY is true (not piping to a file)
+ifneq ($(strip $(gb_BELL)),)
+define gb_Output_announce_bell
+$(info $(gb_Output_BELL)$(gb_Output_ESCAPE)[A)
+endef
+endif
+
+define gb_Output_announce_str
+$(call gb_Output__format_type,$(2),$(3),$(4)) $(call gb_Output__format_target,$(1))
+endef
+
+define gb_Output_announce
+$(info $(call gb_Output_announce_str,$(1),$(2),$(3),$(4)))
+endef
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/Package.mk b/solenv/gbuild/Package.mk
new file mode 100644
index 000000000..9c90322cf
--- /dev/null
+++ b/solenv/gbuild/Package.mk
@@ -0,0 +1,227 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+
+# PackagePart class
+
+# a pattern rule with multiple targets is actually executed only once for each
+# match, so define only pattern rules with one target here
+# the .dir is for make 3.81, which ignores trailing /
+define gb_PackagePart__rule
+$(1)/.dir :
+ $$(if $$(wildcard $$(dir $$@)),,mkdir -p $$(dir $$@))
+$(1)/%/.dir :
+ $$(if $$(wildcard $$(dir $$@)),,mkdir -p $$(dir $$@))
+$(1)/% :
+ $$(call gb_Deliver_deliver,$$<,$$@)
+endef
+
+$(foreach destination,$(call gb_PackagePart_get_destinations),$(eval \
+ $(call gb_PackagePart__rule,$(destination))))
+
+# Deliver one file to the output dir.
+#
+# gb_PackagePart_PackagePart destfile source prep-target outdir
+define gb_PackagePart_PackagePart
+$(4)/$(1) : $(2) | $(dir $(4)/$(1)).dir
+$(2) :| $(3)
+
+$(if $(gb_Package_PRESTAGEDIR),\
+ $(if $(wildcard $(gb_Package_PRESTAGEDIR)/$(1)),\
+ $(call gb_Deliver_add_deliverable,$(4)/$(1),$(gb_Package_PRESTAGEDIR)/$(1),$(3)),\
+ $(call gb_Deliver_add_deliverable,$(4)/$(1),$(2),$(3)) \
+ ),\
+ $(call gb_Deliver_add_deliverable,$(4)/$(1),$(2),$(3)) \
+)
+
+endef
+
+
+# Package class
+
+$(dir $(call gb_Package_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_Package_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+.PHONY : $(call gb_Package_get_clean_target,%)
+$(call gb_Package_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),PKG,2)
+ RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),500,$(FILES)) \
+ && cat $${RESPONSEFILE} | $(if $(filter WNT,$(OS)),env -i PATH="$$PATH") xargs $(if $(filter MACOSX,$(OS_FOR_BUILD)),-n 1000) rm -fr \
+ && rm -f $${RESPONSEFILE}
+
+$(call gb_Package_get_preparation_target,%) :
+ mkdir -p $(dir $@) && touch $@
+
+# NOTE: It is possible that a file has been added to the package more
+# than once, so we must drop the duplicates, or Windows installer will
+# be unhappy.
+# TODO: this is only for convenience for impl. of gbuild classes. There
+# should be check that it does not happen in "normal" use, i.e., in
+# Package_foo makefiles.
+$(call gb_Package_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),PKG,2)
+ $(call gb_Trace_StartRange,$*,PKG)
+ $(if $(PACKAGE_DEFINED),,$(call gb_Output_error,$(RDEPENDS) depend(s) on package $* which does not exist.))
+ rm -f $@ && \
+ mv $(call gb_var2file,$@.tmp,100,$(sort $(FILES))) $@
+ $(call gb_Trace_EndRange,$*,PKG)
+
+# for other targets that want to create Packages, does not register at Module
+define gb_Package_Package_internal
+gb_Package_SOURCEDIR_$(1) := $(2)
+gb_Package_OUTDIR_$(1) := $(INSTROOT)
+$(call gb_Package_get_target,$(1)) : PACKAGE_DEFINED := $(true)
+$(call gb_Package_get_target,$(1)) : FILES :=
+$(call gb_Package_get_clean_target,$(1)) : FILES := $(call gb_Package_get_target,$(1)) $(call gb_Package_get_preparation_target,$(1))
+$(call gb_Package_get_target,$(1)) : $(call gb_Package_get_preparation_target,$(1))
+$(call gb_Package_get_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+$(call gb_Package_get_target,$(1)) :| $(dir $(call gb_Package_get_target,$(1))).dir
+
+endef
+
+define gb_Package_Package
+$$(if $$(gb_Package_SOURCEDIR_$(1)),$$(call gb_Output_error,gb_Package__check: Package $(1) has already been defined))
+$(if $(filter postprocess% instsetoo_native%,$(1)),,\
+ $(call gb_Postprocess_register_target,AllPackages,Package,$(1)))
+ifeq (,$$(filter $(1),$$(gb_Package_REGISTERED)))
+$$(eval $$(call gb_Output_info,Currently known packages are: $(sort $(gb_Package_REGISTERED)),ALL))
+$$(eval $$(call gb_Output_error,Package $(1) must be registered in Repository.mk or RepositoryExternal.mk))
+endif
+$(call gb_Package_Package_internal,$(1),$(2))
+$$(eval $$(call gb_Module_register_target,$(call gb_Package_get_target,$(1)),$(call gb_Package_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Package)
+
+endef
+
+# Ensure that the package is defined.
+#
+# gb_Package__check package
+define gb_Package__check
+$$(if $$(gb_Package_SOURCEDIR_$(1)),,$$(call gb_Output_error,gb_Package__check: Package $(1) has not been defined))
+
+endef
+
+# Set output dir for the package files.
+#
+# Default is $(INSTROOT).
+#
+# gb_Package_set_outdir package outdir
+define gb_Package_set_outdir
+$(call gb_Package__check,$(1))
+gb_Package_OUTDIR_$(1) := $(2)
+
+endef
+
+# Add empty directory (if it's non-empty, don't use this, use
+# gb_Package_add_file for the files in it instead!)
+define gb_Package_add_empty_directory
+$(call gb_Package__check,$(1))
+$(if $(strip $(2)),,$(call gb_Output_error,gb_Package_add_directory requires 2 arguments))
+$(call gb_Package_get_target,$(1)) :| $$(gb_Package_OUTDIR_$(1))/$(2)/.dir
+$(call gb_Package_get_target,$(1)) : FILES += $$(gb_Package_OUTDIR_$(1))/$(2)
+$(call gb_Package_get_clean_target,$(1)) : FILES += $$(gb_Package_OUTDIR_$(1))/$(2)
+
+endef
+
+# Example:
+# $(eval $(call gb_Package_add_empty_directories,foo_inc,inc/foo))
+# # -> inc/foo
+define gb_Package_add_empty_directories
+$(call gb_Package__check,$(1))
+$(foreach file,$(2),$(call gb_Package_add_empty_directory,$(1),$(file)))
+
+endef
+
+define gb_Package_add_symbolic_link
+$(call gb_Package__check,$(1))
+$(if $(strip $(3)),,$(call gb_Output_error,gb_Package_add_symbolic_link requires 3 arguments))
+$(call gb_Package_get_target,$(1)) : $$(gb_Package_OUTDIR_$(1))/$(2)
+$$(gb_Package_OUTDIR_$(1))/$(2) :| $$(dir $$(gb_Package_OUTDIR_$(1))/$(2)).dir
+ rm -f $$@ && ln -s $(3) $$@
+
+$(call gb_Package_get_target,$(1)) : FILES += $$(gb_Package_OUTDIR_$(1))/$(2)
+$(call gb_Package_get_clean_target,$(1)) : FILES += $$(gb_Package_OUTDIR_$(1))/$(2)
+
+endef
+
+define gb_Package_add_file
+$(call gb_Package__check,$(1))
+$(if $(strip $(3)),,$(call gb_Output_error,gb_Package_add_file requires 3 arguments))
+$(call gb_Package_get_target,$(1)) : $$(gb_Package_OUTDIR_$(1))/$(2)
+$(call gb_Package_get_target,$(1)) : FILES += $$(gb_Package_OUTDIR_$(1))/$(2)
+$(call gb_Package_get_clean_target,$(1)) : FILES += $$(gb_Package_OUTDIR_$(1))/$(2)
+$(call gb_PackagePart_PackagePart,$(2),$$(gb_Package_SOURCEDIR_$(1))/$(3),$(call gb_Package_get_preparation_target,$(1)),$$(gb_Package_OUTDIR_$(1)))
+
+endef
+
+# Adds several files at once.
+#
+# Files are copied directly into the specified directory.
+#
+# Example:
+# $(eval $(call gb_Package_Package,foo_inc,$(SRCDIR)/foo/inc))
+# $(eval $(call gb_Package_add_files,foo_inc,inc/foo,foo/bar/foo.hxx))
+# # -> inc/foo/foo.hxx
+define gb_Package_add_files
+$(call gb_Package__check,$(1))
+$(if $(strip $(3)),,$(if $(filter 1,$(words $(2))),,$(call gb_Output_error,gb_Package_add_files: it looks like either pkg name or dest. dir is missing)))
+$(foreach file,$(3),$(call gb_Package_add_file,$(1),$(2)/$(notdir $(file)),$(file)))
+
+endef
+
+# Adds several files at once.
+#
+# Files are copied including subdirectories.
+#
+# Example:
+# $(eval $(call gb_Package_Package,foo_inc,$(SRCDIR)/foo/inc))
+# $(eval $(call gb_Package_add_files,foo_inc,inc,foo/bar/foo.hxx))
+# # -> inc/foo/bar/foo.hxx
+define gb_Package_add_files_with_dir
+$(call gb_Package__check,$(1))
+$(if $(strip $(3)),,$(if $(filter 1,$(words $(2))),,$(call gb_Output_error,gb_Package_add_files: it looks like either pkg name or dest. dir is missing)))
+$(foreach file,$(3),$(call gb_Package_add_file,$(1),$(2)/$(file),$(file)))
+
+endef
+
+# Package files from custom target
+define gb_Package_use_custom_target
+$(call gb_Package__check,$(1))
+$(call gb_Package_get_preparation_target,$(1)) :| $(call gb_CustomTarget_get_target,$(2))
+
+endef
+
+# Package files from unpacked tarball of an external project
+define gb_Package_use_unpacked
+$(call gb_Package__check,$(1))
+$(call gb_Package_get_preparation_target,$(1)) :| $(call gb_UnpackedTarball_get_target,$(2))
+
+endef
+
+# Package files from build of an external project
+define gb_Package_use_external_project
+$(call gb_Package__check,$(1))
+$(call gb_Package_get_preparation_target,$(1)) :| $(call gb_ExternalProject_get_target,$(2))
+
+endef
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/PackageSet.mk b/solenv/gbuild/PackageSet.mk
new file mode 100644
index 000000000..e85c3ecea
--- /dev/null
+++ b/solenv/gbuild/PackageSet.mk
@@ -0,0 +1,77 @@
+# -*- 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/.
+#
+
+# class PackageSet
+
+# Allows to bundle a set of packages under one name.
+#
+# This is intended to be used by gbuild classes that want to provide a
+# filelist for installer, but for implementation reasons have to use
+# several Packages internally (e.g., because of different source dirs).
+
+$(dir $(call gb_PackageSet_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_PackageSet_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_PackageSet_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),PKS,2)
+ $(call gb_Trace_StartRange,$*,PKS)
+ cat $(sort $(FILELISTS)) > $@
+ $(call gb_Trace_EndRange,$*,PKS)
+
+.PHONY : $(call gb_PackageSet_get_clean_target,%)
+$(call gb_PackageSet_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),PKS,2)
+ rm -f $(call gb_PackageSet_get_target,$*)
+
+# Create and register a package set.
+#
+# gb_PackageSet_PackageSet set
+define gb_PackageSet_PackageSet
+$(call gb_PackageSet_PackageSet_internal,$(1))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_PackageSet_get_target,$(1)),$(call gb_PackageSet_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),PackageSet)
+
+endef
+
+# Create a package set.
+#
+# gb_PackageSet_PackageSet_internal set
+define gb_PackageSet_PackageSet_internal
+$(call gb_PackageSet_get_target,$(1)) : FILELISTS :=
+
+$(call gb_PackageSet_get_target,$(1)) :| $(dir $(call gb_PackageSet_get_target,$(1))).dir
+
+endef
+
+# Add a package to the set.
+#
+# A package can be added more than once.
+#
+# gb_PackageSet_add_package set package
+define gb_PackageSet_add_package
+$(call gb_PackageSet_get_target,$(1)) : FILELISTS += $(call gb_Package_get_target,$(2))
+
+$(call gb_PackageSet_get_target,$(1)) : $(call gb_Package_get_target,$(2))
+$(call gb_PackageSet_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(2))
+
+endef
+
+# Add several packages to the set at once.
+#
+# gb_PackageSet_add_packages set package(s)
+define gb_PackageSet_add_packages
+$(foreach package,$(2),$(call gb_PackageSet_add_package,$(1),$(package)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/Pagein.mk b/solenv/gbuild/Pagein.mk
new file mode 100644
index 000000000..606596ce2
--- /dev/null
+++ b/solenv/gbuild/Pagein.mk
@@ -0,0 +1,61 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+gb_Pagein__is_library = $(filter $(1),$(gb_Library_KNOWNLIBS))
+
+gb_Pagein__make_library_path = $(call gb_Library_get_runtime_filename,$(1))
+
+gb_Pagein__make_path = \
+$(if $(call gb_Pagein__is_library,$(1)),$(call gb_Pagein__make_library_path,$(1)),$(1))
+
+gb_Pagein__get_install_target = $(INSTROOT)/$(LIBO_BIN_FOLDER)/pagein-$(1)
+
+define gb_Pagein__command
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && rm -f $(1) \
+ && touch $(1) \
+ $(foreach object,$(OBJECTS),&& echo $(call gb_Pagein__make_path,$(object)) >> $(1)))
+
+endef
+
+.PHONY : $(call gb_Pagein_get_clean_target,%)
+$(call gb_Pagein_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),PAG,5)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_Pagein__get_install_target,$*) $(call gb_Pagein_get_target,$*))
+
+$(call gb_Pagein_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),PAG,5)
+ $(call gb_Trace_StartRange,$*,PAG)
+ $(call gb_Pagein__command,$@,$*,$^)
+ $(call gb_Trace_EndRange,$*,PAG)
+
+define gb_Pagein_Pagein
+$(call gb_Pagein_get_target,$(1)) : OBJECTS :=
+$(call gb_Pagein_get_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+$$(eval $$(call gb_Module_register_target,$(call gb_Pagein__get_install_target,$(1)),$(call gb_Pagein_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Pagein,$(call gb_Pagein_get_target,$(1)))
+
+$(call gb_Helper_install_final, \
+ $(call gb_Pagein__get_install_target,$(1)), \
+ $(call gb_Pagein_get_target,$(1)))
+
+endef
+
+define gb_Pagein_add_object
+$(call gb_Pagein_get_target,$(1)) : OBJECTS += $(filter-out $(gb_MERGEDLIBS),$(2))
+
+endef
+
+define gb_Pagein_add_objects
+$(foreach object,$(2),$(call gb_Pagein_add_object,$(1),$(object)))
+
+endef
+
+# vim: set ts=4 sw=4 noet:
diff --git a/solenv/gbuild/Postprocess.mk b/solenv/gbuild/Postprocess.mk
new file mode 100644
index 000000000..2c1dfd2f4
--- /dev/null
+++ b/solenv/gbuild/Postprocess.mk
@@ -0,0 +1,56 @@
+# -*- 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/.
+#
+
+$(dir $(call gb_Postprocess_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_Postprocess_get_target,%) :
+ $(call gb_Output_announce,$(POSTPROCESS_INFO): $(if $(POSTPROCESS_PREFIX),$(subst $(POSTPROCESS_PREFIX),,$^),$^),$(true),ALL,6)
+ $(call gb_Trace_MakeMark,$(POSTPROCESS_INFO): $(if $(POSTPROCESS_PREFIX),$(subst $(POSTPROCESS_PREFIX),,$^),$^),ALL)
+ touch $@
+
+.PHONY : $(call gb_Postprocess_get_clean_target,%)
+$(call gb_Postprocess_get_clean_target,%) :
+ $(call gb_Output_announce,$(POSTPROCESS_INFO): $(if $(POSTPROCESS_PREFIX),$(subst $(POSTPROCESS_PREFIX),,$^),$^),$(false),ALL,6)
+ rm -f $(call gb_Postprocess_get_target,$*)
+
+define gb_Postprocess_Postprocess
+$(call gb_Postprocess_get_target,$(1)) : POSTPROCESS_INFO := $(2)
+$(call gb_Postprocess_get_target,$(1)) : POSTPROCESS_PREFIX := $(3)
+$(call gb_Postprocess_get_clean_target,$(1)) : POSTPROCESS_INFO := $(2)
+$(call gb_Postprocess_get_clean_target,$(1)) : POSTPROCESS_PREFIX := $(subst $(WORKDIR),$(WORKDIR)/Clean,$(3))
+
+$(call gb_Postprocess_get_target,$(1)) :| $(dir $(call gb_Postprocess_get_target,$(1))).dir
+
+$(call gb_Helper_make_userfriendly_targets,$(1),Postprocess)
+
+endef
+
+# gb_Postprocess_register_target category class targetname
+define gb_Postprocess_register_target
+$(call gb_Postprocess_get_target,$(1)) : $(call gb_$(2)_get_target,$(3))
+$(call gb_Postprocess_get_clean_target,$(1)) : $(call gb_$(2)_get_clean_target,$(3))
+
+endef
+
+define gb_Postprocess_make_targets
+$(call gb_Postprocess_Postprocess,AllExecutables,All executables)
+$(call gb_Postprocess_Postprocess,AllLibraries,All libraries)
+$(call gb_Postprocess_Postprocess,AllModulesButInstsetNative,All modules but instset,$(WORKDIR)/Module/)
+$(call gb_Postprocess_Postprocess,AllPackages,All packages,$(WORKDIR)/Package/)
+$(call gb_Postprocess_Postprocess,AllResources,All resources,$(WORKDIR)/AllLangRes/)
+$(call gb_Postprocess_Postprocess,AllUIConfigs,All UI configuration files,$(WORKDIR)/UIConfig/)
+$(call gb_Postprocess_Postprocess,AllModuleTests,All modules' tests,$(WORKDIR)/Module/check/)
+$(call gb_Postprocess_Postprocess,AllModuleSlowtests,All modules' slowtests,$(WORKDIR)/Module/slowcheck/)
+$(call gb_Postprocess_Postprocess,AllModuleScreenshots,All modules' screenshots,$(WORKDIR)/Module/screenshot/)
+$(call gb_Postprocess_Postprocess,AllModuleUITests,All modules' uitests,$(WORKDIR)/Module/uicheck/)
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/PrecompiledHeaders.mk b/solenv/gbuild/PrecompiledHeaders.mk
new file mode 100644
index 000000000..b6d3ecdfe
--- /dev/null
+++ b/solenv/gbuild/PrecompiledHeaders.mk
@@ -0,0 +1,184 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+
+# PrecompiledHeader class
+
+# Use different PCH file depending on whether we use debugging symbols.
+gb_PrecompiledHeader__get_debugdir = $(if $(call gb_target_symbols_enabled,$(1)),debug,nodebug)
+
+# $(call gb_PrecompiledHeader_generate_timestamp_rule,linktargetmakefilename)
+define gb_PrecompiledHeader_generate_timestamp_rule
+$(call gb_LinkTarget_get_pch_timestamp,$(1)) :
+ mkdir -p $$(dir $$@) && touch $$@
+
+endef
+
+ifneq ($(gb_ENABLE_PCH),)
+
+# IMPORTANT: Since these defines get expanded, every $ needs to be doubled to $$, except
+# for $(1)'s and things that are constant.
+# The defines are needed to get the right version of gb_PrecompiledHeader__get_debugdir.
+
+# all cxxflags to use for compilation
+gb_PrecompiledHeader_cxxflags_includes := $$(PCH_DEFS) $$(PCH_CXXFLAGS) $$(gb_PrecompiledHeader_EXCEPTIONFLAGS)
+# flags to save to the .flags file to check if they are the same as last time
+# (note: the leading space in sed is important, to remove the option and its separating space)
+gb_PrecompiledHeader_flags_for_flags_file := $$(sort $(gb_PrecompiledHeader_cxxflags_includes)) \
+ $(if $(gb_PrecompiledHeader_ignore_flags_for_flags_file),| sed 's/ $(gb_PrecompiledHeader_ignore_flags_for_flags_file)//')
+
+# $(call gb_PrecompiledHeader_generate_rules,pchtarget,linktarget,linktargetmakefilename,pchcxxfile,compiler)
+define gb_PrecompiledHeader_generate_rules
+
+$(call gb_PrecompiledHeader_get_dep_target,$(1),$(3)) :
+ $$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $$(dir $$@) && \
+ echo "$$(call gb_PrecompiledHeader_get_target,$(1),$(3)) : $$(gb_Helper_PHONY)" > $$@)
+
+# keep the flags the PCH was built with in a separate file, update the file if and only if the flags
+# change, and make the PCH depend on it => the PCH will be rebuilt on any flags change
+.PHONY: force
+$(call gb_PrecompiledHeader_get_flags_file,$(1),$(3)) : force
+ $$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $$(dir $$@) && \
+ echo $(gb_PrecompiledHeader_flags_for_flags_file) | cmp -s - $$@ \
+ || echo $(gb_PrecompiledHeader_flags_for_flags_file) > $$@)
+
+# despite this being only one .d file, need to run concat-deps on it to
+# re-write external headers from UnpackedTarball
+$(call gb_PrecompiledHeader_get_target,$(1),$(3)) :
+ test "$$(PCH_LINKTARGETMAKEFILENAME)" = "$(3)" \
+ || ( echo "Error, PCH $(1) built by $$(PCH_LINKTARGETMAKEFILENAME) instead of $(3)" >&2; exit 1)
+ rm -f $$@
+ $$(call gb_PrecompiledHeader__command,$$@,$(1),$$<,$(gb_PrecompiledHeader_cxxflags_includes),$$(INCLUDE),$(3),$(5))
+ $$(call gb_PrecompiledHeader__sum_command,$$@,$(1),$$<,$(gb_PrecompiledHeader_cxxflags_includes),$$(INCLUDE),$(3),$(5))
+ifeq ($(gb_FULLDEPS),$(true))
+ $$(call gb_Helper_abbreviate_dirs,\
+ RESPONSEFILE=$$(call gb_var2file,$$(shell $$(gb_MKTEMP)),200,$$(call gb_PrecompiledHeader_get_dep_target_tmp,$(1),$(3))) && \
+ $$(call gb_Executable_get_command,concat-deps) $$$${RESPONSEFILE} \
+ > $$(call gb_PrecompiledHeader_get_dep_target,$(1),$(3)) && \
+ rm -f $$$${RESPONSEFILE} $$(call gb_PrecompiledHeader_get_dep_target_tmp,$(1),$(3)))
+endif
+
+$(call gb_PrecompiledHeader_get_for_reuse_target,$(1),$(3)) : $(call gb_LinkTarget_get_target,$(2))
+ $$(call gb_PrecompiledHeader__create_reuse_files,$(2),$(1),$(3))
+ mkdir -p $$(dir $$@) && touch $$@
+
+.PHONY : $(call gb_PrecompiledHeader_get_clean_target,$(1))
+$(call gb_PrecompiledHeader_get_clean_target,$(1)) :
+ $$(call gb_Output_announce,$(1),$(false),PCH,1)
+ -$$(call gb_Helper_abbreviate_dirs,\
+ rm -f $$(call gb_PrecompiledHeader_get_target,$(1),$(3)) \
+ $$(call gb_PrecompiledHeader_get_target,$(1),$(3)).obj \
+ $$(call gb_PrecompiledHeader_get_target,$(1),$(3)).pdb \
+ $$(call gb_PrecompiledHeader_get_target,$(1),$(3)).sum \
+ $$(call gb_PrecompiledHeader_get_flags_file,$(1),$(3)) \
+ $$(call gb_PrecompiledHeader_get_for_reuse_target,$(1),$(3)) \
+ $$(call gb_PrecompiledHeader_get_dep_target,$(1),$(3)))
+
+endef
+
+# $(call gb_PrecompiledHeader_check_flags,linktargetmakefilename,pchcxxfile,pchfile,flags)
+# When creating a PCH, the PCH's CXXFLAGS are saved to a matching .flags file. When reusing the PCH
+# from another linktarget, use the file to check that the linktarget uses the same CXXFLAGS as the PCH.
+# This complements the check in gb_CxxObject__set_pchflags.
+define gb_PrecompiledHeader_check_flags
+$$(call gb_Helper_abbreviate_dirs,\
+ $$(if $$(strip $$(call gb_PrecompiledHeader_check_flags_internal,$$(shell cat $(4)),$(5),$(2))),false,true) || ( \
+ echo Error reusing $(2) by $(1). >&2 && \
+ echo -n " precompiled header flags : ">&2 && \
+ cat $(4) >&2 && \
+ echo " object flags : "$$(sort $(5)) >&2 && \
+ echo " reason : $$(call gb_PrecompiledHeader_check_flags_internal,$$(shell cat $(4)),$(5),$(2))" >&2 && \
+ echo Incorrect precompiled header setup or internal gbuild error. >&2 ; \
+ exit 1) \
+)
+
+endef
+
+# When trying to reuse one PCH between multiple linktargets, there is a problem that we have
+# various defines that cause mismatch in the check above, but these defines actually should not affect the PCH.
+# Specifically, there are 3 kinds:
+# - -DXXX_DLLIMPLEMENTATION - they are used only in our headers, should not affect system headers.
+# - -DSYSTEM_XXX - they are used only by our code (if at all), should not affect system headers
+# - various LO configuration defines - they again should only be used by our code and not system headers
+# Technically, different compilers handle additional defines like this:
+# - GCC
+# * It is explicitly allowed to have different macros, as long as they do not affect the PCH.
+# * With -Winvalid-pch GCC will even warn if there is a change in a macro affecting the PCH.
+# * https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html
+# - Clang
+# * I could not find an official statement on what happens if definitions are different.
+# * In practice a conflict does not seem to be detected, but the PCH and all the code in it
+# acts according to the settings it was built with. Using a PCH and adding more defines
+# seems to be functionally equivalent to creating the definitions only after the PCH inclusion.
+# * As a side-effect, macros defined on the command line not present in the PCH suddenly
+# trigger the -Wunused-macros warning. See bottom of pch/inc/clangfix.hxx .
+# - MSVC
+# * MSVC explicitly states that the definitions must be the same, but they are not checked,
+# and "unpredictable results can occur" if files depend on them.
+# * In practice the situation seems to be the same as with Clang, the PCH and the code from it
+# act according to the settings it was built with.
+# * https://docs.microsoft.com/en-us/cpp/build/creating-precompiled-header-files
+# So while this is officially tricky, in practice it seems to work to allow PCH reuse if the linktarget
+# has more defines than the PCH was built with, as long as the defines do not affect the PCH.
+gb_PrecompiledHeader_ignore_flags_system := \
+-DFASTSAX_DLLIMPLEMENTATION \
+-DSAX_DLLIMPLEMENTATION \
+-DSCQAHELPER_DLLIMPLEMENTATION \
+-DVCLPLUG_WIN_IMPLEMENTATION \
+-DVCLPLUG_GEN_IMPLEMENTATION \
+-DSYSTEM_EXPAT \
+-DSYSTEM_LIBXML \
+-DSYSTEM_ZLIB \
+-DSYSTEM_NSS \
+-DHAVE_VALGRIND_HEADERS \
+-DUSE_RANDR \
+-DUSE_XINERAMA_XORG \
+-DDISABLE_CVE_TESTS \
+-DCPPUNIT_PLUGIN_EXPORT='extern "C" SAL_DLLPUBLIC_EXPORT' \
+-DOOO_DLLIMPLEMENTATION_TEST \
+-DSK_USER_CONFIG_HEADER=% \
+-DSKIA_DLL \
+-DGLM_FORCE_CTOR_INIT \
+-DVCL_INTERNALS \
+-DZLIB_CONST \
+$(gb_CXXFLAGS_include)$(SRCDIR)/pch/inc/clangfix.hxx \
+$(gb_CXXFLAGS_no_pch_warnings) \
+$(gb_PrecompiledHeader_ignore_flags_for_flags_file) \
+
+# Probably also update pch/inc/clangfix.hxx if you extend the list.
+
+# $(call gb_PrecompiledHeader_check_flags_internal,pchfileflags,flags,pchcxxfile)
+# Check if two sets of flags are compatible, allowing reuse of the PCH. Flags are compatible if
+# - they are the same
+# - the PCH is precompiled_system and the linktarget has additional defines listed above
+define gb_PrecompiledHeader_check_flags_internal
+$(if $(filter-out $(2),$(1)),$(filter-out $(2),$(1)), \
+ $(if $(filter-out $(1),$(2)),\
+ $(if $(filter-out precompiled_system,$(notdir $(3))),$(filter-out $(1),$(2)), \
+ $(foreach flag,$(filter-out $(1),$(2)),$(filter-out $(gb_PrecompiledHeader_ignore_flags_system),$(flag))) \
+ ) \
+ ,) \
+)
+endef
+
+endif
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/PythonTest.mk b/solenv/gbuild/PythonTest.mk
new file mode 100644
index 000000000..4e81261d2
--- /dev/null
+++ b/solenv/gbuild/PythonTest.mk
@@ -0,0 +1,129 @@
+# -*- 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/.
+#
+
+# PythonTest class
+
+# (gb_PythonTest_GDBTRACE et al are defined alongside gb_CppunitTest_GDBTRACE in CppunitTest.mk)
+
+gb_PythonTest_UNITTESTFAILED ?= $(GBUILDDIR)/platform/unittest-failed-default.sh
+
+ifeq ($(SYSTEM_PYTHON),)
+gb_PythonTest_EXECUTABLE := $(gb_Python_INSTALLED_EXECUTABLE)
+gb_PythonTest_EXECUTABLE_GDB := $(gb_Python_INSTALLED_EXECUTABLE_GDB)
+gb_PythonTest_DEPS ?= $(call gb_Package_get_target,python3) $(call gb_Package_get_target,python_shell)
+else
+gb_PythonTest_EXECUTABLE := $(PYTHON_FOR_BUILD)
+gb_PythonTest_EXECUTABLE_GDB := $(PYTHON_FOR_BUILD)
+gb_PythonTest_DEPS :=
+endif
+
+gb_PythonTest_COMMAND := $(gb_PythonTest_EXECUTABLE) -m org.libreoffice.unittest
+
+.PHONY : $(call gb_PythonTest_get_clean_target,%)
+$(call gb_PythonTest_get_clean_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -fr $(WORKDIR)/PythonTest/$*)
+
+ifneq ($(DISABLE_PYTHON),TRUE)
+
+.PHONY : $(call gb_PythonTest_get_target,%)
+$(call gb_PythonTest_get_target,%) :\
+ $(call gb_Library_get_target,pyuno) \
+ $(if $(filter-out WNT,$(OS)),$(call gb_Library_get_target,pyuno_wrapper)) \
+ | $(gb_PythonTest_DEPS)
+ifneq ($(gb_SUPPRESS_TESTS),)
+ @true
+else
+ $(call gb_Output_announce,$*,$(true),PYT,2)
+ $(call gb_Trace_StartRange,$*,PYT)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(dir $(call gb_PythonTest_get_target,$*)) && \
+ mkdir -p $(dir $(call gb_PythonTest_get_target,$*))user/user/autotext && \
+ $(if $(gb_CppunitTest__interactive),, \
+ $(if $(value gb_CppunitTest_postprocess), \
+ rm -fr $@.core && mkdir $@.core && cd $@.core &&)) \
+ { \
+ $(if $(filter gdb,$(gb_PythonTest_GDBTRACE)),,$(gb_PythonTest_PRECOMMAND)) \
+ $(if $(G_SLICE),G_SLICE=$(G_SLICE)) \
+ $(if $(GLIBCXX_FORCE_NEW),GLIBCXX_FORCE_NEW=$(GLIBCXX_FORCE_NEW)) \
+ $(DEFS) \
+ TEST_LIB=$(call gb_Library_get_target,test) \
+ URE_BOOTSTRAP=vnd.sun.star.pathname:$(call gb_Helper_get_rcfile,$(INSTROOT)/$(LIBO_ETC_FOLDER)/fundamental) \
+ PYTHONPATH="$(PYPATH)" \
+ UserInstallation=$(call gb_Helper_make_url,$(dir $(call gb_PythonTest_get_target,$*))user) \
+ TestUserDir="$(call gb_Helper_make_url,$(dir $(call gb_PythonTest_get_target,$*)))" \
+ PYTHONDONTWRITEBYTECODE=1 \
+ $(gb_TEST_ENV_VARS) \
+ $(ICECREAM_RUN) $(gb_PythonTest_GDBTRACE) $(gb_CppunitTest_VALGRINDTOOL) $(gb_CppunitTest_RR) \
+ $(gb_PythonTest_COMMAND) \
+ $(if $(PYTHON_TEST_NAME),$(PYTHON_TEST_NAME),$(MODULES)) \
+ ; } \
+ $(if $(gb_CppunitTest__interactive),, \
+ > $@.log 2>&1 \
+ || ($(if $(value gb_CppunitTest_postprocess), \
+ RET=$$?; \
+ $(call gb_CppunitTest_postprocess,$(gb_PythonTest_EXECUTABLE_GDB),$@.core,$$RET) >> $@.log 2>&1;) \
+ cat $@.log; $(gb_PythonTest_UNITTESTFAILED) Python $*)))
+ $(call gb_Trace_EndRange,$*,PYT)
+endif
+
+# always use udkapi and URE services
+define gb_PythonTest_PythonTest
+$(call gb_PythonTest_get_target,$(1)) : PYPATH := $(SRCDIR)/unotest/source/python$$(gb_CLASSPATHSEP)$(INSTROOT)/$(LIBO_LIB_PYUNO_FOLDER)$(if $(filter-out $(LIBO_LIB_PYUNO_FOLDER),$(LIBO_LIB_FOLDER)),$(gb_CLASSPATHSEP)$(INSTROOT)/$(LIBO_LIB_FOLDER))
+$(call gb_PythonTest_get_target,$(1)) : MODULES :=
+
+$(eval $(call gb_Module_register_target,$(call gb_PythonTest_get_target,$(1)),$(call gb_PythonTest_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),PythonTest)
+
+endef
+
+define gb_PythonTest_set_defs
+$(call gb_PythonTest_get_target,$(1)) : DEFS := $(2)
+
+endef
+
+# put the directory on the PYTHONPATH because the "unittest" loader
+# mysteriously fails to load modules given as absolute path unless the $PWD is
+# a prefix of the absolute path, which it is not when we go into a certain
+# dir to get a core dump there
+#
+# gb_PythonTest_add_modules directory module(s)
+define gb_PythonTest_add_modules
+$(call gb_PythonTest_get_target,$(1)) : PYPATH := $$(PYPATH)$$(gb_CLASSPATHSEP)$(2)
+$(call gb_PythonTest_get_target,$(1)) : MODULES += $(3)
+
+endef
+
+define gb_PythonTest_use_customtarget
+$(call gb_PythonTest_get_target,$(1)) : $(call gb_CustomTarget_get_workdir,$(2))
+
+endef
+
+
+else # DISABLE_PYTHON
+
+.PHONY : $(call gb_PythonTest_get_target,$(1))
+$(call gb_PythonTest_get_target,%) :
+ifeq ($(gb_SUPPRESS_TESTS),)
+ $(call gb_Output_announce,$* (skipped - no PythonTest),$(true),PYT,2)
+endif
+ @true
+
+define gb_PythonTest_PythonTest
+$(eval $(call gb_Module_register_target,$(call gb_PythonTest_get_target,$(1)),$(call gb_PythonTest_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),PythonTest)
+
+endef
+
+gb_PythonTest_set_defs :=
+gb_PythonTest_add_modules :=
+gb_PythonTest_use_customtarget :=
+
+endif # DISABLE_PYTHON
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/Pyuno.mk b/solenv/gbuild/Pyuno.mk
new file mode 100644
index 000000000..3e5cb820f
--- /dev/null
+++ b/solenv/gbuild/Pyuno.mk
@@ -0,0 +1,79 @@
+# -*- 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/.
+#
+
+# class Pyuno
+#
+# Handles creation and delivery of Python UNO components.
+#
+# Provides one filelist, called Pyuno/<name>.
+
+$(dir $(call gb_Pyuno_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_Pyuno_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_Pyuno_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),PYU,3)
+ $(call gb_Trace_MakeMark,$*,PYU)
+ touch $@
+
+$(call gb_Pyuno_get_final_target,%) :
+ touch $@
+
+.PHONY : $(call gb_Pyuno_get_clean_target,%)
+$(call gb_Pyuno_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),PYU,3)
+ rm -f $(call gb_Pyuno_get_target,$*) $(call gb_Pyuno_get_final_target,$*)
+
+gb_Pyuno_get_packagename = Pyuno/$(1)
+
+# gb_Pyuno_Pyuno component
+define gb_Pyuno_Pyuno
+$(call gb_Package_Package_internal,$(call gb_Pyuno_get_packagename,$(1)),$(2))
+
+$(call gb_Pyuno_get_final_target,$(1)) : $(call gb_Pyuno_get_target,$(1))
+$(call gb_Pyuno_get_target,$(1)) : $(call gb_Package_get_target,$(call gb_Pyuno_get_packagename,$(1)))
+$(call gb_Pyuno_get_target,$(1)) :| $(dir $(call gb_Pyuno_get_target,$(1))).dir
+$(call gb_Pyuno_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(call gb_Pyuno_get_packagename,$(1)))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_Pyuno_get_final_target,$(1)),$(call gb_Pyuno_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Pyuno,$(call gb_Pyuno_get_final_target,$(1)))
+
+endef
+
+# gb_Pyuno_add_file component destination source
+define gb_Pyuno_add_file
+$(call gb_Package_add_file,$(call gb_Pyuno_get_packagename,$(1)),$(LIBO_LIB_PYUNO_FOLDER)/$(2),$(3))
+
+endef
+
+# gb_Pyuno_add_files component destdir source
+define gb_Pyuno_add_files
+$(foreach file,$(3),$(call gb_Pyuno_add_file,$(1),$(if $(strip $(2)),$(strip $(2))/)$(file),$(file)))
+
+endef
+
+gb_Pyuno__COMPONENTPREFIX := vnd.openoffice.pymodule:
+
+define gb_Pyuno_set_componentfile_full
+$(call gb_ComponentTarget_ComponentTarget,$(2),$(3),$(4),$(5))
+$(call gb_Pyuno_get_final_target,$(1)) : $(call gb_ComponentTarget_get_target,$(2))
+$(call gb_ComponentTarget_get_target,$(2)) : $(call gb_Pyuno_get_target,$(1))
+$(call gb_Pyuno_get_clean_target,$(1)) : $(call gb_ComponentTarget_get_clean_target,$(2))
+
+endef
+
+# Set .component file for the component.
+define gb_Pyuno_set_componentfile
+$(call gb_Pyuno_set_componentfile_full,$(1),$(2),$(gb_Pyuno__COMPONENTPREFIX),$(1),$(3))
+
+endef
+
+# vim:set shiftwidth=4 tabstop=4 noexpandtab:
diff --git a/solenv/gbuild/README b/solenv/gbuild/README
new file mode 100644
index 000000000..e99f96fa4
--- /dev/null
+++ b/solenv/gbuild/README
@@ -0,0 +1,17 @@
+
+GBuild is a set of makefile macros built on top of gmake that attempts to simplify LibreOffice development.
+
+See
+ https://wiki.documentfoundation.org/Development/Build_System
+for online build-system documentation.
+
+See
+ https://web.archive.org/web/20130911015536/http://wiki.openoffice.org/wiki/Build_Environment_Effort/Module_Migration
+for an archived overview of the new build system.
+
+See
+ ./solenv/doc/gbuild
+for a commented class/API hierarchy of gbuild written in C++ syntax. It was not
+intended for any use beyond to generate nicelooking docs with the doxygen
+doxygen documentation generator from it. It likely is quite outdated these
+days.
diff --git a/solenv/gbuild/Rdb.mk b/solenv/gbuild/Rdb.mk
new file mode 100644
index 000000000..45058888d
--- /dev/null
+++ b/solenv/gbuild/Rdb.mk
@@ -0,0 +1,75 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+gb_Rdb__get_install_target = $(INSTROOT)/$(LIBO_ETC_FOLDER)/services/$(1).rdb
+
+define gb_Rdb__command
+$(call gb_Helper_abbreviate_dirs,\
+ RESPONSEFILE=$(call gb_var2file,$(shell $(call gb_MKTEMP)),70,\
+ <list> \
+ $(foreach component,$(COMPONENTS),\
+ <filename>$(call gb_ComponentTarget_get_target,$(component))</filename>) \
+ </list>) && \
+ mkdir -p $(dir $@) && \
+ $(call gb_ExternalExecutable_get_command,xsltproc) --nonet -o $(1) \
+ $(SRCDIR)/solenv/bin/packcomponents.xslt $$RESPONSEFILE && \
+ rm $$RESPONSEFILE)
+endef
+
+$(call gb_Rdb_get_target,%) :| $(call gb_ExternalExecutable_get_dependencies,xsltproc)
+ $(call gb_Output_announce,$*,$(true),RDB,1)
+ $(call gb_Trace_StartRange,$*,RDB)
+ $(call gb_Rdb__command,$@,$*,$?,$^)
+ $(call gb_Trace_EndRange,$*,RDB)
+
+.PHONY : $(call gb_Rdb_get_clean_target,%)
+$(call gb_Rdb_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),RDB,1)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_Rdb__get_install_target,$*) $(call gb_Rdb_get_target,$*))
+
+define gb_Rdb__Rdb_impl
+# gb_Rdb_add_component, which adds to the target-specific COMPONENTS variable, can be called (from
+# gb_ComponentTarget_ComponentTarget) before gb_Rdb__Rdb_impl is called, so using `COMPONENTS :=`
+# here could lose content; but still use `COMPONENTS ?=` here to establish COMPONENTS as target-
+# specific even in the corner case of an empty Rdb with no gb_Rdb_add_component calls, so that the
+# use of $(COMPONENTS) in gb_Rdb__command would not accidentally pick a global COMPONENTS variable:
+$(call gb_Rdb_get_target,$(1)) : COMPONENTS ?=
+$(call gb_Rdb_get_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+$$(eval $$(call gb_Module_register_target,$(2),$(call gb_Rdb_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Rdb,$(2))
+
+endef
+
+define gb_Rdb_Rdb
+$(call gb_Rdb__Rdb_impl,$(1),$(call gb_Rdb_get_target,$(1)))
+
+endef
+
+# FIXME this needs some layer-like thing for the special case in URE
+define gb_Rdb_Rdb_install
+$(call gb_Rdb__Rdb_impl,$(1),$(if $(2),$(INSTROOT)/$(2),$(call gb_Rdb__get_install_target,$(1))))
+$(call gb_Helper_install_final, \
+ $(if $(2),$(INSTROOT)/$(2),$(call gb_Rdb__get_install_target,$(1))), \
+ $(call gb_Rdb_get_target,$(1)))
+
+endef
+
+define gb_Rdb_add_component
+$(call gb_Rdb_get_target,$(1)) : $(call gb_ComponentTarget_get_target,$(2))
+$(call gb_Rdb_get_target,$(1)) : COMPONENTS += $(2)
+
+endef
+
+define gb_Rdb_add_components
+$(foreach component,$(2),$(call gb_Rdb_add_component,$(1),$(component)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/SdiTarget.mk b/solenv/gbuild/SdiTarget.mk
new file mode 100644
index 000000000..ed98bdbfa
--- /dev/null
+++ b/solenv/gbuild/SdiTarget.mk
@@ -0,0 +1,83 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# SdiTarget class
+gb_SdiTarget_SVIDLDEPS := $(call gb_Executable_get_runtime_dependencies,svidl)
+gb_SdiTarget_SVIDLCOMMAND := $(call gb_Executable_get_command,svidl)
+
+$(call gb_SdiTarget_get_target,%) : $(SRCDIR)/%.sdi $(gb_SdiTarget_SVIDLDEPS)
+ $(call gb_Output_announce,$*,$(true),SDI,1)
+ $(call gb_Trace_StartRange,$*,SDI)
+ $(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $@))
+ $(call gb_Helper_abbreviate_dirs,\
+ cd $(dir $<) && \
+ $(gb_SdiTarget_SVIDLCOMMAND) -quiet \
+ $(INCLUDE) \
+ -fs$@.hxx \
+ -fx$(EXPORTS) \
+ -fm$@ \
+ $(if $(gb_FULLDEPS),-fM$(call gb_SdiTarget_get_dep_target,$*)) \
+ $< \
+ && touch $@.hxx)
+ $(call gb_Trace_EndRange,$*,SDI)
+# touch the hxx file so it's newer than the target - the .hxx only occurs in
+# generated .d files, so it's not a target yet when building from scratch!
+
+# rule necessary to rebuild cxx files that include the header
+$(call gb_SdiTarget_get_target,%.hxx) : $(call gb_SdiTarget_get_target,%)
+ touch $@
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(dir $(call gb_SdiTarget_get_dep_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_SdiTarget_get_dep_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_SdiTarget_get_dep_target,%) :
+ $(if $(wildcard $@),touch $@)
+endif
+
+.PHONY : $(call gb_SdiTarget_get_clean_target,%)
+$(call gb_SdiTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),SDI,1)
+ -$(call gb_Helper_abbreviate_dirs,\
+ rm -f \
+ $(call gb_SdiTarget_get_target,$*).hxx \
+ $(call gb_SdiTarget_get_dep_target,$*) \
+ $(call gb_SdiTarget_get_target,$*))
+
+define gb_SdiTarget_SdiTarget
+$(call gb_SdiTarget_get_target,$(1)) : \
+ INCLUDE := -I$(SRCDIR)/include $(SOLARINC) -I$$(dir $(SRCDIR)/$(1))
+$(call gb_SdiTarget_get_target,$(1)) : EXPORTS := $(SRCDIR)/$(2).sdi
+ifeq ($(gb_FULLDEPS),$(true))
+-include $(call gb_SdiTarget_get_dep_target,$(1))
+$(call gb_SdiTarget_get_dep_target,$(1)) :| $(dir $(call gb_SdiTarget_get_dep_target,$(1))).dir
+endif
+$(call gb_Helper_make_userfriendly_targets,$(1),SdiTarget)
+endef
+
+define gb_SdiTarget_set_include
+$(call gb_SdiTarget_get_target,$(1)) : INCLUDE := $(2)
+
+endef
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/StaticLibrary.mk b/solenv/gbuild/StaticLibrary.mk
new file mode 100644
index 000000000..e310dc903
--- /dev/null
+++ b/solenv/gbuild/StaticLibrary.mk
@@ -0,0 +1,118 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+
+# Static Library class
+
+# defined globally in gbuild.mk
+# defined by platform
+# gb_StaticLibrary_get_filename
+# gb_StaticLibrary_PLAINEXT
+# gb_StaticLibrary_StaticLibrary_platform
+
+
+# EVIL: gb_StaticLibrary and gb_Library need the same deliver rule because they are indistinguishable on windows
+.PHONY : $(WORKDIR)/Clean/StaticLibrary/%
+$(WORKDIR)/Clean/StaticLibrary/% :
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(AUXTARGETS))
+
+define gb_StaticLibrary_StaticLibrary
+$(call gb_StaticLibrary__StaticLibrary_impl,$(1),$(call gb_StaticLibrary_get_linktarget,$(1)))
+
+endef
+
+# call gb_StaticLibrary__StaticLibrary_impl,staticlib,linktarget
+define gb_StaticLibrary__StaticLibrary_impl
+$(call gb_LinkTarget_LinkTarget,$(2),StaticLibrary_$(1),NONE)
+$(call gb_LinkTarget_set_targettype,$(2),StaticLibrary)
+$(call gb_StaticLibrary_get_clean_target,$(1)) : $(call gb_LinkTarget_get_clean_target,$(2))
+$(call gb_StaticLibrary_get_clean_target,$(1)) : AUXTARGETS :=
+$(call gb_StaticLibrary_StaticLibrary_platform,$(1),$(2))
+$$(eval $$(call gb_Module_register_target,$(call gb_StaticLibrary_get_target,$(1)),$(call gb_StaticLibrary_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),StaticLibrary)
+
+endef
+
+# forward the call to the gb_LinkTarget implementation
+# (note: because the function name is in $(1), the other args are shifted by 1)
+define gb_StaticLibrary__forward_to_Linktarget
+$(call gb_LinkTarget_$(subst gb_StaticLibrary_,,$(1)),$(call gb_StaticLibrary_get_linktarget,$(2)),$(3),$(4),StaticLibrary_$(2))
+
+endef
+
+# copy pasta for forwarding: this could be (and was) done more elegantly, but
+# these here can be found by both git grep and ctags
+gb_StaticLibrary_add_cobject = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_cobjects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_cxxobject = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_cxxobjects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_objcxxobject = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_objcxxobjects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_cxxclrobject = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_cxxclrobjects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_asmobject = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_asmobjects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_exception_objects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_x64_generated_exception_objects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_generated_cobjects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_x64_generated_cobjects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_generated_exception_objects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_generated_objcobjects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_generated_objcxxobjects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_generated_nasmobjects = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_cflags = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_cxxflags = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_objcflags = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_objcxxflags = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_nasmflags = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_cxxclrflags = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_defs = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_include = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_ldflags = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_ldflags = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_x64 = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_libs = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_library_path_flags = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_api = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_sdk_api = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_udk_api = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_internal_api = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_internal_bootstrap_api = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_internal_comprehensive_api = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_external = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_externals = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_custom_headers = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_package = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_packages = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_unpacked = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_external_project = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_static_libraries = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_add_sdi_headers = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_precompiled_header = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_reuse_precompiled_header = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_common_precompiled_header = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_warnings_not_errors = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_warnings_disabled = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_external_code = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_generated_cxx_suffix = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_use_clang = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+gb_StaticLibrary_set_clang_precompiled_header = $(call gb_StaticLibrary__forward_to_Linktarget,$(0),$(1),$(2),$(3))
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/TargetLocations.mk b/solenv/gbuild/TargetLocations.mk
new file mode 100644
index 000000000..32d7eed72
--- /dev/null
+++ b/solenv/gbuild/TargetLocations.mk
@@ -0,0 +1,487 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# outdir target pattern
+
+# these are hard-coded to URE for now since there are so few of them...
+gb_CliLibrary_get_target = $(INSTROOT)/$(LIBO_URE_LIB_FOLDER)/$(1)$(gb_CliLibrary_EXT)
+gb_CliNativeLibrary_get_target = $(INSTROOT)/$(LIBO_URE_LIB_FOLDER)/$(1)$(gb_CliNativeLibrary_EXT)
+gb_CliUnoApi_get_target = $(INSTROOT)/$(if $(filter cli_uretypes,$(1)),$(LIBO_URE_LIB_FOLDER),$(LIBO_LIB_FOLDER))/$(1)$(gb_CliUnoApi_EXT)
+gb_PackagePart_get_destinations = \
+ $(INSTDIR) \
+ $(WORKDIR)/unittest \
+
+# kind of lame but with just 3 of these why bother with registration etc.
+gb_UnoApi_get_target = $(INSTROOT)/$(if $(filter udkapi,$(1)),$(LIBO_URE_MISC_FOLDER)/types,$(LIBO_ETC_FOLDER)/types/$(1)).rdb
+gb_UnoApi_get_target_for_build = $(INSTROOT_FOR_BUILD)/$(if $(filter udkapi,$(1)),$(LIBO_URE_MISC_FOLDER_FOR_BUILD)/types,$(LIBO_ETC_FOLDER)/types/$(1)).rdb
+
+# workdir target patterns
+
+gb_AutoInstall_get_target = $(WORKDIR)/AutoInstall/$(1)
+gb_AllLangHelp_get_target = $(WORKDIR)/AllLangHelp/$(1)
+gb_AllLangHelp_get_helpfiles_target = $(WORKDIR)/AllLangHelp/$(1).helpfiles
+gb_AllLangPackage_get_target = $(WORKDIR)/AllLangPackage/$(1)
+gb_AllLangMoTarget_get_target = $(WORKDIR)/AllLangMo/$(1)
+gb_AsmObject_get_target = $(WORKDIR)/AsmObject/$(1).o
+gb_AsmObject_get_dwo_target = $(WORKDIR)/AsmObject/$(1).dwo
+gb_CObject_get_target = $(WORKDIR)/CObject/$(1).o
+gb_CObject_get_dwo_target = $(WORKDIR)/CObject/$(1).dwo
+gb_GenCObject_get_target = $(WORKDIR)/GenCObject/$(1).o
+gb_GenCObject_get_dwo_target = $(WORKDIR)/GenCObject/$(1).dwo
+gb_CliAssembly_get_target = $(WORKDIR)/CliAssembly/$(1).done
+gb_CliAssemblyTarget_get_target = $(WORKDIR)/CliAssemblyTarget/$(1).done
+gb_CliAssemblyTarget_get_assembly_target = $(WORKDIR)/CliAssemblyTarget/$(1)$(gb_CliAssemblyTarget_POLICYEXT)
+gb_CliConfigTarget_get_target = $(WORKDIR)/CliConfigTarget/$(1).config
+gb_CliNativeLibrary_get_preparation_target = $(WORKDIR)/CliNativeLibraryTarget/$(1).prepare
+gb_CompilerTest_get_target = $(WORKDIR)/CompilerTest/$(1)
+gb_ComponentTarget_get_target = $(WORKDIR)/ComponentTarget/$(1).component
+gb_ComponentTarget_get_target_for_build = $(WORKDIR_FOR_BUILD)/ComponentTarget/$(1).component
+gb_Configuration_get_preparation_target = $(WORKDIR)/Configuration/$(1).prepared
+gb_CppunitTest_get_target = $(WORKDIR)/CppunitTest/$(1).test
+gb_CustomPackage_get_target = $(WORKDIR)/CustomPackage/$(1).filelist
+gb_CustomTarget_get_repo_target = $(WORKDIR)/CustomTarget/$(2)_$(1).done
+gb_CustomTarget_get_target = $(WORKDIR)/CustomTarget/$(1).done
+gb_CustomTarget_get_workdir = $(WORKDIR)/CustomTarget/$(1)
+gb_DescriptionTranslateTarget_get_target = $(WORKDIR)/DescriptionTranslateTarget/$(1).xml
+gb_Dictionary_get_target = $(WORKDIR)/Dictionary/$(1).done
+gb_CxxObject_get_target = $(WORKDIR)/CxxObject/$(1).o
+gb_CxxObject_get_dwo_target = $(WORKDIR)/CxxObject/$(1).dwo
+gb_GenCxxObject_get_target = $(WORKDIR)/GenCxxObject/$(1).o
+gb_GenCxxObject_get_dwo_target = $(WORKDIR)/GenCxxObject/$(1).dwo
+gb_GenNasmObject_get_target = $(WORKDIR)/GenNasmObject/$(1).o
+gb_GenNasmObject_get_dwo_target = $(WORKDIR)/GenNasmObject/$(1).dwo
+gb_Executable_get_headers_target = $(WORKDIR)/Headers/Executable/$(1)
+gb_Executable_get_linktargetfile = $(call gb_LinkTarget_get_target,$(call gb_Executable_get_linktarget,$1))
+gb_Executable_get_runtime_target = $(WORKDIR_FOR_BUILD)/Executable/$(1).run
+gb_Extension_get_target = $(WORKDIR)/Extension/$(1).oxt
+gb_Extension_get_rootdir = $(WORKDIR)/Extension/$(1)/root
+gb_Extension_get_workdir = $(WORKDIR)/Extension/$(1)
+gb_ExtensionPackage_get_target = $(WORKDIR)/ExtensionPackage/$(1).filelist
+gb_ExtensionPackage_get_preparation_target = $(WORKDIR)/ExtensionPackage/$(1).prepare
+gb_ExtensionPackageSet_get_target = $(WORKDIR)/ExtensionPackage/$(1).set
+gb_ExternalPackage_get_target = $(WORKDIR)/ExternalPackage/$(1)
+gb_ExternalProject_get_statedir = $(WORKDIR)/ExternalProject/$(1)
+gb_ExternalProject_get_preparation_target = $(WORKDIR)/ExternalProject/$(1).prepare
+gb_ExternalProject_get_state_target = $(WORKDIR)/ExternalProject/$(1)/$(2)
+gb_ExternalProject_get_target = $(WORKDIR)/ExternalProject/$(1).done
+gb_ExternalProject_get_target_for_build = $(WORKDIR_FOR_BUILD)/ExternalProject/$(1).done
+gb_Gallery_get_target = $(WORKDIR)/Gallery/$(1).done
+gb_Gallery_get_workdir = $(WORKDIR)/Gallery/$(1)
+gb_GeneratedPackage_get_target = $(WORKDIR)/GeneratedPackage/$(1).filelist
+gb_GeneratedPackage_get_target_for_build = $(WORKDIR_FOR_BUILD)/GeneratedPackage/$(1).filelist
+gb_HelpIndexTarget_get_target = $(WORKDIR)/HelpIndexTarget/$(1).done
+gb_HelpJarTarget_get_target = $(WORKDIR)/HelpJarTarget/$(1).done
+gb_HelpLinkTarget_get_preparation_target = $(WORKDIR)/HelpLinkTarget/$(1).prepare
+gb_HelpLinkTarget_get_target = $(WORKDIR)/HelpLinkTarget/$(1).done
+gb_HelpTarget_get_filelist = $(WORKDIR)/HelpTarget/$(1).filelist
+gb_HelpTarget_get_linked_target = $(WORKDIR)/HelpTarget/$(1).translate
+gb_HelpTarget_get_target = $(WORKDIR)/HelpTarget/$(1).zip
+gb_HelpTarget_get_translation_target = $(call gb_HelpTarget_get_filelist,$(1))
+gb_HelpTarget_get_workdir = $(WORKDIR)/HelpTarget/$(1)
+gb_HelpTranslatePartTarget_get_target = $(WORKDIR)/HelpTranslatePartTarget/$(1)/done
+gb_HelpTranslatePartTarget_get_translated_target = $(WORKDIR)/HelpTranslatePartTarget/$(1)/$(2).xhp
+gb_HelpTranslatePartTarget_get_workdir = $(WORKDIR)/HelpTranslatePartTarget/$(1)
+gb_HelpTranslateTarget_get_target = $(WORKDIR)/HelpTranslateTarget/$(1).done
+gb_HelpTreeTarget_get_target = $(WORKDIR)/HelpTreeTarget/$(1).tree
+gb_InstallModule_get_filelist = $(call gb_InstallModuleTarget_get_filelist,$(1))
+gb_InstallModule_get_target = $(WORKDIR)/InstallModule/$(1).done
+gb_InstallModuleTarget_get_external_target = $(WORKDIR)/InstallModuleTarget/$(1).external
+gb_InstallModuleTarget_get_filelist = $(WORKDIR)/InstallModuleTarget/$(1).filelist
+gb_InstallModuleTarget_get_target = $(WORKDIR)/InstallModuleTarget/$(1).filelist
+gb_InstallScript_get_target = $(WORKDIR)/InstallScriptTarget/$(1)$(gb_InstallScript_EXT)
+gb_InternalUnoApi_get_target = $(WORKDIR)/InternalUnoApi/$(1).done
+gb_Jar_get_target = $(call gb_Jar_get_install_target,$(1))
+gb_Jar_get_classsetname = Jar/$(1)
+gb_JavaClassSet_get_classdir = $(WORKDIR)/JavaClassSet/$(1)
+gb_JavaClassSet_get_repo_target = $(WORKDIR)/JavaClassSet/$(2)/$(1).done
+gb_JavaClassSet_get_target = $(WORKDIR)/JavaClassSet/$(1)/done
+gb_JunitTest_get_classsetname = JunitTest/$(1)
+gb_JunitTest_get_target = $(WORKDIR)/JunitTest/$(1)/done
+gb_JunitTest_get_userdir = $(WORKDIR)/JunitTest/$(1)/user
+gb_PythonTest_get_target = $(WORKDIR)/PythonTest/$(1)/done
+# linktarget = class/object<>some_optional_target, like Library/libswlo.so<>/.../instdir/program/libswlo.so
+# while the target is optional, the workdir functions will always work correctly
+gb_LinkTarget__get_workdir_linktargetname = $(firstword $(subst <>, ,$(1)))
+gb_LinkTarget__get_workdir_linktargetclass = $(firstword $(subst /, ,$(call gb_LinkTarget__get_workdir_linktargetname,$(1))))
+gb_LinkTarget__get_workdir_linktargetobject = $(lastword $(subst /, ,$(call gb_LinkTarget__get_workdir_linktargetname,$(1))))
+gb_LinkTarget_get_headers_target = \
+ $(WORKDIR)/Headers/$(call gb_LinkTarget__get_workdir_linktargetname,$(1))
+gb_LinkTarget_get_objects_list = \
+ $(WORKDIR)/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1)).objectlist
+gb_LinkTarget_get_dep_target = \
+ $(WORKDIR)/Dep/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1)).d
+gb_LinkTarget_get_dep_libraries_target = \
+ $(WORKDIR)/Dep/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1)).d.libraries
+gb_LinkTarget_get_dep_externals_target = \
+ $(WORKDIR)/Dep/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1)).d.externals
+gb_LinkTarget_get_dep_statics_target = \
+ $(WORKDIR)/Dep/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1)).d.statics
+gb_LinkTarget_get_clean_target = \
+ $(WORKDIR)/Clean/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1))
+gb_LinkTarget_get_target = $(lastword $(subst <>, ,$(1)))
+gb_LinkTarget_get_pch_timestamp = $(WORKDIR)/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(1))/Timestamps/$(1)
+gb_LinkTarget_get_pch_reuse_timestamp = $(WORKDIR)/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(1))/Timestamps/$(1)_reuse
+gb_Module_get_nonl10n_target = $(WORKDIR)/Module/nonl10n/$(1)
+gb_Module_get_l10n_target = $(WORKDIR)/Module/l10n/$(1)
+gb_Module_get_check_target = $(WORKDIR)/Module/check/$(1)
+gb_Module_get_slowcheck_target = $(WORKDIR)/Module/slowcheck/$(1)
+gb_Module_get_screenshot_target = $(WORKDIR)/Module/screenshot/$(1)
+gb_Module_get_subsequentcheck_target = $(WORKDIR)/Module/subsequentcheck/$(1)
+gb_Module_get_perfcheck_target = $(WORKDIR)/Module/perfcheck/$(1)
+gb_Module_get_uicheck_target = $(WORKDIR)/Module/uicheck/$(1)
+gb_Module_get_target = $(WORKDIR)/Module/$(1)
+gb_ObjCxxObject_get_target = $(WORKDIR)/ObjCxxObject/$(1).o
+gb_ObjCxxObject_get_dwo_target = $(WORKDIR)/ObjCxxObject/$(1).dwo
+gb_ObjCObject_get_target = $(WORKDIR)/ObjCObject/$(1).o
+gb_ObjCObject_get_dwo_target = $(WORKDIR)/ObjCObject/$(1).dwo
+gb_GenObjCxxObject_get_target = $(WORKDIR)/GenObjCxxObject/$(1).o
+gb_GenObjCxxObject_get_dwo_target = $(WORKDIR)/GenObjCxxObject/$(1).dwo
+gb_GenObjCObject_get_target = $(WORKDIR)/GenObjCObject/$(1).o
+gb_GenObjCObject_get_dwo_target = $(WORKDIR)/GenObjCObject/$(1).dwo
+gb_CxxClrObject_get_target = $(WORKDIR)/CxxClrObject/$(1).o
+gb_CxxClrObject_get_dwo_target = $(WORKDIR)/CxxClrObject/$(1).dwo
+gb_GenCxxClrObject_get_target = $(WORKDIR)/GenCxxClrObject/$(1).o
+gb_GenCxxClrObject_get_dwo_target = $(WORKDIR)/GenCxxClrObject/$(1).dwo
+gb_Pagein_get_target = $(WORKDIR)/Pagein/pagein-$(1)
+gb_Package_get_preparation_target = $(WORKDIR)/Package/prepared/$(1)
+gb_Package_get_target = $(WORKDIR)/Package/$(1).filelist
+gb_Package_get_target_for_build = $(WORKDIR_FOR_BUILD)/Package/$(1).filelist
+gb_PackageSet_get_target = $(WORKDIR)/PackageSet/$(1).filelist
+gb_PackageInfo_get_target = $(WORKDIR)/PackageInfo
+gb_Postprocess_get_target = $(WORKDIR)/Postprocess/$(1)
+gb_PrecompiledHeader_get_dep_target = $(WORKDIR)/Dep/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(2))/$(1).hxx$(gb_PrecompiledHeader_EXT).d
+gb_PrecompiledHeader_get_dep_target_tmp = $(call gb_PrecompiledHeader_get_dep_target,$(1),$(2)).tmp
+gb_PrecompiledHeader_get_flags_file = $(WORKDIR)/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(2))/$(1).hxx$(gb_PrecompiledHeader_EXT).flags
+gb_PrecompiledHeader_get_for_reuse_target = $(WORKDIR)/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(2))/$(1).hxx$(gb_PrecompiledHeader_EXT).reuse
+gb_PrecompiledHeader_get_target = $(WORKDIR)/PrecompiledHeader/$(call gb_PrecompiledHeader__get_debugdir,$(2))/$(1).hxx$(gb_PrecompiledHeader_EXT)
+gb_PropertiesTranslateTarget_get_target = $(WORKDIR)/PropertiesTranslateTarget/$(1).properties
+gb_Pyuno_get_final_target = $(WORKDIR)/Pyuno/$(1).final
+gb_Pyuno_get_target = $(WORKDIR)/Pyuno/$(1).done
+gb_Rdb_get_target = $(WORKDIR)/Rdb/$(1).rdb
+gb_Rdb_get_target_for_build = $(WORKDIR_FOR_BUILD)/Rdb/$(1).rdb
+gb_ResTarget_get_target = $(WORKDIR)/ResTarget/$(1).res
+gb_MoTarget_get_target = $(WORKDIR)/MoTarget/$(1).mo
+gb_ScpMergeTarget_get_target = $(WORKDIR)/ScpMergeTarget/$(1).ulf
+gb_ScpPreprocessTarget_get_target = $(WORKDIR)/ScpPreprocessTarget/$(1).pre
+gb_ScpTarget_get_external_target = $(WORKDIR)/ScpTarget/$(1).external
+gb_ScpTarget_get_target = $(WORKDIR)/ScpTarget/$(1).par
+gb_ScpTemplateTarget_get_dir = $(abspath $(WORKDIR)/ScpTemplateTarget/$(dir $(1)))
+gb_ScpTemplateTarget_get_target = $(abspath $(WORKDIR)/ScpTemplateTarget/$(dir $(1))$(subst pack,modules,$(subst module_,all,$(notdir $(1)))).inc)
+gb_SdiTarget_get_target = $(WORKDIR)/SdiTarget/$(1)
+gb_ThesaurusIndexTarget_get_target = $(WORKDIR)/ThesaurusIndexTarget/$(basename $(1)).idx
+gb_UIConfig_get_imagelist_target = $(WORKDIR)/UIConfig/$(1).ilst
+gb_UIConfig_get_a11yerrors_target = $(WORKDIR)/UIConfig/$(1).a11yerrors
+gb_UIConfig_get_target = $(WORKDIR)/UIConfig/$(1).done
+gb_UIImageListTarget_get_target = $(WORKDIR)/UIImageListTarget/$(1).ilst
+gb_UIMenubarTarget_get_target = $(WORKDIR)/UIMenubarTarget/$(1).xml
+gb_UITest_get_target = $(WORKDIR)/UITest/$(1)/done
+gb_UnoApiTarget_get_target = $(WORKDIR)/UnoApiTarget/$(1).rdb
+gb_UnoApiHeadersTarget_get_bootstrap_dir = $(WORKDIR)/UnoApiHeadersTarget/$(1)/$(call gb_UnoApiHeadersTarget_select_variant,$(1),bootstrap)
+gb_UnoApiHeadersTarget_get_comprehensive_dir = $(WORKDIR)/UnoApiHeadersTarget/$(1)/$(call gb_UnoApiHeadersTarget_select_variant,$(1),comprehensive)
+gb_UnoApiHeadersTarget_get_dir = $(WORKDIR)/UnoApiHeadersTarget/$(1)/$(call gb_UnoApiHeadersTarget_select_variant,$(1),normal)
+gb_UnoApiHeadersTarget_get_real_bootstrap_dir = $(WORKDIR)/UnoApiHeadersTarget/$(1)/bootstrap
+gb_UnoApiHeadersTarget_get_real_comprehensive_dir = $(WORKDIR)/UnoApiHeadersTarget/$(1)/comprehensive
+gb_UnoApiHeadersTarget_get_real_dir = $(WORKDIR)/UnoApiHeadersTarget/$(1)/normal
+gb_UnoApiHeadersTarget_get_real_bootstrap_target = $(WORKDIR)/UnoApiHeadersTarget/$(1)/bootstrap.done
+gb_UnoApiHeadersTarget_get_real_comprehensive_target = $(WORKDIR)/UnoApiHeadersTarget/$(1)/comprehensive.done
+gb_UnoApiHeadersTarget_get_real_target = $(WORKDIR)/UnoApiHeadersTarget/$(1)/normal.done
+gb_UnoApiHeadersTarget_get_bootstrap_target = $(WORKDIR)/UnoApiHeadersTarget/$(1)/$(call gb_UnoApiHeadersTarget_select_variant,$(1),bootstrap).done
+gb_UnoApiHeadersTarget_get_comprehensive_target = $(WORKDIR)/UnoApiHeadersTarget/$(1)/$(call gb_UnoApiHeadersTarget_select_variant,$(1),comprehensive).done
+gb_UnoApiHeadersTarget_get_target = $(WORKDIR)/UnoApiHeadersTarget/$(1)/$(call gb_UnoApiHeadersTarget_select_variant,$(1),normal).done
+gb_UnpackedTarball_get_dir = $(WORKDIR)/UnpackedTarball/$(1)
+gb_UnpackedTarball_get_pristine_dir = $(WORKDIR)/UnpackedTarball/$(1).org
+gb_UnpackedTarball_get_final_target = $(WORKDIR)/UnpackedTarball/$(1).update
+# NOTE: the .done target is hardcoded in solenv/bin/concat-deps.c !
+gb_UnpackedTarball_get_target = $(WORKDIR)/UnpackedTarball/$(1).done
+gb_UnpackedTarball_get_preparation_target = $(WORKDIR)/UnpackedTarball/$(1).prepare
+gb_UnpackedTarget_get_target = $(WORKDIR)/UnpackedTarget/$(1)
+gb_WinResTarget_get_target = $(WORKDIR)/WinResTarget/$(1)$(gb_WinResTarget_POSTFIX)
+# workdir targets: $(1) is prefix/path
+gb_Configuration_get_target = $(WORKDIR)/Configuration/$(1).done
+gb_YaccTarget_get_grammar_target = $(WORKDIR)/YaccTarget/$(1).cxx
+gb_YaccTarget_get_header_target = $(WORKDIR)/YaccTarget/$(1).hxx
+gb_YaccTarget_get_target = $(WORKDIR)/YaccTarget/$(1).done
+
+gb_LexTarget_get_scanner_target = $(WORKDIR)/LexTarget/$(1).cxx
+gb_LexTarget_get_target = $(WORKDIR)/LexTarget/$(1).done
+
+gb_XcdTarget_get_target = $(WORKDIR)/XcdTarget/$(1)
+gb_XcsTarget_get_target = $(WORKDIR)/XcsTarget$(if $(1),/)$(1)
+gb_XcuDataTarget_get_target = $(WORKDIR)/XcuDataTarget/$(1)
+gb_XcuFilterFiltersTarget_get_target = $(WORKDIR)/XcuFilterFiltersTarget/$(1)
+gb_XcuFilterInternalTarget_get_target = $(WORKDIR)/XcuFilterInternalTarget/$(1)
+gb_XcuFilterOthersTarget_get_target = $(WORKDIR)/XcuFilterOthersTarget/$(1)
+gb_XcuFilterTypesTarget_get_target = $(WORKDIR)/XcuFilterTypesTarget/$(1)
+gb_XcuLangpackTarget_get_target = $(WORKDIR)/XcuLangpackTarget/$(1)
+gb_XcuModuleTarget_get_target = $(WORKDIR)/XcuModuleTarget/$(1)
+gb_XcuMergeTarget_get_target = $(WORKDIR)/XcuMergeTarget/$(1)
+gb_XcuResTarget_get_target = $(WORKDIR)/XcuResTarget/$(1)
+gb_Zip_get_target = $(WORKDIR)/Zip/$(1).zip
+
+define gb_Library_get_exports_target
+$(WORKDIR)/LinkTarget/$(call gb_Library__get_workdir_linktargetname,$(1)).exports
+endef
+
+define gb_Library_get_versionlink_target
+$(call gb_Library_get_sdk_link_dir)/$(basename $(call gb_Library_get_filename,$(1)))
+endef
+
+define gb_Library_get_headers_target
+$(patsubst $(1):%,$(WORKDIR)/Headers/Library/%,$(filter $(1):%,$(gb_Library_FILENAMES)))
+endef
+
+define gb_StaticLibrary_get_headers_target
+$(WORKDIR)/Headers/StaticLibrary/$(call gb_StaticLibrary_get_filename,$(1))
+endef
+
+$(eval $(call gb_Helper_make_clean_targets,\
+ AutoInstall \
+ AllLangHelp \
+ AllLangPackage \
+ AllLangMoTarget \
+ CliAssembly \
+ CliAssemblyTarget \
+ CliConfigTarget \
+ CliLibrary \
+ CliNativeLibrary \
+ CliUnoApi \
+ CompilerTest \
+ ComponentTarget \
+ CustomPackage \
+ DescriptionTranslateTarget \
+ Dictionary \
+ Executable \
+ ExternalPackage \
+ Extension \
+ ExtensionPackage \
+ ExtensionPackageSet \
+ Gallery \
+ GeneratedPackage \
+ HelpTarget \
+ HelpIndexTarget \
+ HelpJarTarget \
+ HelpLinkTarget \
+ HelpTranslatePartTarget \
+ HelpTranslateTarget \
+ HelpTreeTarget \
+ InstallModule \
+ InstallModuleTarget \
+ InstallScript \
+ InternalUnoApi \
+ JavaClassSet \
+ Jar \
+ JunitTest \
+ Library \
+ Module \
+ PackagePart \
+ Package \
+ PackageSet \
+ Pagein \
+ Postprocess \
+ PrecompiledHeader \
+ PropertiesTranslateTarget \
+ Pyuno \
+ PythonTest \
+ Rdb \
+ ResTarget \
+ ScpMergeTarget \
+ ScpPreprocessTarget \
+ ScpTarget \
+ ScpTemplateTarget \
+ SdiTarget \
+ StaticLibrary \
+ ThesaurusIndexTarget \
+ CppunitTest \
+ CppunitTestFakeExecutable \
+ CustomTarget \
+ ExternalProject \
+ UIConfig \
+ UIImageListTarget \
+ UIMenubarTarget \
+ UITest \
+ UnoApi \
+ UnoApiHeadersTarget \
+ UnoApiTarget \
+ UnpackedTarball \
+ UnpackedTarget \
+ WinResTarget \
+ YaccTarget \
+ LexTarget \
+ Zip \
+ XcsTarget \
+ XcuDataTarget \
+ XcuModuleTarget \
+ XcuLangpackTarget \
+ XcuMergeTarget \
+ XcuResTarget \
+ Configuration \
+))
+
+$(eval $(call gb_Helper_make_dep_targets,\
+ CObject \
+ CxxObject \
+ ObjCObject \
+ ObjCxxObject \
+ CxxClrObject \
+ AsmObject \
+ GenCObject \
+ GenCxxObject \
+ GenObjCObject \
+ GenObjCxxObject \
+ GenNasmObject \
+ GenCxxClrObject \
+ SdiTarget \
+))
+
+# other getters
+
+define gb_Library_get_layer
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_Library_LAYER)))
+endef
+
+define gb_Executable_get_layer
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_Executable_LAYER)))
+endef
+
+define gb_Library_get_filename
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_Library_FILENAMES)))
+endef
+
+define gb_Library_get_filename_for_build
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_Library_FILENAMES_FOR_BUILD)))
+endef
+
+define gb_Executable_get_filename
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_Executable_FILENAMES)))
+endef
+
+define gb_Executable_get_filename_for_build
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_Executable_FILENAMES_FOR_BUILD)))
+endef
+
+# Get dependencies needed for running the executable
+#
+# This is not strictly necessary, but it makes the use more similar to
+# ExternalExecutable.
+#
+# gb_Executable_get_runtime_dependencies executable
+define gb_Executable_get_runtime_dependencies
+$(call gb_Executable_get_runtime_target,$(1))
+endef
+
+# Get complete command-line for running the executable
+#
+# This includes setting library path.
+#
+# gb_Executable_get_command executable
+define gb_Executable_get_command
+$(gb_Helper_set_ld_path) $(BUILDTOOLTRACE) $(2) $(call gb_Executable_get_target_for_build,$(1))
+endef
+
+define gb_Executable__get_workdir_linktargetname
+Executable/$(call gb_Executable_get_filename,$(1))
+endef
+define gb_Executable_get_target
+$(call gb_Executable__get_dir_for_exe,$(1))/$(call gb_Executable_get_filename,$(1))
+endef
+ifneq ($(CROSS_COMPILING),)
+# Can we assume this is used only for executables registered for "NONE"?
+define gb_Executable_get_target_for_build
+$(call gb_Executable__get_dir_for_exe_for_build,$(1))/$(call gb_Executable_get_filename_for_build,$(1))
+endef
+else
+gb_Executable_get_target_for_build = $(gb_Executable_get_target)
+endif # CROSS_COMPILING
+define gb_Executable_get_linktarget
+$(call gb_Executable__get_workdir_linktargetname,$(1))<>$(call gb_Executable_get_target,$(1))
+endef
+gb_Executable_get_linktarget_target = $(call gb_LinkTarget_get_target,$(call gb_Executable_get_linktarget,$(1)))
+
+gb_ExternalProject__get_workdir_linktargetname = ExternalProject/$(1)
+
+define gb_Library__get_workdir_linktargetname
+Library/$(call gb_Library_get_filename,$(1))
+endef
+define gb_Library_get_target
+$(call gb_Library_get_instdir,$(1))/$(call gb_Library_get_runtime_filename,$(1))
+endef
+ifneq ($(CROSS_COMPILING),)
+define gb_Library_get_target_for_build
+$(call gb_Library_get_instdir_for_build,$(1))/$(call gb_Library_get_runtime_filename_for_build,$(1))
+endef
+else
+gb_Library_get_target_for_build = $(gb_Library_get_target)
+endif # CROSS_COMPILING
+# this returns a tuple of both the linktargetname, and the target file
+define gb_Library_get_linktarget
+$(call gb_Library__get_workdir_linktargetname,$(1))<>$(call gb_Library_get_target,$(1))
+endef
+gb_Library_get_linktarget_target = $(call gb_LinkTarget_get_target,$(call gb_Library_get_linktarget,$(1)))
+gb_Library_get_dep_libraries_target = $(call gb_LinkTarget_get_dep_libraries_target,$(call gb_Library_get_linktarget,$(1)))
+
+define gb_StaticLibrary__get_workdir_linktargetname
+StaticLibrary/$(call gb_StaticLibrary_get_filename,$(1))
+endef
+define gb_StaticLibrary_get_target
+$(WORKDIR)/LinkTarget/$(call gb_StaticLibrary__get_workdir_linktargetname,$(1))
+endef
+# this returns a tuple of both the linktargetname, and the target file
+define gb_StaticLibrary_get_linktarget
+$(call gb_StaticLibrary__get_workdir_linktargetname,$(1))<>$(call gb_StaticLibrary_get_target,$(1))
+endef
+gb_StaticLibrary_get_linktarget_target = $(call gb_LinkTarget_get_target,$(call gb_StaticLibrary_get_linktarget,$(1)))
+
+define gb_CppunitTest__get_workdir_linktargetname
+CppunitTest/$(call gb_CppunitTest_get_filename,$(1))
+endef
+define gb_CppunitTest__get_linktarget_target
+$(WORKDIR)/LinkTarget/$(call gb_CppunitTest__get_workdir_linktargetname,$(1))
+endef
+# this returns a tuple of both the linktargetname, and the target file
+define gb_CppunitTest_get_linktarget
+$(call gb_CppunitTest__get_workdir_linktargetname,$(1))<>$(call gb_CppunitTest__get_linktarget_target,$(1))
+endef
+gb_CppunitTest_get_linktarget_target = $(call gb_LinkTarget_get_target,$(call gb_CppunitTest_get_linktarget,$(1)))
+
+define gb_CompilerTest__get_workdir_linktargetname
+CompilerTest/$(1)
+endef
+define gb_CompilerTest__get_linktarget_target
+$(WORKDIR)/LinkTarget/$(call gb_CompilerTest__get_workdir_linktargetname,$(1))
+endef
+# this returns a tuple of both the linktargetname, and the target file
+define gb_CompilerTest_get_linktarget
+$(call gb_CompilerTest__get_workdir_linktargetname,$(1))<>$(call gb_CompilerTest__get_linktarget_target,$(1))
+endef
+
+# static members declared here because they are used globally
+
+gb_StaticLibrary_WORKDIR = $(WORKDIR)/LinkTarget/StaticLibrary
+gb_Library_WORKDIR_FOR_BUILD = $(WORKDIR_FOR_BUILD)/LinkTarget/Library
+gb_Executable_BINDIR = $(WORKDIR)/LinkTarget/Executable
+gb_Executable_BINDIR_FOR_BUILD = $(WORKDIR_FOR_BUILD)/LinkTarget/Executable
+gb_Library_DLLDIR = $(WORKDIR)/LinkTarget/Library
+gb_Library_DLLDIR_FOR_BUILD = $(WORKDIR_FOR_BUILD)/LinkTarget/Library
+gb_CppunitTest_DLLDIR = $(WORKDIR)/LinkTarget/CppunitTest
+
+# static variables declared here because they are used globally
+
+gb_POLOCATION := $(SRCDIR)/translations/source
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/Tempfile.mk b/solenv/gbuild/Tempfile.mk
new file mode 100644
index 000000000..ee0593db8
--- /dev/null
+++ b/solenv/gbuild/Tempfile.mk
@@ -0,0 +1,45 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+ifneq ($(HAVE_GNUMAKE_FILE_FUNC),)
+define gb_var2file
+$(file >$(1),$(3))$(1)
+endef
+else
+# Write string to temporary file by chopping into pieces that
+# fit the commandline
+# parameters: filename, maxitems (for one write), string
+# returns: filename
+define gb_var2file
+$(strip $(1)
+$(eval gb_var2file_helpervar := $$(shell printf "%s" "" > $(1) ))\
+$(eval gb_var2file_curblock := $(firstword $(3)))\
+$(foreach item,$(wordlist 2,99999,$(3)),$(eval gb_var2file_curblock += $(item)
+ ifeq ($$(words $$(gb_var2file_curblock)),$(2))
+ gb_var2file_helpervar := $$(shell printf "%s" "$$(gb_var2file_curblock)" >> $(1) )
+ gb_var2file_curblock :=
+ endif
+ ))\
+ $(eval gb_var2file_helpervar := $(shell printf "%s\n" "$(gb_var2file_curblock)" >> $(1) )
+ gb_var2file_curblock :=
+ ))
+endef
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/TestHelpers.mk b/solenv/gbuild/TestHelpers.mk
new file mode 100644
index 000000000..2ce814ecd
--- /dev/null
+++ b/solenv/gbuild/TestHelpers.mk
@@ -0,0 +1,47 @@
+# -*- 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/.
+#
+
+# This makes sure that more_fonts, opensymbol and fontconfig is installed
+define gb_TestHelpers_use_more_fonts
+
+ifneq ($(MAKECMDGOALS),clean)
+ifneq (,$$(filter MORE_FONTS,$$(BUILD_TYPE)))
+ifeq (,$$(filter more_fonts,$$(gb_Module_ALLMODULES)))
+
+# the gbuildtojson / gbuild self-test runs tests "out of scope", but itself depends
+# on more fonts, so we must ignore the font tests for these tests.
+ifeq (,$$(gb_IGNORE_MORE_FONTS))
+
+# we are in single module mode -> fail test on missing fonts from filelists!
+# include Module_more_font.mk fails with strange error messages,
+# so we can't check if the more_fonts filelists are up-to-date, so just assume it.
+
+$(1): \
+ $$(foreach font,$$(gb_Package_MODULE_ooo_fonts), \
+ $$(if $$(wildcard $$(call gb_Package_get_target,$$(font))), \
+ $$(foreach file,$$(shell cat $$(call gb_Package_get_target,$$(font))), \
+ $$(if $$(wildcard $$(file)),,$$(error Missing font -> run make more_fonts extras))), \
+ $$(error Missing font filelist -> run make more_fonts extras)))
+endif
+else
+# we're in global run mode (full knowledge) -> depend directly on the delivered fonts!
+
+$(1): \
+ $$(foreach package,$$(subst ExternalPackage_,,$$(filter ExternalPackage_%,$$(call gb_Module_get_classnames,more_fonts))), \
+ $$(call gb_Package_get_files,$$(package))) \
+ $$(call gb_Package_get_files,extras_font) \
+ $$(if $$(filter Package_extras_fontconfig,$$(call gb_Module_get_classnames,extras)), \
+ $$(call gb_Package_get_files,extras_fontconfig))
+endif
+endif
+endif
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/Trace.mk b/solenv/gbuild/Trace.mk
new file mode 100644
index 000000000..8d416157d
--- /dev/null
+++ b/solenv/gbuild/Trace.mk
@@ -0,0 +1,61 @@
+# -*- 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/.
+#
+
+# Support for tracing what gbuild does.
+# Run 'make GBUILD_TRACE=/somewhere/log.json', process the file
+# using solenv/bin/finish-gbuild-trace.py, and then view it in Chromium
+# using the chrome://tracing URL:
+# - the '?' icon in the top-right is the help
+# - 'gbuild' rows represent per-parallelism (per-CPU) usage in time
+# - 'totals' rows represent sums for reach build type
+# - note that 'EXTERNAL' targets do not detect whether the external package
+# is built with parallelism or not, so the actual CPU time may be higher
+# - vertical lines represent targets that themselves do not take any time
+# to build
+# - any target can be found using the search field in the top right corner
+# (just type e.g. '[MOD]: sal' and hit the '->' button, if you cannot see
+# it pressing 'm' or 'f' can help)
+
+gb_TRACE :=
+ifneq ($(GBUILD_TRACE),)
+gb_TRACE := $(abspath $(GBUILD_TRACE))
+endif
+
+ifneq ($(gb_TRACE),)
+
+# call gb_Trace_AddMark,marktype,detail,type,extra
+# The (flock;cat) part is to minimize lock time.
+define gb_Trace__AddMark
+echo "{\"name\": \"$(3)\", \"ph\": \"$(1)\", \"pid\": 1, \"tid\": 1, \"ts\": $$(date +%s%N),\"args\":{\"message\":\"[$(3)]: $(2)\"}}," | ( flock 1; cat ) >>$(gb_TRACE)
+endef
+
+# call gb_Trace_StartRange,detail,type
+define gb_Trace_StartRange
+$(call gb_Trace__AddMark,B,$(1),$(2))
+endef
+
+# call gb_Trace_EndRange,detail,type
+define gb_Trace_EndRange
+$(call gb_Trace__AddMark,E,$(1),$(2))
+endef
+
+# call gb_Trace_MakeMark,detail,type
+define gb_Trace_MakeMark
+$(call gb_Trace__AddMark,i,$(1),$(2))
+endef
+
+ifeq ($(MAKE_RESTARTS),)
+$(shell rm -f $(gb_TRACE) 2>/dev/null)
+else
+$(shell $(call gb_Trace__AddMark,i,make restart,MAKE))
+endif
+
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/UIConfig.mk b/solenv/gbuild/UIConfig.mk
new file mode 100644
index 000000000..eaca4c5d8
--- /dev/null
+++ b/solenv/gbuild/UIConfig.mk
@@ -0,0 +1,358 @@
+# -*- 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/.
+#
+
+# class UIMenubarTarget
+
+# Handles platform-specific processing of menubar config files.
+
+# defined by platform:
+# gb_UIMenubarTarget_UIMenubarTarget_platform
+# gb_UIMenubarTarget__command
+
+$(dir $(call gb_UIMenubarTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_UIMenubarTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_UIMenubarTarget_get_target,%) :
+ $(call gb_UIMenubarTarget__command,$@,$*,$<)
+
+.PHONY : $(call gb_UIMenubarTarget_get_clean_target,%)
+$(call gb_UIMenubarTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$(2),$(false),UIM,1)
+ rm -f $(call gb_UIMenubarTarget_get_target,$*)
+
+# Process a menubar configuration file.
+#
+# gb_UIMenubarTarget_UIMenubarTarget target source
+define gb_UIMenubarTarget_UIMenubarTarget
+$(call gb_UIMenubarTarget_get_target,$(1)) : $(2)
+$(call gb_UIMenubarTarget_get_target,$(1)) :| $(dir $(call gb_UIMenubarTarget_get_target,$(1))).dir
+
+$(call gb_UIMenubarTarget_UIMenubarTarget_platform,$(1),$(2))
+
+endef
+
+# class UIImageListTarget
+
+# Handles creation of image lists for .ui files.
+
+gb_UIImageListTarget_COMMAND = $(call gb_ExternalExecutable_get_command,xsltproc)
+gb_UIImageListTarget_DEPS = $(call gb_ExternalExecutable_get_dependencies,xsltproc)
+gb_UIImageListTarget_XSLTFILE := $(SRCDIR)/solenv/bin/uiimagelist.xsl
+
+# NOTE: for some reason xsltproc does not produce any file if there is
+# no output, so we touch the target to make sure it exists.
+define gb_UIImageListTarget__command
+$(call gb_Helper_abbreviate_dirs,\
+ $(gb_UIImageListTarget_COMMAND) --nonet -o $@ $(gb_UIImageListTarget_XSLTFILE) $(UIFILE) && \
+ touch $@ \
+)
+endef
+
+$(dir $(call gb_UIImageListTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_UIImageListTarget_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_UIImageListTarget_get_target,%) : $(gb_UIImageListTarget_DEPS) $(gb_UIImageListTarget_XSLTFILE)
+ $(call gb_Output_announce,$*,$(true),UIL,1)
+ $(call gb_Trace_StartRange,$*,UIL)
+ $(call gb_UIImageListTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,UIL)
+
+.PHONY : $(call gb_UIImageListTarget_get_clean_target,%)
+$(call gb_UIImageListTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),UIL,1)
+ rm -f $(call gb_UIImageListTarget_get_target,$*)
+
+# Extract list of images referenced in a .ui file.
+#
+# gb_UIImageListTarget_UIImageListTarget uifile
+define gb_UIImageListTarget_UIImageListTarget
+$(call gb_UIImageListTarget_get_target,$(1)) : UIFILE := $(SRCDIR)/$(1).ui
+
+$(call gb_UIImageListTarget_get_target,$(1)) : $(SRCDIR)/$(1).ui
+$(call gb_UIImageListTarget_get_target,$(1)) :| $(dir $(call gb_UIImageListTarget_get_target,$(1))).dir
+
+endef
+
+# class UIConfig
+
+# Handles UI configuration files.
+#
+# This mostly means UI description files (suffix .ui) for the new layouting
+# mechanism.
+#
+# This class provides the following filelists:
+# * UIConfig/<name> containing all nontranslatable files
+
+gb_UIConfig_INSTDIR := $(LIBO_SHARE_FOLDER)/config/soffice.cfg
+
+ifneq ($(filter LXML,$(BUILD_TYPE)),)
+gb_UIConfig_LXML_PATH := PYTHONPATH=$${PYTHONPATH:+$$PYTHONPATH:}$(call gb_UnpackedTarball_get_dir,lxml)/install ;
+gb_UIConfig_LXML_TARGET := $(call gb_ExternalProject_get_target,lxml)
+endif
+gb_UIConfig_gla11y_SCRIPT := $(SRCDIR)/bin/gla11y
+
+$(dir $(call gb_UIConfig_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_UIConfig_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_UIConfig_get_target,%) : $(call gb_UIConfig_get_imagelist_target,%) $(call gb_UIConfig_get_a11yerrors_target,%)
+ $(call gb_Output_announce,$*,$(true),UIC,2)
+ $(call gb_Trace_StartRange,$*,UIC)
+ $(call gb_Helper_abbreviate_dirs,\
+ touch $@ \
+ )
+ $(call gb_Trace_EndRange,$*,UIC)
+
+$(call gb_UIConfig_get_imagelist_target,%) :
+ $(call gb_UIConfig__command)
+
+.PHONY : $(call gb_UIConfig_get_clean_target,%)
+$(call gb_UIConfig_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),UIC,2)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_UIConfig_get_target,$*) $(call gb_UIConfig_get_imagelist_target,$*) \
+ )
+ $(call gb_Output_announce,$*,$(false),UIA,2)
+ rm -f $(call gb_UIConfig_get_a11yerrors_target,$*)
+
+gb_UIConfig_gla11y_PARAMETERS = -P $(SRCDIR)/ -f $(UI_A11YFALSE)
+
+# Disable this to see suppressed warnings
+ifeq (1,1)
+gb_UIConfig_gla11y_PARAMETERS += -s $(UI_A11YSUPPRS)
+endif
+# Enable this to regenerate suppression files
+ifeq (1,0)
+gb_UIConfig_gla11y_PARAMETERS += -g $(UI_A11YSUPPRS)
+endif
+
+# Tell gla11y about LO-specific widgets
+# These are storage, containers, or preview
+gb_UIConfig_gla11y_PARAMETERS += --widgets-suffixignored +ValueSet,HBox,VBox,ToolBox,Preview,PreviewWin,PreviewWindow,PrevWindow
+# These are buttons, thus already contain their label (but an image is not enough)
+gb_UIConfig_gla11y_PARAMETERS += --widgets-button +svtlo-ManagedMenuButton
+
+# All new warnings should be fatal except a few kinds which could be only doubtful
+gb_UIConfig_gla11y_PARAMETERS += --fatal-all --not-fatal-type duplicate-mnemonic --not-fatal-type labelled-by-and-mnemonic --not-fatal-type orphan-label
+
+define gb_UIConfig_a11yerrors__command
+$(call gb_UIConfig__gla11y_command)
+endef
+
+$(call gb_UIConfig_get_a11yerrors_target,%) : $(gb_UIConfig_LXML_TARGET) $(call gb_ExternalExecutable_get_dependencies,python) $(gb_UIConfig_gla11y_SCRIPT)
+ $(call gb_Output_announce,$*,$(true),UIA,1)
+ $(call gb_Trace_StartRange,$*,UIA)
+ $(call gb_UIConfig_a11yerrors__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,UIA)
+
+gb_UIConfig_get_packagename = UIConfig/$(1)
+gb_UIConfig_get_packagesetname = UIConfig/$(1)
+
+# Processes and delivers a set of UI configuration files.
+#
+# gb_UIConfig_UIConfig modulename
+define gb_UIConfig_UIConfig
+ifeq (,$$(filter $(1),$$(gb_UIConfig_REGISTERED)))
+$$(eval $$(call gb_Output_info,Currently known UI configs are: $(sort $(gb_UIConfig_REGISTERED)),ALL))
+$$(eval $$(call gb_Output_error,UIConfig $(1) must be registered in Repository.mk))
+endif
+$(call gb_UIConfig_get_imagelist_target,$(1)) : UI_IMAGELISTS :=
+
+$(call gb_PackageSet_PackageSet_internal,$(call gb_UIConfig_get_packagesetname,$(1)))
+$(call gb_Package_Package_internal,$(call gb_UIConfig_get_packagename,$(1)),$(SRCDIR))
+$(call gb_Package_Package_internal,$(call gb_UIConfig_get_packagename,$(1)_generated),$(WORKDIR))
+
+$(call gb_PackageSet_add_package,$(call gb_UIConfig_get_packagesetname,$(1)),$(call gb_UIConfig_get_packagename,$(1)))
+
+$(call gb_UIConfig_get_target,$(1)) :| $(dir $(call gb_UIConfig_get_target,$(1))).dir
+$(call gb_UIConfig_get_imagelist_target,$(1)) :| $(dir $(call gb_UIConfig_get_imagelist_target,$(1))).dir
+$(call gb_UIConfig_get_a11yerrors_target,$(1)) :| $(dir $(call gb_UIConfig_get_a11yerrors_target,$(1))).dir
+$(call gb_UIConfig_get_a11yerrors_target,$(1)) : UI_A11YSUPPRS := $(SRCDIR)/solenv/sanitizers/ui/$(1).suppr
+$(call gb_UIConfig_get_a11yerrors_target,$(1)) : UI_A11YFALSE := $(SRCDIR)/solenv/sanitizers/ui/$(1).false
+$(call gb_UIConfig_get_target,$(1)) : $(call gb_PackageSet_get_target,$(call gb_UIConfig_get_packagesetname,$(1)))
+$(call gb_UIConfig_get_clean_target,$(1)) : $(call gb_PackageSet_get_clean_target,$(call gb_UIConfig_get_packagesetname,$(1)))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_UIConfig_get_target,$(1)),$(call gb_UIConfig_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),UIConfig)
+$(call gb_Postprocess_register_target,AllUIConfigs,UIConfig,$(1))
+
+endef
+
+# gb_UIConfig__package_file target package type destfile srcfile
+define gb_UIConfig__package_file
+$(call gb_Package_add_file,$(2),$(gb_UIConfig_INSTDIR)/$(1)/$(3)/$(4),$(5))
+
+endef
+
+# gb_UIConfig__package_uifile target package destfile srcfile
+define gb_UIConfig__package_uifile
+$(call gb_UIConfig__package_file,$(1),$(2),ui,$(3),$(4))
+
+endef
+
+define gb_UIConfig_add_a11yerrors_uifile
+$(call gb_UIConfig_get_a11yerrors_target,$(1)) : UIFILES += $(SRCDIR)/$(2).ui
+$(call gb_UIConfig_get_a11yerrors_target,$(1)) : $(SRCDIR)/$(2).ui
+
+endef
+
+# gb_UIConfig__add_uifile target file
+define gb_UIConfig__add_uifile
+$(call gb_UIConfig__package_uifile,$(1),$(call gb_UIConfig_get_packagename,$(1)),$(notdir $(2)).ui,$(2).ui)
+$(call gb_UIImageListTarget_UIImageListTarget,$(2))
+
+$(call gb_UIConfig_get_imagelist_target,$(1)) : UI_IMAGELISTS += $(call gb_UIImageListTarget_get_target,$(2))
+$(call gb_UIConfig_get_imagelist_target,$(1)) : $(call gb_UIImageListTarget_get_target,$(2))
+$(call gb_UIConfig_get_clean_target,$(1)) : $(call gb_UIImageListTarget_get_clean_target,$(2))
+
+$(call gb_UIConfig_add_a11yerrors_uifile,$(1),$(2))
+
+endef
+
+gb_UIConfig_ALLFILES:=
+# Adds .ui file to the package
+#
+# The file is relative to $(SRCDIR) and without extension.
+#
+# gb_UIConfig_add_uifile target uifile
+define gb_UIConfig_add_uifile
+gb_UIConfig_ALLFILES+=$(1):$(notdir $(2))
+$(call gb_UIConfig__add_uifile,$(1),$(2))
+
+endef
+
+# Adds multiple .ui files to the package
+#
+# gb_UIConfig_add_uifiles target uifile(s)
+define gb_UIConfig_add_uifiles
+$(foreach uifile,$(2),$(call gb_UIConfig_add_uifile,$(1),$(uifile)))
+
+endef
+
+# gb_UIConfig_add_uifiles target uifile(s) but only for running gla11y
+define gb_UIConfig_add_a11yerrors_uifiles
+$(foreach uifile,$(2),$(call gb_UIConfig_add_a11yerrors_uifile,$(1),$(uifile)))
+
+endef
+
+# gb_UIConfig__add_xmlfile target package-target type xmlfile
+define gb_UIConfig__add_xmlfile
+$(call gb_UIConfig__package_file,$(1),$(call gb_UIConfig_get_packagename,$(2)),$(3),$(notdir $(4)).xml,$(4).xml)
+
+endef
+
+define gb_UIConfig__add_menubarfile
+$(call gb_UIMenubarTarget_UIMenubarTarget,$(2),$(3))
+$(call gb_Package_add_file,$(call gb_UIConfig_get_packagename,$(1)_generated),$(gb_UIConfig_INSTDIR)/$(1)/menubar/$(notdir $(2)).xml,$(subst $(WORKDIR)/,,$(call gb_UIMenubarTarget_get_target,$(2))))
+$(call gb_PackageSet_add_package,$(call gb_UIConfig_get_packagesetname,$(1)),$(call gb_UIConfig_get_packagename,$(1)_generated))
+
+$(call gb_Package_get_target,$(call gb_UIConfig_get_packagename,$(1)_generated)) : $(call gb_UIMenubarTarget_get_target,$(2))
+$(call gb_Package_get_clean_target,$(call gb_UIConfig_get_packagename,$(1)_generated)) : $(call gb_UIMenubarTarget_get_clean_target,$(2))
+
+endef
+
+# Add menubar config file to the package.
+#
+# The file is relative to $(SRCDIR) and without extension.
+#
+# gb_UIConfig_add_menubarfile target file
+define gb_UIConfig_add_menubarfile
+$(call gb_UIConfig__add_menubarfile,$(1),$(gb_UIConfig_INSTDIR)/$(1)/menubar/$(notdir $(2)),$(SRCDIR)/$(2).xml)
+
+endef
+
+# Adds multiple menubar config files to the package.
+#
+# gb_UIConfig_add_menubarfiles target file(s)
+define gb_UIConfig_add_menubarfiles
+$(foreach menubarfile,$(2),$(call gb_UIConfig_add_menubarfile,$(1),$(menubarfile)))
+
+endef
+
+# Add a generated menubar config file to the package.
+#
+# The file is relative to $(WORKDIR) and without extension.
+#
+# gb_UIConfig_add_generated_menubarfile target file
+define gb_UIConfig_add_generated_menubarfile
+$(call gb_UIConfig__add_menubarfile,$(1),$(gb_UIConfig_INSTDIR)/$(1)/menubar/$(notdir $(2)),$(WORKDIR)/$(2).xml)
+
+endef
+
+# Adds multiple menubar config files to the package.
+#
+# gb_UIConfig_add_generated_menubarfiles target file(s)
+define gb_UIConfig_add_generated_menubarfiles
+$(foreach menubarfile,$(2),$(call gb_UIConfig_add_generated_menubarfile,$(1),$(menubarfile)))
+
+endef
+
+# Add statusbar config file to the package.
+#
+# The file is relative to $(SRCDIR) and without extension.
+#
+# gb_UIConfig_add_statusbarfile target file
+define gb_UIConfig_add_statusbarfile
+$(call gb_UIConfig__add_xmlfile,$(1),$(1),statusbar,$(2))
+
+endef
+
+# Adds multiple statusbar config files to the package.
+#
+# gb_UIConfig_add_statusbarfiles target file(s)
+define gb_UIConfig_add_statusbarfiles
+$(foreach statusbarfile,$(2),$(call gb_UIConfig_add_statusbarfile,$(1),$(statusbarfile)))
+
+endef
+
+# Add toolbar config file to the package.
+#
+# The file is relative to $(SRCDIR) and without extension.
+#
+# gb_UIConfig_add_toolbarfile target file
+define gb_UIConfig_add_toolbarfile
+$(call gb_UIConfig__add_xmlfile,$(1),$(1),toolbar,$(2))
+
+endef
+
+# Adds multiple toolbar config files to the package.
+#
+# gb_UIConfig_add_toolbarfiles target file(s)
+define gb_UIConfig_add_toolbarfiles
+$(foreach toolbarfile,$(2),$(call gb_UIConfig_add_toolbarfile,$(1),$(toolbarfile)))
+
+endef
+
+# Add popupmenu config file to the package.
+#
+# The file is relative to $(SRCDIR) and without extension.
+#
+# gb_UIConfig_add_popupmenufile target file
+define gb_UIConfig_add_popupmenufile
+$(call gb_UIConfig__add_xmlfile,$(1),$(1),popupmenu,$(2))
+
+endef
+
+# Adds multiple popupmenu config files to the package.
+#
+# gb_UIConfig_add_popupmenufiles target file(s)
+define gb_UIConfig_add_popupmenufiles
+$(foreach popupmenufile,$(2),$(call gb_UIConfig_add_popupmenufile,$(1),$(popupmenufile)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/UITest.mk b/solenv/gbuild/UITest.mk
new file mode 100644
index 000000000..0a0893923
--- /dev/null
+++ b/solenv/gbuild/UITest.mk
@@ -0,0 +1,157 @@
+# -*- 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/.
+#
+
+# UITest class
+
+gb_UITest_UNITTESTFAILED ?= $(GBUILDDIR)/uitest-failed-default.sh
+
+ifeq ($(SYSTEM_PYTHON),)
+gb_UITest_EXECUTABLE := $(gb_Python_INSTALLED_EXECUTABLE)
+gb_UITest_DEPS ?= $(call gb_Package_get_target,python3)
+else
+gb_UITest_EXECUTABLE := $(PYTHON_FOR_BUILD)
+gb_UITest_DEPS :=
+endif
+
+# UITests are much more likely to generate core files for the soffice than for
+# the python executable, but solenv/bin/gdb-core-bt.sh is often unable to
+# determine the executable that generated a core file, so make it fall back to
+# the soffice executable rather than to gb_UITest_EXECUTABLE:
+gb_UITest_EXECUTABLE_GDB := $(call gb_Executable_get_target,soffice_bin)
+
+ifneq ($(strip $(UITESTTRACE)),)
+gb_UITest_GDBTRACE := --gdb
+gb_UITest__interactive := $(true)
+endif
+
+ifneq ($(gb_UITest_DEBUGRUN),)
+gb_UITest_SOFFICEARG:=connect:pipe,name=$(USER)
+gb_UITest__interactive := $(true)
+else
+gb_UITest_SOFFICEARG:=path:$(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice
+endif
+
+gb_UITest_COMMAND = $(ICECREAM_RUN) $(gb_CppunitTest_RR) $(gb_UITest_EXECUTABLE) $(SRCDIR)/uitest/test_main.py
+
+gb_TEST_ENV_VARS += LIBO_LANG=C
+
+.PHONY : $(call gb_UITest_get_clean_target,%)
+$(call gb_UITest_get_clean_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $@ $@.log)
+
+ifneq ($(DISABLE_PYTHON),TRUE)
+
+# qadevOOo/qa/registrymodifications.xcu is copied to user profile directory to ensure en_US locale;
+# this might be overwritten later when gb_UITest_use_config is set
+.PHONY : $(call gb_UITest_get_target,%)
+$(call gb_UITest_get_target,%) :| $(gb_UITest_DEPS)
+ifneq ($(gb_SUPPRESS_TESTS),)
+ @true
+else
+ $(call gb_Output_announce,$*,$(true),UIT,2)
+ $(call gb_Trace_StartRange,$*,UIT)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(dir $(call gb_UITest_get_target,$*)) && \
+ mkdir -p $(dir $(call gb_UITest_get_target,$*))/user/user && \
+ cp $(SRCDIR)/qadevOOo/qa/registrymodifications.xcu $(dir $(call gb_UITest_get_target,$*))/user/user/ && \
+ $(if $(gb_UITest__interactive),, \
+ rm -fr $@.core && mkdir -p $(dir $(call gb_UITest_get_target,$*))user/ && mkdir $@.core && cd $@.core && ) \
+ $(if $(gb_UITest_use_config), \
+ cp $(gb_UITest_use_config) $(dir $(call gb_UITest_get_target,$*))user/. && ) \
+ ($(gb_UITest_PRECOMMAND) \
+ $(if $(G_SLICE),G_SLICE=$(G_SLICE)) \
+ $(if $(GLIBCXX_FORCE_NEW),GLIBCXX_FORCE_NEW=$(GLIBCXX_FORCE_NEW)) \
+ $(DEFS) \
+ $(if $(filter WNT,$(OS)),SAL_LOG_FILE="$(dir $(call gb_UITest_get_target,$*))/soffice.out.log") \
+ TEST_LIB=$(call gb_Library_get_target,test) \
+ URE_BOOTSTRAP=vnd.sun.star.pathname:$(call gb_Helper_get_rcfile,$(INSTROOT)/$(LIBO_ETC_FOLDER)/fundamental) \
+ PYTHONPATH="$(PYPATH)" \
+ TestUserDir="$(call gb_Helper_make_url,$(dir $(call gb_UITest_get_target,$*)))" \
+ PYTHONDONTWRITEBYTECODE=0 \
+ $(if $(ENABLE_WERROR),PYTHONWARNINGS=error) \
+ $(if $(filter WNT,$(OS)),TZ=) \
+ $(gb_TEST_ENV_VARS) \
+ $(gb_UITest_COMMAND) \
+ --soffice="$(gb_UITest_SOFFICEARG)" \
+ --userdir=$(call gb_Helper_make_url,$(dir $(call gb_UITest_get_target,$*))user) \
+ --dir=$(strip $(MODULES)) \
+ $(gb_UITest_GDBTRACE) \
+ $(if $(gb_UITest__interactive),, \
+ > $@.log 2>&1 \
+ || ($(if $(value gb_CppunitTest_postprocess), \
+ RET=$$?; \
+ $(call gb_CppunitTest_postprocess,$(gb_UITest_EXECUTABLE_GDB),$@.core,$$RET) >> $@.log 2>&1;) \
+ $(if $(filter WNT,$(OS)), \
+ printf '%s: <<<\n' $(dir $(call gb_UITest_get_target,$*))/soffice.out.log; \
+ cat $(dir $(call gb_UITest_get_target,$*))/soffice.out.log; \
+ printf ' >>>\n\n';) \
+ cat $@.log; $(gb_UITest_UNITTESTFAILED) UI $*))))
+ $(call gb_Trace_EndRange,$*,UIT)
+endif
+
+# always use udkapi and URE services
+define gb_UITest_UITest
+$(call gb_UITest_get_target,$(1)) : PYPATH := $(SRCDIR)/uitest$$(gb_CLASSPATHSEP)$(SRCDIR)/unotest/source/python$$(gb_CLASSPATHSEP)$(INSTROOT)/$(LIBO_LIB_PYUNO_FOLDER)$(if $(filter-out $(LIBO_LIB_PYUNO_FOLDER),$(LIBO_LIB_FOLDER)),$(gb_CLASSPATHSEP)$(INSTROOT)/$(LIBO_LIB_FOLDER))
+$(call gb_UITest_get_target,$(1)) : MODULES :=
+
+$(eval $(call gb_TestHelpers_use_more_fonts,$(call gb_UITest_get_target,$(1))))
+$(eval $(call gb_Module_register_target,$(call gb_UITest_get_target,$(1)),$(call gb_UITest_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),UITest)
+
+endef
+
+define gb_UITest_set_defs
+$(call gb_UITest_get_target,$(1)) : DEFS := $(2)
+
+endef
+
+# put the directory on the PYTHONPATH because the "unittest" loader
+# mysteriously fails to load modules given as absolute path unless the $PWD is
+# a prefix of the absolute path, which it is not when we go into a certain
+# dir to get a core dump there
+#
+# gb_UITest_add_modules directory module(s)
+define gb_UITest_add_modules
+$(call gb_UITest_get_target,$(1)) : PYPATH := $$(PYPATH)$$(gb_CLASSPATHSEP)$(strip $(2))/$(strip $(3))
+$(call gb_UITest_get_target,$(1)) : MODULES += $(strip $(2))/$(strip $(3))
+
+endef
+
+define gb_UITest_use_customtarget
+$(call gb_UITest_get_target,$(1)) : $(call gb_CustomTarget_get_workdir,$(2))
+
+endef
+
+define gb_UITest_use_configuration
+$(call gb_UITest_get_target,$(1)) : gb_UITest_use_config := $(2)
+endef
+
+
+else # DISABLE_PYTHON
+
+.PHONY : $(call gb_UITest_get_target,$(1))
+$(call gb_UITest_get_target,%) :
+ifeq ($(gb_SUPPRESS_TESTS),)
+ $(call gb_Output_announce,$* (skipped - no UITest),$(true),PYT,2)
+endif
+ @true
+
+define gb_UITest_UITest
+$(eval $(call gb_Module_register_target,$(call gb_UITest_get_target,$(1)),$(call gb_UITest_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),UITest)
+
+endef
+
+gb_UITest_set_defs :=
+gb_UITest_add_modules :=
+gb_UITest_use_customtarget :=
+
+endif # DISABLE_PYTHON
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/UnoApi.mk b/solenv/gbuild/UnoApi.mk
new file mode 100644
index 000000000..d99195d21
--- /dev/null
+++ b/solenv/gbuild/UnoApi.mk
@@ -0,0 +1,104 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+gb_UnoApi_ENABLE_INSTALL := $(and $(filter host,$(gb_Side)),$(filter ODK,$(BUILD_TYPE)))
+
+.PHONY : $(call gb_UnoApi_get_clean_target,%)
+$(call gb_UnoApi_get_clean_target,%) :
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_UnoApi_get_target,$*))
+
+# call gb_UnoApi_UnoApi,api
+define gb_UnoApi_UnoApi
+$(call gb_UnoApiTarget_UnoApiTarget,$(1),$(1))
+$(call gb_UnoApiHeadersTarget_UnoApiHeadersTarget,$(1))
+ifneq ($(gb_UnoApi_ENABLE_INSTALL),)
+$(call gb_Package_Package_internal,$(1)_idl,$(SRCDIR))
+$(call gb_Package_set_outdir,$(1)_idl,$(INSTDIR))
+endif
+
+$(call gb_UnoApi_get_target,$(1)) :| $(dir $(call gb_UnoApi_get_target,$(1))).dir
+$(call gb_UnoApi_get_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(1))
+$(call gb_UnoApi_get_target,$(1)) :| $(call gb_UnoApiHeadersTarget_get_target,$(1))
+$(call gb_UnoApi_get_clean_target,$(1)) : $(call gb_UnoApiTarget_get_clean_target,$(1))
+$(call gb_UnoApi_get_clean_target,$(1)) : $(call gb_UnoApiHeadersTarget_get_clean_target,$(1))
+
+$(call gb_Deliver_add_deliverable,$(call gb_UnoApi_get_target,$(1)),$(call gb_UnoApiTarget_get_target,$(1)),$(1))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_UnoApi_get_target,$(1)),$(call gb_UnoApi_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),UnoApi)
+
+endef
+
+ifneq ($(gb_UnoApi_ENABLE_INSTALL),)
+
+# Create a package of IDL files for putting into SDK.
+#
+# gb_UnoApi_package_idlfiles api
+define gb_UnoApi_package_idlfiles
+$(call gb_UnoApi_get_target,$(1)) :| $(call gb_Package_get_target,$(1)_idl)
+$(call gb_UnoApi_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(1)_idl)
+
+endef
+
+define gb_UnoApi__add_idlfile
+$(call gb_Package_add_file,$(1)_idl,$(patsubst $(1)/%,$(SDKDIRNAME)/idl/%,$(2).idl),$(2).idl)
+
+endef
+
+else # !gb_UnoApi_ENABLE_INSTALL
+
+gb_UnoApi_package_idlfiles :=
+gb_UnoApi__add_idlfile :=
+
+endif
+
+# For enum types, plain struct types, polymorphic struct type templates,
+# exception types, interface types, typedefs, and constant groups:
+define gb_UnoApi_add_idlfiles
+$(call gb_UnoApiTarget_add_idlfiles,$(1),$(2),$(3))
+$(call gb_UnoApiHeadersTarget_add_headerfiles,$(1),$(2),$(addsuffix .hpp,$(3)))
+$(call gb_UnoApiHeadersTarget_add_headerfiles,$(1),$(2),$(addsuffix .hdl,$(3)))
+$(foreach idl,$(3),$(call gb_UnoApi__add_idlfile,$(1),$(gb_UnoApiTarget_REG_$(1))/$(2)/$(idl)))
+
+endef
+
+# For single-interface--based services and interface-based singletons:
+define gb_UnoApi_add_idlfiles_nohdl
+$(call gb_UnoApiTarget_add_idlfiles,$(1),$(2),$(3))
+$(call gb_UnoApiHeadersTarget_add_headerfiles,$(1),$(2),$(addsuffix .hpp,$(3)))
+$(foreach idl,$(3),$(call gb_UnoApi__add_idlfile,$(1),$(gb_UnoApiTarget_REG_$(1))/$(2)/$(idl)))
+
+endef
+
+# For accumulation-based services and service-based singletons:
+define gb_UnoApi_add_idlfiles_noheader
+$(call gb_UnoApiTarget_add_idlfiles,$(1),$(2),$(3))
+$(foreach idl,$(3),$(call gb_UnoApi__add_idlfile,$(1),$(gb_UnoApiTarget_REG_$(1))/$(2)/$(idl)))
+
+endef
+
+define gb_UnoApi__use_api
+$(call gb_UnoApiTarget_use_api,$(1),$(2))
+$(call gb_UnoApiHeadersTarget_use_api,$(1),$(2))
+$(call gb_UnoApi_get_target,$(1)) :| $(call gb_UnoApi_get_target,$(2))
+
+endef
+
+define gb_UnoApi_use_api
+$(foreach rdb,$(2),$(call gb_UnoApi__use_api,$(1),$(rdb)))
+
+endef
+
+define gb_UnoApi_set_reference_rdbfile
+$(call gb_UnoApiTarget_set_reference_rdbfile,$(1),$(2))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/UnoApiTarget.mk b/solenv/gbuild/UnoApiTarget.mk
new file mode 100644
index 000000000..563ab82a2
--- /dev/null
+++ b/solenv/gbuild/UnoApiTarget.mk
@@ -0,0 +1,250 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# UnoApiTarget
+
+gb_UnoApiTarget_UNOIDLWRITEDEPS := $(call gb_Executable_get_runtime_dependencies,unoidl-write)
+gb_UnoApiTarget_UNOIDLWRITECOMMAND := $(call gb_Executable_get_command,unoidl-write)
+
+gb_UnoApiTarget_UNOIDLCHECKDEPS := $(call gb_Executable_get_runtime_dependencies,unoidl-check)
+gb_UnoApiTarget_UNOIDLCHECKCOMMAND := $(call gb_Executable_get_command,unoidl-check)
+
+define gb_UnoApiTarget__command
+mkdir -p $(dir $(1)) \
+$(if $(UNOAPI_ENTITIES), \
+ && RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),500,$(UNOAPI_ENTITIES))) \
+&& $(gb_UnoApiTarget_UNOIDLWRITECOMMAND) \
+ $(foreach rdb,$(UNOAPI_DEPRDBS),$(call gb_UnoApiTarget_get_target,$(rdb))) \
+ $(SRCDIR)/$(gb_UnoApiTarget_REG_$(2)) $(if $(UNOAPI_ENTITIES),@$${RESPONSEFILE}) $(1) \
+$(if $(UNOAPI_ENTITIES),&& rm -f $${RESPONSEFILE}) \
+$(if $(UNOAPI_REFERENCE), \
+ $(call gb_Output_announce,$(2),$(true),DBc,3) \
+ && $(gb_UnoApiTarget_UNOIDLCHECKCOMMAND) $(UNOAPI_REFERENCE) -- \
+ $(foreach rdb,$(UNOAPI_DEPRDBS),$(call gb_UnoApiTarget_get_target,$(rdb))) \
+ $(1))
+endef
+
+$(call gb_UnoApiTarget_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),UNO,4)
+ $(call gb_Trace_StartRange,$*,UNO)
+ $(call gb_UnoApiTarget__command,$@,$*)
+ $(call gb_Trace_EndRange,$*,UNO)
+
+.PHONY : $(call gb_UnoApiTarget_get_clean_target,%)
+$(call gb_UnoApiTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),UNO,4)
+ -$(call gb_Helper_abbreviate_dirs,\
+ rm -rf $(call gb_UnoApiTarget_get_target,$*))
+
+define gb_UnoApiTarget_UnoApiTarget
+gb_UnoApiTarget_REG_$(1) := $(2)
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_ENTITIES :=
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_REFERENCE :=
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_DEPRDBS :=
+$(call gb_UnoApiTarget_get_target,$(1)) : $(gb_UnoApiTarget_UNOIDLWRITEDEPS)
+$(call gb_UnoApiTarget_get_target,$(1)) : $(SRCDIR)/$(2) # may be dir, though
+
+endef
+
+define gb_UnoApiTarget_add_idlfile
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_ENTITIES += $(subst /,.,$(2))$(if $(2),.)$(3)
+$(call gb_UnoApiTarget_get_target,$(1)) : $(SRCDIR)/$(gb_UnoApiTarget_REG_$(1))/$(2)/$(3).idl
+
+endef
+
+define gb_UnoApiTarget_add_idlfiles
+$(foreach idl,$(3),$(call gb_UnoApiTarget_add_idlfile,$(1),$(2),$(idl)))
+
+endef
+
+define gb_UnoApiTarget_set_reference_rdbfile
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_REFERENCE := $(2)
+$(call gb_UnoApiTarget_get_target,$(1)) : $(2)
+$(call gb_UnoApiTarget_get_target,$(1)) : $(gb_UnoApiTarget_UNOIDLCHECKDEPS)
+
+endef
+
+define gb_UnoApiTarget_use_api
+$(call gb_UnoApiTarget_get_target,$(1)) : UNOAPI_DEPRDBS += $(2)
+$(call gb_UnoApiTarget_get_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(2))
+
+endef
+
+# UnoApiHeadersTarget
+
+# defined by platform
+# gb_UnoApiHeadersTarget_select_variant
+
+# Allow to redefine header variant.
+#
+# On iOS we use static linking because dynamic loading of own code
+# isn't allowed by the iOS App Store rules, and we want our code to be
+# eventually distributable there as part of apps.
+#
+# To avoid problems that this causes together with the lovely
+# intentional breaking of the One Definition Rule, for iOS we always
+# generate comprehensive headers for certain type RDBS. (The ODR
+# breakage doesn't harm, by accident or careful design, on platforms
+# where shared libraries are used.) To avoid generating the same headers
+# more than once, we are silently "redirecting" the target to point to
+# comprehensive headers instead.
+#
+# Example:
+# If gb_UnoApiHeadersTarget_select_variant is defined as
+#
+# ifeq ($(DISABLE_DYNLOADING),TRUE)
+# gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))
+# else
+# gb_UnoApiHeadersTarget_select_variant = $(2)
+# endif
+#
+# then, for the DISABLE_DYNLOADING case, whenever a makefile uses
+# $(call gb_UnoApiHeadersTarget_get_target,udkapi) or $(call
+# gb_UnoApiHeadersTarget_get_dir,udkapi), it will get target or dir for
+# comprehensive headers instead.
+#
+# We are experimenting with static linking on Android, too. There for
+# technical reasons to get around silly limitations in the OS, sigh.
+#
+# gb_UnoApiHeadersTarget_select_variant api default-variant
+ifeq ($(origin gb_UnoApiHeadersTarget_select_variant),undefined)
+$(eval $(call gb_Output_error,gb_UnoApiHeadersTarget_select_variant must be defined by platform))
+endif
+
+gb_UnoApiHeadersTarget_CPPUMAKERDEPS := $(call gb_Executable_get_runtime_dependencies,cppumaker)
+gb_UnoApiHeadersTarget_CPPUMAKERCOMMAND := $(call gb_Executable_get_command,cppumaker)
+
+define gb_UnoApiHeadersTarget__command
+ $(gb_UnoApiHeadersTarget_CPPUMAKERCOMMAND) \
+ -Gc $(4) -O$(3) $(call gb_UnoApiTarget_get_target,$(2)) \
+ $(UNOAPI_DEPS) && \
+ touch $(1)
+
+endef
+
+$(call gb_UnoApiHeadersTarget_get_real_bootstrap_target,%) : \
+ $(gb_UnoApiHeadersTarget_CPPUMAKERDEPS)
+ $(call gb_Output_announce,$*,$(true),HPB,3) \
+ $(call gb_Trace_StartRange,$*,HPB)
+ $(call gb_UnoApiHeadersTarget__command,$@,$*,$(call gb_UnoApiHeadersTarget_get_bootstrap_dir,$*))
+ $(call gb_Trace_EndRange,$*,HPB)
+
+$(call gb_UnoApiHeadersTarget_get_real_comprehensive_target,%) : \
+ $(gb_UnoApiHeadersTarget_CPPUMAKERDEPS)
+ $(call gb_Output_announce,$*,$(true),HPC,3)
+ $(call gb_Trace_StartRange,$*,HPC)
+ $(call gb_UnoApiHeadersTarget__command,$@,$*,$(call gb_UnoApiHeadersTarget_get_comprehensive_dir,$*),-C)
+ $(call gb_Trace_EndRange,$*,HPC)
+
+$(call gb_UnoApiHeadersTarget_get_real_target,%) : \
+ $(gb_UnoApiHeadersTarget_CPPUMAKERDEPS)
+ $(call gb_Output_announce,$*,$(true),HPP,3) \
+ $(call gb_Trace_StartRange,$*,HPP)
+ $(call gb_UnoApiHeadersTarget__command,$@,$*,$(call gb_UnoApiHeadersTarget_get_dir,$*),-L)
+ $(call gb_Trace_EndRange,$*,HPP)
+
+.PHONY : $(call gb_UnoApiHeadersTarget_get_clean_target,%)
+$(call gb_UnoApiHeadersTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),HPP,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf \
+ $(call gb_UnoApiHeadersTarget_get_real_dir,$*) \
+ $(call gb_UnoApiHeadersTarget_get_real_bootstrap_dir,$*) \
+ $(call gb_UnoApiHeadersTarget_get_real_comprehensive_dir,$*) \
+ $(call gb_UnoApiHeadersTarget_get_real_target,$*) \
+ $(call gb_UnoApiHeadersTarget_get_real_bootstrap_target,$*)) \
+ $(call gb_UnoApiHeadersTarget_get_real_comprehensive_target,$*)
+
+define gb_UnoApiHeadersTarget_UnoApiHeadersTarget
+$(call gb_UnoApiHeadersTarget_get_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(1))
+$(call gb_UnoApiHeadersTarget_get_bootstrap_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(1))
+$(call gb_UnoApiHeadersTarget_get_comprehensive_target,$(1)) : $(call gb_UnoApiTarget_get_target,$(1))
+$(call gb_UnoApiHeadersTarget_get_clean_target,$(1)) : $(call gb_UnoApiTarget_get_clean_target,$(1))
+
+$(call gb_UnoApiHeadersTarget_get_target,$(1)) : UNOAPI_DEPS :=
+$(call gb_UnoApiHeadersTarget_get_bootstrap_target,$(1)) : UNOAPI_DEPS :=
+$(call gb_UnoApiHeadersTarget_get_comprehensive_target,$(1)) : UNOAPI_DEPS :=
+
+# need dummy recipes so that header files are delivered in Package_inc;
+# otherwise make will consider the header to be up-to-date because it was
+# actually built by the recipe for gb_UnoApiHeadersTarget_get_target
+$(call gb_UnoApiHeadersTarget_get_real_dir,$(1))/%.hdl : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_target,$(1))
+ touch $$@
+
+$(call gb_UnoApiHeadersTarget_get_real_dir,$(1))/%.hpp : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_target,$(1))
+ touch $$@
+
+$(call gb_UnoApiHeadersTarget_get_real_bootstrap_dir,$(1))/%.hdl : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_bootstrap_target,$(1))
+ touch $$@
+
+$(call gb_UnoApiHeadersTarget_get_real_bootstrap_dir,$(1))/%.hpp : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_bootstrap_target,$(1))
+ touch $$@
+
+$(call gb_UnoApiHeadersTarget_get_real_comprehensive_dir,$(1))/%.hdl : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_comprehensive_target,$(1))
+ touch $$@
+
+$(call gb_UnoApiHeadersTarget_get_real_comprehensive_dir,$(1))/%.hpp : \
+ $(call gb_Executable_get_target_for_build,cppumaker) \
+ | $(call gb_UnoApiHeadersTarget_get_real_comprehensive_target,$(1))
+ touch $$@
+
+endef
+
+# ensure that idl change triggers the dummy rule to rebuild the headers
+# call gb_UnoApiHeadersTarget_add_headerfile,unoapi,headerfile
+define gb_UnoApiHeadersTarget_add_headerfile
+$(call gb_UnoApiHeadersTarget_get_dir,$(1))/$(2) : \
+ $(SRCDIR)/$(basename $(gb_UnoApiTarget_REG_$(1))/$(2)).idl
+
+endef
+
+# call gb_UnoApiHeadersTarget_add_headerfiles,unoapi,directory,headerfilenames
+define gb_UnoApiHeadersTarget_add_headerfiles
+$(foreach hdr,$(3),$(call gb_UnoApiHeadersTarget_add_headerfile,$(1),$(2)/$(hdr)))
+endef
+
+define gb_UnoApiHeadersTarget__use_api_for_target
+$(call gb_UnoApiHeadersTarget_get_$(3),$(1)) : $(call gb_UnoApiTarget_get_target,$(2))
+$(call gb_UnoApiHeadersTarget_get_$(3),$(1)) : UNOAPI_DEPS += -X$(call gb_UnoApiTarget_get_target,$(2))
+
+endef
+
+define gb_UnoApiHeadersTarget__use_api
+$(call gb_UnoApiHeadersTarget__use_api_for_target,$(1),$(2),target)
+$(call gb_UnoApiHeadersTarget__use_api_for_target,$(1),$(2),bootstrap_target)
+$(call gb_UnoApiHeadersTarget__use_api_for_target,$(1),$(2),comprehensive_target)
+
+endef
+
+define gb_UnoApiHeadersTarget_use_api
+$(foreach rdb,$(2),$(call gb_UnoApiHeadersTarget__use_api,$(1),$(rdb)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/UnpackedTarball.mk b/solenv/gbuild/UnpackedTarball.mk
new file mode 100644
index 000000000..fb574f6a9
--- /dev/null
+++ b/solenv/gbuild/UnpackedTarball.mk
@@ -0,0 +1,455 @@
+# -*- 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/.
+#
+
+# UnpackedTarget class
+
+# Handles unpacking of a tarball
+
+# platform
+# gb_UnpackedTarget_TARFILE_LOCATION
+# NOTE: only for commands; targets should use TARFILE_LOCATION directly
+
+# Location of internal copies of config.{guess,sub}.
+gb_UnpackedTarball_CONFIGDIR := $(GBUILDDIR)
+
+define gb_UnpackedTarget__command_untar
+$(GNUTAR) \
+ -x \
+ $(3) \
+ -C $(UNPACKED_DIR) \
+ $(STRIP_COMPONENTS)=$(UNPACKED_STRIP_COMPONENTS) \
+ -f $(UNPACKED_TARBALL)
+endef
+
+define gb_UnpackedTarget__command_unzip
+unzip \
+ -qq \
+ -d $(UNPACKED_DIR) $(UNPACKED_TARBALL) \
+$(if $(filter-out 0,$(UNPACKED_STRIP_COMPONENTS)),\
+ && UNZIP_DIR=`ls $(UNPACKED_DIR)` \
+ && mv $(UNPACKED_DIR)/$$UNZIP_DIR/* $(UNPACKED_DIR) \
+ && rm -rf $(UNPACKED_DIR)/$$UNZIP_DIR \
+)
+endef
+
+define gb_UnpackedTarget__command
+$(call gb_Output_announce,$(notdir $(2)),$(true),UPK,1)
+ $(call gb_Trace_StartRange,$(notdir $(2)),UPK)
+$(call gb_Helper_abbreviate_dirs,\
+ $(if $(wildcard $(UNPACKED_DIR)),rm -rf $(UNPACKED_DIR) &&) \
+ mkdir -p $(UNPACKED_DIR) && \
+ $(call gb_UnpackedTarget__command_$(1),$(2),$(3),$(4)) && \
+ touch $(2) \
+)
+ $(call gb_Trace_EndRange,$(notdir $(2)),UPK)
+endef
+
+$(dir $(call gb_UnpackedTarget_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_UnpackedTarget_get_target,%).tar.bz2 :
+ $(call gb_UnpackedTarget__command,untar,$@,$*,-j)
+
+$(call gb_UnpackedTarget_get_target,%).tar.xz :
+ $(call gb_UnpackedTarget__command,untar,$@,$*,-J)
+
+$(call gb_UnpackedTarget_get_target,%).tar.gz :
+ $(call gb_UnpackedTarget__command,untar,$@,$*,-z)
+
+$(call gb_UnpackedTarget_get_target,%).tgz :
+ $(call gb_UnpackedTarget__command,untar,$@,$*,-z)
+
+$(call gb_UnpackedTarget_get_target,%).zip :
+ $(call gb_UnpackedTarget__command,unzip,$@,$*)
+
+$(call gb_UnpackedTarget_get_target,%).oxt :
+ $(call gb_UnpackedTarget__command,unzip,$@,$*)
+
+.PHONY : $(call gb_UnpackedTarget_get_clean_target,%)
+$(call gb_UnpackedTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),UPK,1)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_UnpackedTarget_get_target,$*) \
+ )
+
+# gb_UnpackedTarget_UnpackedTarget target outdir strip-components?
+define gb_UnpackedTarget_UnpackedTarget
+$(call gb_UnpackedTarget_get_target,$(1)) : UNPACKED_DIR := $(2)
+$(call gb_UnpackedTarget_get_target,$(1)) : UNPACKED_TARBALL := $(gb_UnpackedTarget_TARFILE_LOCATION)/$(1)
+$(call gb_UnpackedTarget_get_target,$(1)) : UNPACKED_STRIP_COMPONENTS := $(if $(strip $(3)),$(strip $(3)),1)
+
+$(call gb_UnpackedTarget_get_target,$(1)) : $(TARFILE_LOCATION)/$(1)
+$(call gb_UnpackedTarget_get_target,$(1)) :| $(dir $(call gb_UnpackedTarget_get_target,$(1))).dir
+
+endef
+
+# UnpackedTarball class
+
+# Handles unpacking and patching of an external project
+#
+# The unpacked dir is recreated every time one of the patches, copied
+# files or the makefile changes.
+
+# This is what dmake patches use. Once all external modules are
+# converted, it is better to be changed to 1.
+gb_UnpackedTarball_PATCHLEVEL_DEFAULT := 2
+
+gb_UnpackedTarball_CONVERTTODOS = \
+ $(gb_AWK) 'sub("$$","\r")' $(1) > $(1).TEMP && mv $(1).TEMP $(1)
+gb_UnpackedTarball_CONVERTTOUNIX = \
+ tr -d '\r' < $(1) > $(1).TEMP && mv $(1).TEMP $(1)
+
+define gb_UnpackedTarball__copy_files_impl
+$(if $(1),\
+ && cp $(firstword $(1)) $(firstword $(2)) \
+ $(call gb_UnpackedTarball__copy_files_impl,$(wordlist 2,$(words $(1)),$(1)),$(wordlist 2,$(words $(2)),$(2))) \
+)
+endef
+
+# Drop leading &&
+define gb_UnpackedTarball__copy_files_fix
+$(wordlist 2,$(words $(1)),$(1))
+endef
+
+define gb_UnpackedTarball__copy_files
+$(call gb_UnpackedTarball__copy_files_fix,$(call gb_UnpackedTarball__copy_files_impl,$(1),$(2)))
+endef
+
+define gb_UnpackedTarball__command
+$(call gb_Helper_abbreviate_dirs,\
+ ( \
+ cd $(3) \
+ $(if $(UNPACKED_IS_BIN_TARBALL),,&& \
+ $(if $(UNPACKED_PRE_ACTION),\
+ $(UNPACKED_PRE_ACTION) && \
+ ) \
+ $(if $(UNPACKED_FILES),\
+ mkdir -p $(sort $(dir $(UNPACKED_DESTFILES))) && \
+ $(call gb_UnpackedTarball__copy_files,$(UNPACKED_FILES),$(UNPACKED_DESTFILES)) && \
+ ) \
+ $(foreach file,$(UNPACKED_FIX_EOL),$(call gb_UnpackedTarball_CONVERTTOUNIX,$(file)) && ) \
+ $(if $(UNPACKED_PATCHES),\
+ for p in $(UNPACKED_PATCHES); do \
+ pl=$(UNPACKED_PATCHLEVEL); \
+ s=$${p##*.}; case "$$s" in [0-9]$(CLOSE_PAREN) pl="$$s"; ;; esac ; \
+ $(GNUPATCH) $(UNPACKED_PATCHFLAGS) -f -s "-p$$pl" --fuzz=0 < "$$p"; \
+ if test "$$?" -ne 0; then echo "Patch FAILED: $$p"; exit 1; fi;\
+ done && \
+ ) \
+ $(foreach file,$(UNPACKED_FIX_EOL),$(call gb_UnpackedTarball_CONVERTTODOS,$(file)) && ) \
+ $(foreach confdir,$(UNPACKED_CONFIG_DIRS),\
+ cp -f $(SRCDIR)/config.guess $(SRCDIR)/config.sub $(confdir) && \
+ ) \
+ $(if $(UNPACKED_POST_ACTION),\
+ $(UNPACKED_POST_ACTION) && \
+ ) \
+ $(if $(gb_KEEP_PRISTINE), \
+ rm -fr $(call gb_UnpackedTarball_get_pristine_dir,$(2)) && \
+ cp -r $(call gb_UnpackedTarball_get_dir,$(2)) $(call gb_UnpackedTarball_get_pristine_dir,$(2)) && \
+ ) \
+ touch $(1) \
+ )\
+ ) || \
+ ( \
+ touch $(call gb_UnpackedTarball_get_preparation_target,$(2)) && \
+ exit 1 \
+ )
+)
+endef
+
+$(dir $(call gb_UnpackedTarball_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_UnpackedTarball_get_preparation_target,%) :
+ touch $@
+
+$(call gb_UnpackedTarball_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),PAT,2)
+ $(call gb_Trace_StartRange,$*,PAT)
+ $(call gb_UnpackedTarball__command,$@,$*,$(call gb_UnpackedTarball_get_dir,$*))
+ $(call gb_Trace_EndRange,$*,PAT)
+
+$(call gb_UnpackedTarball_get_final_target,%) :
+ touch $@
+
+.PHONY : $(call gb_UnpackedTarball_get_clean_target,%)
+$(call gb_UnpackedTarball_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),PAT,2)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -rf \
+ $(call gb_UnpackedTarball_get_final_target,$*) \
+ $(call gb_UnpackedTarball_get_target,$*) \
+ $(call gb_UnpackedTarball_get_preparation_target,$*) \
+ $(call gb_UnpackedTarball_get_dir,$*) \
+ $(call gb_UnpackedTarball_get_pristine_dir,$*) \
+ )
+
+# Initialize unpacked tarball
+define gb_UnpackedTarball_UnpackedTarball_internal
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_DESTFILES :=
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_FILES :=
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_FIX_EOL :=
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PATCHES :=
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PATCHLEVEL := $(gb_UnpackedTarball_PATCHLEVEL_DEFAULT)
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PATCHFLAGS :=
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_POST_ACTION :=
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PRE_ACTION :=
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_CONFIG_DIRS :=
+
+$(call gb_UnpackedTarball_get_preparation_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+$(call gb_UnpackedTarball_get_preparation_target,$(1)) :| $(dir $(call gb_UnpackedTarball_get_target,$(1))).dir
+$(call gb_UnpackedTarball_get_target,$(1)) : $(call gb_UnpackedTarball_get_preparation_target,$(1))
+$(call gb_UnpackedTarball_get_target,$(1)) :| $(dir $(call gb_UnpackedTarball_get_target,$(1))).dir
+$(call gb_UnpackedTarball_get_final_target,$(1)) : $(call gb_UnpackedTarball_get_target,$(1))
+
+private gb_UnpackedTarball_PATTERN_RULES_$(1) :=
+
+endef
+
+# Define a new unpacked tarball
+define gb_UnpackedTarball_UnpackedTarball
+$(call gb_UnpackedTarball_UnpackedTarball_internal,$(1))
+
+$$(eval $$(call gb_Module_register_target,$(call gb_UnpackedTarball_get_final_target,$(1)),$(call gb_UnpackedTarball_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),UnpackedTarball,$(call gb_UnpackedTarball_get_final_target,$(1)))
+
+endef
+
+# Convert line ending from dos to unix style for selected files
+#
+# This is done before applying patches, because patches expect unix
+# style line ending, and the files are converted back after that. The
+# files are relative to the unpacked path.
+#
+# gb_UnpackedTarball_fix_end_of_line unpacked file(s)
+define gb_UnpackedTarball_fix_end_of_line
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_FIX_EOL += $(addprefix $(call gb_UnpackedTarball_get_dir,$(1))/,$(2))
+
+endef
+
+
+# Internal version of set_tarball, mostly to avoid repeated invocation of $(shell
+define gb_UnpackedTarball_set_tarball_internal
+$(call gb_UnpackedTarget_UnpackedTarget,$(2),$(call gb_UnpackedTarball_get_dir,$(1)),$(3),$(4))
+$(call gb_UnpackedTarball_get_target,$(1)) : $(call gb_UnpackedTarget_get_target,$(2))
+$(call gb_UnpackedTarball_get_clean_target,$(1)) : $(call gb_UnpackedTarget_get_clean_target,$(2))
+$(call gb_UnpackedTarget_get_target,$(2)) : $(call gb_UnpackedTarball_get_preparation_target,$(1))
+$(if $(findstring in,$(5)),
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_IS_BIN_TARBALL := YES
+$(call gb_ExternalProject_get_state_target,$(1),%) : UNPACKED_IS_BIN_TARBALL := YES)
+$(if $(findstring out,$(5)),$(call gb_Module_get_target,$(4)) : $(TARFILE_LOCATION)/$(6)
+$(TARFILE_LOCATION)/$(6) : $(call gb_Module_get_nonl10n_target,$(4))
+ $$(call gb_Output_announce,$(6),$(true),PKB,3)
+ $$(call gb_Trace_StartRange,$(6),PKB)
+ if test ! -f "$$@" ; then cd $(call gb_UnpackedTarball_get_dir,) && $(GNUTAR) -czf "$$@" $(1)/ || $(GNUTAR) -czf "$$@" $(1)/ ; else touch "$$@" ; fi
+ $$(call gb_Trace_EndRange,$(6),PKB)
+)
+
+endef
+
+# Set tarball name
+#
+# gb_UnpackedTarball_set_tarball unpacked tarball-name
+define gb_UnpackedTarball_set_tarball
+$(if $(USE_LIBRARY_BIN_TAR),
+$(if $(4),
+$(if $(shell "$(SRCDIR)/solenv/bin/bin_library_info.sh" -l "$(gb_UnpackedTarget_TARFILE_LOCATION)" -o "$(4)" -b "$(BUILDDIR)" -s "$(SRCDIR)" -t "$(2)" -m verify -p "$(OS)_$(CPUNAME)"),
+$(call gb_UnpackedTarball_set_tarball_internal,$(1),$(shell "$(SRCDIR)/solenv/bin/bin_library_info.sh" -l "$(gb_UnpackedTarget_TARFILE_LOCATION)" -o "$(4)" -b "$(BUILDDIR)" -s "$(SRCDIR)" -t "$(2)" -m verify -p "$(OS)_$(CPUNAME)"),$(3),$(4),in),\
+$(call gb_UnpackedTarball_set_tarball_internal,$(1),$(2),$(3),$(4),out,$(shell "$(SRCDIR)/solenv/bin/bin_library_info.sh" -l "$(gb_UnpackedTarget_TARFILE_LOCATION)" -o "$(4)" -b "$(BUILDDIR)" -s "$(SRCDIR)" -t "$(2)" -m name -p "$(OS)_$(CPUNAME)")))
+,
+$(call gb_UnpackedTarball_set_tarball_internal,$(1),$(2),$(3),$(4),)
+)
+,
+$(call gb_UnpackedTarball_set_tarball_internal,$(1),$(2),$(3),$(4),)
+)
+
+endef
+
+# Set patch level to be used for all patches
+#
+# The default value is 3 to be able to work with current dmake patches.
+#
+# gb_UnpackedTarball_set_patchlevel unpacked level
+define gb_UnpackedTarball_set_patchlevel
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PATCHLEVEL := $(2)
+
+endef
+
+# Add patch flags to be passed to patch for all patches cf. fdo#66826
+#
+# gb_UnpackedTarball_set_patchlevel unpacked level
+define gb_UnpackedTarball_set_patchflags
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PATCHFLAGS := $(2)
+
+endef
+
+# Add a patch to be applied on the unpacked files
+#
+# gb_UnpackedTarball_add_patch unpacked patch
+define gb_UnpackedTarball_add_patch
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PATCHES += $(SRCDIR)/$(2)
+$(call gb_UnpackedTarball_get_preparation_target,$(1)) : $(SRCDIR)/$(2)
+
+endef
+
+# Add several patches at once
+#
+# gb_UnpackedTarball_add_patches unpacked patch(es)
+define gb_UnpackedTarball_add_patches
+$(foreach patch,$(2),$(call gb_UnpackedTarball_add_patch,$(1),$(patch)))
+
+endef
+
+# Add a file from source dir to the unpacked dir
+#
+# This function should not be used for overwriting existing files--use a
+# patch for that purpose.
+#
+# gb_UnpackedTarball_add_file unpacked destfile file
+define gb_UnpackedTarball_add_file
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_FILES += $(SRCDIR)/$(3)
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_DESTFILES += $(call gb_UnpackedTarball_get_dir,$(1))/$(2)
+$(call gb_UnpackedTarball_get_preparation_target,$(1)) : $(SRCDIR)/$(3)
+
+endef
+
+# Add several files(s) from source dir to the unpacked dir
+#
+# The files are added into the specified subdir.
+#
+# gb_UnpackedTarball_add_files unpacked subdir file(s)
+define gb_UnpackedTarball_add_files
+$(foreach file,$(3),$(call gb_UnpackedTarball_add_file,$(1),$(2)/$(notdir $(file)),$(file)))
+
+endef
+
+# Set arbitrary shell command to be run during unpack
+#
+# The command is run at the very beginning, in freshly unpacked tarball.
+# The command is run in the unpacked directory. If more than one command
+# is used, care should be taken that the whole command fails if either
+# of the sub-commands fails.
+#
+# gb_UnpackedTarball_set_pre_action unpacked shell-command
+define gb_UnpackedTarball_set_pre_action
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_PRE_ACTION := $(strip $(2))
+
+endef
+
+# Set arbitrary shell command to be run during unpack
+#
+# The command is run at the very end: after patching, C++ extension
+# mangling and copying additional files in. The command is run in the
+# unpacked directory. If more than one command is used, care should be
+# taken that the whole command fails if either of the sub-commands
+# fails.
+#
+# NOTE: This is a bit hackish, but it is the easiest way to move files
+# around or delete files (typically because the file causes build
+# problems in the original location, c.f. clucene). This is doable by
+# using -E with patch (we use GNU patch anyway), but it would mean an
+# additional patch to maintain...
+#
+# gb_UnpackedTarball_set_post_action unpacked shell-command
+define gb_UnpackedTarball_set_post_action
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_POST_ACTION := $(strip $(2))
+
+endef
+
+define gb_UnpackedTarbal__make_pattern_rule
+$(call gb_UnpackedTarball_get_dir,$(1))/%$(2) :
+ $$(if $$(wildcard $$@),,$$(call gb_Output_error,file $$@ does not exist in the tarball))
+ $$(if $$(UNPACKED_MODE),chmod $$(UNPACKED_MODE) $$@ &&) \
+ touch $$@
+
+$(eval gb_UnpackedTarball_PATTERN_RULES_$(1) += $(2))
+
+endef
+
+define gb_UnpackedTarbal__ensure_pattern_rule
+$(if $(filter $(2),$(gb_UnpackedTarball_PATTERN_RULES_$(1))),,$(call gb_UnpackedTarbal__make_pattern_rule,$(1),$(2)))
+
+endef
+
+define gb_UnpackedTarbal__make_file_rule
+$(call gb_UnpackedTarball_get_dir,$(1))/$(2) :
+ $$(if $$(wildcard $$@),,$$(call gb_Output_error,file $$@ does not exist in the tarball))
+ $$(if $$(UNPACKED_MODE),chmod $$(UNPACKED_MODE) $$@ &&) \
+ touch $$@
+
+endef
+
+# Mark a source file to be used outside of this module
+#
+# This results in the timestamp of the file being updated, so a possible
+# change is recognized properly by other files depending on it. The
+# update is run after possible post action.
+#
+# See description of class ExternalPackage for more information.
+#
+# gb_UnpackedTarball_mark_output_file unpacked file
+define gb_UnpackedTarball_mark_output_file
+$(call gb_UnpackedTarball_get_final_target,$(1)) : $(call gb_UnpackedTarball_get_dir,$(1))/$(2)
+$(call gb_UnpackedTarball_get_dir,$(1))/$(2) : $(call gb_UnpackedTarball_get_target,$(1))
+$(call gb_UnpackedTarball_get_dir,$(1))/$(2) : UNPACKED_MODE := 644
+$(if $(suffix $(2)),\
+ $(call gb_UnpackedTarbal__ensure_pattern_rule,$(1),$(suffix $(2))),\
+ $(call gb_UnpackedTarbal__make_file_rule,$(1),$(2)) \
+)
+
+endef
+
+# Mark several source files to be used outside of this module
+#
+# gb_UnpackedTarball_mark_output_files unpacked file(s)
+define gb_UnpackedTarball_mark_output_files
+$(foreach file,$(2),$(call gb_UnpackedTarball_mark_output_file,$(1),$(file)))
+
+endef
+
+# Replace project's config.{guess,sub} files by internal copies
+#
+# This is useful if the project's config files are outdated and don't
+# allow build on some new arch. The internal copies are located at
+# gb_UnpackedTarball_CONFIGDIR.
+#
+# If the configs are placed somewhere else than in the top-level dir of
+# the project, pass the (relative) dir as second argument. (It can even
+# be a list of dirs, if the project contains multiple subprojects, each
+# with its own configure.)
+#
+# gb_UnpackedTarball_update_autoconf_configs unpacked dirs(s)?
+define gb_UnpackedTarball_update_autoconf_configs
+$(call gb_UnpackedTarball_get_target,$(1)) : UNPACKED_CONFIG_DIRS += $(if $(strip $(2)),$(2),.)
+
+endef
+
+# force the rebuild of an external target
+# this only works when running as partial build.
+#
+%.rebuild :
+ if [ -f $(call gb_UnpackedTarball_get_target,$*) ] ; then \
+ touch $(call gb_UnpackedTarball_get_target,$*) ; \
+ $(MAKE) ;\
+ fi
+
+%.genpatch :
+ if [ -d $(call gb_UnpackedTarball_get_dir,$*) -a -d $(call gb_UnpackedTarball_get_pristine_dir,$*) ] ; then \
+ ( \
+ patch_file=$$(pwd)/$*.new.patch.1; \
+ cd $(call gb_UnpackedTarball_get_dir,) ; \
+ diff -ur $*.org $* > $$patch_file; \
+ echo "Patch $$patch_file generated" ; \
+ ); \
+ else \
+ echo "Error: No pristine tarball available for $*" 1>&2 ; \
+ fi
+
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/WinResTarget.mk b/solenv/gbuild/WinResTarget.mk
new file mode 100644
index 000000000..7cc98adc5
--- /dev/null
+++ b/solenv/gbuild/WinResTarget.mk
@@ -0,0 +1,123 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# WinResTarget class
+
+gb_WinResTarget_DEFAULTDEFS := $(gb_RCDEFS)
+
+define gb_WinResTarget_WinResTarget
+$(call gb_WinResTarget_WinResTarget_init,$(1))
+$$(eval $$(call gb_Module_register_target,$(call gb_WinResTarget_get_target,$(1)),$(call gb_WinResTarget_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),WinResTarget)
+
+endef
+
+define gb_WinResTarget_WinResTarget_init
+$(call gb_WinResTarget_get_target,$(1)) : DEFS := $(gb_WinResTarget_DEFAULTDEFS)
+$(call gb_WinResTarget_get_target,$(1)) : FLAGS := $(gb_RCFLAGS)
+$(call gb_WinResTarget_get_target,$(1)) : INCLUDE := -I$(SRCDIR)/include $(subst -isystem,-I,$(SOLARINC)) -I$(BUILDDIR)/config_$(gb_Side)
+$(call gb_WinResTarget_get_clean_target,$(1)) : RCFILE :=
+$(call gb_WinResTarget_get_target,$(1)) : RCFILE :=
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_WinResTarget_get_dep_target,$(1)) : DEFS := $$(gb_WinResTarget_DEFAULTDEFS)
+$(call gb_WinResTarget_get_dep_target,$(1)) : FLAGS := $$(gb_RCFLAGS)
+$(call gb_WinResTarget_get_dep_target,$(1)) : INCLUDE := $$(gb_WinResTarget_INCLUDE) -I$(BUILDDIR)/config_$(gb_Side)
+$(call gb_WinResTarget_get_dep_target,$(1)) : RCFILE :=
+
+-include $(call gb_WinResTarget_get_dep_target,$(1))
+endif
+
+endef
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_WinResTarget_get_dep_target,%) : $(gb_WinResTarget__command_target)
+ $(call gb_WinResTarget__command_dep,$@,$*,$(call gb_WinResTarget_get_target,$*))
+endif
+
+
+$(call gb_WinResTarget_get_target,%) :
+ $(call gb_WinResTarget__command,$@,$*,$<)
+
+$(call gb_WinResTarget_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),RC ,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ rm -f $(call gb_WinResTarget_get_target,$*) \
+ $(call gb_WinResTarget_get_dep_target,$*))
+
+define gb_WinResTarget_add_defs
+$(call gb_WinResTarget_get_target,$(1)) : DEFS += $(2)
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_WinResTarget_get_dep_target,$(1)) : DEFS += $(2)
+endif
+
+endef
+
+define gb_WinResTarget__add_include
+$(call gb_WinResTarget_get_target,$(1)) : INCLUDE += -I$(2)
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_WinResTarget_get_dep_target,$(1)) : INCLUDE += -I$(2)
+endif
+
+endef
+
+define gb_WinResTarget_set_include
+$(call gb_WinResTarget_get_target,$(1)) : INCLUDE := $(2)
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_WinResTarget_get_dep_target,$(1)) : INCLUDE := $(2)
+endif
+
+endef
+
+define gb_WinResTarget_set_rcfile
+$(call gb_WinResTarget_get_clean_target,$(1)) : RCFILE := $(SRCDIR)/$(strip $(2)).rc
+$(call gb_WinResTarget_get_target,$(1)) : RCFILE := $(SRCDIR)/$(strip $(2)).rc
+$(call gb_WinResTarget_get_target,$(1)) : $(SRCDIR)/$(strip $(2)).rc
+
+ifeq ($(gb_FULLDEPS),$(true))
+$(call gb_WinResTarget_get_dep_target,$(1)) : RCFILE := $(SRCDIR)/$(strip $(2)).rc
+endif
+
+endef
+
+define gb_WinResTarget_add_dependency
+$(call gb_WinResTarget_get_target,$(1)) : $(SRCDIR)/$(strip $(2))
+
+endef
+
+define gb_WinResTarget_add_dependencies
+$(foreach dep,$(2),$(call gb_WinResTarget_add_dependency,$(1),$(dep)))
+
+endef
+
+define gb_WinResTarget__use_custom_headers
+$(call gb_WinResTarget_get_target,$(1)) : $(call gb_CustomTarget_get_target,$(2))
+$(call gb_WinResTarget__add_include,$(1),$(call gb_CustomTarget_get_workdir,$(2)))
+
+endef
+
+define gb_WinResTarget_use_custom_headers
+$(foreach customtarget,$(2),$(call gb_WinResTarget__use_custom_headers,$(1),$(customtarget)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/Zip.mk b/solenv/gbuild/Zip.mk
new file mode 100644
index 000000000..b2debba77
--- /dev/null
+++ b/solenv/gbuild/Zip.mk
@@ -0,0 +1,154 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# Zip class
+
+gb_Zip__get_preparation_target = $(WORKDIR)/Zip/$(1).prepare
+
+gb_Zip_ZIPCOMMAND := zip $(if $(findstring s,$(MAKEFLAGS)),-q)
+
+# remove zip file in workdir and outdir
+$(call gb_Zip_get_clean_target,%) :
+ $(call gb_Output_announce,$*,$(false),ZIP,3)
+ $(call gb_Helper_abbreviate_dirs,\
+ $(if $(CLEAR_LOCATION),rm -rf $(gb_Package_Location_$*) &&) \
+ $(if $(INSTALL_NAME),rm -f $(INSTALL_NAME) &&) \
+ rm -f $(call gb_Zip_get_target,$*) && \
+ rm -f $(call gb_Zip__get_preparation_target,$*))
+
+$(dir $(call gb_Zip_get_target,%)).dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_Zip_get_target,%))%/.dir :
+ $(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+# rule to create zip package in workdir
+# --filesync makes sure that all files in the zip package will be removed that no longer are in $(FILES)
+# if there are no files, zip fails; copy empty zip file to target in that case
+$(call gb_Zip_get_target,%) :
+ $(call gb_Output_announce,$*,$(true),ZIP,3)
+ $(call gb_Trace_StartRange,$*,ZIP)
+ $(call gb_Helper_abbreviate_dirs,\
+ $(if $(FILES),\
+ RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),500,\
+ $(FILES)) && \
+ cd $(LOCATION) && \
+ cat $${RESPONSEFILE} | tr "[:space:]" "\n" | \
+ $(gb_Zip_ZIPCOMMAND) -@rX --filesync --must-match \
+ $(call gb_Zip_get_target,$*) && \
+ rm -f $${RESPONSEFILE} && \
+ touch $@\
+ , cp $(SRCDIR)/solenv/gbuild/empty.zip $@)\
+ $(if $(INSTALL_NAME),&& cp $(call gb_Zip_get_target,$*) $(INSTALL_NAME)) \
+ )
+ $(call gb_Trace_EndRange,$*,ZIP)
+
+# the preparation target is here to ensure proper ordering of actions in cases
+# when we want to, e.g., create a zip from files created by a custom target
+$(call gb_Zip__get_preparation_target,%) :
+ touch $@
+
+# clear file list, set location (zipping uses relative paths)
+# register target and clean target
+# add deliverable
+# add dependency for outdir target to workdir target (pattern rule for delivery is in Package.mk)
+# the zip package target requires that all added files have a common root directory (package location)
+# names of added files are relative to it; the zip will store them with their complete relative path name
+# the location can't be stored in a scoped variable as it is needed in the add_file macro (see rule above)
+define gb_Zip_Zip_internal_nodeliver
+$(call gb_Zip_get_target,$(1)) : FILES :=
+$(call gb_Zip_get_target,$(1)) : INSTALL_NAME :=
+$(call gb_Zip_get_target,$(1)) : LOCATION := $(2)
+$(call gb_Zip_get_target,$(1)) :| $(dir $(call gb_Zip_get_target,$(1))).dir
+$(call gb_Zip__get_preparation_target,$(1)) :| $(dir $(call gb_Zip__get_preparation_target,$(1))).dir
+$(call gb_Zip_get_clean_target,$(1)) : CLEAR_LOCATION :=
+$(call gb_Zip_get_clean_target,$(1)) : INSTALL_NAME :=
+$(eval gb_Package_Location_$(1) := $(2))
+
+endef
+
+define gb_Zip_Zip_internal
+$(call gb_Zip_Zip_internal_nodeliver,$(1),$(2))
+
+endef
+
+# depend on makefile to enforce a rebuild if files are removed from the zip
+define gb_Zip_Zip
+$(call gb_Zip_Zip_internal,$(1),$(2))
+$(call gb_Zip_get_target,$(1)) : $(gb_Module_CURRENTMAKEFILE)
+
+$(eval $(call gb_Module_register_target,$(call gb_Zip_get_target,$(1)),$(call gb_Zip_get_clean_target,$(1))))
+$(call gb_Helper_make_userfriendly_targets,$(1),Zip,$(call gb_Zip_get_target,$(1)))
+
+endef
+
+# adding a file creates a dependency to it
+# the full path name of the file needs access to the package location
+# as scoped variables only exist in rules, we use a postfixed name to refer to the location
+#
+# if package location is in $(WORKDIR) we can specify third parameter and copy file from different place
+# then we need also remove the location on make clean
+define gb_Zip_add_file
+$(call gb_Zip_get_target,$(1)) : FILES += $(2)
+$(call gb_Zip_get_target,$(1)) : $(gb_Package_Location_$(1))/$(2)
+$(gb_Package_Location_$(1))/$(2) :| $(call gb_Zip__get_preparation_target,$(1))
+ifneq ($(3),)
+$(call gb_Zip_get_clean_target,$(1)) : CLEAR_LOCATION := TRUE
+$(gb_Package_Location_$(1))/$(2) : $(3)
+ mkdir -p $$(dir $$@)
+ cp -f $$< $$@
+
+endif
+
+endef
+
+# add additional dependency that must exist before the archive can be created
+define gb_Zip_add_dependency
+$(call gb_Zip__get_preparation_target,$(1)) :| $(2)
+
+endef
+
+define gb_Zip_add_files
+$(foreach file,$(2),$(call gb_Zip_add_file,$(1),$(file)))
+endef
+
+define gb_Zip_add_dependencies
+$(foreach dependency,$(2),$(call gb_Zip_add_dependency,$(1),$(dependency)))
+
+endef
+
+define gb_Zip_add_commandoptions
+$(call gb_Zip_get_target,$(1)) : gb_Zip_ZIPCOMMAND += $(2)
+
+endef
+
+define gb_Zip_set_install_name
+$(call gb_Zip_get_target,$(1)) : INSTALL_NAME := $(2)
+$(call gb_Zip_get_target,$(1)) :| $(dir $(2)).dir
+$(call gb_Zip_get_clean_target,$(1)) : INSTALL_NAME := $(2)
+
+endef
+
+define gb_Zip_use_unpacked
+$(call gb_Zip__get_preparation_target,$(1)) \
+ :| $(call gb_UnpackedTarball_get_final_target,$(2))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/empty.zip b/solenv/gbuild/empty.zip
new file mode 100644
index 000000000..15cb0ecb3
--- /dev/null
+++ b/solenv/gbuild/empty.zip
Binary files differ
diff --git a/solenv/gbuild/extensions/post_Counters.mk b/solenv/gbuild/extensions/post_Counters.mk
new file mode 100644
index 000000000..8773844a5
--- /dev/null
+++ b/solenv/gbuild/extensions/post_Counters.mk
@@ -0,0 +1,22 @@
+# -*- 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/.
+#
+
+ifneq ($(filter countoutdated,$(MAKECMDGOALS)),)
+
+gb_Output_announce=
+
+ifneq ($(strip $(filter-out countoutdated,$(MAKECMDGOALS))),)
+countoutdated: $(filter-out countoutdated,$(MAKECMDGOALS))
+else
+countoutdated: $(.DEFAULT_GOAL)
+endif
+
+endif
+
+# vim: set noet ts=4 sw=4:
diff --git a/solenv/gbuild/extensions/post_Fuzzers.mk b/solenv/gbuild/extensions/post_Fuzzers.mk
new file mode 100644
index 000000000..e26e65935
--- /dev/null
+++ b/solenv/gbuild/extensions/post_Fuzzers.mk
@@ -0,0 +1,17 @@
+# -*- 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/.
+#
+
+# chain-link all fuzzer binaries
+$(foreach fuzzer,$(gb_Fuzzers_KNOWN), \
+ $(eval gb_Fuzzers_KNOWN = $(filter-out $(fuzzer),$(gb_Fuzzers_KNOWN))) \
+ $(if $(firstword $(gb_Fuzzers_KNOWN)), \
+ $(eval $(call gb_Executable_get_linktarget_target,$(firstword $(gb_Fuzzers_KNOWN))) : \
+ $(call gb_Executable_get_linktarget_target,$(fuzzer)))))
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/extensions/post_GbuildToJson.mk b/solenv/gbuild/extensions/post_GbuildToJson.mk
new file mode 100644
index 000000000..f1707a488
--- /dev/null
+++ b/solenv/gbuild/extensions/post_GbuildToJson.mk
@@ -0,0 +1,202 @@
+# -*- 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/.
+#
+
+
+# Outstanding work:
+#
+# fill files names in:
+# --ASMOBJECTS
+# --GENCOBJECTS
+# --YACCOBJECTS
+# --LEXOBJECTS
+# --JAVAOBJECTS
+# --PYTHONOBJECTS
+#
+# Add black listed modules a json files (--DENYLIST)
+#
+# Reduce number of denylisted modules
+
+ifneq ($(filter gbuildtojson,$(MAKECMDGOALS)),)
+
+# possibly recurse to ensure gbuildtojson was build before running the modded make
+gb_GbuildToJson_prep := $(shell $(MAKE) -f $(SRCDIR)/solenv/Makefile Executable_gbuildtojson)
+gb_FULLDEPS:=
+
+gbuildtojson:
+ @true
+
+
+gb_GbuildToJson_PHONY := $(WORKDIR)/GBUILDTOJSONPHONY
+.PHONY : $(gb_GbuildToJson_PHONY)
+$(gb_GbuildToJson_PHONY):
+ @true
+
+
+
+define gb_LinkTarget__command
+mkdir -p $(WORKDIR)/GbuildToJson/$(dir $(2))
+mkdir -p $(WORKDIR)/LinkTarget/$(dir $(2))
+$(if $(GBUILDTOJSON_LD_LIBRARY_PATH),LD_LIBRARY_PATH=$(GBUILDTOJSON_LD_LIBRARY_PATH)) \
+$(call gb_Executable_get_command,gbuildtojson) \
+--makefile=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_MAKEFILE)) \
+--linktarget=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(2)) \
+--ilibtarget=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(ILIBTARGET)) \
+--cxxobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(CXXOBJECTS)) \
+--yaccobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(YACCOBJECTS)) \
+--objcobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(OBJCOBJECTS)) \
+--objcxxobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(OBJCXXOBJECTS)) \
+--cxxclrobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(CXXCLROBJECTS)) \
+--asmobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(ASMOBJECTS)) \
+--lexobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(LEXOBJECTS)) \
+--gencobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(GENCOBJECTS)) \
+--gencxxobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(GENCXXOBJECTS)) \
+--gencxxclrobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(GENCXXCLROBJECTS)) \
+--cobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(COBJECTS)) \
+--javaobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(JAVAOBJECTS)) \
+--pythonobjects=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(PYTHONOBJECTS)) \
+--cflags=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_CFLAGS)) \
+--cflagsappend=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_CFLAGS_APPEND)) \
+--cxxflags=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_CXXFLAGS)) \
+--cxxflagsappend=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_CXXFLAGS_APPEND)) \
+--objcflags=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_OBJCFLAGS)) \
+--objcflagsappend=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_OBJCFLAGS_APPEND)) \
+--objcxxflags=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_OBJCXXFLAGS)) \
+--objcxxflagsappend=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_OBJCXXFLAGS_APPEND)) \
+--cxxclrflags=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_CXXCLRFLAGS)) \
+--cxxclrflagsappend=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(T_CXXCLRFLAGS_APPEND)) \
+--defs=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(DEFS)) \
+--include=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(INCLUDE)) \
+--linked_libs=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(LINKED_LIBS)) \
+--linked_static_libs=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(LINKED_STATIC_LIBS)) \
+> $(WORKDIR)/GbuildToJson/$(2)
+endef
+
+define gb_Postprocess_register_target
+gbuildtojson : $(call gb_LinkTarget_get_target,$(call gb_$(2)_get_linktarget,$(3)))
+
+$(call gb_LinkTarget_get_target,$(call gb_$(2)_get_linktarget,$(3))): $(gb_Helper_MISCDUMMY) $(gb_GbuildToJson_PHONY)
+$(call gb_LinkTarget_get_target,$(call gb_$(2)_get_linktarget,$(3))): T_MAKEFILE := $(lastword $(MAKEFILE_LIST))
+endef
+
+define gb_CppunitTest_register_target
+gbuildtojson : $(call gb_LinkTarget_get_target,$(2))
+
+$(call gb_LinkTarget_get_target,$(2)): $(gb_Helper_MISCDUMMY) $(gb_GbuildToJson_PHONY)
+$(call gb_LinkTarget_get_target,$(2)): T_MAKEFILE := $(lastword $(MAKEFILE_LIST))
+endef
+
+gb_LinkTarget_use_static_libraries =
+gb_UnoApiHeadersTarget_get_target = $(gb_Helper_MISCDUMMY)
+gb_UnpackedTarball_get_final_target = $(gb_Helper_MISCDUMMY)
+gb_LinkTarget__get_headers_check =
+define gb_LinkTarget_add_cobject
+$(call gb_LinkTarget_get_target,$(1)) : COBJECTS += $(2)
+
+endef
+define gb_LinkTarget_add_cxxobject_internal
+$(call gb_LinkTarget_get_target,$(1)) : CXXOBJECTS += $(2)
+
+endef
+define gb_LinkTarget_add_generated_c_object
+$(call gb_LinkTarget_get_target,$(1)) : GENCOBJECTS += $(2)
+
+endef
+define gb_LinkTarget_add_generated_cxx_object_internal
+$(call gb_LinkTarget_get_target,$(1)) : GENCXXOBJECTS += $(2)
+
+endef
+define gb_LinkTarget_add_generated_cxxclrobject
+$(call gb_LinkTarget_get_target,$(1)) : GENCXXCLROBJECTS += $(2)
+
+endef
+define gb_LinkTarget_add_objcobject
+$(call gb_LinkTarget_get_target,$(1)) : OBJCOBJECTS += $(2)
+
+endef
+define gb_LinkTarget_add_objcxxobject
+$(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS += $(2)
+
+endef
+define gb_LinkTarget_add_cxxclrobject
+$(call gb_LinkTarget_get_target,$(1)) : CXXCLROBJECTS += $(2)
+
+endef
+define gb_LinkTarget_add_scanners
+$(call gb_LinkTarget_get_target,$(1)) : LEXOBJECTS += $(2)
+
+endef
+define gb_LinkTarget_add_grammars
+$(call gb_LinkTarget_get_target,$(1)) : YACCOBJECTS += $(2)
+
+endef
+gb_LinkTarget_use_package =
+gb_LinkTarget_use_generated_package =
+gb_LinkTarget_add_sdi_headers =
+gb_LinkTarget_use_external_project =
+gb_LinkTarget__check_srcdir_paths =
+gb_LinkTarget__command_objectlist = @true
+gb_WinResTarget_WinResTarget_init =
+gb_WinResTarget_set_rcfile =
+gb_WinResTarget_add_defs =
+gb_LinkTarget_set_nativeres =
+gb_LinkTarget_add_nativeres =
+gb_Library_set_componentfile =
+gb_Library_add_componentimpl =
+
+#$(call gb_Library_get_exports_target,%):
+$(WORKDIR)/LinkTarget/Library/%.exports:
+ @true
+
+define gb_LinkTarget__use_custom_headers
+$(call gb_LinkTarget__add_include,$(1),$(call gb_CustomTarget_get_workdir,$(2)))
+
+endef
+
+
+define gb_Module__add_target_impl
+$(call gb_Module__read_targetfile,$(1),$(2),target)
+
+$(call gb_Module_get_nonl10n_target,$(1)) : $(3)
+
+endef
+
+define gb_Module__add_check_target_impl
+$(call gb_Module__read_targetfile,$(1),$(2),check target)
+
+$(call gb_Module_get_check_target,$(1)) : $(3)
+
+endef
+
+define gb_Module_add_target
+$(if $(filter Library_% Executable_%,$(2)),$(call gb_Module__add_target_impl,$(1),$(2),$$(gb_Module_CURRENTTARGET)))
+endef
+
+define gb_Module_add_check_target
+$(if $(filter CppunitTest_% Library_%,$(2)),$(call gb_Module__add_check_target_impl,$(1),$(2),$$(gb_Module_CURRENTTARGET)))
+endef
+
+gb_Module_add_l10n_target =
+
+gb_GbuildToJson_DENYLISTEDMODULES := cli_ure jurt external
+
+define gb_Module__add_moduledir_impl
+include $(patsubst $(1):%,%,$(filter $(1):%,$(gb_Module_MODULELOCATIONS)))/$(2)/Module_$(notdir $(2)).mk
+$(call gb_Module_get_target,$(1)) : $$(firstword $$(gb_Module_TARGETSTACK))
+gb_Module_TARGETSTACK := $$(wordlist 2,$$(words $$(gb_Module_TARGETSTACK)),$$(gb_Module_TARGETSTACK))
+
+endef
+
+define gb_Module_add_moduledir
+$(if $(filter $(gb_GbuildToJson_DENYLISTEDMODULES),$(2)),,$(call gb_Module__add_moduledir_impl,$(1),$(2)))
+
+endef
+
+endif
+
+# vim: set noet ts=4 sw=4:
diff --git a/solenv/gbuild/extensions/post_PackageInfo.mk b/solenv/gbuild/extensions/post_PackageInfo.mk
new file mode 100644
index 000000000..331eeb89e
--- /dev/null
+++ b/solenv/gbuild/extensions/post_PackageInfo.mk
@@ -0,0 +1,116 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+gb_PackageInfo_InstallModules := \
+ base \
+ calc \
+ graphicsfilter \
+ tde \
+ impress \
+ onlineupdate \
+ gnome \
+ kde \
+ math \
+ ooo \
+ writer \
+ ure \
+ activexbinarytable \
+ ooobinarytable \
+ winexplorerextbinarytable \
+
+define gb_PackageInfo_emit_binaries_command
+@touch $(foreach suf,executables libraries files,$(gb_PackageInfo_get_target)/$(1).$(suf))
+@$(foreach executable,$(gb_Executable_MODULE_$(1)),echo "$(patsubst $(INSTDIR)/%,%,$(call gb_Executable_get_target,$(executable)))" >> $(gb_PackageInfo_get_target)/$(1).executables &&) true
+@$(foreach library,$(gb_SdkLinkLibrary_MODULE_$(1)),echo "sdk/lib/$(call gb_Library_get_linktarget,$(library))" >> $(gb_PackageInfo_get_target)/$(1).sdklinklibraries &&) true
+@$(foreach library,$(gb_Library_MODULE_$(1)),echo "$(patsubst $(INSTDIR)/%,%,$(call gb_Library_get_target,$(library)))" >> $(gb_PackageInfo_get_target)/$(1).libraries &&) true
+@$(foreach jar,$(gb_Jar_MODULE_$(1)),echo "$(patsubst $(INSTDIR)/%,%,$(call gb_Jar_get_target,$(jar)))" >> $(gb_PackageInfo_get_target)/$(1).jars &&) true
+@$(foreach pkg,$(gb_Package_MODULE_$(1)),echo "$(call gb_Package_get_target,$(pkg))" >> $(gb_PackageInfo_get_target)/$(1).packages &&) true
+@echo "$(foreach suf,executables libraries files,$(gb_PackageInfo_get_target)/$(1).$(suf)) \\" >> $(WORKDIR)/Dep/packageinfo.d
+
+endef
+
+define gb_PackageInfo_emit_help_for_one_target
+$(foreach suf,cfg db ht idxl/_0.cfs idxl/segments_3 idxl/segments.gen jar key tree,$(if $(wildcard $(INSTDIR)/help/$(1).$(suf)),echo "help/$(1).$(suf)" >> $(2) && )) true
+
+endef
+
+define gb_PackageInfo_emit_help_for_one_lang
+@touch $(foreach suf,executables libraries files,$(gb_PackageInfo_get_target)/help-$(1).$(suf))
+$(foreach target,$(gb_AllLangHelp_ALLTARGETS),$(call gb_PackageInfo_emit_help_for_one_target,$(1)/$(target),$(gb_PackageInfo_get_target)/help-$(1).files))
+$(foreach suf,html css,$(foreach file,$(wildcard $(INSTDIR)/help/$(1)/*.$(suf)),echo "$(patsubst $(INSTDIR)/%,%,$(file))" >> $(gb_PackageInfo_get_target)/help-$(1).files && )) true
+@echo " $(foreach suf,executables libraries files,$(gb_PackageInfo_get_target)/help-$(1).$(suf)) \\" >> $(WORKDIR)/Dep/packageinfo.d
+
+endef
+
+#getting the package files post-hoc with wildcard is not good and should be done better
+define gb_PackageInfo_emit_l10n_for_one_alllangpackage
+@$(foreach file,$(shell ls $(INSTDIR)/$(1)/$(2)),echo "$(1)/$(2)/$(file)" >> $(gb_PackageInfo_get_target)/l10n-$(2).files &&) true
+
+endef
+
+define gb_PackageInfo_emit_l10n_for_one_mo
+@echo "$(patsubst $(INSTDIR)/%,%,$(call gb_MoTarget_get_install_target,$(shell $(SRCDIR)/solenv/bin/localestr $(2))/LC_MESSAGES/$(1)))" >> $(gb_PackageInfo_get_target)/l10n-$(2).files
+
+endef
+
+define gb_PackageInfo_emit_l10n_for_one_configfile
+echo "$(LIBO_SHARE_FOLDER)/registry/$(2)$(1).xcd" >> $(gb_PackageInfo_get_target)/l10n-$(1).files
+
+endef
+
+define gb_PackageInfo_emit_l10n_for_one_lang
+@touch $(foreach suf,executables libraries files,$(gb_PackageInfo_get_target)/l10n-$(1).$(suf))
+$(if $(filter-out qtz en-US,$(1)),$(foreach packagedir,$(patsubst %/,%,$(gb_AllLangPackage_ALLDIRS)),$(call gb_PackageInfo_emit_l10n_for_one_alllangpackage,$(packagedir),$(1))))
+$(if $(filter $(gb_AllLangMoTarget_LANGS),$(1)),$(foreach target,$(gb_AllLangMoTarget_REGISTERED),$(call gb_PackageInfo_emit_l10n_for_one_mo,$(target),$(1))))
+$(if $(filter $(gb_Configuration_LANGS),$(1)),$(foreach configfile,Langpack- res/fcfg_langpack_ res/registry_,$(call gb_PackageInfo_emit_l10n_for_one_configfile,$(1),$(configfile))))
+$(if $(filter $(gb_CJK_LANGS),$(1)),$(foreach configfile,cjk_,$(call gb_PackageInfo_emit_l10n_for_one_configfile,$(1),$(configfile))))
+$(if $(filter $(gb_CTL_LANGS),$(1)),$(foreach configfile,ctl_,$(call gb_PackageInfo_emit_l10n_for_one_configfile,$(1),$(configfile))))
+$(if $(filter $(gb_CTLSEQCHECK_LANGS),$(1)),$(foreach configfile,ctlseqcheck_,$(call gb_PackageInfo_emit_l10n_for_one_configfile,$(1),$(configfile))))
+@echo "$(foreach suf,executables libraries files,$(gb_PackageInfo_get_target)/l10n-$(1).$(suf)) \\" >> $(WORKDIR)/Dep/packageinfo.d
+
+endef
+
+-include $(WORKDIR)/Dep/packageinfo.d
+$(foreach filelist,files executables libraries,$(gb_PackageInfo_get_target)/%.$(filelist)):
+ @rm -rf $(gb_PackageInfo_get_target) $(WORKDIR)/Dep/packageinfo.d && mkdir $(gb_PackageInfo_get_target)
+ $(foreach installmodule,$(gb_PackageInfo_InstallModules),$(call gb_PackageInfo_emit_binaries_command,$(installmodule)))
+ $(foreach helplang,$(gb_HELP_LANGS),$(call gb_PackageInfo_emit_help_for_one_lang,$(helplang)))
+ $(foreach l10nlang,$(if $(strip $(gb_WITH_LANG)),$(gb_WITH_LANG),en-US),$(call gb_PackageInfo_emit_l10n_for_one_lang,$(l10nlang)))
+ @echo "$(gb_PackageInfo_get_target)/packageinfo_all : $(filter-out $(WORKDIR)/Dep/%,$(MAKEFILE_LIST))" >> $(WORKDIR)/Dep/packageinfo.d
+ @touch $(gb_PackageInfo_get_target)/packageinfo_all
+
+$(gb_PackageInfo_get_target)/packageinfo_all:
+ $(MAKE) -f $(firstword $(MAKEFILE_LIST)) $(gb_PackageInfo_get_target)/$(firstword $(gb_PackageInfo_InstallModules)).files
+
+.PHONY : packageinfo
+packageinfo: $(gb_PackageInfo_get_target)/packageinfo_all
+
+install-package-%: $(gb_PackageInfo_get_target)/packageinfo_all
+ for executable in `cat $(gb_PackageInfo_get_target)/$*.executables`; \
+ do \
+ install -D $(INSTDIR)/$${executable} $(INSTALLDIR)/$${executable} ;\
+ done
+ for library in `cat $(gb_PackageInfo_get_target)/$*.sdklinklibraries`; \
+ do \
+ install -D -m644 $(INSTDIR)/$${library} $(INSTALLDIR)/$${library}; \
+ done
+ for library in `cat $(gb_PackageInfo_get_target)/$*.libraries`; \
+ do \
+ install -D -m644 $(INSTDIR)/$${library} $(INSTALLDIR)/$${library}; \
+ done
+ for jar in `cat $(gb_PackageInfo_get_target)/$*.jars`; \
+ do \
+ install -D -m644 $(INSTDIR)/$${jar} $(INSTALLDIR)/$${jar}; \
+ done
+ for file in `cat $(gb_PackageInfo_get_target)/$*.files`; \
+ do \
+ install -D -m644 $(INSTDIR)/$${file} $(INSTALLDIR)/$${file}; \
+ done
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/extensions/post_SpeedUpTargets.mk b/solenv/gbuild/extensions/post_SpeedUpTargets.mk
new file mode 100644
index 000000000..3db6355ab
--- /dev/null
+++ b/solenv/gbuild/extensions/post_SpeedUpTargets.mk
@@ -0,0 +1,88 @@
+# -*- 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/.
+#
+
+ifneq ($(CROSS_COMPILING),)
+gb_Module_add_targets_for_build :=
+gb_Module_SKIPTARGETS := check slowcheck screenshot subsequentcheck uicheck
+endif
+
+ifeq ($(gb_Side),build)
+gb_Module_SKIPTARGETS := check slowcheck screenshot subsequentcheck uicheck
+endif
+
+ifeq ($(MAKECMDGOALS),build)
+gb_Module_SKIPTARGETS := check slowcheck screenshot subsequentcheck uicheck
+endif
+
+ifeq (,$(filter perfcheck,$(MAKECMDGOALS)))
+gb_Module_SKIPTARGETS += perfcheck
+else
+gb_Module_SKIPTARGETS += check slowcheck screenshot subsequentcheck uicheck
+endif
+
+ifneq ($(strip $(MAKECMDGOALS)),)
+# speed up depending on the target
+gb_SpeedUpTargets_LEVEL_4 := debugrun help translations install-package-% packageinfo
+gb_SpeedUpTargets_LEVEL_3 := showmodules $(gb_SpeedUpTargets_LEVEL_4)
+gb_SpeedUpTargets_LEVEL_2 := $(gb_SpeedUpTargets_LEVEL_3)
+gb_SpeedUpTargets_LEVEL_1 := clean showdeliverables $(gb_PackageInfo_get_target)/% $(gb_SpeedUpTargets_LEVEL_2)
+
+ifeq (T,$(if $(filter-out $(gb_SpeedUpTargets_LEVEL_1),$(MAKECMDGOALS)),,T))
+gb_FULLDEPS :=
+
+ifeq (T,$(if $(filter-out $(gb_SpeedUpTargets_LEVEL_2),$(MAKECMDGOALS)),,T))
+gb_Module_SKIPTARGETS += check slowcheck screenshot subsequentcheck uicheck
+
+ifeq (T,$(if $(filter-out $(gb_SpeedUpTargets_LEVEL_3),$(MAKECMDGOALS)),,T))
+gb_Module_SKIPTARGETS += build
+
+ifeq (T,$(if $(filter-out $(gb_SpeedUpTargets_LEVEL_4),$(MAKECMDGOALS)),,T))
+gb_Module_SKIPTARGETS += module
+
+endif
+endif
+endif
+endif
+
+endif
+
+
+ifneq (,$(filter build,$(gb_Module_SKIPTARGETS)))
+gb_Module_add_target =
+endif
+
+ifneq (,$(filter check,$(gb_Module_SKIPTARGETS)))
+gb_Module_add_check_target =
+endif
+
+ifneq (,$(filter slowcheck,$(gb_Module_SKIPTARGETS)))
+gb_Module_add_slowcheck_target =
+endif
+
+ifneq (,$(filter screenshot,$(gb_Module_SKIPTARGETS)))
+gb_Module_add_screenshot_target =
+endif
+
+ifneq (,$(filter subsequentcheck,$(gb_Module_SKIPTARGETS)))
+gb_Module_add_subsequentcheck_target =
+endif
+
+ifneq (,$(filter perfcheck,$(gb_Module_SKIPTARGETS)))
+gb_Module_add_perfcheck_target =
+endif
+
+ifneq (,$(filter uicheck,$(gb_Module_SKIPTARGETS)))
+gb_Module_add_uicheck_target =
+endif
+
+ifneq (,$(filter module,$(gb_Module_SKIPTARGETS)))
+gb_Module_add_moduledir =
+endif
+
+# vim:set shiftwidth=4 softtabstop=4 noexpandtab:
diff --git a/solenv/gbuild/extensions/pre_BuildTools.mk b/solenv/gbuild/extensions/pre_BuildTools.mk
new file mode 100644
index 000000000..0a83545cf
--- /dev/null
+++ b/solenv/gbuild/extensions/pre_BuildTools.mk
@@ -0,0 +1,54 @@
+# -*- 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/.
+#
+
+# Tools we need to build for cross-compiling
+ifeq ($(gb_Side),build)
+
+gb_BUILD_TOOLS_executables = \
+ bestreversemap \
+ cfgex \
+ climaker \
+ cpp \
+ cppumaker \
+ gencoll_rule \
+ genconv_dict \
+ gendict \
+ $(if $(WITH_GALLERY_BUILD),gengal) \
+ genindex_data \
+ helpex \
+ idxdict \
+ javamaker \
+ $(call gb_CondExeLockfile,lockfile) \
+ makedepend \
+ propex \
+ saxparser \
+ svidl \
+ treex \
+ ulfex \
+ unoidl-check \
+ unoidl-write \
+ xrmex \
+ $(call gb_Helper_optional,HELPTOOLS, \
+ HelpIndexer \
+ HelpLinker \
+ ) \
+ $(if $(filter WNT,$(OS)),$(call gb_Helper_optional,DESKTOP,lngconvex)) \
+
+gb_BUILD_TOOLS_executables_extern = \
+ python \
+ xsltproc \
+
+gb_BUILD_TOOLS = \
+ $(foreach executable,$(gb_BUILD_TOOLS_executables),$(call gb_Executable_get_runtime_dependencies,$(executable))) \
+ $(foreach executable,$(gb_BUILD_TOOLS_executables_extern),$(call gb_ExternalExecutable_get_dependencies,$(executable))) \
+ $(INSTROOT)/$(LIBO_URE_ETC_FOLDER)/$(call gb_Helper_get_rcfile,uno) \
+
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/extensions/pre_Counters.mk b/solenv/gbuild/extensions/pre_Counters.mk
new file mode 100644
index 000000000..eaec75069
--- /dev/null
+++ b/solenv/gbuild/extensions/pre_Counters.mk
@@ -0,0 +1,31 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+gb_CountersOutdated_COUNTER_ALL:=
+gb_CountersOutdated_COUNTER_TYPES:=
+
+.PHONY: countoutdated
+countoutdated:
+ $(info total outdated files: $(words $(gb_CountersOutdated_COUNTER_ALL)))
+ $(info types of outdated files: $(gb_CountersOutdated_TYPES))
+ $(foreach type,$(gb_CountersOutdated_TYPES),$(info $(type): $(words $(gb_CountersOutdated_COUNTER_$(type)))))
+ @true
+
+ifneq ($(filter countoutdated,$(MAKECMDGOALS)),)
+
+$(WORKDIR)/%:
+ $(eval gb_CountersOutdated_COUNTER_ALL+= x)
+ $(eval gb_CountersOutdated__TYPE=$(firstword $(subst /, ,$*)))
+ $(if $(filter undefined,$(origin gb_CountersOutdated_COUNTER_$(gb_CountersOutdated__TYPE))),$(eval gb_CountersOutdated_COUNTER_$(gb_CountersOutdated__TYPE):=) $(eval gb_CountersOutdated_TYPES+=$(gb_CountersOutdated__TYPE)))
+ $(eval gb_CountersOutdated_COUNTER_$(gb_CountersOutdated__TYPE)+= x)
+ @true
+
+endif
+
+# vim: set noet ts=4 sw=4:
diff --git a/solenv/gbuild/extensions/pre_MergedLibsList.mk b/solenv/gbuild/extensions/pre_MergedLibsList.mk
new file mode 100644
index 000000000..b2402ec0c
--- /dev/null
+++ b/solenv/gbuild/extensions/pre_MergedLibsList.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/.
+#
+
+# we link all object files from these libraries into one, merged library
+gb_MERGE_LIBRARY_LIST := \
+ avmedia \
+ $(if $(filter WNT,$(OS)),avmediawin) \
+ $(call gb_Helper_optional,SCRIPTING, \
+ basctl \
+ basprov \
+ ) \
+ basegfx \
+ canvasfactory \
+ canvastools \
+ comphelper \
+ configmgr \
+ cppcanvas \
+ $(call gb_Helper_optional,BREAKPAD,crashreport) \
+ ctl \
+ dbtools \
+ deployment \
+ deploymentmisc \
+ $(if $(filter-out MACOSX WNT,$(OS)),desktopbe1) \
+ $(if $(filter WNT,$(OS)),directx9canvas) \
+ drawinglayercore \
+ drawinglayer \
+ editeng \
+ emfio \
+ $(if $(filter WNT,$(OS)),emser) \
+ evtatt \
+ filterconfig \
+ for \
+ forui \
+ fps_office \
+ frm \
+ fsstorage \
+ fwk \
+ $(if $(filter WNT,$(OS)),gdipluscanvas) \
+ guesslang \
+ $(call gb_Helper_optional,DESKTOP,helplinker) \
+ hyphen \
+ i18nsearch \
+ i18npool \
+ i18nutil \
+ lng \
+ lnth \
+ localebe1 \
+ msfilter \
+ mtfrenderer \
+ numbertext \
+ odfflatxml \
+ offacc \
+ $(if $(ENABLE_OPENGL_CANVAS),oglcanvas) \
+ $(if $(filter OPENCL,$(BUILD_TYPE)),opencl) \
+ package2 \
+ passwordcontainer \
+ sax \
+ sb \
+ simplecanvas \
+ sfx \
+ sofficeapp \
+ sot \
+ spell \
+ $(if $(or $(DISABLE_GUI),$(ENABLE_WASM_STRIP_SPLASH)),,spl) \
+ srtrs1 \
+ $(call gb_Helper_optional,SCRIPTING,stringresource) \
+ svgio \
+ svl \
+ svt \
+ svx \
+ svxcore \
+ syssh \
+ textfd \
+ tk \
+ tl \
+ ucb1 \
+ ucbhelper \
+ ucpexpand1 \
+ ucpext \
+ ucphier1 \
+ ucpimage \
+ ucpfile1 \
+ ucptdoc1 \
+ unordf \
+ unoxml \
+ updatefeed \
+ utl \
+ uui \
+ vbaevents \
+ vbahelper \
+ vcl \
+ vclcanvas \
+ xmlfa \
+ xmlfd \
+ xmlscript \
+ xo \
+ xof \
+ xsltdlg \
+ xsltfilter \
+ xstor \
+
+
+# allow module-deps.pl to color based on this.
+ifneq ($(ENABLE_PRINT_DEPS),)
+
+$(info MergeLibContents: $(gb_MERGE_LIBRARY_LIST))
+
+endif
+
+ifneq ($(MERGELIBS),)
+
+gb_MERGEDLIBS := $(gb_MERGE_LIBRARY_LIST)
+
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/gbuild.help.txt b/solenv/gbuild/gbuild.help.txt
new file mode 100644
index 000000000..acd16ed2e
--- /dev/null
+++ b/solenv/gbuild/gbuild.help.txt
@@ -0,0 +1,159 @@
+NAME
+ gbuild - GNU make based build system for LibreOffice
+
+SYNOPSIS
+ make [ -f makefile ] [ options ] [ variable=value ... ] [ targets ] ...
+
+IMPORTANT OPTIONS
+ -s Silent operation; do not print the commands as they are executed.
+
+ -n Print the commands that would be executed, but do not execute them.
+ -k Continue as much as possible after an error.
+
+ -j Specifies the number of jobs (commands) to run simultaneously.
+ -l Specifies that no new jobs (commands) should be started if there are
+ others jobs running and the load average is at least load.
+
+ -t Touch files (mark them up to date without really changing them)
+ instead of running their commands.
+ -W Pretend that the target file has just been modified.
+ -o Do not remake the file file even if it is older than its
+ dependencies, and do not remake anything on account of changes in file.
+
+ -p Print the data base (rules and variable values) that results from
+ reading the makefiles.
+ --debug=b debug make run, see GNU make man page for details
+
+ (descriptions from GNU make man page)
+
+AVAILABLE TARGETS
+ build build product (default goal)
+ clean remove all generated files
+ debugrun starts the INSTDIR instance and allows tests to
+ be run against it. You can provide additional
+ arguments to soffice.bin using the gb_DBGARGS
+ variable.
+
+ check run unit tests and if in toplevel subsequentcheck
+ unitcheck run unit tests
+ slowcheck run slow unit tests
+ screenshot create all screenshots
+ subsequentcheck run system tests (requires full installation)
+ perfcheck run performance/callgrind unit tests
+ uicheck run UI tests
+
+ You can set gb_SUPPRESS_TESTS to just build but not run the tests.
+
+ build-l10n-only builds translation files for the build products
+ build-non-l10n-only builds the product without the localization files
+ translations extract .pot files to workdir/pot
+
+ packageinfo generates package information for distros
+ dump-deps-png creates dependency diagrams in PNG format
+ NOTE: needs graphviz to work
+ showmodules shows all registered modules
+
+ <module> an alias for <module>.build
+ <module>.<toplevel target> runs the toplevel target for the named
+ module. Per default, all pre-requisite are excluded!
+ <module>.allbuild as build + including all the pre-requisite modules
+ <module>.allcheck as check + including all the pre-requisite modules
+ <module>.buildall an alias for <module>.allbuild
+ <module>.checkall an alias for <module>.allcheck
+ <module>.showdeliverables show the targets delivered to INSTDIR and
+ their source
+
+ cmd execute the command contained in the variable cmd=""
+ in a shell with config_host.mk or config_build.mk
+ environment set. (see gb_SIDE)
+
+ <target> build gbuild target (such as Library_vbaswobj or
+ CppunitTest_sw_macros_test)
+ <target>.clean clean gbuild target
+ <class>_<target> for all targets and for the following classes:
+ o AllLangMoTarget
+ o AllLangZip
+ o CliLibrary
+ o CliNativeLibrary
+ o CliUnoApi
+ o ComponentTarget
+ o Configuration
+ o CppunitTest
+ o CustomTarget
+ o Dictionary
+ o Executable
+ o Extension
+ o ExternalPackage
+ o ExternalProject
+ o Gallery
+ o Helper
+ o InstallModule
+ o InstallScript
+ o InternalUnoApi
+ o Jar
+ o JunitTest
+ o Library
+ o Package
+ o Pagein
+ o PythonTest
+ o Pyuno
+ o Rdb
+ o StaticLibrary
+ o UI
+ o UnoApi
+ o UnpackedTarball
+ o WinResTarget
+ o Zip
+
+INTERACTIVE VARIABLES:
+ BUILDTOOLTRACE Run all commands that invoke built tools in strace,
+ valgrind or a debugger:
+ BUILDTOOLTRACE='$(DEVENV) /debugexe' PARALLELISM=1 make
+ DEBUG / debug If not empty, build as with --enable-debug.
+ ENABLE_SYMBOLS / enable_symbols
+ If not empty, build as with --enable-symbols.
+ DBGLEVEL / dbglevel
+ If not empty, force the debug level to the specified value. The
+ debug level is passed to the source code through OSL_DEBUG_LEVEL
+ macro.
+ 0 = no debug (as with --disable-debug)
+ 1 = debugging information + no optimizations (as with --enable-debug)
+ (Note that levels higher than 2 are used only by obsolete debugging
+ features. Use SAL_INFO/SAL_WARN with a specific area for extra debug
+ output in new code.)
+ 2 = debugging information + no optimizations + extra
+ debug output. OSL_TRACE starts being active on this
+ level.
+ 3... = debugging information + no optimizations + extra
+ debug output (usually extremely verbose). Levels
+ > 2 are not used very much.
+ PARALLELISM If not empty, pass argument on as the -j switch
+ to recursive make invocations. Useful to
+ lower/increase build parallelism individually.
+ verbose=t Verbose mode: display all commands
+ LEXFLAGS Append flags for LEX scanner generator invocation.
+ YACCFLAGS Append flags for YACC parser generator invocation.
+ CPPFLAGS Append preprocessor flags for C/C++/ObjC/ObjC++ compilation.
+ CFLAGS Override compiler flags for plain C compilation.
+ ENVCFLAGS Append compiler flags for plain C compilation.
+ CXXFLAGS Override compiler flags for C++ compilation.
+ Note: this overrides default optimization and debug
+ flags; to append flags without overriding, use:
+ CXXFLAGS='$(call gb_LinkTarget__get_debugflags,$(1)) -Wfoo'
+ ENVCFLAGSCXX Append compiler flags for C++ compilation.
+ OBJCFLAGS Override compiler flags for Objective C compilation.
+ OBJCXXFLAGS Override compiler flags for Objective C++ compilation.
+ LDFLAGS Override linker flags.
+ gb_FULLDEPS Generate and use dependencies (on by default, handle with care).
+ gb_COLOR Use ASCII color output.
+ gb_TITLES Show progress in terminal title.
+ gb_Side Either "host" or "build" (default to "host").
+ determine if config_host.mk or config_build.mk is used to
+ set the build environment.
+ gb_DBGARGS Append these arguments to GDBs "set args" command for
+ debugrun. Double quotes will be automatically escaped.
+ gb_SUPPRESS_TESTS Do not run tests (but still build them, when requested
+ by the given targets).
+ GCC_COLORS Colorize gcc diagnostics output. See
+ https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Message-Formatting-Options.html
+ for details & syntax. Or export that setting in your .bash_profile.
diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk
new file mode 100644
index 000000000..075c029b0
--- /dev/null
+++ b/solenv/gbuild/gbuild.mk
@@ -0,0 +1,406 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+GBUILDDIR:=$(SRCDIR)/solenv/gbuild
+
+# vars needed from the env/calling makefile
+
+# DEBUG
+# JAVA_HOME
+# LIBXML_CFLAGS
+# OS
+# SOLARINC
+# UPD
+
+# PTHREAD_CFLAGS (Linux)
+# SYSTEM_ICU (Linux)
+# SYSTEM_LIBJPEG (Linux)
+# SYSTEM_LIBXML (Linux)
+
+.DELETE_ON_ERROR:
+
+# do not use built-in rules
+# DO NOT TOUCH THIS LINE UNLESS YOU REALLY KNOW WHAT YOU ARE DOING
+# REMOVING THIS MAKES e.g. MODULE SW ALONE SLOWER BY SOME 300%
+# FOR TAIL_BUILD THE IMPACT IS HUGE!
+# (unless you are doing make -r, which we should explicitly NOT require from
+# users)
+MAKEFLAGS += r
+.SUFFIXES:
+
+true := T
+false :=
+gb_not = $(if $(1),$(false),$(true))
+
+define NEWLINE
+
+
+endef
+
+define WHITESPACE
+
+endef
+
+COMMA :=,
+
+OPEN_PAREN :=(
+CLOSE_PAREN :=)
+
+gb_SPACE:=$(gb_SPACE) $(gb_SPACE)
+
+gb_VERBOSE := $(verbose)
+
+include $(GBUILDDIR)/Helper.mk
+
+include $(GBUILDDIR)/Conditions.mk
+
+include $(SRCDIR)/solenv/inc/langlist.mk
+
+# optional extensions that should never be essential
+ifneq ($(wildcard $(GBUILDDIR)/extensions/pre_*.mk),)
+include $(wildcard $(GBUILDDIR)/extensions/pre_*.mk)
+endif
+
+include $(GBUILDDIR)/Output.mk
+
+gb_TIMELOG := 0
+ifneq ($(strip $(TIMELOG)$(timelog)),)
+gb_TIMELOG := 1
+endif
+
+ifneq ($(ENABLE_DBGUTIL),)
+gb_ENABLE_DBGUTIL := $(true)
+else
+gb_ENABLE_DBGUTIL := $(false)
+endif
+
+gb_ENABLE_SYMBOLS_FOR := $(ENABLE_SYMBOLS_FOR)
+
+# ENABLE_SYMBOLS (presumably from the command line)
+ifneq ($(strip $(ENABLE_SYMBOLS)),)
+gb_ENABLE_SYMBOLS_FOR := $(ENABLE_SYMBOLS)
+endif
+ifneq ($(strip $(enable_symbols)),)
+gb_ENABLE_SYMBOLS_FOR := $(enable_symbols)
+endif
+
+# note: ENABLE_BREAKPAD turns on symbols
+ifneq ($(strip $(ENABLE_BREAKPAD)),)
+gb_ENABLE_SYMBOLS_FOR := all
+endif
+
+gb_DEBUGLEVEL := 0
+ifneq ($(strip $(DEBUG)),)
+gb_DEBUGLEVEL := 1
+# make DEBUG=true should force -g
+ifeq ($(origin DEBUG),command line)
+gb_ENABLE_SYMBOLS_FOR := all
+endif
+endif
+ifneq ($(strip $(debug)),)
+gb_DEBUGLEVEL := 1
+ifeq ($(origin debug),command line)
+gb_ENABLE_SYMBOLS_FOR := all
+endif
+endif
+ifeq ($(gb_ENABLE_DBGUTIL),$(true))
+gb_DEBUGLEVEL := 1
+endif
+
+ifneq ($(strip $(DBGLEVEL)),)
+gb_DEBUGLEVEL := $(strip $(DBGLEVEL))
+ifeq ($(origin DBGLEVEL),command line)
+gb_ENABLE_SYMBOLS_FOR := all
+endif
+endif
+ifneq ($(strip $(dbglevel)),)
+gb_DEBUGLEVEL := $(strip $(dbglevel))
+ifeq ($(origin dbglevel),command line)
+gb_ENABLE_SYMBOLS_FOR := all
+endif
+endif
+
+# handle special cases
+ifeq ($(gb_ENABLE_SYMBOLS_FOR),1)
+gb_ENABLE_SYMBOLS_FOR := all
+endif
+ifeq ($(gb_ENABLE_SYMBOLS_FOR),0)
+gb_ENABLE_SYMBOLS_FOR :=
+endif
+ifeq ($(gb_ENABLE_SYMBOLS_FOR),yes)
+gb_ENABLE_SYMBOLS_FOR := all
+endif
+ifeq ($(gb_ENABLE_SYMBOLS_FOR),no)
+gb_ENABLE_SYMBOLS_FOR :=
+endif
+
+# Detect whether symbols should be enabled for the given gbuild target.
+# enable if: no "-TARGET" defined AND [module is enabled OR "TARGET" defined]
+gb_target_symbols_enabled = \
+ $(and $(if $(filter -$(1),$(ENABLE_SYMBOLS_FOR)),,$(true)),\
+ $(or $(gb_Module_CURRENTMODULE_SYMBOLS_ENABLED),\
+ $(filter $(1),$(ENABLE_SYMBOLS_FOR))))
+
+ifeq ($(BLOCK_PCH),)
+gb_ENABLE_PCH := $(ENABLE_PCH)
+else
+# Setting BLOCK_PCH effectively disables PCH, but the extra object file will be still linked in.
+# This is useful for rebuilding only some files with PCH disabled, e.g. to check #include's,
+# disabling the whole ENABLE_PCH would lead to unresolved symbols at link time.
+gb_ENABLE_PCH :=
+endif
+
+ifneq ($(nodep)$(ENABLE_PRINT_DEPS),)
+gb_FULLDEPS := $(false)
+else
+gb_FULLDEPS := $(true)
+endif
+
+ifneq ($(strip $(patches)$(PATCHES)),)
+gb_KEEP_PRISTINE := $(true)
+else
+gb_KEEP_PRISTINE := $(false)
+endif
+
+ifeq ($(findstring s,$(MAKEFLAGS)),)
+gb_QUIET_EXTERNAL := $(false)
+else
+gb_QUIET_EXTERNAL := $(true)
+endif
+
+# save user-supplied flags for latter use
+ifneq ($(strip $(ENVCFLAGS)),)
+gb__ENV_CFLAGS := $(ENVCFLAGS)
+endif
+ifneq ($(strip $(ENVCFLAGSCXX)),)
+gb__ENV_CXXFLAGS := $(ENVCFLAGSCXX)
+endif
+
+include $(GBUILDDIR)/ExternalExecutable.mk
+include $(GBUILDDIR)/TargetLocations.mk
+include $(GBUILDDIR)/Tempfile.mk
+
+$(eval $(call gb_Helper_init_registries))
+include $(SRCDIR)/Repository.mk
+include $(SRCDIR)/RepositoryExternal.mk
+$(eval $(call gb_Helper_collect_knownlibs))
+
+gb_Library_DLLPOSTFIX := lo
+gb_RUN_CONFIGURE :=
+
+gb_CONFIGURE_PLATFORMS := --build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM)
+
+# Include platform/cpu/compiler specific config/definitions
+
+include $(GBUILDDIR)/platform/$(OS)_$(CPUNAME)_$(COM).mk
+
+# this is optional
+include $(SRCDIR)/RepositoryFixes.mk
+
+# after platform; at least currently python depends on variable set in platform
+$(eval $(call gb_ExternalExecutable_collect_registrations))
+
+# add user-supplied flags
+ifneq ($(strip gb__ENV_CFLAGS),)
+gb_LinkTarget_CFLAGS += $(gb__ENV_CFLAGS)
+endif
+ifneq ($(strip gb__ENV_CXXFLAGS),)
+gb_LinkTarget_CXXFLAGS += $(gb__ENV_CXXFLAGS)
+endif
+
+gb_CPUDEFS += -D$(CPUNAME)
+
+gb_GLOBALDEFS := \
+ -D_REENTRANT \
+ -DOSL_DEBUG_LEVEL=$(gb_DEBUGLEVEL) \
+ $(gb_OSDEFS) \
+ $(gb_COMPILERDEFS) \
+ $(gb_CPUDEFS) \
+
+ifeq ($(gb_ENABLE_DBGUTIL),$(true))
+gb_GLOBALDEFS += -DDBG_UTIL
+
+ifneq ($(COM)-$(MSVC_USE_DEBUG_RUNTIME),MSC-)
+gb_GLOBALDEFS += -D_DEBUG
+endif
+endif
+
+ifeq ($(gb_TIMELOG),1)
+gb_GLOBALDEFS += -DTIMELOG \
+
+endif
+
+ifeq ($(strip $(ASSERT_ALWAYS_ABORT)),FALSE)
+gb_GLOBALDEFS += -DNDEBUG \
+
+endif
+
+ifeq ($(ENABLE_SAL_LOG),TRUE)
+gb_GLOBALDEFS += -DSAL_LOG_INFO \
+ -DSAL_LOG_WARN \
+
+endif
+
+ifneq ($(gb_DEBUGLEVEL),0)
+ifneq ($(gb_DEBUGLEVEL),1) # 2 or more
+gb_GLOBALDEFS += -DDEBUG \
+
+endif
+endif
+
+gb_GLOBALDEFS += \
+ $(call gb_Helper_define_if_set,\
+ DISABLE_DYNLOADING \
+ )
+
+gb_GLOBALDEFS := $(sort $(gb_GLOBALDEFS))
+
+# Common environment variables passed into all gb_*Test classes:
+# * Cap the number of threads unittests use:
+gb_TEST_ENV_VARS := MAX_CONCURRENCY=4
+# * Disable searching for certificates by default:
+#
+# see xmlsecurity/source/xmlsec/nss/nssinitializer.cxx for use
+#
+# a) If MOZILLA_CERTIFICATE_FOLDER is empty then LibreOffice autodetects
+# the user's mozilla-descended application profile. To disable that we
+# use a non-empty string here.
+#
+# b) Using dbm: appears to nss as equivalent to an empty path so the
+# initial NSS_InitReadWrite will fail. In response to that failure
+# LibreOffice will create a temp fallback cert database which is removed
+# on process exit
+gb_TEST_ENV_VARS += MOZILLA_CERTIFICATE_FOLDER=dbm:
+# Avoid hanging if the cups daemon requests a password:
+gb_TEST_ENV_VARS += SAL_DISABLE_SYNCHRONOUS_PRINTER_DETECTION=1
+ifeq (,$(SAL_USE_VCLPLUGIN))
+gb_TEST_ENV_VARS += SAL_USE_VCLPLUGIN=svp
+endif
+
+# This is used to detect whether LibreOffice is being built (as opposed to building
+# 3rd-party code). Used for tag deprecation for API we want to
+# ensure is not used at all externally while we clean
+# out our internal usage, for code in sal/ that should be used only internally, etc.
+gb_DEFS_INTERNAL := \
+ -DLIBO_INTERNAL_ONLY \
+
+include $(GBUILDDIR)/Deliver.mk
+
+$(eval $(call gb_Deliver_init))
+
+include $(GBUILDDIR)/Trace.mk
+
+# We are using a set of scopes that we might as well call classes.
+
+# TODO: to what extent is the following still true?
+# It is important to include them in the right order as that is
+# -- at least in part -- defining precedence. This is not an issue in the
+# WORKDIR as there are no naming collisions there, but INSTDIR is a mess
+# and precedence is important there. This is also platform dependent.
+#
+# This is less of an issue with GNU Make versions > 3.82 which matches for
+# shortest stem instead of first match. However, upon introduction this version
+# is not available everywhere by default.
+
+include $(foreach class, \
+ ComponentTarget \
+ Postprocess \
+ AllLangMoTarget \
+ WinResTarget \
+ LinkTarget \
+ Library \
+ StaticLibrary \
+ Executable \
+ SdiTarget \
+ Package \
+ ExternalPackage \
+ CustomTarget \
+ ExternalProject \
+ Gallery \
+ Pagein \
+ PrecompiledHeaders \
+ Pyuno \
+ PythonTest \
+ UITest \
+ Rdb \
+ CppunitTest \
+ Jar \
+ JavaClassSet \
+ JunitTest \
+ Module \
+ UIConfig \
+ UnoApiTarget \
+ UnoApi \
+ UnpackedTarball \
+ InternalUnoApi \
+ CliAssembly \
+ CliLibrary \
+ CliNativeLibrary \
+ CliUnoApi \
+ Zip \
+ AllLangPackage \
+ Configuration \
+ HelpTarget \
+ AllLangHelp \
+ Extension \
+ ExtensionPackage \
+ Dictionary \
+ InstallModuleTarget \
+ InstallModule \
+ InstallScript \
+ AutoInstall \
+ PackageSet \
+ GeneratedPackage \
+ CompilerTest \
+,$(GBUILDDIR)/$(class).mk)
+
+$(eval $(call gb_Helper_process_executable_registrations))
+$(eval $(call gb_Postprocess_make_targets))
+
+# optional extensions that should never be essential
+ifneq ($(wildcard $(GBUILDDIR)/extensions/post_*.mk),)
+include $(wildcard $(GBUILDDIR)/extensions/post_*.mk)
+endif
+
+define gb_Extensions_final_hook
+ifneq ($(wildcard $(GBUILDDIR)/extensions/final_*.mk),)
+include $(wildcard $(GBUILDDIR)/extensions/final_*.mk)
+endif
+
+endef
+
+# Setup for ccache.
+ifneq ($(gb_ENABLE_PCH),)
+# CCACHE_SLOPPINESS should contain pch_defines,time_macros for PCHs.
+gb_CCACHE_SLOPPINESS :=
+ifeq ($(shell test -z "$$CCACHE_SLOPPINESS" && echo 1),1)
+gb_CCACHE_SLOPPINESS := CCACHE_SLOPPINESS=pch_defines,time_macros
+else
+ifeq ($(shell echo "$$CCACHE_SLOPPINESS" | grep -q pch_defines | grep -q time_macros && echo 1),1)
+gb_CCACHE_SLOPPINESS := CCACHE_SLOPPINESS=$CCACHE_SLOPPINESS:pch_defines,time_macros
+endif
+endif
+gb_COMPILER_SETUP += $(gb_CCACHE_SLOPPINESS)
+endif
+
+ifneq ($(CCACHE_DEPEND_MODE),)
+gb_COMPILER_SETUP += CCACHE_DEPEND=1
+endif
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/gen-autoinstall.py b/solenv/gbuild/gen-autoinstall.py
new file mode 100644
index 000000000..d55ab51d3
--- /dev/null
+++ b/solenv/gbuild/gen-autoinstall.py
@@ -0,0 +1,98 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+# generate AutoInstall files from gbuild data for further scp2 processing
+
+import sys
+
+module = sys.argv[1]
+scp2componentcondition = sys.argv[2]
+scp2libtemplate = sys.argv[3]
+scp2exetemplate = sys.argv[4]
+scp2jartemplate = sys.argv[5]
+scp2pkgtemplate = sys.argv[6]
+# use 'with open(file) as f:' to avoid 'ResourceWarning: unclosed file'
+with open(sys.argv[7]) as f:
+ sdklibs = f.readline().split()
+with open(sys.argv[8]) as f:
+ libs = f.readline().split()
+with open(sys.argv[9]) as f:
+ exes = f.readline().split()
+with open(sys.argv[10]) as f:
+ jars = f.readline().split()
+with open(sys.argv[11]) as f:
+ pkgs = f.readline().split()
+
+if len(scp2componentcondition) > 0:
+ scp2componentcondition = "," + scp2componentcondition
+
+def escape(string):
+ return string.replace(".", "_").replace("-", "_").replace("/", "_")
+
+def to_tuple(l):
+ ret = []
+ i = 0
+ while i < len(l):
+ ret.append((l[i], l[i+1]))
+ i += 2
+ return ret
+
+def to_triple(l):
+ ret = []
+ i = 0
+ while i < len(l):
+ ret.append((l[i], l[i+1], l[i+2]))
+ i += 3
+ return ret
+
+print("/* autogenerated installs for group " + module + " */")
+print("#define auto_" + module + "_ALL \\")
+
+autosdklibs = [("auto_" + module + "_link_" + escape(lib),link,target) for (lib,link,target) in to_triple(sdklibs)]
+autolibs = [("auto_" + module + "_lib_" + escape(lib),libfile) for (lib,libfile) in to_tuple(libs)]
+autoexes = [("auto_" + module + "_exe_" + escape(exe),exefile) for (exe,exefile) in to_tuple(exes)]
+autojars = [("auto_" + module + "_jar_" + escape(jar),jar + ".jar") for jar in jars]
+autopkgs = [("auto_" + module + "_pkg_" + escape(pkg),pkg + ".filelist") for pkg in pkgs]
+
+allgids = [gid for (gid,_,_) in autosdklibs] + \
+ [gid for (gid,_) in autolibs] + \
+ [gid for (gid,_) in autoexes] + \
+ [gid for (gid,_) in autojars] + \
+ [gid for (gid,_) in autopkgs]
+
+print(", \\\n".join([" " + gid for gid in allgids]))
+
+for (gid, link, target) in autosdklibs:
+ print("SDK_LIBRARY_LINK(" + gid + "," + link + "," + target + ")")
+
+scp2libtemplates = set([ "URE_PRIVATE_LIB", "LIBO_LIB_FILE", "LIBO_LIB_FILE_BINARYTABLE", "LIBO_LIB_FILE_COMPONENTCONDITION", "SHLXTHDL_LIB_FILE", "SHLXTHDL_X64_LIB_FILE_COMPONENTCONDITION" ])
+for (gid, libfile) in autolibs:
+ if not(scp2libtemplate in scp2libtemplates):
+ raise Exception("invalid scp2libtemplate \"" + scp2libtemplate + "\"")
+ print(scp2libtemplate + "(" + gid + "," + libfile + scp2componentcondition + ")")
+
+scp2exetemplates = set([ "URE_EXECUTABLE", "LIBO_EXECUTABLE", "LIBO_EXECUTABLE_COMPONENTCONDITION", "SDK_EXECUTABLE" ])
+for (gid, exefile) in autoexes:
+ if not(scp2exetemplate in scp2exetemplates):
+ raise Exception("invalid scp2exetemplate \"" + scp2exetemplate + "\"")
+ print(scp2exetemplate + "(" + gid + "," + exefile + scp2componentcondition + ")")
+
+scp2jartemplates = set([ "URE_JAR_FILE", "LIBO_JAR_FILE" ])
+for (gid, jarfile) in autojars:
+ if not(scp2jartemplate in scp2jartemplates):
+ raise Exception("invalid scp2jartemplate \"" + scp2jartemplate + "\"")
+ print(scp2jartemplate + "(" + gid + "," + jarfile + scp2componentcondition + ")")
+
+scp2pkgtemplates = set([ "PACKAGE_FILELIST", "PACKAGE_FILELIST_COMPONENTCONDITION","PACKAGE_FILELIST_FONT", "SDK_PACKAGE_FILELIST" ])
+for (gid, pkgfilelist) in autopkgs:
+ if not(scp2pkgtemplate in scp2pkgtemplates):
+ raise Exception("invalid scp2pkgtemplate \"" + scp2pkgtemplate + "\"")
+ print(scp2pkgtemplate + "(" + gid + "," + pkgfilelist + scp2componentcondition + ")")
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gbuild/partial_build.mk b/solenv/gbuild/partial_build.mk
new file mode 100644
index 000000000..5819667b2
--- /dev/null
+++ b/solenv/gbuild/partial_build.mk
@@ -0,0 +1,46 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+ifeq ($(gb_Side),)
+gb_Side:=host
+endif
+
+ifeq (,$(BUILDDIR))
+gb_partial_build__makefile_dir=$(dir $(abspath $(firstword $(MAKEFILE_LIST))))
+BUILDDIR := $(if $(wildcard $(gb_partial_build__makefile_dir)../Module_external.mk), \
+ $(gb_partial_build__makefile_dir)../.., \
+ $(gb_partial_build__makefile_dir)..)
+endif
+
+include $(BUILDDIR)/config_$(gb_Side).mk
+
+gb_PARTIAL_BUILD := T
+include $(SRCDIR)/solenv/gbuild/gbuild.mk
+
+$(eval $(call gb_Module_make_global_targets,$(wildcard $(module_directory)Module*.mk)))
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+$(if $(gb_LinkTarget__Lock),$(shell rm -f $(gb_LinkTarget__Lock)))
+ifeq ($(ENABLE_CUSTOMTARGET_COMPONENTS),TRUE)
+include $(SRCDIR)/solenv/gbuild/static.mk
+$(if $(filter a,$(gb_DEBUG_STATIC)),$(error Abort after static.mk))
+endif
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/ANDROID_AARCH64_GCC.mk b/solenv/gbuild/platform/ANDROID_AARCH64_GCC.mk
new file mode 100644
index 000000000..0fab5ede8
--- /dev/null
+++ b/solenv/gbuild/platform/ANDROID_AARCH64_GCC.mk
@@ -0,0 +1,17 @@
+# -*- 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/.
+#
+
+# please make generic modifications to unxgcc.mk or android.mk
+gb_CPUDEFS += -DARM32
+gb_COMPILEROPTFLAGS := -Os
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+include $(GBUILDDIR)/platform/android.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/ANDROID_ARM_GCC.mk b/solenv/gbuild/platform/ANDROID_ARM_GCC.mk
new file mode 100644
index 000000000..0fab5ede8
--- /dev/null
+++ b/solenv/gbuild/platform/ANDROID_ARM_GCC.mk
@@ -0,0 +1,17 @@
+# -*- 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/.
+#
+
+# please make generic modifications to unxgcc.mk or android.mk
+gb_CPUDEFS += -DARM32
+gb_COMPILEROPTFLAGS := -Os
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+include $(GBUILDDIR)/platform/android.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/ANDROID_INTEL_GCC.mk b/solenv/gbuild/platform/ANDROID_INTEL_GCC.mk
new file mode 100644
index 000000000..597366a7f
--- /dev/null
+++ b/solenv/gbuild/platform/ANDROID_INTEL_GCC.mk
@@ -0,0 +1,17 @@
+# -*- 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/.
+#
+
+# please make generic modifications to unxgcc.mk or android.mk
+gb_CPUDEFS += -DX86
+gb_COMPILEROPTFLAGS := -Os
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+include $(GBUILDDIR)/platform/android.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/ANDROID_X86_64_GCC.mk b/solenv/gbuild/platform/ANDROID_X86_64_GCC.mk
new file mode 100644
index 000000000..bb57e8ae0
--- /dev/null
+++ b/solenv/gbuild/platform/ANDROID_X86_64_GCC.mk
@@ -0,0 +1,15 @@
+# -*- 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/.
+#
+
+# please make generic modifications to unxgcc.mk or android.mk
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+include $(GBUILDDIR)/platform/android.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/DRAGONFLY_INTEL_GCC.mk b/solenv/gbuild/platform/DRAGONFLY_INTEL_GCC.mk
new file mode 100644
index 000000000..00ccf8a03
--- /dev/null
+++ b/solenv/gbuild/platform/DRAGONFLY_INTEL_GCC.mk
@@ -0,0 +1,18 @@
+# -*- 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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+gb_CPUDEFS := -DX86
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+gb_CppunitTest_CPPTESTPRECOMMAND := LD_LIBRARY_PATH=$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs:/usr/pkg/lib
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/DRAGONFLY_X86_64_GCC.mk b/solenv/gbuild/platform/DRAGONFLY_X86_64_GCC.mk
new file mode 100644
index 000000000..71b53d522
--- /dev/null
+++ b/solenv/gbuild/platform/DRAGONFLY_X86_64_GCC.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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+gb_CppunitTest_CPPTESTPRECOMMAND := LD_LIBRARY_PATH=$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs:/usr/pkg/lib
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/DeclareDPIAware.manifest b/solenv/gbuild/platform/DeclareDPIAware.manifest
new file mode 100644
index 000000000..bb0123062
--- /dev/null
+++ b/solenv/gbuild/platform/DeclareDPIAware.manifest
@@ -0,0 +1,7 @@
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
+ <asmv3:application>
+ <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
+ <dpiAware>true</dpiAware>
+ </asmv3:windowsSettings>
+ </asmv3:application>
+</assembly>
diff --git a/solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk b/solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk
new file mode 100644
index 000000000..61424f72c
--- /dev/null
+++ b/solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk
@@ -0,0 +1,95 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+# don't sort; later can override previous settings!
+gb_EMSCRIPTEN_PRE_JS_FILES = \
+ $(SRCDIR)/static/emscripten/environment.js \
+ $(call gb_CustomTarget_get_workdir,static/emscripten_fs_image)/soffice.data.js.link \
+
+gb_RUN_CONFIGURE := $(SRCDIR)/solenv/bin/run-configure
+# avoid -s SAFE_HEAP=1 - c.f. gh#8584 this breaks source maps
+gb_EMSCRIPTEN_CPPFLAGS := -pthread -s USE_PTHREADS=1
+gb_EMSCRIPTEN_LDFLAGS := $(gb_EMSCRIPTEN_CPPFLAGS)
+
+# Initial memory size and worker thread pool
+gb_EMSCRIPTEN_LDFLAGS += -s TOTAL_MEMORY=1GB -s PTHREAD_POOL_SIZE=4
+
+# To keep the link time (and memory) down, prevent all rewriting options from wasm-emscripten-finalize
+# See emscripten.py, finalize_wasm, modify_wasm = True
+# So we need WASM_BIGINT=1 and ASSERTIONS=1 (2 implies STACK_OVERFLOW_CHECK)
+gb_EMSCRIPTEN_LDFLAGS += --bind -s FORCE_FILESYSTEM=1 -s WASM_BIGINT=1 -s ERROR_ON_UNDEFINED_SYMBOLS=1 -s FETCH=1 -s ASSERTIONS=1 -s EXIT_RUNTIME=0 -s EXPORTED_RUNTIME_METHODS=["UTF16ToString","stringToUTF16","printErr"]
+gb_EMSCRIPTEN_QTDEFS := -DQT_NO_LINKED_LIST -DQT_NO_JAVA_STYLE_ITERATORS -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB
+
+gb_Executable_EXT := .html
+ifeq ($(ENABLE_WASM_EXCEPTIONS),TRUE)
+gb_EMSCRIPTEN_EXCEPT = -fwasm-exceptions -s SUPPORT_LONGJMP=wasm
+gb_EMSCRIPTEN_CPPFLAGS += -s SUPPORT_LONGJMP=wasm
+else
+gb_EMSCRIPTEN_EXCEPT = -s DISABLE_EXCEPTION_CATCHING=0
+endif
+
+gb_CXXFLAGS += $(gb_EMSCRIPTEN_CPPFLAGS)
+gb_LinkTarget_EXCEPTIONFLAGS += $(gb_EMSCRIPTEN_EXCEPT)
+gb_LinkTarget_CFLAGS += $(gb_EMSCRIPTEN_CPPFLAGS) $(gb_EMSCRIPTEN_QTDEFS)
+gb_LinkTarget_CXXFLAGS += $(gb_EMSCRIPTEN_CPPFLAGS) $(gb_EMSCRIPTEN_QTDEFS) $(gb_EMSCRIPTEN_EXCEPT)
+gb_LinkTarget_LDFLAGS += $(gb_EMSCRIPTEN_LDFLAGS) $(gb_EMSCRIPTEN_CPPFLAGS) $(gb_EMSCRIPTEN_EXCEPT)
+
+# Linker and compiler optimize + debug flags are handled in LinkTarget.mk
+gb_LINKEROPTFLAGS :=
+gb_LINKERSTRIPDEBUGFLAGS :=
+# This maps to g3, no source maps, but DWARF with current emscripten!
+# https://developer.chrome.com/blog/wasm-debugging-2020/
+gb_DEBUGINFO_FLAGS = -g
+#gb_DEBUGINFO_FLAGS = -gsource-map --source-map-base=file://$(WORKDIR)/LinkTarget/Executable
+
+ifeq ($(HAVE_EXTERNAL_DWARF),TRUE)
+gb_DEBUGINFO_FLAGS += -gseparate-dwarf
+endif
+
+# We need at least code elimination, otherwise linking OOMs even with 64GB.
+# So we "fake" -Og support to mean -O1 for Emscripten and always enable it for debug in configure.
+gb_COMPILERDEBUGOPTFLAGS := -O1
+gb_COMPILERNOOPTFLAGS := -O1 -fstrict-aliasing -fstrict-overflow
+
+# cleanup addition JS and wasm files for binaries
+define gb_Executable_Executable_platform
+$(call gb_LinkTarget_add_auxtargets,$(2),\
+ $(patsubst %.lib,%.wasm,$(3)) \
+ $(patsubst %.lib,%.js,$(3)) \
+ $(patsubst %.lib,%.worker.js,$(3)) \
+)
+
+$(foreach pre_js,$(gb_EMSCRIPTEN_PRE_JS_FILES),$(call gb_Executable_add_prejs,$(1),$(pre_js)))
+
+endef
+
+define gb_CppunitTest_CppunitTest_platform
+$(call gb_LinkTarget_add_auxtargets,$(2),\
+ $(patsubst %.lib,%.wasm,$(3)) \
+ $(patsubst %.lib,%.js,$(3)) \
+ $(patsubst %.lib,%.worker.js,$(3)) \
+)
+
+$(foreach pre_js,$(gb_EMSCRIPTEN_PRE_JS_FILES),$(call gb_CppunitTest_add_prejs,$(1),$(pre_js)))
+
+endef
+
+gb_SUPPRESS_TESTS := $(true)
+
+define gb_Library_get_rpath
+endef
+
+define gb_Executable_get_rpath
+endef
+
+# vim: set noet sw=4 ts=4
diff --git a/solenv/gbuild/platform/FREEBSD_AARCH64_GCC.mk b/solenv/gbuild/platform/FREEBSD_AARCH64_GCC.mk
new file mode 100644
index 000000000..6199f17b3
--- /dev/null
+++ b/solenv/gbuild/platform/FREEBSD_AARCH64_GCC.mk
@@ -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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/FREEBSD_INTEL_GCC.mk b/solenv/gbuild/platform/FREEBSD_INTEL_GCC.mk
new file mode 100644
index 000000000..5582d2dc8
--- /dev/null
+++ b/solenv/gbuild/platform/FREEBSD_INTEL_GCC.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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+gb_CPUDEFS := -DX86
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/FREEBSD_POWERPC64_GCC.mk b/solenv/gbuild/platform/FREEBSD_POWERPC64_GCC.mk
new file mode 100644
index 000000000..93fdf8126
--- /dev/null
+++ b/solenv/gbuild/platform/FREEBSD_POWERPC64_GCC.mk
@@ -0,0 +1,17 @@
+# -*- 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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_CPUDEFS += -DPPC -DPOWERPC64
+gb_COMPILERDEFAULTOPTFLAGS := -O2
+gb_CXXFLAGS += -mminimal-toc
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/FREEBSD_POWERPC_GCC.mk b/solenv/gbuild/platform/FREEBSD_POWERPC_GCC.mk
new file mode 100644
index 000000000..48c29b6f1
--- /dev/null
+++ b/solenv/gbuild/platform/FREEBSD_POWERPC_GCC.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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_CPUDEFS += -DPPC -DPOWERPC
+gb_COMPILERDEFAULTOPTFLAGS := -O2
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/FREEBSD_X86_64_GCC.mk b/solenv/gbuild/platform/FREEBSD_X86_64_GCC.mk
new file mode 100644
index 000000000..6199f17b3
--- /dev/null
+++ b/solenv/gbuild/platform/FREEBSD_X86_64_GCC.mk
@@ -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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/HAIKU_INTEL_GCC.mk b/solenv/gbuild/platform/HAIKU_INTEL_GCC.mk
new file mode 100644
index 000000000..5582d2dc8
--- /dev/null
+++ b/solenv/gbuild/platform/HAIKU_INTEL_GCC.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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+gb_CPUDEFS := -DX86
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/HAIKU_X86_64_GCC.mk b/solenv/gbuild/platform/HAIKU_X86_64_GCC.mk
new file mode 100644
index 000000000..6199f17b3
--- /dev/null
+++ b/solenv/gbuild/platform/HAIKU_X86_64_GCC.mk
@@ -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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_AARCH64_GCC.mk b/solenv/gbuild/platform/LINUX_AARCH64_GCC.mk
new file mode 100644
index 000000000..431485a7c
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_AARCH64_GCC.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/.
+#
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_ARM_GCC.mk b/solenv/gbuild/platform/LINUX_ARM_GCC.mk
new file mode 100644
index 000000000..cccf5772b
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_ARM_GCC.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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_CPUDEFS += -DARM32
+gb_COMPILEROPTFLAGS := -Os
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_AXP_GCC.mk b/solenv/gbuild/platform/LINUX_AXP_GCC.mk
new file mode 100644
index 000000000..b0d41078f
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_AXP_GCC.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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_COMPILEROPTFLAGS := -Os
+gb_LinkTarget_LDFLAGS += -Wl,--no-relax
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_GODSON64_GCC.mk b/solenv/gbuild/platform/LINUX_GODSON64_GCC.mk
new file mode 100644
index 000000000..4a0a619e4
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_GODSON64_GCC.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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_CPUDEFS += -DMIPS64
+gb_COMPILEROPTFLAGS := -Os
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_GODSON_GCC.mk b/solenv/gbuild/platform/LINUX_GODSON_GCC.mk
new file mode 100644
index 000000000..976aaedf9
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_GODSON_GCC.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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_CPUDEFS += -DMIPS
+gb_COMPILEROPTFLAGS := -Os
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_HPPA_GCC.mk b/solenv/gbuild/platform/LINUX_HPPA_GCC.mk
new file mode 100644
index 000000000..c1a1ceeee
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_HPPA_GCC.mk
@@ -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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_IA64_GCC.mk b/solenv/gbuild/platform/LINUX_IA64_GCC.mk
new file mode 100644
index 000000000..c1a1ceeee
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_IA64_GCC.mk
@@ -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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_INTEL_GCC.mk b/solenv/gbuild/platform/LINUX_INTEL_GCC.mk
new file mode 100644
index 000000000..146e95cf9
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_INTEL_GCC.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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_CPUDEFS := -DX86
+gb_COMPILEROPTFLAGS := -Os
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_M68K_GCC.mk b/solenv/gbuild/platform/LINUX_M68K_GCC.mk
new file mode 100644
index 000000000..9e007101d
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_M68K_GCC.mk
@@ -0,0 +1,15 @@
+# -*- 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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_COMPILEROPTFLAGS := -Os
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_POWERPC64_GCC.mk b/solenv/gbuild/platform/LINUX_POWERPC64_GCC.mk
new file mode 100644
index 000000000..1880b3bad
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_POWERPC64_GCC.mk
@@ -0,0 +1,15 @@
+# -*- 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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_CPUDEFS += -DPPC
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_POWERPC_GCC.mk b/solenv/gbuild/platform/LINUX_POWERPC_GCC.mk
new file mode 100644
index 000000000..1880b3bad
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_POWERPC_GCC.mk
@@ -0,0 +1,15 @@
+# -*- 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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_CPUDEFS += -DPPC
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_S390X_GCC.mk b/solenv/gbuild/platform/LINUX_S390X_GCC.mk
new file mode 100644
index 000000000..c1a1ceeee
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_S390X_GCC.mk
@@ -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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_S390_GCC.mk b/solenv/gbuild/platform/LINUX_S390_GCC.mk
new file mode 100644
index 000000000..c1a1ceeee
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_S390_GCC.mk
@@ -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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_SPARC64_GCC.mk b/solenv/gbuild/platform/LINUX_SPARC64_GCC.mk
new file mode 100644
index 000000000..9e007101d
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_SPARC64_GCC.mk
@@ -0,0 +1,15 @@
+# -*- 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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_COMPILEROPTFLAGS := -Os
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_SPARC_GCC.mk b/solenv/gbuild/platform/LINUX_SPARC_GCC.mk
new file mode 100644
index 000000000..9e007101d
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_SPARC_GCC.mk
@@ -0,0 +1,15 @@
+# -*- 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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+gb_COMPILEROPTFLAGS := -Os
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/LINUX_X86_64_GCC.mk b/solenv/gbuild/platform/LINUX_X86_64_GCC.mk
new file mode 100644
index 000000000..c1a1ceeee
--- /dev/null
+++ b/solenv/gbuild/platform/LINUX_X86_64_GCC.mk
@@ -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/.
+#
+
+#please make generic modifications to unxgcc.mk or linux.mk
+
+include $(GBUILDDIR)/platform/linux.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/MACOSX_AARCH64_GCC.mk b/solenv/gbuild/platform/MACOSX_AARCH64_GCC.mk
new file mode 100644
index 000000000..d8845ccbb
--- /dev/null
+++ b/solenv/gbuild/platform/MACOSX_AARCH64_GCC.mk
@@ -0,0 +1,13 @@
+# -*- 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/.
+#
+#*************************************************************************
+
+include $(GBUILDDIR)/platform/macosx.mk
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/MACOSX_X86_64_GCC.mk b/solenv/gbuild/platform/MACOSX_X86_64_GCC.mk
new file mode 100644
index 000000000..d8845ccbb
--- /dev/null
+++ b/solenv/gbuild/platform/MACOSX_X86_64_GCC.mk
@@ -0,0 +1,13 @@
+# -*- 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/.
+#
+#*************************************************************************
+
+include $(GBUILDDIR)/platform/macosx.mk
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/NETBSD_INTEL_GCC.mk b/solenv/gbuild/platform/NETBSD_INTEL_GCC.mk
new file mode 100644
index 000000000..feb527ba9
--- /dev/null
+++ b/solenv/gbuild/platform/NETBSD_INTEL_GCC.mk
@@ -0,0 +1,21 @@
+# -*- 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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+gb_CPUDEFS := -DX86
+gb_COMPILEROPTFLAGS := -O -g
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+NB_ADD_LIBPATH := /usr/pkg/lib:/usr/X11R7/lib
+
+gb_CppunitTest_CPPTESTPRECOMMAND := LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs:$(NB_ADD_LIBPATH)
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/NETBSD_X86_64_GCC.mk b/solenv/gbuild/platform/NETBSD_X86_64_GCC.mk
new file mode 100644
index 000000000..fbbf7b428
--- /dev/null
+++ b/solenv/gbuild/platform/NETBSD_X86_64_GCC.mk
@@ -0,0 +1,20 @@
+# -*- 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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+gb_COMPILEROPTFLAGS := -O -g
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+NB_ADD_LIBPATH := /usr/pkg/lib:/usr/X11R7/lib
+
+gb_CppunitTest_CPPTESTPRECOMMAND := LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs:$(NB_ADD_LIBPATH)
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/OPENBSD_INTEL_GCC.mk b/solenv/gbuild/platform/OPENBSD_INTEL_GCC.mk
new file mode 100644
index 000000000..50d803d29
--- /dev/null
+++ b/solenv/gbuild/platform/OPENBSD_INTEL_GCC.mk
@@ -0,0 +1,17 @@
+# -*- 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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+gb_CPUDEFS := -DX86
+gb_STDLIBS := $(PTHREAD_LIBS)
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/OPENBSD_X86_64_GCC.mk b/solenv/gbuild/platform/OPENBSD_X86_64_GCC.mk
new file mode 100644
index 000000000..15908054d
--- /dev/null
+++ b/solenv/gbuild/platform/OPENBSD_X86_64_GCC.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/.
+#
+
+#please make generic modifications to unxgcc.mk
+
+gb_STDLIBS := $(PTHREAD_LIBS)
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/SOLARIS_INTEL_GCC.mk b/solenv/gbuild/platform/SOLARIS_INTEL_GCC.mk
new file mode 100644
index 000000000..7f31c8a8a
--- /dev/null
+++ b/solenv/gbuild/platform/SOLARIS_INTEL_GCC.mk
@@ -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/.
+#
+#*************************************************************************
+
+include $(GBUILDDIR)/platform/solaris.mk
+
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/SOLARIS_SPARC_GCC.mk b/solenv/gbuild/platform/SOLARIS_SPARC_GCC.mk
new file mode 100644
index 000000000..25b383489
--- /dev/null
+++ b/solenv/gbuild/platform/SOLARIS_SPARC_GCC.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/.
+#
+#*************************************************************************
+
+gb_CPUDEFS := -D__sparcv8plus
+
+include $(GBUILDDIR)/platform/solaris.mk
+
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/WNT_AARCH64_MSC.mk b/solenv/gbuild/platform/WNT_AARCH64_MSC.mk
new file mode 100644
index 000000000..c9cf93138
--- /dev/null
+++ b/solenv/gbuild/platform/WNT_AARCH64_MSC.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/.
+#
+# 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 .
+#
+
+gb_CPUDEFS := -D_ARM64_=1
+
+include $(GBUILDDIR)/platform/com_MSC_defs.mk
+
+include $(GBUILDDIR)/platform/com_MSC_class.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/WNT_INTEL_MSC.mk b/solenv/gbuild/platform/WNT_INTEL_MSC.mk
new file mode 100644
index 000000000..690a7083a
--- /dev/null
+++ b/solenv/gbuild/platform/WNT_INTEL_MSC.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/.
+#
+# 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 .
+#
+
+gb_CPUDEFS := -D_X86_=1
+
+include $(GBUILDDIR)/platform/com_MSC_defs.mk
+
+include $(GBUILDDIR)/platform/com_MSC_class.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/WNT_X86_64_MSC.mk b/solenv/gbuild/platform/WNT_X86_64_MSC.mk
new file mode 100644
index 000000000..18eae3e74
--- /dev/null
+++ b/solenv/gbuild/platform/WNT_X86_64_MSC.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/.
+#
+# 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 .
+#
+
+gb_CPUDEFS := -D_AMD64_=1
+
+include $(GBUILDDIR)/platform/com_MSC_defs.mk
+
+include $(GBUILDDIR)/platform/com_MSC_class.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/android.mk b/solenv/gbuild/platform/android.mk
new file mode 100644
index 000000000..fde207ecc
--- /dev/null
+++ b/solenv/gbuild/platform/android.mk
@@ -0,0 +1,129 @@
+# -*- 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/.
+#
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+
+gb_STDLIBS := -static-libstdc++
+
+endif
+
+# No unit testing can be run
+gb_CppunitTest_CPPTESTPRECOMMAND := :
+
+# Re-define this from unxgcc.mk with some small but important
+# changes. Just temporarily done this way, shm_get promised to
+# eventually enable this to be done this in some more elegant and less
+# redundant fashion.
+
+gb_LinkTarget_LDFLAGS += \
+ -Wl,-z,defs \
+ -Wl,--as-needed \
+ -Wl,--no-add-needed
+
+define gb_LinkTarget__command_dynamiclink
+$(call gb_Helper_abbreviate_dirs,\
+ $(if $(CXXOBJECTS)$(GENCXXOBJECTS)$(EXTRAOBJECTLISTS),$(gb_CXX),$(gb_CC)) \
+ -shared \
+ $(if $(filter Library CppunitTest,$(TARGETTYPE)),$(gb_Library_TARGETTYPEFLAGS)) \
+ $(subst \d,$$,$(RPATH)) \
+ $(T_USE_LD) $(T_LDFLAGS) \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),`cat $(extraobjectlist)`) \
+ -Wl$(COMMA)--start-group $(foreach lib,$(LINKED_STATIC_LIBS),$(call gb_StaticLibrary_get_target,$(lib))) -Wl$(COMMA)--end-group \
+ $(T_LIBS) \
+ $(patsubst lib%.a,-l%,$(patsubst lib%.so,-l%,$(foreach lib,$(LINKED_LIBS),$(call gb_Library_get_filename,$(lib))))) \
+ -o $(1))
+endef
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+
+# Library class
+
+gb_Library_DEFS :=
+gb_Library_SYSPRE := lib
+gb_Library_UNOVERPRE := $(gb_Library_SYSPRE)uno_
+gb_Library_PLAINEXT := .a
+gb_Library_DLLEXT := .a
+gb_Library_RTEXT := gcc3$(gb_Library_PLAINEXT)
+
+gb_Library_OOOEXT := $(gb_Library_DLLPOSTFIX)$(gb_Library_PLAINEXT)
+gb_Library_UNOEXT := .uno$(gb_Library_PLAINEXT)
+
+endif
+
+# Prefix UNO library filenames with "lib"
+gb_Library_FILENAMES := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_RTEXT)) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(gb_Library_UNOVERPRE)$(lib)$(gb_Library_PLAINEXT)) \
+
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+
+gb_Library_FILENAMES += \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):$(lib)$(gb_Library_UNOEXT)) \
+
+gb_Library_LAYER := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):OXT) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):NONE) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):OXT) \
+
+define gb_Library_Library_platform
+$(call gb_LinkTarget_get_target,$(2)) : LAYER := $(call gb_Library_get_layer,$(1))
+
+endef
+
+# CppunitTest class
+
+gb_CppunitTest_get_filename = libtest_$(1).a
+
+# No use for Cppunit targets now for Android (which would be just
+# static archives), they are just a waste of disk space.
+define gb_LinkTarget__command
+$(call gb_Output_announce,$(2),$(true),LNK,4)
+ $(call gb_Trace_StartRange,$(2),LNK)
+$(if $(filter CppunitTest,$(TARGETTYPE)), \
+ touch $(1), \
+ $(call gb_LinkTarget__command_staticlink,$(1)))
+ $(call gb_Trace_EndRange,$(2),LNK)
+endef
+
+endif
+
+# No DT_RPATH or DT_RUNPATH support in the Bionic dynamic linker so
+# don't bother generating such.
+
+define gb_Library_get_rpath
+endef
+
+define gb_Executable_get_rpath
+endef
+
+gb_LinkTarget_LDFLAGS := $(subst -Wl$(COMMA)-rpath-link$(COMMA)$(SYSBASE)/lib:$(SYSBASE)/usr/lib,,$(gb_LinkTarget_LDFLAGS))
+
+gb_Library__set_soversion_script_platform =
+
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/com_GCC_class.mk b/solenv/gbuild/platform/com_GCC_class.mk
new file mode 100644
index 000000000..d34464030
--- /dev/null
+++ b/solenv/gbuild/platform/com_GCC_class.mk
@@ -0,0 +1,255 @@
+# -*- 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/.
+#
+
+ifeq ($(gb_FULLDEPS),$(true))
+ifneq (,$(CCACHE_HARDLINK))
+# cannot move hardlink over itself, so create dep file directly, even if that
+# might leave a broken file behind in case the build is interrupted forcefully
+define gb_cxx_dep_generation_options
+-MMD -MT $(1) -MP -MF $(2)
+endef
+define gb_cxx_dep_copy
+endef
+else
+define gb_cxx_dep_generation_options
+-MMD -MT $(1) -MP -MF $(2)_
+endef
+define gb_cxx_dep_copy
+&& mv $(1)_ $(1)
+endef
+endif
+else
+define gb_cxx_dep_generation_options
+endef
+define gb_cxx_dep_copy
+endef
+endif
+
+# AsmObject class
+
+gb_AsmObject_get_source = $(1)/$(2).s
+
+# $(call gb_AsmObject__command,object,relative-source,source,dep-file)
+define gb_AsmObject__command
+$(call gb_Output_announce,$(2),$(true),ASM,3)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) $(dir $(4)) && cd $(SRCDIR) && \
+ $(gb_CC) \
+ -x assembler-with-cpp \
+ $(T_LTOFLAGS) \
+ $(gb_AFLAGS) \
+ $(if $(HAVE_ASM_END_BRANCH_INS_SUPPORT),-DEND_BRANCH_INS_SUPPORT) \
+ -c $(3) \
+ -o $(1)) \
+ $(INCLUDE) && \
+ echo "$(1) : $(3)" > $(4)
+endef
+
+# CObject class
+
+# $(call gb_CObject__compiler,source,compiler)
+define gb_CObject__compiler
+ $(if $(filter %.c %.m,$(1)), \
+ $(if $(2), $(2), $(gb_CC)), \
+ $(if $(2), $(2), $(gb_CXX)))
+endef
+
+# When gb_LinkTarget_use_clang is used, filter out GCC flags that Clang doesn't know.
+# $(call gb_CObject__filter_out_clang_cflags,cflags)
+define gb_CObject__filter_out_clang_cflags
+ $(filter-out $(gb_FilterOutClangCFLAGS),$(1))
+endef
+
+# $(call gb_CObject__command_pattern,object,flags,source,dep-file,compiler-plugins,compiler)
+define gb_CObject__command_pattern
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) $(dir $(4)) && cd $(SRCDIR) && \
+ $(gb_COMPILER_SETUP) \
+ $(if $(5),$(gb_COMPILER_PLUGINS_SETUP)) \
+ $(call gb_CObject__compiler,$(3),$(6)) \
+ $(DEFS) \
+ $(T_LTOFLAGS) \
+ $(if $(VISIBILITY),,$(gb_VISIBILITY_FLAGS)) \
+ $(if $(WARNINGS_NOT_ERRORS),$(if $(ENABLE_WERROR),$(if $(PLUGIN_WARNINGS_AS_ERRORS),$(gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS))),$(gb_CFLAGS_WERROR)) \
+ $(if $(5),$(gb_COMPILER_PLUGINS)) \
+ $(if $(COMPILER_TEST),-fsyntax-only -ferror-limit=0 -Xclang -verify) \
+ $(if $(6), $(call gb_CObject__filter_out_clang_cflags,$(2)),$(2)) \
+ $(if $(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS)) \
+ $(if $(EXTERNAL_CODE),$(gb_CXXFLAGS_Wundef),$(gb_DEFS_INTERNAL)) \
+ -c $(3) \
+ -o $(1) \
+ $(if $(COMPILER_TEST),,$(call gb_cxx_dep_generation_options,$(1),$(4))) \
+ $(INCLUDE) \
+ $(PCHFLAGS) \
+ $(if $(COMPILER_TEST),,$(call gb_cxx_dep_copy,$(4))) \
+ )
+endef
+
+# PrecompiledHeader class
+
+ifeq ($(COM_IS_CLANG),TRUE)
+gb_PrecompiledHeader_get_enableflags = -include-pch $(call gb_PrecompiledHeader_get_target,$(1),$(2))
+gb_PrecompiledHeader_EXT := .pch
+# Workaround: Apple Clang version 12.0.5 sometimes tries to compile instead of generating PCH
+# when used just with -c c++-header, so help it by being explicit.
+gb_PrecompiledHeader_emit_pch := -Xclang -emit-pch
+else
+gb_PrecompiledHeader_get_enableflags = \
+-include $(dir $(call gb_PrecompiledHeader_get_target,$(1),$(2)))$(notdir $(subst .gch,,$(call gb_PrecompiledHeader_get_target,$(1),$(2))))
+gb_PrecompiledHeader_EXT := .gch
+gb_PrecompiledHeader_emit_pch :=
+endif
+
+gb_PrecompiledHeader_extra_pch_cxxflags += $(PCH_INSTANTIATE_TEMPLATES)
+
+# Clang supports building extra object file where it puts code that would be shared by all users of the PCH.
+# Unlike with MSVC it is built as a separate step. The relevant options are used only when generating the PCH
+# and when creating the PCH's object file, normal compilations using the PCH do not need extra options.
+gb_PrecompiledHeader_pch_with_obj += $(BUILDING_PCH_WITH_OBJ)
+gb_PrecompiledHeader_extra_pch_cxxflags += $(BUILDING_PCH_WITH_OBJ)
+ifneq ($(BUILDING_PCH_WITH_OBJ),)
+# If using Clang's PCH extra object, we may need to strip unused sections, otherwise inline and template functions
+# emitted in that object may in some cases cause unresolved references to private symbols in other libraries.
+gb_LinkTarget_LDFLAGS += $(LD_GC_SECTIONS)
+gb_PrecompiledHeader_pch_with_obj += -ffunction-sections -fdata-sections
+# Enable generating more shared code and debuginfo in the PCH object file.
+gb_PrecompiledHeader_extra_pch_cxxflags += $(PCH_DEBUGINFO)
+ifeq ($(ENABLE_OPTIMIZED),)
+# -fmodules-codegen appears to be worth it only if not optimizing, otherwise optimizing all the functions emitted
+# in the PCH object file may take way too long, especially given that many of those may get thrown away
+gb_PrecompiledHeader_extra_pch_cxxflags += $(PCH_CODEGEN)
+endif
+endif
+
+# This is for MSVC's object file built directly as a side-effect of building the PCH.
+gb_PrecompiledHeader_get_objectfile =
+
+# $(call gb_PrecompiledHeader__command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename,compiler)
+define gb_PrecompiledHeader__command
+$(call gb_Output_announce,$(2),$(true),PCH,1)
+ $(call gb_Trace_StartRange,$(2),PCH)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) $(dir $(call gb_PrecompiledHeader_get_dep_target,$(2),$(6))) && \
+ cd $(BUILDDIR)/ && \
+ CCACHE_DISABLE=1 $(gb_COMPILER_SETUP) \
+ $(if $(7),$(7),$(gb_CXX)) \
+ -x c++-header $(gb_PrecompiledHeader_emit_pch) \
+ $(if $(7), $(call gb_CObject__filter_out_clang_cflags,$(4)),$(4)) \
+ $(if $(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS)) \
+ $(gb_COMPILERDEPFLAGS) \
+ $(if $(VISIBILITY),,$(gb_VISIBILITY_FLAGS)) \
+ $(if $(EXTERNAL_CODE),$(gb_CXXFLAGS_Wundef),$(gb_DEFS_INTERNAL)) \
+ $(gb_NO_PCH_TIMESTAMP) \
+ $(gb_PrecompiledHeader_extra_pch_cxxflags) \
+ $(5) \
+ $(call gb_cxx_dep_generation_options,$(1),$(call gb_PrecompiledHeader_get_dep_target_tmp,$(2),$(6))) \
+ -c $(patsubst %.cxx,%.hxx,$(3)) \
+ -o$(1) \
+ $(call gb_cxx_dep_copy,$(call gb_PrecompiledHeader_get_dep_target_tmp,$(2),$(6))) \
+ )
+ $(call gb_Trace_EndRange,$(2),PCH)
+endef
+
+ifeq ($(COM_IS_CLANG),TRUE)
+# Clang has -fno-pch-timestamp, just checksum the file for CCACHE_PCH_EXTSUM
+# $(call gb_PrecompiledHeader__sum_command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename,compiler)
+define gb_PrecompiledHeader__sum_command
+ $(SHA256SUM) $(1) >$(1).sum
+endef
+else
+# GCC does not generate the same .gch for the same input, so checksum the (preprocessed) input
+# $(call gb_PrecompiledHeader__sum_command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename,compiler)
+define gb_PrecompiledHeader__sum_command
+$(call gb_Helper_abbreviate_dirs,\
+ CCACHE_DISABLE=1 $(gb_COMPILER_SETUP) \
+ $(if $(7),$(7),$(gb_CXX)) \
+ -x c++-header \
+ $(4) \
+ $(if $(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS)) \
+ $(gb_COMPILERDEPFLAGS) \
+ $(if $(VISIBILITY),,$(gb_VISIBILITY_FLAGS)) \
+ $(if $(EXTERNAL_CODE),$(gb_CXXFLAGS_Wundef),$(gb_DEFS_INTERNAL)) \
+ $(gb_NO_PCH_TIMESTAMP) \
+ $(5) \
+ -E $(patsubst %.cxx,%.hxx,$(3)) \
+ -o- \
+ | $(SHA256SUM) >$(1).sum \
+ )
+endef
+endif
+
+# not needed
+gb_PrecompiledHeader__create_reuse_files =
+gb_PrecompiledHeader__copy_reuse_files =
+
+# YaccTarget class
+
+define gb_YaccTarget__command
+$(call gb_Output_announce,$(2),$(true),YAC,3)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(3)) && \
+ $(BISON) $(T_YACCFLAGS) -v --defines=$(4) -o $(5) $(1) && touch $(3) )
+
+endef
+
+# CppunitTest class
+
+ifeq ($(strip $(DEBUGCPPUNIT)),TRUE)
+ifeq ($(strip $(CPPUNITTRACE)),)
+CPPUNITTRACE := gdb --args
+endif
+ifeq ($(filter gdb,$(CPPUNITTRACE)),)
+$(error For DEBUGCPPUNIT=TRUE, CPPUNITTRACE must be a command that runs gdb)
+endif
+gb_CppunitTest_DEBUGCPPUNIT := -nx --batch --command=$(SRCDIR)/solenv/bin/gdbtrycatchtrace-stdout
+endif
+
+# ExternalProject class
+
+gb_ExternalProject_use_autoconf :=
+gb_ExternalProject_use_nmake :=
+
+# StaticLibrary class
+
+gb_StaticLibrary_get_filename = lib$(1).a
+gb_StaticLibrary_PLAINEXT := .a
+gb_StaticLibrary_StaticLibrary_platform :=
+
+gb_LinkTarget_get_linksearchpath_for_layer = \
+ -L$(WORKDIR)/LinkTarget/StaticLibrary \
+ -L$(call gb_Library_get_sdk_link_dir) \
+ $(foreach layer,\
+ $(subst +, ,$(patsubst $(1):%.,%,\
+ $(filter $(1):%.,$(gb_LinkTarget_LAYER_LINKPATHS)))),\
+ $(patsubst $(layer):%,-L%,\
+ $(filter $(layer):%,$(gb_Library_LAYER_DIRS))))
+
+
+gb_ICU_PRECOMMAND := $(call gb_Helper_extend_ld_path,$(WORKDIR_FOR_BUILD)/UnpackedTarball/icu/source/lib)
+
+# UIConfig class
+
+# macOS sort(1) cannot read a response file
+define gb_UIConfig__command
+$(call gb_Helper_abbreviate_dirs,\
+ $(SORT) -u $(UI_IMAGELISTS) /dev/null > $@ \
+)
+
+endef
+
+define gb_UIConfig__gla11y_command
+$(call gb_Helper_abbreviate_dirs,\
+ $(gb_UIConfig_LXML_PATH) $(if $(SYSTEM_LIBXML)$(SYSTEM_LIBXSLT),,$(gb_Helper_set_ld_path)) \
+ $(call gb_ExternalExecutable_get_command,python) \
+ $(gb_UIConfig_gla11y_SCRIPT) $(gb_UIConfig_gla11y_PARAMETERS) -o $@ $(UIFILES)
+)
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/com_GCC_defs.mk b/solenv/gbuild/platform/com_GCC_defs.mk
new file mode 100644
index 000000000..bdf1684eb
--- /dev/null
+++ b/solenv/gbuild/platform/com_GCC_defs.mk
@@ -0,0 +1,335 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+gb_AWK := awk
+
+gb_CLASSPATHSEP := :
+gb_LICENSE := LICENSE
+gb_README = README_$(1)
+
+# use CC/CXX if they are nondefaults
+ifneq ($(origin CC),default)
+gb_CC := $(CC)
+gb_GCCP := $(CC)
+else
+gb_CC := gcc
+gb_GCCP := gcc
+endif
+
+ifneq ($(origin CXX),default)
+gb_CXX := $(CXX)
+else
+gb_CXX := g++
+endif
+
+ifneq ($(origin AR),default)
+gb_AR := $(AR)
+else
+gb_AR := $(shell $(CC) -print-prog-name=ar)
+endif
+
+# shell setup (env.vars) for the compiler
+gb_COMPILER_SETUP :=
+
+ifeq ($(strip $(gb_COMPILEROPTFLAGS)),)
+gb_COMPILEROPTFLAGS := -O2
+endif
+
+gb_AFLAGS := $(AFLAGS)
+
+gb_COMPILERDEFS := \
+ -DBOOST_ERROR_CODE_HEADER_ONLY \
+ -DBOOST_SYSTEM_NO_DEPRECATED \
+ -DCPPU_ENV=$(CPPU_ENV) \
+ $(if $(filter EMSCRIPTEN,$(OS)),-U_FORTIFY_SOURCE) \
+
+# enable debug STL
+ifeq ($(gb_ENABLE_DBGUTIL),$(true))
+ifneq ($(HAVE_LIBSTDCPP),)
+gb_COMPILERDEFS_STDLIB_DEBUG = -D_GLIBCXX_DEBUG
+else
+ifneq ($(LIBCPP_DEBUG),)
+gb_COMPILERDEFS_STDLIB_DEBUG = $(LIBCPP_DEBUG)
+endif
+endif
+gb_COMPILERDEFS += $(gb_COMPILERDEFS_STDLIB_DEBUG)
+endif
+
+gb_CFLAGS_COMMON := \
+ -Wall \
+ -Wendif-labels \
+ -Wextra \
+ -Wstrict-prototypes \
+ -Wundef \
+ -Wunreachable-code \
+ $(if $(or $(and $(COM_IS_CLANG),$(or $(findstring icecc,$(CC)),$(findstring icecc,$(CCACHE_PREFIX)))),$(findstring sccache,$(CC))),,-Wunused-macros) \
+ $(if $(COM_IS_CLANG),-Wembedded-directive) \
+ -finput-charset=UTF-8 \
+ -fmessage-length=0 \
+ -fno-common \
+ -pipe \
+ $(if $(filter EMSCRIPTEN,$(OS)),-fno-stack-protector,-fstack-protector-strong) \
+
+gb_CXXFLAGS_COMMON := \
+ -Wall \
+ -Wno-missing-braces \
+ -Wnon-virtual-dtor \
+ -Wendif-labels \
+ -Wextra \
+ -Wundef \
+ -Wunreachable-code \
+ -Wshadow \
+ $(if $(or $(and $(COM_IS_CLANG),$(or $(findstring icecc,$(CXX)),$(findstring icecc,$(CCACHE_PREFIX)))),$(findstring sccache,$(CXX))),,-Wunused-macros) \
+ $(if $(COM_IS_CLANG),-Wembedded-directive) \
+ -finput-charset=UTF-8 \
+ -fmessage-length=0 \
+ -fno-common \
+ -pipe \
+ $(if $(filter EMSCRIPTEN,$(OS)),-fno-stack-protector,-fstack-protector-strong) \
+
+ifeq ($(HAVE_WDEPRECATED_COPY_DTOR),TRUE)
+gb_CXXFLAGS_COMMON += -Wdeprecated-copy-dtor
+endif
+
+gb_CXXFLAGS_DISABLE_WARNINGS = -w
+
+ifeq ($(HAVE_BROKEN_GCC_WMAYBE_UNINITIALIZED),TRUE)
+gb_CXXFLAGS_COMMON += -Wno-maybe-uninitialized
+endif
+
+ifeq ($(HAVE_BROKEN_GCC_WSTRINGOP_OVERFLOW),TRUE)
+gb_CXXFLAGS_COMMON += -Wno-stringop-overflow
+endif
+
+gb_CXXFLAGS_Wundef = -Wno-undef
+
+gb_CXXFLAGS_include := -include$(gb_SPACE)
+
+ifeq ($(strip $(gb_GCOV)),YES)
+gb_CFLAGS_COMMON += -fprofile-arcs -ftest-coverage
+gb_CXXFLAGS_COMMON += -fprofile-arcs -ftest-coverage
+gb_LinkTarget_LDFLAGS += -fprofile-arcs -lgcov
+gb_COMPILEROPTFLAGS := -O0
+endif
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+gb_CFLAGS_COMMON += -ffunction-sections -fdata-sections
+gb_CXXFLAGS_COMMON += -ffunction-sections -fdata-sections
+ifneq ($(OS),EMSCRIPTEN)
+gb_LinkTarget_LDFLAGS += -Wl,--gc-sections
+endif
+endif
+
+ifeq ($(COM_IS_CLANG),TRUE)
+gb_CXXFLAGS_COMMON += \
+ -Wimplicit-fallthrough \
+ -Wunused-exception-parameter \
+ -Wrange-loop-analysis
+else
+gb_CFLAGS_COMMON += \
+ -Wduplicated-cond \
+ -Wlogical-op \
+ -Wshift-overflow=2
+gb_CXXFLAGS_COMMON += \
+ -Wduplicated-cond \
+ -Wlogical-op \
+ -Wshift-overflow=2 \
+ -Wunused-const-variable=1
+endif
+
+# GCC 8 -Wcast-function-type (included in -Wextra) unhelpfully even warns on reinterpret_cast
+# between incompatible function types:
+ifeq ($(shell expr '$(GCC_VERSION)' '>=' 800),1)
+gb_CXXFLAGS_COMMON += \
+ -Wno-cast-function-type
+endif
+
+# If CC or CXX already include -fvisibility=hidden, don't duplicate it
+ifeq (,$(filter -fvisibility=hidden,$(CC)))
+gb_VISIBILITY_FLAGS := -fvisibility=hidden
+endif
+gb_VISIBILITY_FLAGS_CXX := -fvisibility-inlines-hidden
+gb_CXXFLAGS_COMMON += $(gb_VISIBILITY_FLAGS_CXX)
+
+gb_LinkTarget_LDFLAGS += $(if $(filter EMSCRIPTEN,$(OS)),-fno-stack-protector,-fstack-protector-strong)
+
+ifneq ($(gb_ENABLE_PCH),)
+ifeq ($(COM_IS_CLANG),TRUE)
+# Clang by default includes in the PCH timestamps of the files it was
+# generated from, which would make the PCH be a "new" file for ccache
+# even if the file has not actually changed. Disabling the timestamp
+# prevents this at the cost of risking using an outdated PCH (which
+# should be unlikely, given that gbuild has dependencies set up
+# for our includes and system includes are unlikely to change).
+gb_NO_PCH_TIMESTAMP := -Xclang -fno-pch-timestamp
+else
+gb_CFLAGS_COMMON += -fpch-preprocess -Winvalid-pch
+gb_CXXFLAGS_COMMON += -fpch-preprocess -Winvalid-pch
+gb_NO_PCH_TIMESTAMP :=
+endif
+endif
+
+gb_CFLAGS_WERROR = $(if $(ENABLE_WERROR),-Werror)
+
+# This is the default in non-C++11 mode
+ifeq ($(COM_IS_CLANG),TRUE)
+gb_CXX03FLAGS := -std=gnu++98 -Werror=c++11-extensions -Wno-c++11-long-long \
+ -Wno-deprecated-declarations
+else
+gb_CXX03FLAGS := -std=gnu++98 -Wno-long-long \
+ -Wno-variadic-macros -Wno-non-virtual-dtor -Wno-deprecated-declarations
+endif
+
+# On Windows MSVC only supports C90 so force gnu89 (especially in clang) to
+# to catch potential gnu89/C90 incompatibilities locally.
+gb_CFLAGS_COMMON += -std=gnu89
+
+ifeq ($(ENABLE_LTO),TRUE)
+ifeq ($(COM_IS_CLANG),TRUE)
+gb_LTOFLAGS := -flto=thin
+ifeq (,$(index,iOS MACOSX,$(OS)))
+gb_LTOPLUGINFLAGS := --plugin $(if $(LD_PLUGIN),$(LD_PLUGIN),LLVMgold.so)
+endif
+else
+# use parallelism based on make's job handling
+gb_LTOFLAGS := -flto=jobserver -fuse-linker-plugin -O2
+# clang does not support -flto=<number>
+gb_CLANG_LTOFLAGS := -flto=thin
+endif
+endif
+
+gb_LinkTarget_EXCEPTIONFLAGS := \
+ -DEXCEPTIONS_ON \
+ -fexceptions
+
+ifeq ($(gb_ENABLE_DBGUTIL),$(false))
+# Clang doesn't have this option
+ifeq ($(HAVE_GCC_FNO_ENFORCE_EH_SPECS),TRUE)
+gb_LinkTarget_EXCEPTIONFLAGS += \
+ -fno-enforce-eh-specs
+gb_FilterOutClangCFLAGS += -fno-enforce-eh-specs
+endif
+endif
+
+gb_PrecompiledHeader_EXCEPTIONFLAGS := $(gb_LinkTarget_EXCEPTIONFLAGS)
+
+# We turn on and off this one depending on whether icecream and/or ccache are used,
+# and changing cxxflags cause PCH rebuilds, so e.g. a plain temporary 'CCACHE_DISABLE=1'
+# would cause a rebuild. Ignore the flag there, it's irrelevant for PCH use anyway.
+gb_PrecompiledHeader_ignore_flags_for_flags_file := -Wunused-macros
+
+# optimization level
+gb_COMPILERNOOPTFLAGS := -O0 -fstrict-aliasing -fstrict-overflow
+gb_COMPILERDEBUGOPTFLAGS := -Og
+
+ifeq ($(OS),ANDROID)
+gb_DEBUGINFO_FLAGS=-glldb
+# Clang does not know -ggdb2 or some other options
+else ifeq ($(HAVE_GCC_GGDB2),TRUE)
+gb_DEBUGINFO_FLAGS=-ggdb2
+else
+gb_DEBUGINFO_FLAGS=-g2
+endif
+gb_LINKER_DEBUGINFO_FLAGS=
+
+ifeq ($(HAVE_EXTERNAL_DWARF),TRUE)
+gb_DEBUGINFO_FLAGS+=-gsplit-dwarf
+# GCC 11 defaults to -gdwarf-5, which GDB 10 doesn't support in split debug info
+ifeq ($(COM_IS_CLANG),)
+gb_DEBUGINFO_FLAGS+=-gdwarf-4
+endif
+endif
+
+ifeq ($(HAVE_CLANG_DEBUG_INFO_KIND_CONSTRUCTOR),TRUE)
+gb_DEBUGINFO_FLAGS+=-Xclang -debug-info-kind=constructor
+endif
+
+ifeq ($(ENABLE_GDB_INDEX),TRUE)
+gb_LINKER_DEBUGINFO_FLAGS += -Wl,--gdb-index
+gb_DEBUGINFO_FLAGS += -ggnu-pubnames
+endif
+
+gb_LinkTarget_INCLUDE :=\
+ $(SOLARINC) \
+ -I$(BUILDDIR)/config_$(gb_Side) \
+
+ifeq ($(COM_IS_CLANG),TRUE)
+gb_COMPILER_TEST_FLAGS := -Xclang -plugin-arg-loplugin -Xclang --unit-test-mode
+ifeq ($(COMPILER_PLUGIN_TOOL),)
+gb_COMPILER_PLUGINS := -Xclang -load -Xclang $(BUILDDIR)/compilerplugins/clang/plugin.so -Xclang -add-plugin -Xclang loplugin
+ifneq ($(COMPILER_PLUGIN_WARNINGS_ONLY),)
+gb_COMPILER_PLUGINS += -Xclang -plugin-arg-loplugin -Xclang \
+ --warnings-only='$(COMPILER_PLUGIN_WARNINGS_ONLY)'
+endif
+else
+gb_COMPILER_PLUGINS := -Xclang -load -Xclang $(BUILDDIR)/compilerplugins/clang/plugin.so -Xclang -plugin -Xclang loplugin $(foreach plugin,$(COMPILER_PLUGIN_TOOL), -Xclang -plugin-arg-loplugin -Xclang $(plugin))
+ifneq ($(UPDATE_FILES),)
+gb_COMPILER_PLUGINS += -Xclang -plugin-arg-loplugin -Xclang --scope=$(UPDATE_FILES)
+endif
+endif
+ifeq ($(COMPILER_PLUGINS_DEBUG),TRUE)
+gb_COMPILER_PLUGINS += -Xclang -plugin-arg-loplugin -Xclang --debug
+endif
+# set CCACHE_CPP2=1 to prevent clang generating spurious warnings
+gb_COMPILER_SETUP += CCACHE_CPP2=1
+gb_COMPILER_PLUGINS_SETUP := ICECC_EXTRAFILES=$(SRCDIR)/include/sal/log-areas.dox CCACHE_EXTRAFILES=$(SRCDIR)/include/sal/log-areas.dox SCCACHE_EXTRAFILES=$(SRCDIR)/include/sal/log-areas.dox
+gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS := \
+ -Xclang -plugin-arg-loplugin -Xclang --warnings-as-errors
+else
+# Set CCACHE_CPP2 to prevent GCC -Werror=implicit-fallthrough= when ccache strips comments from C
+# code (which still needs /*fallthrough*/-style comments to silence that warning):
+ifeq ($(ENABLE_WERROR),TRUE)
+gb_COMPILER_SETUP += CCACHE_CPP2=1
+endif
+gb_COMPILER_TEST_FLAGS :=
+gb_COMPILER_PLUGINS :=
+gb_COMPILER_PLUGINS_SETUP :=
+gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS :=
+endif
+
+# Executable class
+
+gb_Executable_EXT_for_build :=
+
+# Helper class
+
+ifeq ($(OS_FOR_BUILD),MACOSX)
+gb_Helper_LIBRARY_PATH_VAR := DYLD_LIBRARY_PATH
+else ifeq ($(OS_FOR_BUILD),AIX)
+gb_Helper_LIBRARY_PATH_VAR := LIBPATH
+else ifeq ($(OS_FOR_BUILD),WNT)
+# In theory possible if cross-compiling to some Unix from Windows,
+# in practice strongly discouraged to even try that
+gb_Helper_LIBRARY_PATH_VAR := PATH
+else ifeq ($(OS_FOR_BUILD),HAIKU)
+gb_Helper_LIBRARY_PATH_VAR := LIBRARY_PATH
+else
+gb_Helper_LIBRARY_PATH_VAR := LD_LIBRARY_PATH
+endif
+
+gb_Helper_set_ld_path := $(gb_Helper_LIBRARY_PATH_VAR)=$${$(gb_Helper_LIBRARY_PATH_VAR):+$$$(gb_Helper_LIBRARY_PATH_VAR):}"$(INSTROOT_FOR_BUILD)/$(LIBO_URE_LIB_FOLDER_FOR_BUILD):$(INSTROOT_FOR_BUILD)/$(LIBO_LIB_FOLDER_FOR_BUILD)"
+
+# $(1): list of : separated directory pathnames to append to the ld path
+define gb_Helper_extend_ld_path
+$(gb_Helper_set_ld_path):$(1)
+endef
+
+# Convert path to file URL.
+define gb_Helper_make_url
+file://$(strip $(1))
+endef
+
+gb_Helper_get_rcfile = $(1)rc
+
+ifneq ($(gb_ENABLE_PCH),)
+# Enable use of .sum files for PCHs.
+gb_COMPILER_SETUP += CCACHE_PCH_EXTSUM=1
+endif
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/com_MSC_class.mk b/solenv/gbuild/platform/com_MSC_class.mk
new file mode 100644
index 000000000..06d21ecd4
--- /dev/null
+++ b/solenv/gbuild/platform/com_MSC_class.mk
@@ -0,0 +1,742 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# Convert path to file URL.
+define gb_Helper_make_url
+file:///$(strip $(1))
+endef
+
+# YaccTarget class
+
+define gb_YaccTarget__command
+$(call gb_Output_announce,$(2),$(true),YAC,3)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(3)) && \
+ $(BISON) $(T_YACCFLAGS) --defines=$(4) -o $(5) $(1) && touch $(3) )
+
+endef
+
+# CObject class
+
+# $(call gb_CObject__compiler,flags,source,compiler)
+define gb_CObject__compiler
+ $(if $(filter YES,$(LIBRARY_X64)), $(CXX_X64_BINARY), \
+ $(if $(filter YES,$(PE_X86)), $(CXX_X86_BINARY), \
+ $(if $(filter %.c,$(2)), \
+ $(if $(3), $(3), $(gb_CC)), \
+ $(if $(filter -clr,$(1)), \
+ $(MSVC_CXX) -I$(SRCDIR)/solenv/clang-cl, \
+ $(if $(3), $(3), $(gb_CXX))))))
+endef
+
+# Avoid annoying warning D9025 about overriding command-line arguments.
+gb_Helper_remove_overridden_flags = \
+ $(filter-out -W4 -w -arch:SSE -arch:SSE2 -arch:AVX -arch:AVX2 -Od -O2 -Zc:inline -Zc:inline- \
+ -Zc:dllexportInlines -Zc:dllexportInlines- -EHs -EHa -DNOMINMAX -UNOMINMAX -D_X86_=1 -U_X86_ \
+ -D_AMD64_=1 -U_AMD64_,$(1)) \
+ $(lastword $(filter -W4 -w,$(1))) \
+ $(lastword $(filter -Od -O2,$(1))) \
+ $(lastword $(filter -arch:SSE -arch:SSE2 -arch:AVX -arch:AVX2,$(1))) \
+ $(lastword $(filter -EHs -EHa,$(1))) \
+ $(lastword $(filter -DNOMINMAX -UNOMINMAX,$(1))) \
+ $(lastword $(filter -D_X86_=1 -U_X86_,$(1))) \
+ $(lastword $(filter -D_AMD64_=1 -U_AMD64_,$(1))) \
+ $(lastword $(filter -Zc:inline -Zc:inline-,$(1))) \
+ $(lastword $(filter -Zc:dllexportInlines -Zc:dllexportInlines-,$(1)))
+
+# $(call gb_CObject__command_pattern,object,flags,source,dep-file,compiler-plugins,compiler)
+define gb_CObject__command_pattern
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) $(dir $(4)) && \
+ unset INCLUDE && \
+ $(if $(and $(gb_COMPILERDEPFLAGS),$(T_USE_CLANG)), export SHOWINCLUDES_PREFIX="${LO_CLANG_SHOWINCLUDES_PREFIX}" &&) \
+ $(gb_COMPILER_SETUP) \
+ $(call gb_CObject__compiler,$(2),$(3),$(6)) \
+ $(call gb_Helper_remove_overridden_flags, \
+ $(DEFS) \
+ $(if $(filter YES,$(LIBRARY_X64)), ,$(gb_LTOFLAGS)) \
+ $(2) $(if $(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS)) \
+ $(if $(EXTERNAL_CODE), \
+ $(if $(filter -clr,$(2)),,$(if $(COM_IS_CLANG),-Wno-undef)), \
+ $(gb_DEFS_INTERNAL)) \
+ $(if $(WARNINGS_NOT_ERRORS),$(if $(ENABLE_WERROR),$(if $(PLUGIN_WARNINGS_AS_ERRORS),$(gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS))),$(gb_CFLAGS_WERROR)) \
+ $(if $(filter -clr,$(2)),,$(if $(5),$(gb_COMPILER_PLUGINS))) \
+ $(if $(COMPILER_TEST),-fsyntax-only -ferror-limit=0 -Xclang -verify) \
+ $(PCHFLAGS) \
+ $(if $(COMPILER_TEST),,$(gb_COMPILERDEPFLAGS)) \
+ $(if $(filter YES,$(LIBRARY_X64)), -U_X86_ -D_AMD64_,) \
+ $(if $(filter YES,$(PE_X86)), -D_X86_ -U_AMD64_,)) \
+ $(INCLUDE) \
+ -Fd$(PDBFILE) \
+ -c $(3) \
+ -Fo$(1)) \
+ $(if $(COMPILER_TEST),,$(call gb_create_deps,$(4),$(1),$(3)))
+endef
+
+# PrecompiledHeader class
+
+gb_PrecompiledHeader_get_enableflags = \
+ -Yu$(SRCDIR)/$(3).hxx \
+ -FI$(SRCDIR)/$(3).hxx \
+ -Fp$(call gb_PrecompiledHeader_get_target,$(1),$(2)) \
+ $(gb_PCHWARNINGS)
+
+gb_PrecompiledHeader_EXT := .pch
+
+# MSVC PCH needs extra .obj created during the creation of the PCH file
+gb_PrecompiledHeader_get_objectfile = $(1).obj
+
+# $(call gb_PrecompiledHeader__command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename,compiler)
+define gb_PrecompiledHeader__command
+$(call gb_Output_announce,$(2),$(true),PCH,1)
+ $(call gb_Trace_StartRange,$(2),PCH)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) $(dir $(call gb_PrecompiledHeader_get_dep_target,$(2),$(6))) && \
+ unset INCLUDE && \
+ $(if $(and $(gb_COMPILERDEPFLAGS),$(T_USE_CLANG)), export SHOWINCLUDES_PREFIX="${LO_CLANG_SHOWINCLUDES_PREFIX}" &&) \
+ CCACHE_DISABLE=1 $(gb_COMPILER_SETUP) \
+ $(call gb_CObject__compiler,$(4),$(3),$(7)) \
+ $(call gb_Helper_remove_overridden_flags, \
+ $(4) $(if $(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS))) \
+ -Fd$(PDBFILE) \
+ $(if $(EXTERNAL_CODE),$(if $(COM_IS_CLANG),-Wno-undef),$(gb_DEFS_INTERNAL)) \
+ $(if $(filter YES,$(LIBRARY_X64)), ,$(gb_LTOFLAGS)) \
+ $(gb_COMPILERDEPFLAGS) \
+ $(gb_NO_PCH_TIMESTAMP) \
+ $(5) \
+ -c $(3) \
+ -Yc$(notdir $(patsubst %.cxx,%.hxx,$(3))) -I$(dir $(patsubst %.cxx,%.hxx,$(3))) -Fp$(1) -Fo$(1).obj) \
+ $(call gb_create_deps,$(call gb_PrecompiledHeader_get_dep_target_tmp,$(2),$(6)),$(1),$(3))
+ $(call gb_Trace_EndRange,$(2),PCH)
+endef
+
+ifeq ($(COM_IS_CLANG),TRUE)
+# Clang has -fno-pch-timestamp, just checksum the file for CCACHE_PCH_EXTSUM
+# $(call gb_PrecompiledHeader__sum_command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename,compiler)
+define gb_PrecompiledHeader__sum_command
+ $(SHA256SUM) $(1) >$(1).sum
+endef
+else
+# MSVC does not generate the same .pch for the same input, so checksum the (preprocessed) input
+# $(call gb_PrecompiledHeader__sum_command,pchfile,pchtarget,source,cxxflags,includes,linktargetmakefilename,compiler)
+define gb_PrecompiledHeader__sum_command
+$(call gb_Helper_abbreviate_dirs,\
+ unset INCLUDE && \
+ CCACHE_DISABLE=1 $(gb_COMPILER_SETUP) \
+ $(call gb_CObject__compiler,$(4),$(3),$(7)) \
+ $(call gb_Helper_remove_overridden_flags, \
+ $(4)$(if $(WARNINGS_DISABLED),$(gb_CXXFLAGS_DISABLE_WARNINGS))) \
+ $(if $(EXTERNAL_CODE),$(if $(COM_IS_CLANG),-Wno-undef),$(gb_DEFS_INTERNAL)) \
+ $(gb_LTOFLAGS) \
+ $(5) \
+ -E $(3) \
+ 2>&1 | $(SHA256SUM) >$(1).sum \
+ )
+endef
+endif
+
+# When building a PCH, MSVC also creates a .pdb file with debug info. So for reuse
+# add the .pdb to the PCH's files and then use the .pdb also for linktargets that reuse the PCH.
+# call gb_PrecompiledHeader__create_reuse_files,linktarget,pchtarget,linktargetmakefilename
+define gb_PrecompiledHeader__create_reuse_files
+rm -f $(call gb_PrecompiledHeader_get_target,$(2),$(3)).pdb; \
+if test -f $(call gb_LinkTarget_get_pdbfile_in,$(1)); then \
+ cp $(call gb_LinkTarget_get_pdbfile_in,$(1)) $(call gb_PrecompiledHeader_get_target,$(2),$(3)).pdb; \
+fi
+endef
+
+# call gb_PrecompiledHeader__copy_reuse_files,linktarget,pchtarget,linktargetmakefilename
+define gb_PrecompiledHeader__copy_reuse_files
+rm -f $(call gb_LinkTarget_get_pdbfile_in,$(1)); \
+if test -f $(call gb_PrecompiledHeader_get_target,$(2),$(3)).pdb; then \
+ cp $(call gb_PrecompiledHeader_get_target,$(2),$(3)).pdb $(call gb_LinkTarget_get_pdbfile_in,$(1)); \
+fi
+endef
+
+# AsmObject class
+ifeq ($(CPUNAME),AARCH64)
+gb_AsmObject_get_source = $(1)/$(2).S
+
+# Code needs a preprocessor step .S -> .asm -> .o
+define gb_AsmObject__command
+$(call gb_Output_announce,$(2),$(true),ASM,3)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) $(dir $(4)) && \
+ "$(CC)" -nologo -EP -D_M_ARM64 $(SOLARINC) $(3) > $(subst .o,.asm,$(1)) && \
+ "$(ML_EXE)" $(gb_AFLAGS) -g -errorReport:prompt -o $(1) $(subst .o,.asm,$(1)), \
+ ) && \
+ echo "$(1) : $(3)" > $(4)
+endef
+
+else # !AARCH64
+gb_AsmObject_get_source = $(1)/$(2).asm
+
+define gb_AsmObject__command
+$(call gb_Output_announce,$(2),$(true),ASM,3)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) $(dir $(4)) && \
+ "$(ML_EXE)" \
+ $(if $(filter X86_64,$(CPUNAME)),, /safeseh) \
+ /c /Cp $(gb_AFLAGS) -D$(COM) /Fo$(1) $(3)) && \
+ echo "$(1) : $(3)" > $(4)
+endef
+
+endif
+
+# LinkTarget class
+
+gb_LinkTarget_CFLAGS := $(gb_CFLAGS)
+gb_LinkTarget_CXXFLAGS := $(gb_CXXFLAGS)
+gb_LinkTarget_CXXCLRFLAGS := $(gb_CXXCLRFLAGS)
+
+gb_LinkTarget_INCLUDE :=\
+ $(SOLARINC) \
+ $(foreach inc,$(subst ;, ,$(JDKINC)),-I$(inc)) \
+ -I$(BUILDDIR)/config_$(gb_Side) \
+
+# We must name the .pdb like libname.pdb, not libname.\(dll\|exe\|pyd\).pdb,
+# otherwise WinDbg does not find it.
+define gb_LinkTarget__get_pdb_filename
+$(patsubst %.dll,%.pdb,$(patsubst %.exe,%.pdb,$(patsubst %.bin,%.bin.pdb,$(patsubst %.pyd,%.pdb,$(1)))))
+endef
+
+gb_LinkTarget_get_pdbfile_in = \
+ $(WORKDIR)/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1)).objects.pdb
+
+gb_LinkTarget_get_pdbfile_out = \
+ $(call gb_LinkTarget__get_pdb_filename,$(WORKDIR)/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1)))
+
+gb_LinkTarget_get_ilkfile = \
+ $(WORKDIR)/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1)).ilk
+
+gb_LinkTarget_get_manifestfile = \
+ $(WORKDIR)/LinkTarget/$(call gb_LinkTarget__get_workdir_linktargetname,$(1)).manifest
+
+gb_LinkTarget_get_linksearchpath_for_layer = \
+ -LIBPATH:$(WORKDIR)/LinkTarget/StaticLibrary \
+ -LIBPATH:$(INSTDIR)/$(SDKDIRNAME)/lib \
+ $(if $(filter OXT,$(1)),\
+ -LIBPATH:$(WORKDIR)/LinkTarget/ExtensionLibrary, \
+ -LIBPATH:$(WORKDIR)/LinkTarget/Library)
+
+# avoid fatal error LNK1170 for Library_merged
+define gb_LinkTarget_MergedResponseFile
+cat $${RESPONSEFILE} | sed 's/ /\n/g' | grep -v '^$$' > $${RESPONSEFILE}.1 && \
+mv $${RESPONSEFILE}.1 $${RESPONSEFILE} &&
+endef
+
+gb_MSC_SUBSYSTEM_VERSION=$(COMMA)$(if $(filter AARCH64,$(CPUNAME)),6.02,6.01)
+
+# the sort on the libraries is used to filter out duplicates to keep commandline
+# length in check - otherwise the dupes easily hit the limit when linking mergedlib
+define gb_LinkTarget__command
+$(call gb_Output_announce,$(2),$(true),LNK,4)
+ $(call gb_Trace_StartRange,$(2),LNK)
+$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(1) && \
+ RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),100, \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(CXXCLROBJECTS),$(call gb_CxxClrObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXCLROBJECTS),$(call gb_GenCxxClrObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),$(shell cat $(extraobjectlist))) \
+ $(PCHOBJS) $(NATIVERES)) && \
+ $(if $(filter $(call gb_Library__get_workdir_linktargetname,merged),$(2)),$(call gb_LinkTarget_MergedResponseFile)) \
+ unset INCLUDE && \
+ $(gb_LINK) \
+ $(if $(filter Library CppunitTest,$(TARGETTYPE)),$(gb_Library_TARGETTYPEFLAGS)) \
+ $(if $(filter StaticLibrary,$(TARGETTYPE)),-LIB) \
+ $(if $(filter Executable,$(TARGETTYPE)),$(gb_Executable_TARGETTYPEFLAGS)) \
+ $(if $(T_SYMBOLS),$(if $(filter Executable Library CppunitTest,$(TARGETTYPE)),$(gb_Windows_PE_TARGETTYPEFLAGS_DEBUGINFO)),) \
+ $(if $(filter YES,$(TARGETGUI)), -SUBSYSTEM:WINDOWS$(gb_MSC_SUBSYSTEM_VERSION), -SUBSYSTEM:CONSOLE$(gb_MSC_SUBSYSTEM_VERSION)) \
+ $(if $(filter YES,$(LIBRARY_X64)), -MACHINE:X64) \
+ $(if $(filter YES,$(PE_X86)), -MACHINE:X86) \
+ $(if $(filter YES,$(LIBRARY_X64)), \
+ -LIBPATH:$(COMPATH)/lib/x64 \
+ -LIBPATH:$(WINDOWS_SDK_HOME)/lib/x64 \
+ -LIBPATH:$(UCRTSDKDIR)lib/$(UCRTVERSION)/ucrt/x64 \
+ $(if $(filter 80 81 10,$(WINDOWS_SDK_VERSION)),-LIBPATH:$(WINDOWS_SDK_HOME)/lib/$(WINDOWS_SDK_LIB_SUBDIR)/um/x64)) \
+ $(if $(filter YES,$(PE_X86)), \
+ -LIBPATH:$(COMPATH)/lib/x86 \
+ -LIBPATH:$(WINDOWS_SDK_HOME)/lib/x86 \
+ -LIBPATH:$(UCRTSDKDIR)lib/$(UCRTVERSION)/ucrt/x86 \
+ $(if $(filter 80 81 10,$(WINDOWS_SDK_VERSION)),-LIBPATH:$(WINDOWS_SDK_HOME)/lib/$(WINDOWS_SDK_LIB_SUBDIR)/um/x86)) \
+ $(T_USE_LD) $(T_LDFLAGS) \
+ $(if $(filter Library CppunitTest Executable,$(TARGETTYPE)),/NATVIS:$(SRCDIR)/solenv/vs/LibreOffice.natvis) \
+ @$${RESPONSEFILE} \
+ $(foreach lib,$(sort $(LINKED_LIBS)),$(call gb_Library_get_ilibfilename,$(lib))) \
+ $(foreach lib,$(sort $(LINKED_STATIC_LIBS)),$(call gb_StaticLibrary_get_filename,$(lib))) \
+ $(if $(filter-out StaticLibrary,$(TARGETTYPE)),\
+ $(sort $(T_LIBS)) user32.lib \
+ -manifestfile:$(WORKDIR)/LinkTarget/$(2).manifest \
+ -pdb:$(call gb_LinkTarget__get_pdb_filename,$(WORKDIR)/LinkTarget/$(2))) \
+ $(if $(ILIBTARGET),-out:$(1) -implib:$(ILIBTARGET),-out:$(1)) \
+ | LC_ALL=C $(GBUILDDIR)/platform/filter-creatingLibrary.awk; RC=$${PIPESTATUS[0]}; rm $${RESPONSEFILE} \
+ $(if $(filter Library,$(TARGETTYPE)),; if [ ! -f $(ILIBTARGET) ]; then rm -f $(1); exit 42; fi) \
+ $(if $(filter Library,$(TARGETTYPE)),&& if [ -f $(WORKDIR)/LinkTarget/$(2).manifest ]; then mt.exe $(MTFLAGS) -nologo -manifest $(WORKDIR)/LinkTarget/$(2).manifest $(SRCDIR)/solenv/gbuild/platform/win_compatibility.manifest -outputresource:$(1)\;2 && touch -r $(1) $(WORKDIR)/LinkTarget/$(2).manifest $(ILIBTARGET); fi) \
+ $(if $(filter Executable,$(TARGETTYPE)),&& if [ -f $(WORKDIR)/LinkTarget/$(2).manifest ]; then mt.exe $(MTFLAGS) -nologo -manifest $(WORKDIR)/LinkTarget/$(2).manifest $(SRCDIR)/solenv/gbuild/platform/win_compatibility.manifest -outputresource:$(1)\;1 && touch -r $(1) $(WORKDIR)/LinkTarget/$(2).manifest; fi) \
+ $(if $(filter Executable,$(TARGETTYPE)),&& mt.exe $(MTFLAGS) -nologo -manifest $(SRCDIR)/solenv/gbuild/platform/DeclareDPIAware.manifest -updateresource:$(1)\;1 ) \
+ $(if $(filter Library,$(TARGETTYPE)),&& \
+ echo $(notdir $(1)) > $(WORKDIR)/LinkTarget/$(2).exports.tmp && \
+ $(gb_DUMPBIN) \
+ -exports $(ILIBTARGET) \
+ >> $(WORKDIR)/LinkTarget/$(2).exports.tmp && \
+ $(call gb_Helper_replace_if_different_and_touch,$(WORKDIR)/LinkTarget/$(2).exports.tmp,$(WORKDIR)/LinkTarget/$(2).exports,$(1))) \
+ ; \
+ $(call gb_Trace_EndRange,$(2),LNK) $(if $(gb_TRACE),;) \
+ exit $$RC)
+endef
+
+define gb_MSVCRT_subst
+$(if $(MSVC_USE_DEBUG_RUNTIME),$(subst msvcrt,msvcrtd,$(subst msvcprt,msvcprtd,$(subst libcmt,libcmtd,$(subst libvcruntime,libvcruntimed,$(subst libucrt,libucrtd,$(subst libcpmt,libcpmtd,$(subst msvcmrt,msvcmrtd,$(1)))))))),$(1))
+endef
+
+define gb_LinkTarget_use_system_win32_libs
+$(call gb_LinkTarget_add_libs,$(1),$(foreach lib,$(2),$(call gb_MSVCRT_subst,$(lib)).lib))
+$(if $(call gb_LinkTarget__is_merged,$(1)),\
+ $(call gb_LinkTarget_add_libs,$(call gb_Library_get_linktarget,merged),$(foreach lib,$(2),$(call gb_MSVCRT_subst,$(lib)).lib)))
+endef
+
+# Flags common for PE executables (EXEs and DLLs).
+# Enable incremental only when debugging to speed up relinking.
+gb_Windows_PE_TARGETTYPEFLAGS := \
+ -release \
+ -opt:noref \
+ $(if $(filter 0,$(gb_DEBUGLEVEL)), -incremental:no) \
+ $(if $(filter NO,$(LIBRARY_X64)), -safeseh) \
+ -nxcompat \
+ -dynamicbase \
+ -manifest
+
+# link.exe in -LIB mode doesn't understand -debug, use it only for EXEs and DLLs
+ifeq ($(gb_ENABLE_DBGUTIL),$(true))
+# fastlink is faster but pdb files reference .obj files
+gb_Windows_PE_TARGETTYPEFLAGS_DEBUGINFO := -debug:fastlink
+else
+gb_Windows_PE_TARGETTYPEFLAGS_DEBUGINFO := -debug
+endif
+
+ifeq ($(ENABLE_LTO),TRUE)
+gb_Windows_PE_TARGETTYPEFLAGS += -LTCG
+endif
+
+# Library class
+
+
+gb_Library_DEFS := -D_DLL
+gb_Library_TARGETTYPEFLAGS := \
+ -DLL \
+ $(gb_Windows_PE_TARGETTYPEFLAGS)
+
+gb_Library_get_rpath :=
+
+gb_Library_SYSPRE := i
+gb_Library_PLAINEXT := .lib
+gb_Library_PLAINEXT_FOR_BUILD := .lib
+
+gb_Library_LAYER := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):NONE) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):OXT) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):OXT) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_SHLXTHDL),$(lib):SHLXTHDL) \
+
+gb_Library_ILIBFILENAMES :=\
+ $(foreach lib,$(gb_Library_KNOWNLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+
+gb_Library_DLLEXT := .dll
+gb_Library_UDK_MAJORVER := 3
+gb_Library_RTEXT := MSC$(gb_Library_DLLEXT)
+gb_Library_OOOEXT := $(gb_Library_DLLPOSTFIX)$(gb_Library_DLLEXT)
+gb_Library_UNOEXT := .uno$(gb_Library_DLLEXT)
+gb_Library_UNOVEREXT := $(gb_Library_UDK_MAJORVER)$(gb_Library_DLLEXT)
+gb_Library_RTVEREXT := $(gb_Library_UDK_MAJORVER)$(gb_Library_RTEXT)
+
+gb_Library_FILENAMES :=\
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):$(lib)$(gb_Library_DLLEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):$(lib)$(gb_Library_DLLEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):$(lib)$(gb_Library_DLLEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):$(lib)$(gb_Library_DLLEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_SHLXTHDL),$(lib):$(lib)$(gb_Library_DLLEXT)) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):$(lib)$(gb_Library_RTVEREXT)) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(lib)$(gb_Library_UNOVEREXT)) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):$(lib)$(gb_Library_UNOEXT)) \
+
+# An assembly is a special kind of library for CLI
+define gb_Library_Assembly
+$(call gb_Library_Library,$(1))
+$(call gb_Library_get_linktarget_target,$(1)) : NATIVERES :=
+
+endef
+
+define gb_Library_Library_platform
+$(call gb_LinkTarget_set_ilibtarget,$(2),$(3))
+
+$(call gb_LinkTarget_add_auxtargets,$(2),\
+ $(patsubst %.lib,%.exp,$(3)) \
+ $(call gb_LinkTarget_get_manifestfile,$(2)) \
+ $(call gb_LinkTarget_get_pdbfile_in,$(2)) \
+ $(call gb_LinkTarget_get_pdbfile_out,$(2)) \
+ $(call gb_LinkTarget_get_ilkfile,$(2)) \
+)
+
+$(call gb_Library_add_default_nativeres,$(1),$(1)/default)
+
+$(call gb_LinkTarget_get_target,$(2)) \
+$(call gb_LinkTarget_get_headers_target,$(2)) : PDBFILE = $(call gb_LinkTarget_get_pdbfile_in,$(2))
+
+endef
+
+define gb_Library_add_default_nativeres
+$(call gb_WinResTarget_WinResTarget_init,$(2))
+$(call gb_WinResTarget_set_rcfile,$(2),include/default)
+$(call gb_WinResTarget_add_defs,$(2),\
+ -DVERVARIANT="$(LIBO_VERSION_PATCH)" \
+ -DRES_APP_VENDOR="$(OOO_VENDOR)" \
+ -DORG_NAME="$(call gb_Library_get_filename,$(1))"\
+ -DINTERNAL_NAME="$(subst $(gb_Library_DLLEXT),,$(call gb_Library_get_filename,$(1)))" \
+ -DADDITIONAL_VERINFO1="" \
+ -DADDITIONAL_VERINFO2="" \
+ -DADDITIONAL_VERINFO3="" \
+)
+$(call gb_Library_add_nativeres,$(1),$(2))
+$(call gb_Library_get_clean_target,$(1)) : $(call gb_WinResTarget_get_clean_target,$(2))
+
+endef
+
+define gb_Executable_add_default_nativeres
+$(call gb_WinResTarget_WinResTarget_init,$(1)/default)
+$(call gb_WinResTarget_set_rcfile,$(1)/default,include/default)
+$(call gb_WinResTarget_add_defs,$(1)/default,\
+ -DVERVARIANT="$(LIBO_VERSION_PATCH)" \
+ -DRES_APP_VENDOR="$(OOO_VENDOR)" \
+ -DORG_NAME="$(call gb_Executable_get_filename,$(1))"\
+ -DINTERNAL_NAME="$(subst $(gb_Executable_EXT),,$(call gb_Executable_get_filename,$(1)))" \
+ -DADDITIONAL_VERINFO1="$(if $(2),VALUE \"FileDescription\"$(COMMA) \"$(2)\\0\")" \
+ -DADDITIONAL_VERINFO2="" \
+ -DADDITIONAL_VERINFO3="" \
+)
+$(call gb_Executable_add_nativeres,$(1),$(1)/default)
+$(call gb_Executable_get_clean_target,$(1)) : $(call gb_WinResTarget_get_clean_target,$(1)/default)
+
+endef
+
+define gb_LinkTarget_add_nativeres
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_WinResTarget_get_target,$(2))
+$(call gb_LinkTarget_get_target,$(1)) : NATIVERES += $(call gb_WinResTarget_get_target,$(2))
+
+endef
+
+define gb_LinkTarget_set_nativeres
+$(call gb_LinkTarget_get_target,$(1)) : $(call gb_WinResTarget_get_target,$(2))
+$(call gb_LinkTarget_get_target,$(1)) : NATIVERES := $(call gb_WinResTarget_get_target,$(2))
+
+endef
+
+define gb_Library_get_ilibfilename
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_Library_ILIBFILENAMES)))
+endef
+
+gb_Library_get_sdk_link_dir = $(INSTDIR)/$(SDKDIRNAME)/lib
+
+gb_Library_get_sdk_link_lib = $(gb_Library_get_ilib_target)
+
+# StaticLibrary class
+
+gb_StaticLibrary_get_filename = $(1).lib
+gb_StaticLibrary_PLAINEXT := .lib
+
+define gb_StaticLibrary_StaticLibrary_platform
+$(call gb_LinkTarget_get_target,$(2)) \
+$(call gb_LinkTarget_get_headers_target,$(2)) : PDBFILE = $(call gb_LinkTarget_get_pdbfile_in,$(2))
+
+$(call gb_LinkTarget_add_auxtargets,$(2),\
+ $(call gb_LinkTarget_get_pdbfile_in,$(2)) \
+)
+
+endef
+
+# Executable class
+
+gb_Executable_EXT := .exe
+gb_Executable_EXT_for_build := .exe
+gb_Executable_TARGETTYPEFLAGS := $(gb_Windows_PE_TARGETTYPEFLAGS)
+
+gb_Executable_get_rpath :=
+
+# surprisingly some executables have exports so link.exe creates import lib
+define gb_Executable_Executable_platform
+$(call gb_LinkTarget_set_ilibtarget,$(2),$(3))
+
+$(call gb_LinkTarget_add_auxtargets,$(2),\
+ $(patsubst %.lib,%.exp,$(3)) \
+ $(call gb_LinkTarget_get_pdbfile_out,$(2)) \
+ $(call gb_LinkTarget_get_pdbfile_in,$(2)) \
+ $(call gb_LinkTarget_get_manifestfile,$(2)) \
+)
+
+$(call gb_LinkTarget_get_target,$(2)) \
+$(call gb_LinkTarget_get_headers_target,$(2)) : PDBFILE := $(call gb_LinkTarget_get_pdbfile_in,$(2))
+
+endef
+
+# CppunitTest class
+
+gb_CppunitTest_UNITTESTFAILED := $(GBUILDDIR)/platform/unittest-failed-WNT.sh
+gb_CppunitTest_PYTHONDEPS := $(call gb_Package_get_target,python3)
+gb_CppunitTest_DEFS := -D_DLL
+gb_CppunitTest_CPPTESTPRECOMMAND := $(call gb_Helper_prepend_ld_path,$(shell cygpath -u $(gb_Library_DLLDIR)):$(shell cygpath -u $(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/$(if $(MSVC_USE_DEBUG_RUNTIME),DebugDll,ReleaseDll)))
+gb_CppunitTest_get_filename = test_$(1).dll
+gb_CppunitTest_get_ilibfilename = itest_$(1).lib
+
+define gb_CppunitTest_CppunitTest_platform
+$(call gb_LinkTarget_set_ilibtarget,$(2),$(3))
+
+$(call gb_LinkTarget_add_auxtargets,$(2),\
+ $(patsubst %.lib,%.exp,$(3)) \
+ $(3) \
+ $(call gb_LinkTarget_get_manifestfile,$(2)) \
+ $(call gb_LinkTarget_get_pdbfile_out,$(2)) \
+ $(call gb_LinkTarget_get_pdbfile_in,$(2)) \
+ $(call gb_LinkTarget_get_ilkfile,$(2)) \
+)
+
+$(call gb_LinkTarget_get_target,$(2)) \
+$(call gb_LinkTarget_get_headers_target,$(2)) : PDBFILE = $(call gb_LinkTarget_get_pdbfile_in,$(2))
+
+endef
+
+# JunitTest class
+
+ifneq ($(OOO_TEST_SOFFICE),)
+gb_JunitTest_SOFFICEARG:=$(OOO_TEST_SOFFICE)
+else
+ifneq ($(gb_JunitTest_DEBUGRUN),)
+gb_JunitTest_SOFFICEARG:=connect:pipe,name=$(USER)
+else
+gb_JunitTest_SOFFICEARG:=path:$(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice
+endif
+endif
+
+
+define gb_JunitTest_JunitTest_platform
+$(call gb_JunitTest_get_target,$(1)) : DEFS := \
+ -Dorg.openoffice.test.arg.soffice="$(gb_JunitTest_SOFFICEARG)" \
+ -Dorg.openoffice.test.arg.env=PATH="$$$$PATH" \
+ -Dorg.openoffice.test.arg.user=$(call gb_Helper_make_url,$(call gb_JunitTest_get_userdir,$(1)))
+ -Dorg.openoffice.test.arg.workdir=$(call gb_JunitTest_get_userdir,$(1)) \
+
+endef
+
+
+define gb_Module_DEBUGRUNCOMMAND
+printf "\nAttach the debugger to soffice.bin\n\n"
+OFFICESCRIPT=`mktemp` && \
+printf "$(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice.exe" > $${OFFICESCRIPT} && \
+printf " --norestore --nologo '--accept=pipe,name=$(USER);urp;'\n" >> $${OFFICESCRIPT} && \
+$(SHELL) $${OFFICESCRIPT} && \
+rm $${OFFICESCRIPT}
+endef
+
+
+
+
+# PythonTest class
+
+gb_PythonTest_PRECOMMAND := $(gb_CppunitTest_CPPTESTPRECOMMAND)
+gb_PythonTest_DEPS = $(call gb_Package_get_target,python3) $(call gb_Executable_get_target,python)
+
+ifeq ($(strip $(CPPUNITTRACE)),TRUE)
+override CPPUNITTRACE := '$(DEVENV)' /debugexe
+endif
+
+# WinResTarget class
+
+gb_WinResTarget_POSTFIX :=.res
+
+define gb_WinResTarget__command
+$(call gb_Output_announce,$(2),$(true),RC ,1)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && \
+ $(gb_RC) \
+ $(DEFS) $(FLAGS) \
+ $(INCLUDE) \
+ -Fo$(1) \
+ $(RCFILE) )
+endef
+
+$(eval $(call gb_Helper_make_dep_targets,\
+ WinResTarget \
+))
+
+ifeq ($(gb_FULLDEPS),$(true))
+# FIXME this is used before TargetLocations is read?
+gb_WinResTarget__command_target = $(WORKDIR_FOR_BUILD)/LinkTarget/Executable/makedepend.exe
+define gb_WinResTarget__command_dep
+$(call gb_Output_announce,RC:$(2),$(true),DEP,1)
+ $(call gb_Trace_StartRange,RC:$(2),DEP)
+$(call gb_Helper_abbreviate_dirs,\
+ mkdir -p $(dir $(1)) && \
+ $(call gb_Executable_get_target_for_build,makedepend) \
+ $(INCLUDE) \
+ $(DEFS) \
+ $(RCFILE) \
+ -o .res \
+ -p $(dir $(3)) \
+ -f $(1))
+ $(call gb_Trace_EndRange,RC:$(2),DEP)
+endef
+else
+gb_WinResTarget__command_target =
+gb_WinResTarget__command_dep =
+endif
+
+# InstallModuleTarget class
+
+define gb_InstallModuleTarget_InstallModuleTarget_platform
+$(call gb_InstallModuleTarget_add_defs,$(1),\
+ $(gb_CPUDEFS) \
+ $(gb_OSDEFS) \
+ -DCOMID=MSC \
+)
+
+endef
+
+# ExternalProject class
+
+# Use the gcc wrappers for an autoconf based project
+#
+# gb_ExternalProject_register_targets project state_target
+define gb_ExternalProject_use_autoconf
+$(call gb_ExternalProject_get_preparation_target,$(1)) : $(call gb_Executable_get_runtime_dependencies,gcc-wrapper) \
+ $(call gb_Executable_get_runtime_dependencies,g++-wrapper)
+$(call gb_ExternalProject_get_state_target,$(1),$(2)): WRAPPERS := $(gb_AUTOCONF_WRAPPERS)
+endef
+
+# Set INCLUDE and LIB variables and unset MAKE/MAKEFLAGS when using nmake
+#
+# gb_ExternalProject_use_nmake project state_target
+define gb_ExternalProject_use_nmake
+$(call gb_ExternalProject_get_state_target,$(1),$(2)): NMAKE := $(gb_NMAKE_VARS)
+endef
+
+# if ccache is enabled, then split it and use lastword as REAL_FOO
+# /opt/lo/bin/ccache /cygdrive/c/PROGRA~2/MICROS~2.0/VC/bin/cl.exe
+
+gb_AUTOCONF_WRAPPERS = \
+ REAL_CC="$(shell cygpath -w $(filter-out -%,$(CC)))" \
+ REAL_CC_FLAGS="$(filter -%,$(CC))" \
+ CC="$(call gb_Executable_get_target_for_build,gcc-wrapper)" \
+ REAL_CXX="$(shell cygpath -w $(filter-out -%,$(CXX)))" \
+ REAL_CXX_FLAGS="$(filter -%,$(CXX))" \
+ CXX="$(call gb_Executable_get_target_for_build,g++-wrapper)" \
+ LD="$(shell cygpath -w $(COMPATH)/bin/link.exe) -nologo"
+
+gb_ExternalProject_INCLUDE := \
+ $(subst -I,,$(subst $(WHITESPACE),;,$(SOLARINC)))
+
+gb_NMAKE_VARS = \
+ CC="$(shell cygpath -w $(filter-out -%,$(CC))) $(filter -%,$(CC))" \
+ INCLUDE="$(gb_ExternalProject_INCLUDE)" \
+ LIB="$(ILIB)" \
+ MAKEFLAGS= \
+ MAKE=
+
+# InstallScript class
+
+gb_InstallScript_EXT := .inf
+
+# CliAssemblyTarget class
+
+gb_CliAssemblyTarget_POLICYEXT := $(gb_Library_DLLEXT)
+gb_CliAssemblyTarget_get_dll = $(call gb_Library__get_dir_for_layer,NONE)/$(1)$(gb_CliAssemblyTarget_POLICYEXT)
+
+# Extension class
+
+gb_Extension_LICENSEFILE_DEFAULT := $(INSTROOT)/license.txt
+
+# UnpackedTarget class
+
+gb_UnpackedTarget_TARFILE_LOCATION := $(shell cygpath -u $(TARFILE_LOCATION))
+
+# UnoApiHeadersTarget class
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))
+else
+gb_UnoApiHeadersTarget_select_variant = $(2)
+endif
+
+# UIConfig class
+
+# use responsefile because cui has too many files for command line
+define gb_UIConfig__command
+$(call gb_Helper_abbreviate_dirs,\
+ RESPONSEFILE=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(if $(UI_IMAGELISTS),$(strip $(UI_IMAGELISTS)),/dev/null)) \
+ && tr " " "\000" < $$RESPONSEFILE | tr -d "\r\n" > $$RESPONSEFILE.0 \
+ && $(SORT) -u --files0-from=$$RESPONSEFILE.0 > $@ \
+ && rm $$RESPONSEFILE $$RESPONSEFILE.0 \
+)
+
+endef
+
+# use file list file because swriter has too many files for command line
+define gb_UIConfig__gla11y_command
+$(call gb_ExternalExecutale__check_registration,python)
+$(call gb_Helper_abbreviate_dirs,\
+ FILES=$(call gb_var2file,$(shell $(gb_MKTEMP)),100,$(UIFILES)) && \
+ $(gb_UIConfig_LXML_PATH) $(if $(SYSTEM_LIBXML)$(SYSTEM_LIBXSLT),,$(gb_Helper_set_ld_path)) \
+ $(call gb_ExternalExecutable_get_command,python) \
+ $(gb_UIConfig_gla11y_SCRIPT) $(gb_UIConfig_gla11y_PARAMETERS) -o $@ -L $$FILES && \
+ rm $$FILES
+)
+
+endef
+
+# UIMenubarTarget class
+
+define gb_UIMenubarTarget__command
+$(call gb_Output_announce,$(2),$(true),UIM,1)
+$(call gb_Trace_StartRange,$(2),UIM)
+cp $(3) $(1)
+$(call gb_Trace_EndRange,$(2),UIM)
+
+endef
+
+gb_UIMenubarTarget_UIMenubarTarget_platform :=
+
+# Python
+gb_Python_HOME := $(INSTDIR_FOR_BUILD)/program/python-core-$(PYTHON_VERSION)
+gb_Python_PRECOMMAND := PATH="$(shell cygpath -w $(INSTDIR_FOR_BUILD)/program)" PYTHONHOME="$(gb_Python_HOME)" PYTHONPATH="$${PYPATH:+$$PYPATH:}$(gb_Python_HOME)/lib;$(gb_Python_HOME)/lib/lib-dynload:$(INSTDIR_FOR_BUILD)/program"
+gb_Python_INSTALLED_EXECUTABLE := $(INSTROOT_FOR_BUILD)/$(LIBO_BIN_FOLDER)/python.exe
+
+gb_ICU_PRECOMMAND := PATH="$(shell cygpath -w $(WORKDIR_FOR_BUILD)/UnpackedTarball/icu/source/lib)"
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/com_MSC_defs.mk b/solenv/gbuild/platform/com_MSC_defs.mk
new file mode 100644
index 000000000..364c0011f
--- /dev/null
+++ b/solenv/gbuild/platform/com_MSC_defs.mk
@@ -0,0 +1,352 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# set tmpdir to some mixed case path, suitable for native tools
+gb_TMPDIR:=$(if $(TMPDIR),$(shell cygpath -m $(TMPDIR)),$(shell cygpath -m /tmp))
+
+# please make generic Windows modifications to windows.mk
+include $(GBUILDDIR)/platform/windows.mk
+
+gb_CC := cl
+gb_CXX := cl
+gb_LINK := link
+gb_DUMPBIN := dumpbin
+gb_AWK := awk
+gb_CLASSPATHSEP := ;
+gb_RC := rc
+
+# use CC/CXX if they are nondefaults
+ifneq ($(origin CC),default)
+gb_CC := $(CC)
+gb_GCCP := $(CC)
+endif
+ifneq ($(origin CXX),default)
+gb_CXX := $(CXX)
+endif
+
+# _SCL_SECURE_NO_WARNINGS avoids deprecation warnings for STL algorithms
+# like std::copy, std::transform (when MSVC_USE_DEBUG_RUNTIME is enabled)
+
+gb_COMPILERDEFS := \
+ -DBOOST_ERROR_CODE_HEADER_ONLY \
+ -DBOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE \
+ -DBOOST_SYSTEM_NO_DEPRECATED \
+ -D_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING \
+ -D_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING \
+ -D_SILENCE_CXX17_RESULT_OF_DEPRECATION_WARNING \
+ -D_CRT_NON_CONFORMING_SWPRINTFS \
+ -D_CRT_NONSTDC_NO_DEPRECATE \
+ -D_CRT_SECURE_NO_DEPRECATE \
+ -D_SCL_SECURE_NO_WARNINGS \
+ -D_MT \
+ -D_DLL \
+ -DCPPU_ENV=$(CPPU_ENV) \
+
+ifeq ($(CPUNAME),INTEL)
+gb_COMPILERDEFS += \
+ -DBOOST_MEM_FN_ENABLE_CDECL \
+
+endif
+
+gb_RCDEFS := \
+ $(gb_WIN_VERSION_DEFS) \
+
+gb_RCFLAGS :=
+
+gb_AFLAGS := $(AFLAGS)
+
+# Do we really need to disable this many warnings? It seems to me that
+# many of these warnings are for constructs that we have been actively
+# cleaning away from the code, to avoid warnings when building with
+# gcc or Clang and -Wall -Werror.
+
+# C4127: conditional expression is constant
+
+# C4201: nonstandard extension used : nameless struct/union
+
+# C4244: nonstandard extension used : formal parameter 'identifier'
+# was previously defined as a type
+
+# C4250: 'class1' : inherits 'class2::member' via dominance
+
+# C4251: 'identifier' : class 'type' needs to have dll-interface to be
+# used by clients of class 'type2'
+
+# C4267: conversion from 'size_t' to 'type', possible loss of data
+
+# C4275: non-DLL-interface classkey 'identifier' used as base for
+# DLL-interface classkey 'identifier'
+
+# C4505: 'function' : unreferenced local function has been removed
+
+# C4611: interaction between 'function' and C++ object destruction is
+# non-portable
+
+# C4702: unreachable code
+
+# C4706: assignment within conditional expression
+
+gb_CFLAGS := \
+ -utf-8 \
+ -Gd \
+ -GR \
+ -Gs \
+ -GS \
+ $(if $(MSVC_USE_DEBUG_RUNTIME),-MDd,-MD) \
+ -nologo \
+ -W4 \
+ -wd4244 \
+ -wd4505 \
+ -bigobj \
+
+gb_CXXFLAGS_DISABLE_WARNINGS = -w
+
+ifneq ($(COM_IS_CLANG),TRUE)
+
+# clang-cl doesn't support -Wv:18 for now
+gb_CFLAGS += \
+ -Wv:18 \
+
+endif
+
+gb_CXXFLAGS := \
+ -utf-8 \
+ $(CXXFLAGS_CXX11) \
+ -Gd \
+ -GR \
+ -Gs \
+ -GS \
+ -Gy \
+ $(if $(MSVC_USE_DEBUG_RUNTIME),-MDd,-MD) \
+ -nologo \
+ -W4 \
+ -wd4127 \
+ -wd4201 \
+ -wd4244 \
+ -wd4250 \
+ -wd4251 \
+ -wd4267 \
+ -wd4275 \
+ -wd4505 \
+ -wd4611 \
+ -wd4706 \
+ -bigobj \
+
+ifneq ($(COM_IS_CLANG),TRUE)
+gb_CXXFLAGS += -Zc:inline
+gb_CXXFLAGS_ZCINLINE_OFF := -Zc:inline-
+endif
+
+ifeq ($(CPUNAME),INTEL)
+
+gb_CXXFLAGS += \
+ -Zm500 \
+
+gb_CFLAGS += \
+ -Zm500 \
+
+endif
+
+ifeq ($(HAVE_DLLEXPORTINLINES),TRUE)
+gb_CXXFLAGS += -Zc:dllexportInlines-
+endif
+
+gb_CXXFLAGS_include := -FI
+ifeq ($(COM_IS_CLANG),TRUE)
+gb_CXXFLAGS_no_pch_warnings := -Wno-clang-cl-pch
+endif
+
+ifneq ($(COM_IS_CLANG),TRUE)
+
+# clang-cl doesn't support -Wv:18 for now
+# Work around MSVC 2017 C4702 compiler bug with release builds
+# http://document-foundation-mail-archive.969070.n3.nabble.com/Windows-32-bit-build-failure-unreachable-code-tp4243848.html
+# http://document-foundation-mail-archive.969070.n3.nabble.com/64-bit-Windows-build-failure-after-MSVC-Update-tp4246816.html
+gb_CXXFLAGS += \
+ -Wv:18 \
+ $(if $(filter 0,$(gb_DEBUGLEVEL)),-wd4702) \
+
+endif
+
+# rc.exe does not support -nologo in 6.1.6723.1 that is in the Windows SDK 6.0A
+gb_RCFLAGS += -nologo
+
+# C4005: 'identifier' : macro redefinition
+
+gb_PCHWARNINGS = \
+ -we4650 \
+ -we4651 \
+ -we4652 \
+ -we4653 \
+ -we4005 \
+
+gb_STDLIBS := \
+ advapi32.lib \
+
+gb_CFLAGS_WERROR = $(if $(ENABLE_WERROR),-WX)
+
+# there does not seem to be a way to force C++03 with MSVC, nor with clang-cl against MSVC system
+# headers
+gb_CXX03FLAGS :=
+
+gb_LinkTarget_EXCEPTIONFLAGS := \
+ -DEXCEPTIONS_ON \
+ -EHs \
+
+gb_PrecompiledHeader_EXCEPTIONFLAGS := $(gb_LinkTarget_EXCEPTIONFLAGS)
+
+ifneq ($(gb_ENABLE_PCH),)
+ifeq ($(COM_IS_CLANG),TRUE)
+# the same as in com_GCC_defs.mk
+gb_NO_PCH_TIMESTAMP := -Xclang -fno-pch-timestamp
+endif
+endif
+
+gb_LinkTarget_LDFLAGS := \
+ $(if $(findstring s,$(filter-out --%,$(MAKEFLAGS))),-nologo,) \
+ $(patsubst %,-LIBPATH:%,$(filter-out .,$(subst ;, ,$(subst \,/,$(ILIB))))) \
+
+# Prevent warning spamming
+# Happens because of the way we link our unit tests with our libraries.
+# LNK4049: locally defined symbol
+gb_LinkTarget_LDFLAGS += \
+ /ignore:4217 /ignore:4049
+
+
+ifeq ($(ENABLE_Z7_DEBUG),)
+gb_DEBUGINFO_FLAGS := \
+ -FS \
+ -Zi \
+
+else
+# ccache does not work with -Zi
+gb_DEBUGINFO_FLAGS := \
+ -Z7 \
+
+endif
+
+# See gb_Windows_PE_TARGETTYPEFLAGS_DEBUGINFO
+gb_LINKER_DEBUGINFO_FLAGS :=
+
+gb_COMPILEROPTFLAGS := -O2 -Oy-
+gb_COMPILERNOOPTFLAGS := -Od
+gb_COMPILERDEBUGOPTFLAGS :=
+
+ifeq ($(gb_FULLDEPS),$(true))
+gb_COMPILERDEPFLAGS := -showIncludes
+define gb_create_deps
+| LC_ALL=C $(GBUILDDIR)/platform/filter-showIncludes.awk -vdepfile=$(1) -vobjectfile=$(2) -vsourcefile=$(3); exit $${PIPESTATUS[0]}
+endef
+else
+gb_COMPILERDEPFLAGS :=
+define gb_create_deps
+| LC_ALL=C $(GBUILDDIR)/platform/filter-sourceName.awk; exit $${PIPESTATUS[0]}
+endef
+endif
+
+gb_LTOFLAGS := $(if $(filter TRUE,$(ENABLE_LTO)),-GL)
+
+# When compiling for CLR, disable "warning C4339: use of undefined type detected
+# in CLR meta-data - use of this type may lead to a runtime exception":
+gb_CXXCLRFLAGS := \
+ $(if $(COM_IS_CLANG), \
+ $(patsubst -std=%,-std:c++17 -Zc:__cplusplus,$(gb_CXXFLAGS)), \
+ $(gb_CXXFLAGS)) \
+ $(gb_LinkTarget_EXCEPTIONFLAGS) \
+ -AI $(INSTDIR)/$(LIBO_URE_LIB_FOLDER) \
+ -EHa \
+ -clr \
+ -wd4339 \
+ -Wv:18 \
+ -wd4267 \
+ -Zc:twoPhase- \
+
+ifeq ($(COM_IS_CLANG),TRUE)
+
+gb_CFLAGS += \
+ -Wendif-labels \
+ -Wshadow \
+ -Wstrict-prototypes \
+ -Wundef \
+ -Wunused-macros \
+
+gb_CXXFLAGS += \
+ -Wendif-labels \
+ -Wimplicit-fallthrough \
+ -Wno-missing-braces \
+ -Wnon-virtual-dtor \
+ -Woverloaded-virtual \
+ -Wshadow \
+ -Wundef \
+ -Wunused-macros \
+
+endif
+
+ifeq ($(COM_IS_CLANG),TRUE)
+gb_COMPILER_TEST_FLAGS := -Xclang -plugin-arg-loplugin -Xclang --unit-test-mode
+ifeq ($(COMPILER_PLUGIN_TOOL),)
+gb_COMPILER_PLUGINS := -Xclang -load -Xclang $(BUILDDIR)/compilerplugins/clang/plugin.dll -Xclang -add-plugin -Xclang loplugin
+ifneq ($(COMPILER_PLUGIN_WARNINGS_ONLY),)
+gb_COMPILER_PLUGINS += -Xclang -plugin-arg-loplugin -Xclang \
+ --warnings-only='$(COMPILER_PLUGIN_WARNINGS_ONLY)'
+endif
+else
+gb_COMPILER_PLUGINS := -Xclang -load -Xclang $(BUILDDIR)/compilerplugins/clang/plugin.dll -Xclang -plugin -Xclang loplugin $(foreach plugin,$(COMPILER_PLUGIN_TOOL), -Xclang -plugin-arg-loplugin -Xclang $(plugin))
+ifneq ($(UPDATE_FILES),)
+gb_COMPILER_PLUGINS += -Xclang -plugin-arg-loplugin -Xclang --scope=$(UPDATE_FILES)
+endif
+endif
+ifeq ($(COMPILER_PLUGINS_DEBUG),TRUE)
+gb_COMPILER_PLUGINS += -Xclang -plugin-arg-loplugin -Xclang --debug
+endif
+gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS := \
+ -Xclang -plugin-arg-loplugin -Xclang --warnings-as-errors
+else
+gb_COMPILER_TEST_FLAGS :=
+gb_COMPILER_PLUGINS :=
+gb_COMPILER_PLUGINS_WARNINGS_AS_ERRORS :=
+endif
+
+# Helper class
+
+gb_Helper_set_ld_path := PATH="$(shell cygpath -u $(INSTDIR_FOR_BUILD)/$(LIBO_URE_LIB_FOLDER)):$(shell cygpath -u $(INSTDIR_FOR_BUILD)/$(LIBO_BIN_FOLDER)):$$PATH"
+
+define gb_Helper_prepend_ld_path
+PATH="$(shell cygpath -u $(INSTDIR_FOR_BUILD)/$(LIBO_URE_LIB_FOLDER)):$(shell cygpath -u $(INSTDIR_FOR_BUILD)/$(LIBO_BIN_FOLDER)):$(1):$$PATH"
+endef
+
+# $(1): one directory pathname to append to the ld path
+define gb_Helper_extend_ld_path
+$(gb_Helper_set_ld_path)':$(shell cygpath -u $(1))'
+endef
+
+# common macros to build GPG related libraries
+# we explicitly have to replace cygwin with mingw32 for the host, but the build must stay cygwin, or cmd.exe processes will be spawned
+gb_WIN_GPG_WINDRES_target := $(if $(filter INTEL,$(CPUNAME)),pe-i386,pe-x86-64)
+gb_WIN_GPG_platform_switches := --build=$(BUILD_PLATFORM) --host=$(subst cygwin,mingw32,$(HOST_PLATFORM))
+gb_WIN_GPG_cross_setup_exports = export REAL_BUILD_CC="$(filter-out -%,$(CC_FOR_BUILD))" REAL_BUILD_CC_FLAGS="$(filter -%,$(CC_FOR_BUILD))" \
+ && export CC_FOR_BUILD="$(call gb_Executable_get_target_for_build,gcc-wrapper) --wrapper-env-prefix=REAL_BUILD_ $(SOLARINC) -L$(subst ;, -L,$(ILIB_FOR_BUILD))" \
+ && export RC='windres -O COFF --target=$(gb_WIN_GPG_WINDRES_target) --preprocessor=$(call gb_Executable_get_target_for_build,cpp) --preprocessor-arg=-+ -DRC_INVOKED -DWINAPI_FAMILY=0 $(SOLARINC)'
+
+ifneq ($(gb_ENABLE_PCH),)
+# Enable use of .sum files for PCHs.
+gb_COMPILER_SETUP += CCACHE_PCH_EXTSUM=1
+endif
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/filter-creatingLibrary.awk b/solenv/gbuild/platform/filter-creatingLibrary.awk
new file mode 100755
index 000000000..231609feb
--- /dev/null
+++ b/solenv/gbuild/platform/filter-creatingLibrary.awk
@@ -0,0 +1,46 @@
+#!/usr/bin/gawk -f
+# -*- 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/.
+#
+
+# Filter out the "Creating library" message printed by link.exe,
+# as there is no way to disable it.
+
+BEGIN {
+ creatinglibrary_prefix = ENVIRON["CREATINGLIBRARY_PREFIX"];
+ generatingcode_message = ENVIRON["GENERATINGCODE_MESSAGE"];
+ finishedgeneratingcode_message = ENVIRON["FINISHEDGENERATINGCODE_MESSAGE"];
+ if (!creatinglibrary_prefix) {
+ creatinglibrary_prefix = "\\.lib.*\\.exp"
+ }
+ if (!generatingcode_message) {
+ generatingcode_message = "Generating code"
+ }
+ if (!finishedgeneratingcode_message) {
+ finishedgeneratingcode_message = "Finished generating code"
+ }
+ firstline = 1
+}
+
+{
+ if (firstline && match($0, creatinglibrary_prefix)) {
+ # ignore
+ } else if (match($0, generatingcode_message)) {
+ # ignore
+ } else if (match($0, finishedgeneratingcode_message)) {
+ # ignore
+ } else {
+ # because MSVC stupidly prints errors on stdout, it's
+ # necessary to forward everything that isn't matched by the pattern
+ # so users get to see them.
+ print $0 > "/dev/stderr"
+ }
+ firstline = 0
+}
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/filter-showIncludes.awk b/solenv/gbuild/platform/filter-showIncludes.awk
new file mode 100755
index 000000000..9f5cabd10
--- /dev/null
+++ b/solenv/gbuild/platform/filter-showIncludes.awk
@@ -0,0 +1,99 @@
+#!/usr/bin/gawk -f
+# -*- 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/.
+#
+
+# Create dependency information from the output of cl.exe's showInclude. It
+# needs additional information - the output name to which to write, objfile
+# that depends on the includes, and the original file name.
+# For best results all arguments should be absolute paths.
+#
+# It also consolidates the file names to a canonical form, and filters out
+# duplicates.
+#
+# based on filter-showInclude.pl by Jan Holesovsky <kendy@suse.cz>
+
+BEGIN {
+ if (!depfile || !objectfile || !sourcefile) {
+ print "usage: filter-showIncludes.awk -vdepfile=depfile.d " \
+ "-vobjectfile=objfile.o -vsourcefile=source.cxx" > "/dev/stderr"
+ exit 1
+ }
+ tempfile = depfile ".tmp"
+ print objectfile " : \\\n " sourcefile " \\" > tempfile
+
+ showincludes_prefix = ENVIRON["SHOWINCLUDES_PREFIX"];
+ if (!showincludes_prefix) {
+ showincludes_prefix = "Note: including file:"
+ }
+
+ # to match especially drive letters in allowlist case insensitive
+ IGNORECASE = 1
+ allowlist = \
+ "^(" ENVIRON["SRCDIR"] "|" ENVIRON["BUILDDIR"] ")"
+ firstline = 1
+}
+
+{
+ sub(/\r$/, "")
+ sub(/^ */, "")
+ if (index($0, showincludes_prefix) == 1) {
+ $0 = substr($0, length(showincludes_prefix) + 1)
+ sub(/^ */, "")
+
+ # The output from MSVC may contain a carriage return character at the
+ # end of filenames, in which case the translation unit will depend on a
+ # non-existing header, resulting in constant rebuild of all files,
+ # prevent that.
+ sub(/ /, "")
+
+ gsub(/\\/, "/")
+ gsub(/ /, "\\ ")
+ if ($0 ~ allowlist) { # filter out system headers
+ if (!($0 in incfiles)) {
+ incfiles[$0]
+ print " " $0 " \\" > tempfile
+ }
+ }
+ } else {
+ # because MSVC stupidly prints errors on stdout, it's
+ # necessary to forward everything that isn't matched by the pattern
+ # so users get to see them.
+ if (firstline) { # ignore the line that just prints name of sourcefile
+ firstline = 0
+ } else {
+ print $0 > "/dev/stderr"
+ }
+ }
+}
+
+END {
+ if (!tempfile) {
+ exit 1
+ }
+ print "" > tempfile
+
+ # fdo#40099 if header.h does not exist, it will simply be considered out of
+ # date and any targets that use it as a prerequisite will be updated,
+ # which avoid misery when the header is deliberately deleted and removed
+ # as an include
+ # see http://www.makelinux.net/make3/make3-CHP-8-SECT-3
+ for (file in incfiles) {
+ print file " :\n" > tempfile
+ }
+
+ close(tempfile)
+ movecmd = "mv " tempfile " " depfile
+ ret = system(movecmd)
+ if (ret) {
+ print "ERROR: " movecmd " FAILED with status " ret > "/dev/stderr"
+ exit ret
+ }
+}
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/filter-sourceName.awk b/solenv/gbuild/platform/filter-sourceName.awk
new file mode 100755
index 000000000..d55e2707d
--- /dev/null
+++ b/solenv/gbuild/platform/filter-sourceName.awk
@@ -0,0 +1,32 @@
+#!/usr/bin/gawk -f
+# -*- 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/.
+#
+
+# Filter out the "sourcefile.cxx" message printed by cl.exe,
+# as there is no way to disable it. This file is used
+# in place of filter-showIncludes.awk (which does the same)
+# when --disable-dependency-tracking is used.
+
+BEGIN {
+ firstline = 1
+}
+
+{
+ if (firstline) {
+ # ignore
+ } else {
+ # because MSVC stupidly prints errors on stdout, it's
+ # necessary to forward everything that isn't matched by the pattern
+ # so users get to see them.
+ print $0 > "/dev/stderr"
+ }
+ firstline = 0
+}
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/iOS.mk b/solenv/gbuild/platform/iOS.mk
new file mode 100644
index 000000000..15f1ce4ef
--- /dev/null
+++ b/solenv/gbuild/platform/iOS.mk
@@ -0,0 +1,269 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+ifeq ($(CC),)
+$(error You must set CC in the environment. See README.cross for example.)
+endif
+ifeq ($(CXX),)
+$(error You must set CXX in the environment. See README.cross for example.)
+endif
+
+gb_COMPILEROPTFLAGS := -O2
+
+include $(GBUILDDIR)/platform/com_GCC_defs.mk
+
+# Use standard lldb debugger
+gb_DEBUGINFO_FLAGS=-g
+gb_LINKER_DEBUGINFO_FLAGS=
+
+# Darwin mktemp -t expects a prefix, not a pattern
+gb_MKTEMP := /usr/bin/mktemp -t gbuild.
+
+gb_OSDEFS := \
+ -DIOS \
+ -D_PTHREADS \
+ -DUNIX \
+ -DUNX \
+ -D_REENTRANT \
+ -DNO_PTHREAD_PRIORITY \
+ $(LFS_CFLAGS) \
+
+gb_CFLAGS := \
+ $(gb_CFLAGS_COMMON) \
+ -Wshadow \
+ -fno-strict-aliasing \
+
+gb_CXXFLAGS := \
+ $(gb_CXXFLAGS_COMMON) \
+ -Wno-ctor-dtor-privacy \
+ -fno-strict-aliasing \
+ -fsigned-char \
+ $(CXXFLAGS_CXX11) \
+
+# These are to get the compiler to switch to Objective-C++ or Objective-C mode
+gb_OBJCXXFLAGS := -x objective-c++
+gb_OBJCFLAGS := -x objective-c
+
+gb_COMPILERDEFS += \
+ -DBOOST_DETAIL_NO_CONTAINER_FWD
+
+# LinkTarget class
+
+gb_LinkTarget_CFLAGS := $(gb_CFLAGS)
+gb_LinkTarget_CXXFLAGS := $(gb_CXXFLAGS)
+gb_LinkTarget_OBJCXXFLAGS := $(gb_CXXFLAGS) $(gb_OBJCXXFLAGS)
+gb_LinkTarget_OBJCFLAGS := $(gb_CFLAGS) $(gb_OBJCFLAGS)
+
+define gb_LinkTarget__get_liblinkflags
+$(patsubst lib%.a,-l%,$(foreach lib,$(1),$(call gb_Library_get_filename,$(lib))))
+endef
+
+define gb_LinkTarget__get_layer
+$(if $(filter Executable,$(1)),\
+ $$(call gb_Executable_get_layer,$(2)),\
+ $$(call gb_Library_get_layer,$(2)))
+endef
+
+# To not export anything: -Wl$(COMMA)-exported_symbols_list$(COMMA)/dev/null
+# But for some reason that slows down ld significantly.
+
+define gb_LinkTarget__command_dynamiclink
+ $(if $(filter Library CppunitTest,$(TARGETTYPE)),@echo No dynamic libraries should be built for iOS && exit 1, \
+ $(if $(CXXOBJECTS)$(OBJCXXOBJECTS)$(GENCXXOBJECTS)$(EXTRAOBJECTLISTS),$(gb_CXX),$(gb_CC)) \
+ $(gb_Executable_TARGETTYPEFLAGS) \
+ $(subst \d,$$,$(RPATH)) \
+ $(T_USE_LD) $(T_LDFLAGS) \
+ -dead_strip \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
+ $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),`cat $(extraobjectlist)`) \
+ $(foreach lib,$(LINKED_STATIC_LIBS),$(call gb_StaticLibrary_get_target,$(lib))) \
+ $(call gb_LinkTarget__get_liblinkflags,$(LINKED_LIBS)) \
+ $(shell $(SRCDIR)/bin/lo-all-static-libs) \
+ $(T_LIBS) \
+ -o $(1))
+endef
+
+# parameters: 1-linktarget 2-cobjects 3-cxxobjects
+define gb_LinkTarget__command_staticlink
+$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(1) && \
+ $(gb_AR) -rsu $(1) \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
+ $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),@$(extraobjectlist)) \
+ $(if $(findstring s,$(MAKEFLAGS)),2> /dev/null))
+endef
+
+define gb_LinkTarget__command
+$(call gb_Output_announce,$(2),$(true),LNK,4)
+ $(call gb_Trace_StartRange,$(2),LNK)
+$(if $(filter Executable,$(TARGETTYPE)),$(call gb_LinkTarget__command_dynamiclink,$(1),$(2)))
+$(if $(filter CppunitTest Library StaticLibrary,$(TARGETTYPE)),$(call gb_LinkTarget__command_staticlink,$(1)))
+ $(call gb_Trace_EndRange,$(2),LNK)
+endef
+
+define gb_LinkTarget_use_system_darwin_frameworks
+$(call gb_LinkTarget_add_libs,$(1),$(foreach fw,$(2),-framework $(fw)))
+$(if $(call gb_LinkTarget__is_merged,$(1)),\
+ $(call gb_LinkTarget_add_libs,$(call gb_Library_get_linktarget,merged),$(foreach fw,$(2),-framework $(fw))))
+endef
+
+
+# Library class
+
+gb_Library_DEFS :=
+gb_Library_SYSPRE := lib
+gb_Library_UNOVERPRE := $(gb_Library_SYSPRE)uno_
+gb_Library_PLAINEXT := .a
+gb_Library_PLAINEXT_FOR_BUILD := .dylib
+gb_Library_DLLEXT := .a
+gb_Library_RTEXT := gcc3$(gb_Library_PLAINEXT)
+
+gb_Library_OOOEXT := $(gb_Library_DLLPOSTFIX)$(gb_Library_PLAINEXT)
+gb_Library_UNOEXT := .uno$(gb_Library_PLAINEXT)
+
+gb_Library_FILENAMES := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_RTEXT)) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(gb_Library_UNOVERPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):$(lib)$(gb_Library_UNOEXT)) \
+
+
+gb_Library_LAYER := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):OXT) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):NONE) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):OXT) \
+
+define gb_Library_Library_platform
+$(call gb_LinkTarget_get_target,$(2)) : LAYER := $(call gb_Library_get_layer,$(1))
+
+endef
+
+gb_Library__set_soversion_script_platform =
+
+gb_Library_get_sdk_link_dir = $(WORKDIR)/LinkTarget/Library
+
+# Executable class
+
+gb_Executable_EXT :=
+gb_Executable_TARGETTYPEFLAGS :=
+
+gb_Executable_LAYER := \
+ $(foreach exe,$(gb_Executable_UREBIN),$(exe):UREBIN) \
+ $(foreach exe,$(gb_Executable_SDK),$(exe):SDKBIN) \
+ $(foreach exe,$(gb_Executable_OOO),$(exe):OOO) \
+ $(foreach exe,$(gb_Executable_NONE),$(exe):NONE) \
+
+
+define gb_Executable_Executable_platform
+$(call gb_LinkTarget_get_target,$(2)) : LAYER := $(call gb_Executable_get_layer,$(1))
+
+endef
+
+
+# CppunitTest class
+
+gb_CppunitTest_CPPTESTPRECOMMAND := :
+gb_CppunitTest_get_filename = libtest_(1).a
+gb_CppunitTest_get_ilibfilename = $(gb_CppunitTest_get_filename)
+
+define gb_CppunitTest_CppunitTest_platform
+$(call gb_LinkTarget_get_target,$(2)) : LAYER := NONE
+
+endef
+
+# InstallModuleTarget class
+
+define gb_InstallModuleTarget_InstallModuleTarget_platform
+$(call gb_InstallModuleTarget_add_defs,$(1),\
+ $(gb_CPUDEFS) \
+ $(gb_OSDEFS) \
+ -DCOMID=gcc3 \
+ -D_gcc3 \
+)
+
+endef
+
+# InstallScript class
+
+gb_InstallScript_EXT := .ins
+
+# CliAssemblyTarget class
+
+gb_CliAssemblyTarget_POLICYEXT :=
+gb_CliAssemblyTarget_get_dll :=
+
+# Extension class
+
+gb_Extension_LICENSEFILE_DEFAULT := $(INSTROOT)/LICENSE
+
+# UnpackedTarget class
+
+gb_UnpackedTarget_TARFILE_LOCATION := $(TARFILE_LOCATION)
+
+# UnoApiHeadersTarget class
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))
+else
+gb_UnoApiHeadersTarget_select_variant = $(2)
+endif
+
+# UIMenubarTarget class
+
+define gb_UIMenubarTarget__command
+$(call gb_Output_announce,$(2),$(true),UIM,1)
+$(call gb_Trace_StartRange,$(2),UIM)
+cp $(3) $(1)
+$(call gb_Trace_EndRange,$(2),UIM)
+
+endef
+
+gb_UIMenubarTarget_UIMenubarTarget_platform :=
+
+# Python
+gb_PYTHON_PRECOMMAND :=
+
+include $(GBUILDDIR)/platform/com_GCC_class.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/iOS_AARCH64_GCC.mk b/solenv/gbuild/platform/iOS_AARCH64_GCC.mk
new file mode 100644
index 000000000..0d03fa027
--- /dev/null
+++ b/solenv/gbuild/platform/iOS_AARCH64_GCC.mk
@@ -0,0 +1,22 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+gb_CPUDEFS := -DARM64
+
+include $(GBUILDDIR)/platform/iOS.mk
diff --git a/solenv/gbuild/platform/iOS_X86_64_GCC.mk b/solenv/gbuild/platform/iOS_X86_64_GCC.mk
new file mode 100644
index 000000000..008f54f2e
--- /dev/null
+++ b/solenv/gbuild/platform/iOS_X86_64_GCC.mk
@@ -0,0 +1,22 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+gb_CPUDEFS := -DX86_64
+
+include $(GBUILDDIR)/platform/iOS.mk
diff --git a/solenv/gbuild/platform/linux.mk b/solenv/gbuild/platform/linux.mk
new file mode 100644
index 000000000..8fc7d38e3
--- /dev/null
+++ b/solenv/gbuild/platform/linux.mk
@@ -0,0 +1,24 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+gb__LinkTarget_LDFLAGS_zdefs := -Wl,-z,defs
+ifeq ($(COM_IS_CLANG),TRUE)
+ifneq ($(filter -fsanitize=%,$(CC) $(LDFLAGS)),)
+gb__LinkTarget_LDFLAGS_zdefs :=
+endif
+endif
+gb_LinkTarget_LDFLAGS += $(gb__LinkTarget_LDFLAGS_zdefs)
+
+include $(GBUILDDIR)/platform/unxgcc.mk
+
+ifneq ($(ATOMIC_LIB),)
+gb_STDLIBS_CXX := $(ATOMIC_LIB)
+endif
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/platform/macosx.mk b/solenv/gbuild/platform/macosx.mk
new file mode 100644
index 000000000..5c072cba4
--- /dev/null
+++ b/solenv/gbuild/platform/macosx.mk
@@ -0,0 +1,381 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+gb_SDKDIR := $(MACOSX_SDK_PATH)
+
+include $(GBUILDDIR)/platform/com_GCC_defs.mk
+
+# Darwin mktemp -t expects a prefix, not a pattern
+gb_MKTEMP ?= /usr/bin/mktemp -t gbuild
+
+gb_OSDEFS := \
+ -D$(OS) \
+ -D_PTHREADS \
+ -DUNIX \
+ -DUNX \
+ -D_REENTRANT \
+ -DNO_PTHREAD_PRIORITY \
+ -DMAC_OS_X_VERSION_MIN_REQUIRED=$(MAC_OS_X_VERSION_MIN_REQUIRED) \
+ -DMAC_OS_X_VERSION_MAX_ALLOWED=$(MAC_OS_X_VERSION_MIN_REQUIRED) \
+ $(LFS_CFLAGS) \
+
+
+gb_CFLAGS := \
+ $(gb_CFLAGS_COMMON) \
+ -fPIC \
+ -fno-strict-aliasing \
+ -Wshadow
+
+gb_CXXFLAGS := \
+ $(gb_CXXFLAGS_COMMON) \
+ -fPIC \
+ -Woverloaded-virtual \
+ -Wshadow \
+ -Wno-ctor-dtor-privacy \
+ -fno-strict-aliasing \
+ -fsigned-char \
+ $(CXXFLAGS_CXX11)
+
+ #-fsigned-char \ might be removed?
+
+# these are to get g++ to switch to Objective-C++ mode
+# (see toolkit module for a case where it is necessary to do it this way)
+gb_OBJCXXFLAGS := -x objective-c++ -fobjc-exceptions
+
+gb_OBJCFLAGS := -x objective-c -fobjc-exceptions
+
+# LinkTarget class
+
+define gb_LinkTarget__get_rpath_for_layer
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_LinkTarget__RPATHS)))
+endef
+
+gb_LinkTarget__RPATHS := \
+ URELIB:@__________________________________________________URELIB/ \
+ UREBIN: \
+ OOO:@__________________________________________________OOO/ \
+ SDKBIN: \
+ OXT: \
+ NONE:@__________________________________________________NONE/ \
+
+# $(call gb_LinkTarget__get_installname,libfilename,layerprefix)
+define gb_LinkTarget__get_installname
+$(if $(2),-install_name '$(2)$(1)')
+endef
+
+gb_LinkTarget_CFLAGS := $(gb_CFLAGS)
+gb_LinkTarget_CXXFLAGS := $(gb_CXXFLAGS)
+gb_LinkTarget_OBJCXXFLAGS := $(gb_CXXFLAGS) $(gb_OBJCXXFLAGS)
+gb_LinkTarget_OBJCFLAGS := $(gb_CFLAGS) $(gb_OBJCFLAGS)
+
+define gb_LinkTarget__get_layer
+$(if $(filter Executable,$(1)),\
+ $$(call gb_Executable_get_layer,$(2)),\
+ $$(call gb_Library_get_layer,$(2)))
+endef
+
+# We cannot sign executables early since Mojave/Catalina would treat them as
+# restricted binary and ignore any DYLD_LIBRARY_PATH setting - So all
+# signing is handled by the solenv/bin/macosx-codesign-app-bundle script.
+# And the soffice executable needs to be signed last in
+# macosx-codesign-app-bundle, as codesign would fail complaining that other
+# parts of the app have not yet been signed:
+
+define gb_LinkTarget__command_dynamiclink
+$(call gb_Helper_abbreviate_dirs,\
+ FILELIST=$(call gb_var2file,$(shell $(gb_MKTEMP)),100, \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
+ $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach object,$(GENOBJCOBJECTS),$(call gb_GenObjCObject_get_target,$(object))) \
+ $(foreach object,$(GENOBJCXXOBJECTS),$(call gb_GenObjCxxObject_get_target,$(object))) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),$(shell cat $(extraobjectlist)))) && \
+ cat $${FILELIST} | tr "[:space:]" "\n" | grep -v '^$$' > $${FILELIST}.1 && \
+ mv $${FILELIST}.1 $${FILELIST} && \
+ $(if $(CXXOBJECTS)$(OBJCXXOBJECTS)$(GENCXXOBJECTS)$(EXTRAOBJECTLISTS),$(gb_CXX),$(gb_CC)) \
+ $(if $(filter Executable,$(TARGETTYPE)),$(gb_Executable_TARGETTYPEFLAGS)) \
+ $(if $(filter Bundle,$(TARGETTYPE)),$(gb_Bundle_TARGETTYPEFLAGS)) \
+ $(if $(filter Library CppunitTest,$(TARGETTYPE)),$(gb_Library_TARGETTYPEFLAGS)) \
+ $(subst \d,$$,$(RPATH)) \
+ $(T_USE_LD) $(T_LDFLAGS) \
+ $(patsubst lib%.dylib,-l%,$(patsubst %.$(gb_Library_UDK_MAJORVER),%,$(foreach lib,$(LINKED_LIBS),$(call gb_Library_get_filename,$(lib))))) \
+ -Wl$(COMMA)-filelist$(COMMA)$${FILELIST} \
+ $(T_LIBS) \
+ $(foreach lib,$(LINKED_STATIC_LIBS),$(call gb_StaticLibrary_get_target,$(lib))) \
+ -o $(1) && \
+ rm -f $${FILELIST} && \
+ $(if $(SOVERSIONSCRIPT),ln -sf $(1) $(ILIBTARGET),:) && \
+ $(if $(filter Executable,$(TARGETTYPE)), \
+ $(PERL) $(SRCDIR)/solenv/bin/macosx-change-install-names.pl app $(LAYER) $(1) &&) \
+ $(if $(filter Library Bundle CppunitTest,$(TARGETTYPE)),\
+ $(PERL) $(SRCDIR)/solenv/bin/macosx-change-install-names.pl shl $(LAYER) $(1) &&) \
+ $(if $(filter Library,$(TARGETTYPE)),\
+ otool -l $(1) | grep -A 5 LC_ID_DYLIB \
+ > $(WORKDIR)/LinkTarget/$(2).exports.tmp && \
+ $(NM) -g -P $(1) | cut -d' ' -f1-2 | grep -v U$$ \
+ >> $(WORKDIR)/LinkTarget/$(2).exports.tmp && \
+ $(call gb_Helper_replace_if_different_and_touch,$(WORKDIR)/LinkTarget/$(2).exports.tmp, \
+ $(WORKDIR)/LinkTarget/$(2).exports,$(1)) &&) \
+ :)
+endef
+
+# parameters: 1-linktarget 2-cobjects 3-cxxobjects
+define gb_LinkTarget__command_staticlink
+$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(1) && \
+ $(gb_AR) -rsu $(1) \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(OBJCOBJECTS),$(call gb_ObjCObject_get_target,$(object))) \
+ $(foreach object,$(OBJCXXOBJECTS),$(call gb_ObjCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach object,$(GENOBJCOBJECTS),$(call gb_GenObjCObject_get_target,$(object))) \
+ $(foreach object,$(GENOBJCXXOBJECTS),$(call gb_GenObjCxxObject_get_target,$(object))) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),$(shell cat $(extraobjectlist))) \
+ $(if $(findstring s,$(MAKEFLAGS)),2> /dev/null))
+endef
+
+define gb_LinkTarget__command
+$(call gb_Output_announce,$(2),$(true),LNK,4)
+ $(call gb_Trace_StartRange,$(2),LNK)
+$(if $(filter Library Bundle CppunitTest Executable,$(TARGETTYPE)),$(call gb_LinkTarget__command_dynamiclink,$(1),$(2)))
+$(if $(filter StaticLibrary,$(TARGETTYPE)),$(call gb_LinkTarget__command_staticlink,$(1)))
+ $(call gb_Trace_EndRange,$(2),LNK)
+endef
+
+define gb_LinkTarget_use_system_darwin_frameworks
+$(call gb_LinkTarget_add_libs,$(1),$(foreach fw,$(2),-framework $(fw)))
+$(if $(call gb_LinkTarget__is_merged,$(1)),\
+ $(call gb_LinkTarget_add_libs,$(call gb_Library_get_linktarget,merged),$(foreach fw,$(2),-framework $(fw))))
+endef
+
+
+# Library class
+
+gb_Library_DEFS :=
+gb_Library_TARGETTYPEFLAGS := -dynamiclib -single_module
+gb_Bundle_TARGETTYPEFLAGS := -bundle
+gb_Library_UDK_MAJORVER := 3
+gb_Library_SYSPRE := lib
+gb_Library_UNOVERPRE := $(gb_Library_SYSPRE)uno_
+gb_Library_PLAINEXT := .dylib
+gb_Library_PLAINEXT_FOR_BUILD := .dylib
+gb_Library_DLLEXT := .dylib
+gb_Library_RTEXT := gcc3$(gb_Library_PLAINEXT)
+
+gb_Library_OOOEXT := $(gb_Library_DLLPOSTFIX)$(gb_Library_PLAINEXT)
+gb_Library_UNOEXT := .uno$(gb_Library_PLAINEXT)
+
+gb_Library_FILENAMES := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_RTEXT).$(gb_Library_UDK_MAJORVER)) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(gb_Library_UNOVERPRE)$(lib)$(gb_Library_PLAINEXT).$(gb_Library_UDK_MAJORVER)) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):$(lib)$(gb_Library_UNOEXT)) \
+
+
+gb_Library_LAYER := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):OXT) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):NONE) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):OXT) \
+
+define gb_Library_get_rpath
+$(call gb_LinkTarget__get_installname,$(call gb_Library_get_filename,$(1)),$(call gb_LinkTarget__get_rpath_for_layer,$(call gb_Library_get_layer,$(1))))
+endef
+
+define gb_Library_Library_platform
+$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Library_get_rpath,$(1))
+$(call gb_LinkTarget_get_target,$(2)) : LAYER := $(call gb_Library_get_layer,$(1))
+
+endef
+
+gb_Library__set_soversion_script_platform = $(gb_Library__set_soversion_script)
+
+gb_Library_get_sdk_link_dir = $(WORKDIR)/LinkTarget/Library
+
+gb_Library_get_sdk_link_lib = $(gb_Library_get_versionlink_target)
+
+# bundle is a special kind of library that exists only on Darwin/OSX
+# set the TARGETTYPE to Bundle, and clear install_name(RPATH)
+define gb_Library_Bundle
+$(call gb_Library_Library,$(1))
+$(call gb_LinkTarget_set_targettype,$(call gb_Library_get_linktarget,$(1)),Bundle)
+$(call gb_Library_get_linktarget_target,$(1)) : RPATH :=
+endef
+
+# Executable class
+
+gb_Executable_EXT :=
+gb_Executable_TARGETTYPEFLAGS := -bind_at_load
+
+gb_Executable_LAYER := \
+ $(foreach exe,$(gb_Executable_UREBIN),$(exe):UREBIN) \
+ $(foreach exe,$(gb_Executable_SDK),$(exe):SDKBIN) \
+ $(foreach exe,$(gb_Executable_OOO),$(exe):OOO) \
+ $(foreach exe,$(gb_Executable_NONE),$(exe):NONE) \
+
+
+gb_Executable_get_rpath :=
+
+define gb_Executable_Executable_platform
+$(call gb_LinkTarget_get_target,$(2)) : RPATH :=
+$(call gb_LinkTarget_get_target,$(2)) : LAYER := $(call gb_Executable_get_layer,$(1))
+
+endef
+
+
+# CppunitTest class
+
+gb_CppunitTest_UNITTESTFAILED := $(GBUILDDIR)/platform/unittest-failed-MACOSX.sh
+gb_CppunitTest_PYTHONDEPS := $(call gb_Library_get_target,pyuno_wrapper) $(if $(SYSTEM_PYTHON),,$(call gb_GeneratedPackage_get_target,python3))
+gb_CppunitTest_CPPTESTPRECOMMAND := \
+ $(call gb_Helper_extend_ld_path,$(gb_Library_DLLDIR):$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs)
+gb_CppunitTest_get_filename = libtest_$(1).dylib
+gb_CppunitTest_get_ilibfilename = $(gb_CppunitTest_get_filename)
+gb_CppunitTest_malloc_check := -o "env MallocScribble=1" -o "env MallocPreScribble=1"
+
+define gb_CppunitTest_CppunitTest_platform
+$(call gb_LinkTarget_get_target,$(2)) : RPATH :=
+$(call gb_LinkTarget_get_target,$(2)) : LAYER := NONE
+
+endef
+
+# JunitTest class
+
+ifneq ($(OOO_TEST_SOFFICE),)
+gb_JunitTest_SOFFICEARG:=$(OOO_TEST_SOFFICE)
+else
+ifneq ($(gb_JunitTest_DEBUGRUN),)
+gb_JunitTest_SOFFICEARG:=connect:pipe,name=$(USER)
+else
+gb_JunitTest_SOFFICEARG:=path:$(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice
+endif
+endif
+
+define gb_JunitTest_JunitTest_platform
+$(call gb_JunitTest_get_target,$(1)) : DEFS := \
+ -Dorg.openoffice.test.arg.soffice="$(gb_JunitTest_SOFFICEARG)" \
+ -Dorg.openoffice.test.arg.env=DYLD_LIBRARY_PATH"$$$${DYLD_LIBRARY_PATH+=$$$$DYLD_LIBRARY_PATH}" \
+ -Dorg.openoffice.test.arg.user=$(call gb_Helper_make_url,$(call gb_JunitTest_get_userdir,$(1))) \
+ -Dorg.openoffice.test.arg.workdir=$(call gb_JunitTest_get_userdir,$(1)) \
+
+endef
+
+# PythonTest class
+
+gb_PythonTest_UNITTESTFAILED := $(GBUILDDIR)/platform/unittest-failed-MACOSX.sh
+gb_PythonTest_DEPS := $(call gb_GeneratedPackage_get_target,python3) $(call gb_Package_get_target,python_shell)
+gb_PythonTest_PRECOMMAND := $(gb_Helper_LIBRARY_PATH_VAR)=$${$(gb_Helper_LIBRARY_PATH_VAR):+$$$(gb_Helper_LIBRARY_PATH_VAR):}$(INSTROOT)/$(LIBO_URE_LIB_FOLDER)
+ifneq ($(LIBO_LIB_FOLDER),$(LIBO_URE_LIB_FOLDER))
+gb_PythonTest_PRECOMMAND := $(gb_PythonTest_PRECOMMAND):$(INSTROOT)/$(LIBO_LIB_FOLDER)
+endif
+gb_PythonTest_PRECOMMAND := $(gb_PythonTest_PRECOMMAND):$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs
+
+# UITest class
+
+gb_UITest_DEPS := $(call gb_GeneratedPackage_get_target,python3)
+
+# Module class
+
+define gb_Module_DEBUGRUNCOMMAND
+lldb -f $(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice -- --norestore --nologo \
+ '"--accept=pipe,name=$(USER)\;urp"'
+endef
+
+# InstallModuleTarget class
+
+define gb_InstallModuleTarget_InstallModuleTarget_platform
+$(call gb_InstallModuleTarget_add_defs,$(1),\
+ $(gb_CPUDEFS) \
+ $(gb_OSDEFS) \
+ -DCOMID=gcc3 \
+ -D_gcc3 \
+)
+
+endef
+
+# InstallScript class
+
+gb_InstallScript_EXT := .ins
+
+# CliAssemblyTarget class
+
+gb_CliAssemblyTarget_POLICYEXT :=
+gb_CliAssemblyTarget_get_dll :=
+
+# Extension class
+
+gb_Extension_LICENSEFILE_DEFAULT := $(INSTROOT)/Resources/LICENSE
+
+# UnpackedTarget class
+
+gb_UnpackedTarget_TARFILE_LOCATION := $(TARFILE_LOCATION)
+
+# UnoApiHeadersTarget class
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))
+else
+gb_UnoApiHeadersTarget_select_variant = $(2)
+endif
+
+# UIMenubarTarget class
+
+define gb_UIMenubarTarget__command
+$(call gb_Output_announce,$(2),$(true),UIM,1)
+$(call gb_Trace_StartRange,$(2),UIM)
+$(call gb_ExternalExecutable_get_command,xsltproc) --nonet -o $(1) $(UI_MENUBAR_XSLT) $(3)
+$(call gb_Trace_EndRange,$(2),UIM)
+
+endef
+
+define gb_UIMenubarTarget_UIMenubarTarget_platform
+$(call gb_UIMenubarTarget_get_target,$(1)) : UI_MENUBAR_XSLT := $(SRCDIR)/solenv/bin/macosx_menubar_modification.xsl
+$(call gb_UIMenubarTarget_get_target,$(1)) : $(SRCDIR)/solenv/bin/macosx_menubar_modification.xsl
+$(call gb_UIMenubarTarget_get_target,$(1)) :| $(call gb_ExternalExecutable_get_dependencies,xsltproc)
+
+endef
+
+# Python
+gb_Python_PRECOMMAND := PYTHONPATH="$$PYPATH"
+gb_Python_INSTALLED_EXECUTABLE := $(INSTROOT)/$(LIBO_LIB_FOLDER)/LibreOfficePython.framework/Versions/$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/Resources/Python.app/Contents/MacOS/LibreOfficePython
+# this is passed to gdb as executable when running tests
+gb_Python_INSTALLED_EXECUTABLE_GDB := $(gb_Python_INSTALLED_EXECUTABLE)
+
+include $(GBUILDDIR)/platform/com_GCC_class.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/solaris.mk b/solenv/gbuild/platform/solaris.mk
new file mode 100644
index 000000000..9d18cd913
--- /dev/null
+++ b/solenv/gbuild/platform/solaris.mk
@@ -0,0 +1,357 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+include $(GBUILDDIR)/platform/com_GCC_defs.mk
+
+gb_MKTEMP := mktemp -t gbuild.XXXXXX
+
+ifneq ($(origin AR),default)
+gb_AR := $(AR)
+endif
+
+# do not define SOLARIS - use #ifdef __sun instead
+# -D$(OS) \
+
+gb_OSDEFS := \
+ -DSYSV \
+ -DSUN \
+ -DSUN4 \
+ -D_REENTRANT \
+ -D_POSIX_PTHREAD_SEMANTICS \
+ -D_PTHREADS \
+ -DUNIX \
+ -DUNX \
+ $(PTHREAD_CFLAGS) \
+ $(LFS_CFLAGS) \
+
+gb_CFLAGS := \
+ $(gb_CFLAGS_COMMON) \
+ -fPIC \
+ -Wshadow \
+
+gb_CXXFLAGS := \
+ $(gb_CXXFLAGS_COMMON) \
+ -fPIC \
+ -Wshadow \
+ -Woverloaded-virtual \
+ $(CXXFLAGS_CXX11) \
+
+ifneq ($(strip $(SYSBASE)),)
+gb_CXXFLAGS += --sysroot=$(SYSBASE)
+gb_CFLAGS += --sysroot=$(SYSBASE)
+gb_LinkTarget_LDFLAGS += \
+ -Wl,--sysroot=$(SYSBASE)
+endif
+
+gb_LinkTarget_LDFLAGS += \
+ -L$(SYSBASE)/lib \
+ -L$(SYSBASE)/usr/lib \
+ -Wl,-B,direct \
+ -Wl,-z,defs \
+ -Wl,-z,combreloc \
+
+ifeq ($(HAVE_LD_HASH_STYLE),TRUE)
+gb_LinkTarget_LDFLAGS += \
+ -Wl,--hash-style=$(WITH_LINKER_HASH_STYLE) \
+
+endif
+
+ifneq ($(HAVE_LD_BSYMBOLIC_FUNCTIONS),)
+gb_LinkTarget_LDFLAGS += -Wl,-Bsymbolic-functions
+endif
+
+# sun ld doesn't understand -O1 optimize flag
+gb_LINKEROPTFLAGS :=
+gb_LINKERSTRIPDEBUGFLAGS := -Wl,-zredlocsym -Wl,-znoldynsym
+
+# LinkTarget class
+
+define gb_LinkTarget__get_rpath_for_layer
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_LinkTarget__RPATHS)))
+endef
+
+gb_LinkTarget__RPATHS := \
+ URELIB:\dORIGIN \
+ UREBIN:\dORIGIN \
+ OOO:\dORIGIN \
+ SDKBIN:\dORIGIN/../../program \
+ OXT: \
+ NONE:\dORIGIN/../Library \
+
+gb_LinkTarget_CFLAGS := $(gb_CFLAGS) $(gb_CFLAGS_WERROR)
+gb_LinkTarget_CXXFLAGS := $(gb_CXXFLAGS) $(gb_CFLAGS_WERROR)
+
+# note that `cat $(extraobjectlist)` is needed to build with older gcc versions, e.g. 4.1.2 on SLED10
+# we want to use @$(extraobjectlist) in the long run
+# link with C compiler if there are no C++ files (pyuno_wrapper depends on this)
+define gb_LinkTarget__command_dynamiclink
+$(call gb_Helper_abbreviate_dirs,\
+ $(if $(CXXOBJECTS)$(GENCXXOBJECTS)$(EXTRAOBJECTLISTS),$(gb_CXX),$(gb_CC)) \
+ $(if $(filter Library CppunitTest,$(TARGETTYPE)),$(gb_Library_TARGETTYPEFLAGS)) \
+ $(T_LTOFLAGS) \
+ $(if $(SOVERSIONSCRIPT),-Wl$(COMMA)-soname=$(notdir $(1)) \
+ ) \
+ $(subst \d,$$,$(RPATH)) \
+ $(T_USE_LD) $(T_LDFLAGS) \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),`cat $(extraobjectlist)`) \
+ -Wl$(COMMA)--start-group \
+ $(foreach lib,$(LINKED_STATIC_LIBS),\
+ $(call gb_StaticLibrary_get_target,$(lib))) \
+ $(T_LIBS) \
+ -Wl$(COMMA)--end-group \
+ -Wl$(COMMA)-zrecord \
+ $(patsubst lib%.a,-l%,$(patsubst lib%.so,-l%,$(patsubst %.$(gb_Library_UDK_MAJORVER),%,$(foreach lib,$(LINKED_LIBS),$(call gb_Library_get_filename,$(lib)))))) \
+ -o $(1) \
+ $(if $(SOVERSIONSCRIPT),&& ln -sf ../../program/$(notdir $(1)) $(ILIBTARGET)))
+ $(if $(filter Library,$(TARGETTYPE)), $(call gb_Helper_abbreviate_dirs,\
+ $(READELF) -d $(1) | grep SONAME > $(WORKDIR)/LinkTarget/$(2).exports.tmp; \
+ $(NM) --dynamic --extern-only --defined-only --format=posix $(1) \
+ | cut -d' ' -f1-2 \
+ >> $(WORKDIR)/LinkTarget/$(2).exports.tmp && \
+ $(call gb_Helper_replace_if_different_and_touch,$(WORKDIR)/LinkTarget/$(2).exports.tmp, \
+ $(WORKDIR)/LinkTarget/$(2).exports,$(1))))
+endef
+
+define gb_LinkTarget__command_staticlink
+$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(1) && \
+ $(gb_AR) $(gb_LTOPLUGINFLAGS) -rsu $(1) \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),@$(extraobjectlist)) \
+ $(if $(findstring s,$(MAKEFLAGS)),2> /dev/null))
+endef
+
+define gb_LinkTarget__command
+$(call gb_Output_announce,$(2),$(true),LNK,4)
+ $(call gb_Trace_StartRange,$(2),LNK)
+$(if $(filter Library CppunitTest Executable,$(TARGETTYPE)),$(call gb_LinkTarget__command_dynamiclink,$(1),$(2)))
+$(if $(filter StaticLibrary,$(TARGETTYPE)),$(call gb_LinkTarget__command_staticlink,$(1)))
+ $(call gb_Trace_EndRange,$(2),LNK)
+endef
+
+
+# Library class
+
+gb_Library_DEFS :=
+gb_Library_TARGETTYPEFLAGS := -shared -Wl,-M/usr/lib/ld/map.noexstk -mimpure-text
+gb_Library_UDK_MAJORVER := 3
+gb_Library_SYSPRE := lib
+gb_Library_UNOVERPRE := $(gb_Library_SYSPRE)uno_
+gb_Library_PLAINEXT := .so
+gb_Library_DLLEXT := .so
+gb_Library_RTEXT := gcc3$(gb_Library_PLAINEXT)
+
+gb_Library_OOOEXT := $(gb_Library_DLLPOSTFIX)$(gb_Library_PLAINEXT)
+gb_Library_UNOEXT := .uno$(gb_Library_PLAINEXT)
+
+gb_STDLIBS := \
+ -lm \
+ -lnsl \
+ -lsocket \
+
+gb_Library_FILENAMES := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_RTEXT).$(gb_Library_UDK_MAJORVER)) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(gb_Library_UNOVERPRE)$(lib)$(gb_Library_PLAINEXT).$(gb_Library_UDK_MAJORVER)) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):$(lib)$(gb_Library_UNOEXT)) \
+
+
+gb_Library_LAYER := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):OXT) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):NONE) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):OXT) \
+
+define gb_Library__get_rpath
+$(if $(1),$(strip -Wl,-z,origin '-Wl,-rpath,$(1)' -L$(INSTDIR)/program))
+endef
+
+define gb_Library_get_rpath
+$(call gb_Library__get_rpath,$(call gb_LinkTarget__get_rpath_for_layer,$(call gb_Library_get_layer,$(1))))
+endef
+
+define gb_Library_Library_platform
+$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Library_get_rpath,$(1))
+
+endef
+
+gb_Library__set_soversion_script_platform = $(gb_Library__set_soversion_script)
+
+gb_Library_get_sdk_link_dir = $(INSTDIR)/$(SDKDIRNAME)/lib
+
+gb_Library_get_sdk_link_lib = $(gb_Library_get_versionlink_target)
+
+# Executable class
+
+gb_Executable_EXT :=
+
+gb_Executable_LAYER := \
+ $(foreach exe,$(gb_Executable_UREBIN),$(exe):UREBIN) \
+ $(foreach exe,$(gb_Executable_SDK),$(exe):SDKBIN) \
+ $(foreach exe,$(gb_Executable_OOO),$(exe):OOO) \
+ $(foreach exe,$(gb_Executable_NONE),$(exe):NONE) \
+
+
+define gb_Executable__get_rpath
+$(strip -Wl,-z,origin $(if $(1),'-Wl$(COMMA)-rpath$(COMMA)$(1)') -L$(INSTDIR)/program)
+endef
+
+define gb_Executable_get_rpath
+$(call gb_Executable__get_rpath,$(call gb_LinkTarget__get_rpath_for_layer,$(call gb_Executable_get_layer,$(1))))
+endef
+
+define gb_Executable_Executable_platform
+$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Executable_get_rpath,$(1))
+
+endef
+
+
+# CppunitTest class
+
+gb_CppunitTest_CPPTESTPRECOMMAND := \
+ $(call gb_Helper_extend_ld_path,$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs)
+gb_CppunitTest_get_filename = libtest_$(1).so
+gb_CppunitTest_get_ilibfilename = $(gb_CppunitTest_get_filename)
+
+define gb_CppunitTest_CppunitTest_platform
+$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Library__get_rpath,$(call gb_LinkTarget__get_rpath_for_layer,NONE))
+
+endef
+
+define gb_CppunitTest_postprocess
+$(SRCDIR)/solenv/bin/gdb-core-bt.sh $(1) $(2) $(3)
+endef
+
+# JunitTest class
+
+ifneq ($(OOO_TEST_SOFFICE),)
+gb_JunitTest_SOFFICEARG:=$(OOO_TEST_SOFFICE)
+else
+ifneq ($(gb_JunitTest_DEBUGRUN),)
+gb_JunitTest_SOFFICEARG:=connect:pipe,name=$(USER)
+else
+gb_JunitTest_SOFFICEARG:=path:$(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice
+endif
+endif
+
+define gb_JunitTest_JunitTest_platform
+$(call gb_JunitTest_get_target,$(1)) : DEFS := \
+ -Dorg.openoffice.test.arg.env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \
+ -Dorg.openoffice.test.arg.user=$(call gb_Helper_make_url,$(call gb_JunitTest_get_userdir,$(1))) \
+ -Dorg.openoffice.test.arg.workdir=$(call gb_JunitTest_get_userdir,$(1)) \
+ -Dorg.openoffice.test.arg.postprocesscommand=$(SRCDIR)/solenv/bin/gdb-core-bt.sh \
+ -Dorg.openoffice.test.arg.soffice="$(gb_JunitTest_SOFFICEARG)" \
+
+endef
+
+# PythonTest class
+
+gb_PythonTest_PRECOMMAND := $(gb_CppunitTest_CPPTESTPRECOMMAND)
+
+# Module class
+
+define gb_Module_DEBUGRUNCOMMAND
+OFFICESCRIPT=`mktemp` && \
+printf ". $(INSTROOT)/program/ooenv\\n" > $${OFFICESCRIPT} && \
+printf "gdb --tui $(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice.bin" >> $${OFFICESCRIPT} && \
+printf " -ex \"set args --norestore --nologo '--accept=pipe,name=$(USER);urp;' \"" >> $${OFFICESCRIPT} && \
+printf " -ex \"r\"\\n" >> $${OFFICESCRIPT} && \
+$(SHELL) $${OFFICESCRIPT} && \
+rm $${OFFICESCRIPT}
+endef
+
+# InstallModuleTarget class
+
+define gb_InstallModuleTarget_InstallModuleTarget_platform
+$(call gb_InstallModuleTarget_add_defs,$(1),\
+ $(gb_CPUDEFS) \
+ $(gb_OSDEFS) \
+ -DCOMID=gcc3 \
+ -D_gcc3 \
+)
+
+endef
+
+# InstallScript class
+
+gb_InstallScript_EXT := .ins
+
+# CliAssemblyTarget class
+
+gb_CliAssemblyTarget_POLICYEXT :=
+gb_CliAssemblyTarget_get_dll :=
+
+# Extension class
+
+gb_Extension_LICENSEFILE_DEFAULT := $(INSTROOT)/LICENSE
+
+# UnpackedTarget class
+
+gb_UnpackedTarget_TARFILE_LOCATION := $(TARFILE_LOCATION)
+
+# UnoApiHeadersTarget class
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))
+else
+gb_UnoApiHeadersTarget_select_variant = $(2)
+endif
+
+# UIMenubarTarget class
+
+define gb_UIMenubarTarget__command
+$(call gb_Output_announce,$(2),$(true),UIM,1)
+$(call gb_Trace_StartRange,$(2),UIM)
+cp $(3) $(1)
+$(call gb_Trace_EndRange,$(2),UIM)
+
+endef
+
+gb_UIMenubarTarget_UIMenubarTarget_platform :=
+
+# Python
+gb_Python_PRECOMMAND := PYTHONHOME="$(INSTDIR)/program/python-core-$(PYTHON_VERSION)" PYTHONPATH="$${PYPATH:+$$PYPATH:}$(INSTDIR)/program/python-core-$(PYTHON_VERSION)/lib:$(INSTDIR)/program/python-core-$(PYTHON_VERSION)/lib/lib-dynload:$(INSTDIR)/program"
+gb_Python_INSTALLED_EXECUTABLE := /bin/sh $(INSTROOT)/program/python
+# this is passed to gdb as executable when running tests
+gb_Python_INSTALLED_EXECUTABLE_GDB := $(INSTROOT)/program/python.bin
+
+include $(GBUILDDIR)/platform/com_GCC_class.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/unittest-failed-MACOSX.sh b/solenv/gbuild/platform/unittest-failed-MACOSX.sh
new file mode 100755
index 000000000..049da92b4
--- /dev/null
+++ b/solenv/gbuild/platform/unittest-failed-MACOSX.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+# -*- Mode: sh; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+cat << EOF
+
+Error: a unit test failed, please do one of:
+make $1Test_$2 CPPUNITTRACE="lldb --" # for interactive debugging on macOS
+make $1Test_$2 VALGRIND=memcheck # for memory checking
+
+You can limit the execution to just one particular test by:
+
+EOF
+
+case $1 in
+ Python)
+ cat << EOF
+make $1Test_$2 PYTHON_TEST_NAME="testXYZ" ...above mentioned params...
+
+EOF
+ ;;
+ *)
+ cat << EOF
+make $1Test_$2 CPPUNIT_TEST_NAME="testXYZ" ...above mentioned params...
+
+EOF
+ ;;
+esac
+
+exit 1
+
+# vim: set et sw=4:
diff --git a/solenv/gbuild/platform/unittest-failed-WNT.sh b/solenv/gbuild/platform/unittest-failed-WNT.sh
new file mode 100755
index 000000000..5ace1f0d1
--- /dev/null
+++ b/solenv/gbuild/platform/unittest-failed-WNT.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+# -*- Mode: sh; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+cat << EOF
+
+Error: a unit test failed, please do one of:
+make $1Test_$2 CPPUNITTRACE=TRUE # which is a shortcut for the following line
+make $1Test_$2 CPPUNITTRACE="'$DEVENV' /debugexe" # for interactive debugging in Visual Studio
+make $1Test_$2 CPPUNITTRACE="drmemory -free_max_frames 20" # for memory checking (install Dr.Memory first, and put it to your PATH)
+
+You can limit the execution to just one particular test by:
+
+EOF
+
+case $1 in
+ Python)
+ cat << EOF
+make $1Test_$2 PYTHON_TEST_NAME="testXYZ" ...above mentioned params...
+
+EOF
+ ;;
+ *)
+ cat << EOF
+make $1Test_$2 CPPUNIT_TEST_NAME="testXYZ" ...above mentioned params...
+
+EOF
+ ;;
+esac
+
+exit 1
+
+# vim: set et sw=4:
diff --git a/solenv/gbuild/platform/unittest-failed-default.sh b/solenv/gbuild/platform/unittest-failed-default.sh
new file mode 100755
index 000000000..1e742fd7f
--- /dev/null
+++ b/solenv/gbuild/platform/unittest-failed-default.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+# -*- Mode: sh; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+cat << EOF
+
+Error: a unit test failed, please do one of:
+
+make $1Test_$2 CPPUNITTRACE="gdb --args"
+ # for interactive debugging on Linux
+make $1Test_$2 VALGRIND=memcheck
+ # for memory checking
+make $1Test_$2 DEBUGCPPUNIT=TRUE
+ # for exception catching
+
+You can limit the execution to just one particular test by:
+
+EOF
+
+case $1 in
+ Python)
+ cat << EOF
+make PYTHON_TEST_NAME="testXYZ" ...above mentioned params...
+
+EOF
+ ;;
+ *)
+ cat << EOF
+make CPPUNIT_TEST_NAME="testXYZ" ...above mentioned params...
+
+EOF
+ ;;
+esac
+
+exit 1
+
+# vim: set et sw=4:
diff --git a/solenv/gbuild/platform/unxgcc.mk b/solenv/gbuild/platform/unxgcc.mk
new file mode 100644
index 000000000..94fd8a019
--- /dev/null
+++ b/solenv/gbuild/platform/unxgcc.mk
@@ -0,0 +1,427 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This 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 .
+#
+
+# to block heavy exception handling that try to acquire the solarmutex
+export LO_LEAN_EXCEPTION=1
+
+include $(GBUILDDIR)/platform/com_GCC_defs.mk
+
+gb_MKTEMP := mktemp -t gbuild.XXXXXX
+
+ifneq ($(origin AR),default)
+gb_AR := $(AR)
+endif
+
+gb_OSDEFS := \
+ -D$(OS) \
+ -D_PTHREADS \
+ -DUNIX \
+ -DUNX \
+ $(PTHREAD_CFLAGS) \
+ $(LFS_CFLAGS) \
+
+gb_CFLAGS := \
+ $(gb_CFLAGS_COMMON) \
+ -fPIC \
+ -Wshadow \
+
+# At least libstdc++ needs -pthread when including various C++ headers like <thread>, see
+# <https://gcc.gnu.org/onlinedocs/gcc-8.3.0/libstdc++/manual/manual/using.html
+# #manual.intro.using.flags>:
+ifneq ($(HAVE_LIBSTDCPP),)
+gb_CXX_LINKFLAGS := -pthread
+endif
+# libc++ needs it too
+ifneq ($(HAVE_LIBCPP),)
+gb_CXX_LINKFLAGS := -pthread
+endif
+
+gb_CXXFLAGS := \
+ $(gb_CXXFLAGS_COMMON) \
+ -fPIC \
+ -Wshadow \
+ -Woverloaded-virtual \
+ $(CXXFLAGS_CXX11) \
+ $(gb_CXX_LINKFLAGS) \
+
+
+ifneq ($(strip $(SYSBASE)),)
+gb_CXXFLAGS += --sysroot=$(SYSBASE)
+gb_CFLAGS += --sysroot=$(SYSBASE)
+gb_LinkTarget_LDFLAGS += \
+ -Wl,--sysroot=$(SYSBASE)
+endif
+
+ifeq (,$(DISABLE_DYNLOADING))
+gb_LinkTarget_LDFLAGS += \
+ -Wl,-rpath-link,$(SYSBASE)/lib:$(SYSBASE)/usr/lib \
+ -Wl,-z,combreloc \
+
+endif
+
+ifeq ($(HAVE_LD_HASH_STYLE),TRUE)
+gb_LinkTarget_LDFLAGS += \
+ -Wl,--hash-style=$(WITH_LINKER_HASH_STYLE) \
+
+endif
+
+ifneq ($(HAVE_LD_BSYMBOLIC_FUNCTIONS),)
+gb_LinkTarget_LDFLAGS += -Wl,-Bsymbolic-functions
+endif
+
+gb_LINKEROPTFLAGS := -Wl,-O1
+gb_LINKERSTRIPDEBUGFLAGS := -Wl,-S
+
+# LinkTarget class
+
+define gb_LinkTarget__get_rpath_for_layer
+$(patsubst $(1):%,%,$(filter $(1):%,$(gb_LinkTarget__RPATHS)))
+endef
+
+gb_LinkTarget__RPATHS := \
+ URELIB:\dORIGIN \
+ UREBIN:\dORIGIN \
+ OOO:\dORIGIN \
+ SDKBIN:\dORIGIN/../../program \
+ OXT: \
+ NONE:\dORIGIN/../Library \
+
+gb_LinkTarget_CFLAGS := $(gb_CFLAGS)
+gb_LinkTarget_CXXFLAGS := $(gb_CXXFLAGS)
+
+gb_LinkTarget__cmd_lockfile = $(if $(LOCKFILE),$(LOCKFILE),$(call gb_Executable_get_command,lockfile))
+gb_LinkTarget__Lock := $(WORKDIR)/LinkTarget/link.lock
+
+# No newline or space before endef!
+define gb_LinkTarget__WantLock
+$(if $(strip $(and \
+ $(call gb_CondExeLockfile,$(true)), \
+ $(filter-out Executable/lockfile,$(1)), \
+ $(if $(filter FUZZERS,$(BUILD_TYPE)),,$(DISABLE_DYNLOADING)), \
+ $(filter CppunitTest Executable,$(TARGETTYPE)) \
+ )),$(true))
+endef
+
+# In theory would need to track, if any of the linked objects is C++ code, so for the static build we assume yes :-(
+gb_LinkTarget__NeedsCxxLinker = $(if $(CXXOBJECTS)$(GENCXXOBJECTS)$(EXTRAOBJECTLISTS)$(filter-out XTRUE,X$(ENABLE_RUNTIME_OPTIMIZATIONS)$(DISABLE_DYNLOADING)),$(true))
+
+# note that `cat $(extraobjectlist)` is needed to build with older gcc versions, e.g. 4.1.2 on SLED10
+# we want to use @$(extraobjectlist) in the long run
+# link with C compiler if there are no C++ files (pyuno_wrapper depends on this)
+# But always link with C++ compiler e.g. under -fsanitize=undefined, as sal uses
+# __ubsan_handle_dynamic_type_cache_miss_abort and __ubsan_vptr_type_cache from
+# libclang_rt.ubsan_cxx-x86_64.a, and oosplash links against sal but itself only
+# contains .c sources:
+define gb_LinkTarget__command_dynamiclink
+$(if $(call gb_LinkTarget__WantLock,$2), \
+ echo "$(call gb_Output_announce_str,$(2): wait for lock at $$(date -u),$(true),LNK,5)" ; \
+ $(gb_LinkTarget__cmd_lockfile) -r -1 $(gb_LinkTarget__Lock) ; \
+ echo "$(call gb_Output_announce_str,$(2): got link lock at $$(date -u),$(true),LNK,5)" ; \
+)
++$(call gb_Helper_abbreviate_dirs,\
+ $(if $(call gb_LinkTarget__NeedsCxxLinker),$(or $(T_CXX),$(gb_CXX)) $(gb_CXX_LINKFLAGS),$(or $(T_CC),$(gb_CC))) \
+ $(if $(filter Library CppunitTest,$(TARGETTYPE)),$(gb_Library_TARGETTYPEFLAGS)) \
+ $(T_LTOFLAGS) \
+ $(if $(SOVERSIONSCRIPT),-Wl$(COMMA)--soname=$(notdir $(1)) \
+ -Wl$(COMMA)--version-script=$(SOVERSIONSCRIPT)) \
+ $(subst \d,$$,$(RPATH)) \
+ $(T_USE_LD) $(T_LDFLAGS) $(foreach pre_js,$(T_PREJS), --pre-js $(pre_js)) \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),`cat $(extraobjectlist)`) \
+ $(if $(filter TRUE,$(DISABLE_DYNLOADING)), \
+ -Wl$(COMMA)--start-group \
+ $(patsubst lib%.a,-l%,$(patsubst lib%.so,-l%,$(patsubst %.$(gb_Library_UDK_MAJORVER),%,$(foreach lib,$(LINKED_LIBS),$(call gb_Library_get_filename,$(lib)))))) \
+ $(foreach lib,$(LINKED_STATIC_LIBS),$(call gb_StaticLibrary_get_target,$(lib))) \
+ $(patsubst $(gb_LinkTarget__syslib),%,$(T_LIBS)) \
+ $(if $(call gb_LinkTarget__NeedsCxxLinker),$(T_STDLIBS_CXX)) \
+ -Wl$(COMMA)--end-group \
+ , \
+ -Wl$(COMMA)--start-group \
+ $(foreach lib,$(LINKED_STATIC_LIBS),$(call gb_StaticLibrary_get_target,$(lib))) \
+ $(T_LIBS) \
+ $(if $(call gb_LinkTarget__NeedsCxxLinker),$(T_STDLIBS_CXX)) \
+ -Wl$(COMMA)--end-group \
+ -Wl$(COMMA)--no-as-needed \
+ $(patsubst lib%.a,-l%,$(patsubst lib%.so,-l%,$(patsubst %.$(gb_Library_UDK_MAJORVER),%,$(foreach lib,$(LINKED_LIBS),$(call gb_Library_get_filename,$(lib)))))) \
+ ) \
+ -o $(1) \
+ $(if $(SOVERSIONSCRIPT),&& ln -sf ../../program/$(notdir $(1)) $(ILIBTARGET)) \
+ $(if $(call gb_LinkTarget__WantLock,$(2)),; RC=$$? ; rm -f $(gb_LinkTarget__Lock); if test $$RC -ne 0; then exit $$RC; fi))
+
+$(if $(filter Library,$(TARGETTYPE)), $(call gb_Helper_abbreviate_dirs,\
+ $(READELF) -d $(1) | grep SONAME > $(WORKDIR)/LinkTarget/$(2).exports.tmp; \
+ $(NM) $(gb_LTOPLUGINFLAGS) --dynamic --extern-only --defined-only --format=posix $(1) \
+ | cut -d' ' -f1-2 >> $(WORKDIR)/LinkTarget/$(2).exports.tmp && \
+ $(call gb_Helper_replace_if_different_and_touch,$(WORKDIR)/LinkTarget/$(2).exports.tmp, \
+ $(WORKDIR)/LinkTarget/$(2).exports,$(1))))
+$(if $(and $(filter CppunitTest Executable,$(TARGETTYPE)),$(filter EMSCRIPTEN,$(OS)),$(filter TRUE,$(ENABLE_QT5))), \
+ cp $(QT5_PLATFORMS_SRCDIR)/qtlogo.svg $(QT5_PLATFORMS_SRCDIR)/qtloader.js $(dir $(1)) ; \
+ sed -e 's/@APPNAME@/$(subst $(gb_Executable_EXT),,$(notdir $(1)))/' $(QT5_PLATFORMS_SRCDIR)/wasm_shell.html > $(dir $(1))qt_$(notdir $(1)) ; \
+ ln -sf $(call gb_CustomTarget_get_workdir,static/emscripten_fs_image)/soffice.data $(dir $(1))/soffice.data ; \
+ ln -sf $(call gb_CustomTarget_get_workdir,static/emscripten_fs_image)/soffice.data.js.metadata $(dir $(1))/soffice.data.js.metadata ; \
+)
+endef
+
+define gb_LinkTarget__command_staticlink
+$(call gb_Helper_abbreviate_dirs,\
+ rm -f $(1) && \
+ $(gb_AR) $(gb_LTOPLUGINFLAGS) -rsu $(1) \
+ $(foreach object,$(COBJECTS),$(call gb_CObject_get_target,$(object))) \
+ $(foreach object,$(CXXOBJECTS),$(call gb_CxxObject_get_target,$(object))) \
+ $(foreach object,$(ASMOBJECTS),$(call gb_AsmObject_get_target,$(object))) \
+ $(foreach object,$(GENCOBJECTS),$(call gb_GenCObject_get_target,$(object))) \
+ $(foreach object,$(GENCXXOBJECTS),$(call gb_GenCxxObject_get_target,$(object))) \
+ $(foreach object,$(GENNASMOBJECTS),$(call gb_GenNasmObject_get_target,$(object))) \
+ $(foreach extraobjectlist,$(EXTRAOBJECTLISTS),@$(extraobjectlist)) \
+ $(if $(findstring s,$(MAKEFLAGS)),2> /dev/null))
+endef
+
+define gb_LinkTarget__command
+$(call gb_Output_announce,$(2),$(true),LNK,4)
+ $(call gb_Trace_StartRange,$(2),LNK)
+$(if $(filter CppunitTest Executable,$(TARGETTYPE)),$(call gb_LinkTarget__command_dynamiclink,$(1),$(2)))
+$(if $(filter Library,$(TARGETTYPE)),$(if $(filter TRUE,$(DISABLE_DYNLOADING)),$(call gb_LinkTarget__command_staticlink,$(1)),$(call gb_LinkTarget__command_dynamiclink,$(1),$(2))))
+$(if $(filter StaticLibrary,$(TARGETTYPE)),$(call gb_LinkTarget__command_staticlink,$(1)))
+ $(call gb_Trace_EndRange,$(2),LNK)
+endef
+
+
+# Library class
+
+gb_Library_DEFS :=
+gb_Library_SYSPRE := lib
+gb_Library_UNOVERPRE := $(gb_Library_SYSPRE)uno_
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+
+gb_Library_PLAINEXT := .a
+gb_Library_PLAINEXT_FOR_BUILD := .so
+gb_Library_DLLEXT := .a
+
+else
+
+gb_Library_TARGETTYPEFLAGS := -shared -Wl,-z,noexecstack
+gb_Library_UDK_MAJORVER := 3
+gb_Library_PLAINEXT := .so
+gb_Library_PLAINEXT_FOR_BUILD := .so
+gb_Library_DLLEXT := .so
+
+endif
+
+gb_Library_RTEXT := gcc3$(gb_Library_PLAINEXT)
+
+gb_Library_OOOEXT := $(gb_Library_DLLPOSTFIX)$(gb_Library_PLAINEXT)
+gb_Library_UNOEXT := .uno$(gb_Library_PLAINEXT)
+
+gb_Library_FILENAMES := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_PLAINEXT)) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_OOOEXT)) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):$(lib)$(gb_Library_UNOEXT)) \
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+
+gb_Library_FILENAMES += \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_RTEXT)) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(gb_Library_UNOVERPRE)$(lib)$(gb_Library_PLAINEXT)) \
+
+else
+
+gb_Library_FILENAMES += \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):$(gb_Library_SYSPRE)$(lib)$(gb_Library_RTEXT).$(gb_Library_UDK_MAJORVER)) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(gb_Library_UNOVERPRE)$(lib)$(gb_Library_PLAINEXT).$(gb_Library_UDK_MAJORVER)) \
+
+endif
+
+gb_Library_LAYER := \
+ $(foreach lib,$(gb_Library_OOOLIBS),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_URE),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OOO),$(lib):OOO) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_OXT),$(lib):OXT) \
+ $(foreach lib,$(gb_Library_PLAINLIBS_NONE),$(lib):NONE) \
+ $(foreach lib,$(gb_Library_PRIVATELIBS_URE),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_RTVERLIBS),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):URELIB) \
+ $(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):OXT) \
+
+define gb_Library__get_rpath
+$(if $(1),$(strip -Wl,-z,origin '-Wl,-rpath,$(1)' -Wl,-rpath-link,$(INSTDIR)/program))
+endef
+
+define gb_Library_get_rpath
+$(call gb_Library__get_rpath,$(call gb_LinkTarget__get_rpath_for_layer,$(call gb_Library_get_layer,$(1))))
+endef
+
+define gb_Library_Library_platform
+$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Library_get_rpath,$(1))
+
+endef
+
+gb_Library__set_soversion_script_platform = $(gb_Library__set_soversion_script)
+
+gb_Library_get_sdk_link_dir = $(INSTDIR)/$(SDKDIRNAME)/lib
+
+gb_Library_get_sdk_link_lib = $(gb_Library_get_versionlink_target)
+
+# Executable class
+
+gb_Executable_EXT :=
+
+gb_Executable_LAYER := \
+ $(foreach exe,$(gb_Executable_UREBIN),$(exe):UREBIN) \
+ $(foreach exe,$(gb_Executable_SDK),$(exe):SDKBIN) \
+ $(foreach exe,$(gb_Executable_OOO),$(exe):OOO) \
+ $(foreach exe,$(gb_Executable_NONE),$(exe):NONE) \
+
+
+define gb_Executable__get_rpath
+$(strip -Wl,-z,origin $(if $(1),'-Wl$(COMMA)-rpath$(COMMA)$(1)') -Wl,-rpath-link,$(INSTDIR)/program)
+endef
+
+define gb_Executable_get_rpath
+$(call gb_Executable__get_rpath,$(call gb_LinkTarget__get_rpath_for_layer,$(call gb_Executable_get_layer,$(1))))
+endef
+
+define gb_Executable_Executable_platform
+$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Executable_get_rpath,$(1))
+
+endef
+
+
+# CppunitTest class
+
+gb_CppunitTest_CPPTESTPRECOMMAND := \
+ $(call gb_Helper_extend_ld_path,$(WORKDIR)/UnpackedTarball/cppunit/src/cppunit/.libs)
+gb_CppunitTest_get_filename = libtest_$(1).so
+gb_CppunitTest_get_ilibfilename = $(gb_CppunitTest_get_filename)
+gb_CppunitTest_malloc_check := -ex 'set environment MALLOC_CHECK_=2; set environment MALLOC_PERTURB_=153'
+
+define gb_CppunitTest_CppunitTest_platform
+$(call gb_LinkTarget_get_target,$(2)) : RPATH := $(call gb_Library__get_rpath,$(call gb_LinkTarget__get_rpath_for_layer,NONE))
+
+endef
+
+define gb_CppunitTest_postprocess
+$(SRCDIR)/solenv/bin/gdb-core-bt.sh $(1) $(2) $(3)
+endef
+
+# JunitTest class
+
+ifneq ($(OOO_TEST_SOFFICE),)
+gb_JunitTest_SOFFICEARG:=$(OOO_TEST_SOFFICE)
+else
+ifneq ($(gb_JunitTest_DEBUGRUN),)
+gb_JunitTest_SOFFICEARG:=connect:pipe,name=$(USER)
+else
+gb_JunitTest_SOFFICEARG:=path:$(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice
+endif
+endif
+
+define gb_JunitTest_JunitTest_platform
+$(call gb_JunitTest_get_target,$(1)) : DEFS := \
+ -Dorg.openoffice.test.arg.env=$(gb_Helper_LIBRARY_PATH_VAR)"$$$${$(gb_Helper_LIBRARY_PATH_VAR)+=$$$$$(gb_Helper_LIBRARY_PATH_VAR)}" \
+ -Dorg.openoffice.test.arg.user=$(call gb_Helper_make_url,$(call gb_JunitTest_get_userdir,$(1))) \
+ -Dorg.openoffice.test.arg.workdir=$(call gb_JunitTest_get_userdir,$(1)) \
+ -Dorg.openoffice.test.arg.postprocesscommand=$(SRCDIR)/solenv/bin/gdb-core-bt.sh \
+ -Dorg.openoffice.test.arg.soffice="$(gb_JunitTest_SOFFICEARG)" \
+
+endef
+
+# PythonTest class
+
+gb_PythonTest_PRECOMMAND := $(gb_CppunitTest_CPPTESTPRECOMMAND)
+
+# Module class
+
+define gb_Module_DEBUGRUNCOMMAND
+OFFICESCRIPT=`mktemp` && \
+printf 'if [ -e $(INSTROOT)/program/ooenv ]; then . $(INSTROOT)/program/ooenv; fi\n' > $${OFFICESCRIPT} && \
+printf "PYTHONWARNINGS=default gdb $(INSTROOT)/$(LIBO_BIN_FOLDER)/soffice.bin" >> $${OFFICESCRIPT} && \
+printf " -ex \"set args --norestore --nologo '--accept=pipe,name=$(USER);urp;' %s\"" \
+ "$(subst ","\\\"",$(value gb_DBGARGS))" >> $${OFFICESCRIPT} && \
+$(SHELL) $${OFFICESCRIPT} && \
+rm $${OFFICESCRIPT}
+endef
+
+# InstallModuleTarget class
+
+define gb_InstallModuleTarget_InstallModuleTarget_platform
+$(call gb_InstallModuleTarget_add_defs,$(1),\
+ $(gb_CPUDEFS) \
+ $(gb_OSDEFS) \
+ -DCOMID=gcc3 \
+ -D_gcc3 \
+)
+
+endef
+
+# InstallScript class
+
+gb_InstallScript_EXT := .ins
+
+# CliAssemblyTarget class
+
+gb_CliAssemblyTarget_POLICYEXT :=
+gb_CliAssemblyTarget_get_dll :=
+
+# Extension class
+
+gb_Extension_LICENSEFILE_DEFAULT := $(INSTROOT)/LICENSE
+
+# UnpackedTarget class
+
+gb_UnpackedTarget_TARFILE_LOCATION := $(TARFILE_LOCATION)
+
+# UnoApiHeadersTarget class
+
+ifeq ($(DISABLE_DYNLOADING),TRUE)
+gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))
+else
+gb_UnoApiHeadersTarget_select_variant = $(2)
+endif
+
+# UIMenubarTarget class
+
+define gb_UIMenubarTarget__command
+$(call gb_Output_announce,$(2),$(true),UIM,1)
+$(call gb_Trace_StartRange,$(2),UIM)
+cp $(3) $(1)
+$(call gb_Trace_EndRange,$(2),UIM)
+
+endef
+
+gb_UIMenubarTarget_UIMenubarTarget_platform :=
+
+# Python
+gb_Python_PRECOMMAND := PYTHONHOME="$(INSTDIR)/program/python-core-$(PYTHON_VERSION)" PYTHONPATH="$${PYPATH:+$$PYPATH:}$(INSTDIR)/program/python-core-$(PYTHON_VERSION)/lib:$(INSTDIR)/program/python-core-$(PYTHON_VERSION)/lib/lib-dynload"
+gb_Python_INSTALLED_EXECUTABLE := /bin/sh $(INSTROOT)/program/python
+# this is passed to gdb as executable when running tests
+gb_Python_INSTALLED_EXECUTABLE_GDB := $(INSTROOT)/program/python.bin
+
+include $(GBUILDDIR)/platform/com_GCC_class.mk
+
+# vim: set noet sw=4:
diff --git a/solenv/gbuild/platform/win_compatibility.manifest b/solenv/gbuild/platform/win_compatibility.manifest
new file mode 100644
index 000000000..709f6f3c7
--- /dev/null
+++ b/solenv/gbuild/platform/win_compatibility.manifest
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <!-- Windows 10 -->
+ <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
+ <!-- Windows 8.1 -->
+ <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
+ <!-- Windows 8 -->
+ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+ <!-- Windows 7 -->
+ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+ </application>
+ </compatibility>
+</assembly>
diff --git a/solenv/gbuild/platform/windows.mk b/solenv/gbuild/platform/windows.mk
new file mode 100644
index 000000000..57f906ad1
--- /dev/null
+++ b/solenv/gbuild/platform/windows.mk
@@ -0,0 +1,60 @@
+# -*- 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/.
+#
+
+# to block heavy exception handling that try to acquire the solarmutex
+export LO_LEAN_EXCEPTION=1
+
+gb_LICENSE := license.txt
+gb_README = readme_$(1).txt
+
+gb_Helper_get_rcfile = $(1).ini
+
+gb_Helper_LIBRARY_PATH_VAR := PATH
+
+gb_MKTEMP := mktemp --tmpdir=$(gb_TMPDIR) gbuild.XXXXXX
+
+# define _WIN32_WINNT and WINVER will be derived from it in sdkddkver.h
+# current baseline is Windows 7 (NT 6.1)
+# for _WIN32_IE, if _WIN32_WINNT >= 0x0600 the derived value from
+# sdkddkver.h is sufficient
+gb_WIN_VERSION_DEFS := \
+ -D_WIN32_WINNT=0x0601 \
+ -DWIN32 \
+ -DWNT \
+
+gb_OSDEFS := \
+ $(gb_WIN_VERSION_DEFS) \
+ -DNOMINMAX \
+ $(LFS_CFLAGS) \
+
+gb_Executable_LAYER := \
+ $(foreach exe,$(gb_Executable_UREBIN),$(exe):UREBIN) \
+ $(foreach exe,$(gb_Executable_SDK),$(exe):SDKBIN) \
+ $(foreach exe,$(gb_Executable_OOO),$(exe):OOO) \
+ $(foreach exe,$(gb_Executable_NONE),$(exe):NONE) \
+
+# empty to avoid --warn-undefined-functions
+gb_Library__set_soversion_script_platform =
+
+# default platform and configuration values used by msbuild
+gb_MSBUILD_CONFIG := $(if $(MSVC_USE_DEBUG_RUNTIME),Debug,Release)
+gb_MSBUILD_PLATFORM := $(strip \
+ $(if $(filter INTEL,$(CPUNAME)),Win32) \
+ $(if $(filter X86_64,$(CPUNAME)),x64) \
+ $(if $(filter AARCH64,$(CPUNAME)),ARM64) \
+ )
+gb_MSBUILD_CONFIG_AND_PLATFORM := \
+ /p:Configuration=$(gb_MSBUILD_CONFIG) \
+ /p:Platform=$(gb_MSBUILD_PLATFORM)
+
+gb_CONFIGURE_PLATFORMS := \
+ $(if $(and $(filter i686-pc-cygwin,$(HOST_PLATFORM)),$(filter x86_64-pc-cygwin,$(BUILD_PLATFORM))), \
+ --build=$(HOST_PLATFORM),--build=$(BUILD_PLATFORM)) --host=$(HOST_PLATFORM)
+
+# vim:set noexpandtab:
diff --git a/solenv/gbuild/static.mk b/solenv/gbuild/static.mk
new file mode 100644
index 000000000..faa9a73db
--- /dev/null
+++ b/solenv/gbuild/static.mk
@@ -0,0 +1,247 @@
+# -*- 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/.
+#
+
+# "spezialgelagerter Sonderfall" :-(
+#
+# *******************************************
+# Use gb_DEBUG_STATIC=t to dump various debug info for the static build preparation!
+# Use gb_DEBUG_STATIC=a to abort / error after the dump
+# *******************************************
+#
+# "Generic" comment from the author:
+# My thought was: the dependency info is already there. Can't be too hard to use it for
+# correct static linkage... well it took more than two weeks to hopefully identify all
+# problems / edge cases. Now I can appreciate the usage bin/lo-all-static-libs even more.
+#
+# This code moved a few times to the various gbuild / make phases: Makefile / module
+# setup (in use_(libraries|externals)), post parsing (like now), make "dependency" tree
+# processing. It currently looks like this is the only working option.
+#
+# For static linking, we must collect all depending libraries, externals and statics to
+# be available at link time. And Libraries and externals can use each other. This could
+# be done "in-line", while make processes the dependency tree and would have the correct
+# order, so no separate tree-walking would be needed.
+# It can't be done while reading / processing the modules, as this happens in no order, so
+# depending modules will be missing.
+#
+# Then there is the (gbuild new) concept of plugin libraries. These depend on some loader
+# libraries, like vcl and vclplug_* or gie. For a shared library build, these plugins are
+# just dlopen'ed, but for a static build, any linked binary must also link the plugins, which
+# turns plugins + loaders into a dependency cycle. The implemented solution is to just add
+# plugins to executables, if these depend on a loader library. This results in the additional
+# rule: nothing non-plugin is allowed to depend on a plugins (see gb_Library_set_plugin_for).
+#
+# And we can't add these dependencies while make is already processing the Executables,
+# because these contain additional eval'ed targets, which we can't create in make recipes.
+# This is especially true for externals (see gb_LinkTarget__use_* in RepositoryExternal.mk).
+# We also can't add all plugins to all executables, as we have multiple helper
+# binaries, which are needed early and don't depend on plugins.
+#
+# So the only option left seems to be to walk the dependency tree ourself and expand all
+# the libraries and externals and then add the plugins to the executables. Statics are
+# handled after that, since these won't need extra dependencies not already known.
+# It's a bit fragile in theory, as you can add "gbuild-undetectable" dependencies to any
+# target in the modules, which would need some manual adjustment, but currently that
+# doesn't seem to happen in any breaking way and it works to link multiple Executable
+# with large and small expanded dependency lists.
+#
+# Then there is the special static "components" library, which simply depends on all build
+# components. In theory these could be limited per-module (Writer, Calc, etc.), but currently
+# this is not implemented and instead solenv/bin/native-code.py is used, so actually
+# everything is build and "cleaned up" at link time, which is especially expensive for WASM.
+# That library is currently just used for Emscripten, but could be used generally for
+# static builds.
+#
+# There is already a lot of $(info ...) protected by the already mentioned $(gb_DEBUG_STATIC).
+
+ifeq ($(gb_FULLDEPS),$(true))
+ifeq (,$(gb_PARTIAL_BUILD))
+
+$(foreach lib,$(gb_Library_KNOWNLIBS),$(if $(call gb_Library__get_component,$(lib)), \
+ $(eval $(call gb_Library_use_libraries,components,$(lib)))))
+
+define gb_LinkTarget__add_x_template
+
+# call gb_LinkTarget__add_$(1),linktarget,objects
+define gb_LinkTarget__add_$(1)
+$$(foreach item,$$(2),$$(if $$(filter $$(item),GBUILD_TOUCHED $$(call gb_LinkTarget__get_all_$(1),$$(1))),,
+ $$(if $(gb_DEBUG_STATIC),$$(info $$(call gb_LinkTarget__get_all_$(1)_var,$$(call gb_LinkTarget__get_workdir_linktargetname,$$(1))) += $$(item)))
+ $$(eval $$(call gb_LinkTarget__get_all_$(1)_var,$$(call gb_LinkTarget__get_workdir_linktargetname,$$(1))) += $$(item))
+))
+endef
+
+endef # gb_LinkTarget__add_x_template
+
+ifneq (,$(gb_DEBUG_STATIC))
+$(info $(call gb_LinkTarget__add_x_template,libraries))
+$(info $(call gb_LinkTarget__add_x_template,externals))
+$(info $(call gb_LinkTarget__add_x_template,statics))
+endif
+$(eval $(call gb_LinkTarget__add_x_template,libraries))
+$(eval $(call gb_LinkTarget__add_x_template,externals))
+$(eval $(call gb_LinkTarget__add_x_template,statics))
+
+# call gb_LinkTarget__add_linktargets,linktarget,class,func,objects
+define gb_LinkTarget__add_linktargets
+$(call gb_LinkTarget__add_$(3),$(1),$(4))
+$(foreach item,$(foreach mapped,$(4),$(call gb_$(2)__get_workdir_linktargetname,$(mapped))),
+ $(call gb_LinkTarget__add_libraries,$(1),$(call gb_LinkTarget__get_all_libraries,$(item)))
+ $(call gb_LinkTarget__add_externals,$(1),$(call gb_LinkTarget__get_all_externals,$(item)))
+ $(call gb_LinkTarget__add_statics,$(1),$(call gb_LinkTarget__get_all_statics,$(item)))
+)
+endef
+
+# contains the list of all touched workdir_linktargetname(s)
+gb_LinkTarget__ALL_TOUCHED =
+
+define gb_LinkTarget__add_touch
+$(eval $(call gb_LinkTarget__get_all_libraries_var,$(call gb_LinkTarget__get_workdir_linktargetname,$(1))) += GBUILD_TOUCHED)
+$(eval $(call gb_LinkTarget__get_all_externals_var,$(call gb_LinkTarget__get_workdir_linktargetname,$(1))) += GBUILD_TOUCHED)
+$(eval $(call gb_LinkTarget__get_all_statics_var,$(call gb_LinkTarget__get_workdir_linktargetname,$(1))) += GBUILD_TOUCHED)
+gb_LinkTarget__ALL_TOUCHED += $(1)
+
+endef
+
+define gb_LinkTarget__remove_touch
+$(call gb_LinkTarget__get_all_libraries_var,$(1)) := $(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_libraries,$(1)))
+$(call gb_LinkTarget__get_all_externals_var,$(1)) := $(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_externals,$(1)))
+$(call gb_LinkTarget__get_all_statics_var,$(1)) := $(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_statics,$(1)))
+
+endef
+
+# call gb_LinkTarget__fill_all_deps.linktargetname
+define gb_LinkTarget__fill_all_deps
+$(if $(filter GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_lo_libraries,$(1))),,
+
+ # LO has quite a few dependency loops, so touch first to break them
+ $(call gb_LinkTarget__add_touch,$(1))
+
+ # Add lo libraries
+ $(foreach item,$(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_lo_libraries,$(1))),
+ $(call gb_LinkTarget__fill_all_deps,$(call gb_Library_get_linktarget,$(item)))
+ $(call gb_LinkTarget__add_libraries,$(1),$(call gb_Library__get_all_libraries,$(item)))
+ $(call gb_LinkTarget__add_externals,$(1),$(call gb_Library__get_all_externals,$(item)))
+ $(call gb_LinkTarget__add_statics,$(1),$(call gb_Library__get_all_statics,$(item)))
+ )
+
+ # Add (win32) system libraries
+ $(call gb_LinkTarget__add_libraries,$(1),$(call gb_LinkTarget__get_all_sys_libraries,$(1)))
+
+ # Add externals
+ $(foreach item,$(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_externals,$(1))),
+ $(call gb_LinkTarget__fill_all_deps,$(call gb_ExternalProject__get_workdir_linktargetname,$(item)))
+ $(call gb_LinkTarget__add_libraries,$(1),$(call gb_ExternalProject__get_all_libraries,$(item)))
+ $(call gb_LinkTarget__add_externals,$(1),$(call gb_ExternalProject__get_all_externals,$(item)))
+ $(call gb_LinkTarget__add_statics,$(1),$(call gb_ExternalProject__get_all_statics,$(item)))
+ )
+
+ # Add statics
+ $(foreach item,$(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_statics,$(1))),
+ $(call gb_LinkTarget__fill_all_deps,$(call gb_StaticLibrary_get_linktarget,$(item)))
+ $(call gb_LinkTarget__add_libraries,$(1),$(call gb_StaticLibrary__get_all_libraries,$(item)))
+ $(call gb_LinkTarget__add_externals,$(1),$(call gb_StaticLibrary__get_all_externals,$(item)))
+ $(call gb_LinkTarget__add_statics,$(1),$(call gb_StaticLibrary__get_all_statics,$(item)))
+ )
+
+ $(if $(gb_DEBUG_STATIC),
+ $(info gb_LinkTarget__fill_all_deps libraries for $(call gb_LinkTarget__get_workdir_linktargetname,$(1)) out: $(call gb_LinkTarget__get_all_libraries,$(1)))
+ $(info gb_LinkTarget__fill_all_deps externals for $(call gb_LinkTarget__get_workdir_linktargetname,$(1)) out: $(call gb_LinkTarget__get_all_externals,$(1)))
+ $(info gb_LinkTarget__fill_all_deps statics for $(call gb_LinkTarget__get_workdir_linktargetname,$(1)) out: $(call gb_LinkTarget__get_all_statics,$(1)))
+ )
+)
+
+endef
+
+
+# call gb_LinkTarget__expand_executable,linktarget
+define gb_LinkTarget__expand_executable
+$(call gb_LinkTarget__fill_all_deps,$(1))
+
+# 1. Check if cppuhelper loader for components is requested and add the needed plugin dependences
+# This is a *HACK*, so we don't have to recursively check loader libraries
+# 2. Find any other loader libraries and add the needed plugin dependences
+$(if $(filter cppuhelper,$(filter $(gb_Library_KNOWNLOADERS),$(call gb_LinkTarget__get_all_libraries,$(1)))),
+ $(call gb_LinkTarget__add_linktargets,$(1),Library,libraries,$(call gb_Library__get_plugins,cppuhelper)))
+$(foreach loader,$(filter $(filter-out cppuhelper,$(gb_Library_KNOWNLOADERS)),$(call gb_LinkTarget__get_all_libraries,$(1))),
+ $(call gb_LinkTarget__add_linktargets,$(1),Library,libraries,$(call gb_Library__get_plugins,$(loader))))
+
+$(if $(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_libraries,$(1))),
+ $(eval $(call gb_LinkTarget_use_libraries,$(1),$(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_libraries,$(1))))))
+
+$(if $(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_externals,$(1))),
+ $(eval $(call gb_LinkTarget_use_externals,$(1),$(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_externals,$(1))))))
+
+$(if $(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_statics,$(1))),
+ $(eval $(call gb_LinkTarget_use_static_libraries,$(1),$(filter-out GBUILD_TOUCHED,$(call gb_LinkTarget__get_all_statics,$(1))))))
+
+# Some fixes for the _use_external_project(s) mess
+$(if $(filter icui18n icuuc,$(call gb_LinkTarget__get_all_externals,$(1))),
+ $(call gb_LinkTarget_use_externals,$(1),icudata))
+$(if $(filter orcus-parser,$(call gb_LinkTarget__get_all_externals,$(1))),
+ $(call gb_LinkTarget_use_static_libraries,$(1),boost_filesystem))
+
+$(if $(gb_DEBUG_STATIC),
+ $(info gb_LinkTarget__expand_executable libraries for $(call gb_LinkTarget__get_workdir_linktargetname,$(1)): $(call gb_LinkTarget__get_all_libraries,$(1)))
+ $(info gb_LinkTarget__expand_executable externals for $(call gb_LinkTarget__get_workdir_linktargetname,$(1)): $(call gb_LinkTarget__get_all_externals,$(1)))
+ $(info gb_LinkTarget__expand_executable statics for $(call gb_LinkTarget__get_workdir_linktargetname,$(1)): $(call gb_LinkTarget__get_all_statics,$(1)))
+)
+
+endef
+
+$(foreach lib,$(gb_Library_KNOWNLIBS), \
+ $(eval $(call gb_LinkTarget__fill_all_deps,$(call gb_Library_get_linktarget,$(lib)))))
+$(foreach exec,$(gb_Executable_KNOWN), \
+ $(eval $(call gb_LinkTarget__expand_executable,$(call gb_Executable_get_linktarget,$(exec)))))
+$(foreach workdir_linktargetname,$(gb_LinkTarget__ALL_TOUCHED), \
+ $(eval $(call gb_LinkTarget__remove_touch,$(workdir_linktargetname))))
+
+else # gb_PARTIAL_BUILD
+
+# call gb_LinkTarget__expand_executable_template,class
+define gb_LinkTarget__expand_executable_template
+
+gb_$(1)__get_dep_libraries_target = $$(call gb_LinkTarget_get_dep_libraries_target,$$(call gb_$(1)__get_workdir_linktargetname,$$(1)))
+gb_$(1)__get_dep_externals_target = $$(call gb_LinkTarget_get_dep_externals_target,$$(call gb_$(1)__get_workdir_linktargetname,$$(1)))
+gb_$(1)__get_dep_statics_target = $$(call gb_LinkTarget_get_dep_statics_target,$$(call gb_$(1)__get_workdir_linktargetname,$$(1)))
+
+# call gb_$(1)__has_any_dependencies,item
+define gb_$(1)__has_any_dependencies
+$$(if $$(strip $$(filter-out GBUILD_TOUCHED,
+ $$(call gb_$(1)__get_all_libraries,$$(1))
+ $$(call gb_$(1)__get_all_externals,$$(1))
+ $$(call gb_$(1)__get_all_statics,$$(1)))),$$(1))
+
+endef
+
+# call gb_$(1)__expand_deps,item
+define gb_$(1)__expand_deps
+$$(if $$(call gb_$(1)__has_any_dependencies,$$(1)),
+ $$(if $$(shell cat $$(call gb_$(1)__get_dep_libraries_target,$$(1)) 2>/dev/null),
+ $$(eval $$(call gb_$(1)_use_libraries,$$(1),$$(shell cat $$(call gb_$(1)__get_dep_libraries_target,$$(1))))))
+ $$(if $$(shell cat $$(call gb_$(1)__get_dep_externals_target,$$(1)) 2>/dev/null),
+ $$(eval $$(call gb_$(1)_use_externals,$$(1),$$(shell cat $$(call gb_$(1)__get_dep_externals_target,$$(1))))))
+ $$(if $$(shell cat $$(call gb_$(1)__get_dep_statics_target,$$(1)) 2>/dev/null), \
+ $$(eval $$(call gb_$(1)_use_static_libraries,$$(1),$$(shell cat $$(call gb_$(1)__get_dep_statics_target,$$(1))))))
+)
+
+endef
+
+endef # gb_LinkTarget__expand_executable_template
+
+ifneq (,$(gb_DEBUG_STATIC))
+$(info $(call gb_LinkTarget__expand_executable_template,Executable))
+endif
+$(eval $(call gb_LinkTarget__expand_executable_template,Executable))
+
+$(foreach exec,$(gb_Executable_KNOWN),$(eval $(call gb_Executable__expand_deps,$(exec))))
+
+endif # gb_PARTIAL_BUILD
+endif # gb_FULLDEPS
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/uitest-failed-default.sh b/solenv/gbuild/uitest-failed-default.sh
new file mode 100755
index 000000000..44d229379
--- /dev/null
+++ b/solenv/gbuild/uitest-failed-default.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+# -*- Mode: sh; 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/.
+#
+cat << EOF
+
+Error: a unit test failed:
+
+To rerun just this failed test without all others, use:
+ make UITest_$2
+
+Or to run just a specific test case method, use:
+ make UITest_$2 UITEST_TEST_NAME="Module.ClassName.methodName"
+where
+ Module - the name of the python file (without the .py extension)
+ Class - is the name in the "class Class" declaration
+
+Or to do interactive debugging, run two shells with:
+ LANG=C SAL_USE_VCLPLUGIN=gen make debugrun
+ make gb_UITest_DEBUGRUN=T UITest_$2
+
+The SAL_USE_VCLPLUGIN part is unnecessary if you are running on a kde desktop.
+(The default gtk3 backend has issues with some uitests).
+
+Failing that, put a
+ time.sleep(60)
+in the beginning of the method in the .py file,
+and attach gdb to the running soffice process.
+
+EOF
+
+# In theory, we could add this text, but it really doesn't work very well.
+#
+# Or to do interactive debugging, run two shells with:
+# make debugrun
+# make gb_UITest_DEBUGRUN=T UITest_$2
+
+exit 1
+
+# vim: set et sw=4:
diff --git a/solenv/gbuildtojson/gbuildtojson.cxx b/solenv/gbuildtojson/gbuildtojson.cxx
new file mode 100644
index 000000000..4d60ac787
--- /dev/null
+++ b/solenv/gbuildtojson/gbuildtojson.cxx
@@ -0,0 +1,74 @@
+/* -*- 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/.
+*/
+
+#include <algorithm>
+#include <fstream>
+#include <iostream>
+#include <list>
+#include <map>
+#include <sstream>
+#include <string>
+#include <stdio.h>
+
+int main(int argc, char** argv)
+{
+ const std::string optsintro("--");
+ std::map<std::string, std::string> vartofile;
+ for(int i=1; i < argc; ++i)
+ {
+ const std::string arg(argv[i]);
+ if(arg.substr(0,2) != optsintro)
+ {
+ std::cerr << "Only option args starting with -- allowed." << std::endl;
+ return 1;
+ }
+ const size_t eqpos = arg.find("=", 2);
+ if(eqpos == std::string::npos)
+ {
+ std::cerr << "Only option args assigning with = allowed." << std::endl;
+ return 2;
+ }
+ const std::string argname(arg.substr(2, eqpos-2));
+ vartofile[argname] = arg.substr(eqpos+1, std::string::npos);
+ }
+ std::cout << "{";
+ bool first(true);
+ for(const auto& varandfile : vartofile)
+ {
+ if(first)
+ first =false;
+ else
+ std::cout << "," << std::endl;
+ std::string varupper(varandfile.first);
+ for(auto& c : varupper)
+ if(c != '_')
+ c = c-32;
+ std::ifstream filestream(varandfile.second.c_str());
+ std::stringstream contents;
+ contents << filestream.rdbuf();
+ filestream.close();
+ (void)remove(varandfile.second.c_str());
+ std::string escapedcontents;
+ for(const auto& c : contents.str())
+ {
+ if(c=='\\')
+ escapedcontents += "\\\\";
+ else if(c=='"')
+ escapedcontents += "\\\"";
+ else if(c=='\n')
+ continue;
+ else
+ escapedcontents += c;
+ }
+ std::cout << "\"" << varupper << "\": \"" << escapedcontents << "\"";
+ }
+ std::cout << "}" << std::endl;
+ return 0;
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/solenv/gcc-wrappers/g++.cxx b/solenv/gcc-wrappers/g++.cxx
new file mode 100644
index 000000000..6b352e64c
--- /dev/null
+++ b/solenv/gcc-wrappers/g++.cxx
@@ -0,0 +1,29 @@
+/* -*- 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/.
+*/
+
+#include "wrapper.hxx"
+
+int main(int argc, char* argv[])
+{
+ std::vector<std::string> rawargs(argv + 1, argv + argc);
+
+ std::string env_prefix; // defaults to REAL_
+ bool verbose = false;
+ std::string args = processccargs(rawargs, env_prefix, verbose);
+
+ std::string command = getexe(env_prefix + "CXX");
+ std::string flags = getexe(env_prefix + "CXX_FLAGS", true);
+ args.insert(0, flags.empty() ? std::string() : flags + " ");
+
+ setupccenv();
+
+ return startprocess(command, args, verbose);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/solenv/gcc-wrappers/gcc.cxx b/solenv/gcc-wrappers/gcc.cxx
new file mode 100644
index 000000000..05dff957e
--- /dev/null
+++ b/solenv/gcc-wrappers/gcc.cxx
@@ -0,0 +1,29 @@
+/* -*- 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/.
+*/
+
+#include "wrapper.hxx"
+
+int main(int argc, char* argv[])
+{
+ std::vector<std::string> rawargs(argv + 1, argv + argc);
+
+ std::string env_prefix; // defaults to REAL_
+ bool verbose = false;
+ std::string args = processccargs(rawargs, env_prefix, verbose);
+
+ std::string command = getexe(env_prefix + "CC");
+ std::string flags = getexe(env_prefix + "CC_FLAGS", true);
+ args.insert(0, flags.empty() ? std::string() : flags + " ");
+
+ setupccenv();
+
+ return startprocess(command, args, verbose);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/solenv/gcc-wrappers/wrapper.cxx b/solenv/gcc-wrappers/wrapper.cxx
new file mode 100644
index 000000000..c84fd4990
--- /dev/null
+++ b/solenv/gcc-wrappers/wrapper.cxx
@@ -0,0 +1,332 @@
+/* -*- 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/.
+*/
+
+#include "wrapper.hxx"
+
+#define WIN32_LEAN_AND_MEAN
+
+#include <windows.h>
+
+#define BUFLEN 2048
+
+std::string getexe(std::string exename, bool maybeempty) {
+ char* cmdbuf;
+ size_t cmdlen;
+ _dupenv_s(&cmdbuf,&cmdlen,exename.c_str());
+ if(!cmdbuf) {
+ if (maybeempty) {
+ return std::string();
+ }
+ std::cout << "Error " << exename << " not defined. Did you forget to source the environment?" << std::endl;
+ exit(1);
+ }
+ std::string command(cmdbuf);
+ free(cmdbuf);
+ return command;
+}
+
+void setupccenv() {
+ // Set-up library path
+ std::string libpath="LIB=";
+ char* libbuf;
+ size_t liblen;
+ _dupenv_s(&libbuf,&liblen,"ILIB");
+ if (libbuf == nullptr) {
+ std::cerr << "No environment variable ILIB" << std::endl;
+ std::exit(EXIT_FAILURE);
+ }
+ libpath.append(libbuf);
+ free(libbuf);
+ if(_putenv(libpath.c_str())<0) {
+ std::cerr << "Error: could not export LIB" << std::endl;
+ exit(1);
+ }
+
+ // Set-up include path
+ std::string includepath="INCLUDE=.";
+ char* incbuf;
+ size_t inclen;
+ _dupenv_s(&incbuf,&inclen,"SOLARINC");
+ if (incbuf == nullptr) {
+ std::cerr << "No environment variable SOLARINC" << std::endl;
+ std::exit(EXIT_FAILURE);
+ }
+ std::string inctmp(incbuf);
+ free(incbuf);
+
+ // 2 = strlen("-I")
+ for(size_t pos=0,len=0;pos<inctmp.length();) {
+ while (pos != inctmp.length() && inctmp[pos] == ' ') {
+ ++pos;
+ }
+ size_t endpos=inctmp.find(" -I",pos+1);
+ if(endpos==std::string::npos)
+ endpos=inctmp.length();
+ len=endpos-pos;
+
+ while(len>0&&inctmp[pos+len-1]==' ')
+ --len;
+
+ if(len>2) {
+ includepath.append(";");
+ includepath.append(inctmp,pos+2,len-2);
+ }
+ pos=endpos;
+ }
+ if(_putenv(includepath.c_str())<0) {
+ std::cerr << "Error: could not export INCLUDE" << std::endl;
+ exit(1);
+ }
+}
+
+std::string processccargs(const std::vector<std::string>& rawargs, std::string &env_prefix, bool &verbose)
+{
+ // default env var prefix
+ env_prefix = "REAL_";
+ verbose = false;
+ bool env_prefix_next_arg = false;
+
+ // suppress the msvc banner
+ std::string args=" -nologo";
+ // TODO: should these options be enabled globally?
+ args.append(" -EHsc");
+ const char *const pDebugRuntime(getenv("MSVC_USE_DEBUG_RUNTIME"));
+ if (pDebugRuntime && !strcmp(pDebugRuntime, "TRUE"))
+ args.append(" -MDd");
+ else
+ args.append(" -MD");
+ args.append(" -Gy");
+ args.append(" -Ob1 -Oxs -Oy-");
+
+ std::string linkargs;
+ bool block_linkargs = false;
+
+ // Instead of using synced PDB access (-FS), use individual PDB files based on output.
+ // In fact, simply use -Z7, which doesn't use PDB files at all and writes all debug into the .obj file.
+ const char *const pEnvIndividualPDBs(getenv("MSVC_USE_INDIVIDUAL_PDBS"));
+ const bool bIndividualPDBs = (pEnvIndividualPDBs && !strcmp(pEnvIndividualPDBs, "TRUE"));
+ const char *const pEnvEnableZ7Debug(getenv("ENABLE_Z7_DEBUG"));
+ const bool bEnableZ7Debug = (pEnvEnableZ7Debug && !strcmp(pEnvEnableZ7Debug, "TRUE")) || bIndividualPDBs;
+
+ for(std::vector<std::string>::const_iterator i = rawargs.begin(); i != rawargs.end(); ++i) {
+ if (env_prefix_next_arg)
+ {
+ env_prefix = *i;
+ env_prefix_next_arg = false;
+ continue;
+ }
+
+ args.append(" ");
+ if(*i == "-o") {
+ // TODO: handle more than just exe output
+ ++i;
+ size_t dot=(*i).find_last_of(".");
+ if(!(*i).compare(dot+1,3,"obj") || !(*i).compare(dot+1,1,"o"))
+ {
+ args.append("-Fo");
+ args.append(*i);
+ }
+ else if(!(*i).compare(dot+1,3,"exe"))
+ {
+ args.append("-Fe");
+ args.append(*i);
+ }
+ else if(!(*i).compare(dot+1,3,"dll"))
+ { // apparently cl.exe has no flag for dll?
+ linkargs.append(" -dll -out:");
+ linkargs.append(*i);
+ }
+ else if (dot == std::string::npos)
+ {
+ args.append("-Fe");
+ args.append(*i + ".exe");
+ }
+ else
+ {
+ std::cerr << "unknown -o argument - please adapt gcc-wrapper for \""
+ << (*i) << "\"" << std::endl;
+ exit(1);
+ }
+ }
+ else if(*i == "-g" || !(*i).compare(0,5,"-ggdb")) {
+ if(!bEnableZ7Debug)
+ {
+ args.append("-Zi");
+ args.append(" -FS");
+ }
+ else
+ {
+ // ccache doesn't work with -Zi, the -link -debug for linking will create a final PDB
+ args.append("-Z7");
+ }
+ }
+ else if(!(*i).compare(0,2,"-D")) {
+ // need to re-escape strings for preprocessor
+ std::string str = *i;
+ for(size_t pos=str.find("\""); pos!=std::string::npos; pos=str.find("\"",pos)) {
+ str.replace(pos,0,"\\");
+ pos+=2;
+ }
+ args.append(str);
+ }
+ else if(!(*i).compare(0,2,"-L")) {
+ linkargs.append(" -LIBPATH:"+(*i).substr(2));
+ }
+ else if(!(*i).compare(0,2,"-l") && (*i).compare(0,5,"-link")) {
+ linkargs.append(" "+(*i).substr(2)+".lib");
+ }
+ else if(!(*i).compare(0,5,"-def:") || !(*i).compare(0,5,"/def:")) {
+ // why are we invoked with /def:? cl.exe should handle plain
+ // "foo.def" by itself
+ linkargs.append(" " + *i);
+ }
+ else if(!(*i).compare(0,12,"-fvisibility") || *i == "-fPIC") {
+ //TODO: drop other gcc-specific options
+ }
+ else if(!(*i).compare(0,4,"-Wl,")) {
+ //TODO: drop other gcc-specific options
+ }
+ else if(*i == "-c") {
+ args.append("-c");
+ // If -c is specified, there will be no linking anyway,
+ // and passing -link with -c stops ccache from caching.
+ block_linkargs = true;
+ }
+ else if(*i == "-Werror")
+ args.append("-WX");
+ else if (*i == "--wrapper-print-cmdline")
+ verbose = true;
+ else
+ {
+ size_t pos = i->find("=");
+ if (0 == i->compare(0, pos, "--wrapper-env-prefix"))
+ {
+ if (pos == std::string::npos)
+ env_prefix_next_arg = true;
+ else if (pos + 1 == i->length())
+ {
+ // bailout - missing arg
+ env_prefix_next_arg = true;
+ break;
+ }
+ else
+ env_prefix = i->substr(pos + 1);
+ }
+ else
+ args.append(*i);
+ }
+ }
+
+ if (env_prefix_next_arg)
+ {
+ std::cerr << "wrapper-env-prefix needs an argument!" << std::endl;
+ exit(1);
+ }
+
+ if(!block_linkargs) {
+ // apparently these must be at the end
+ // otherwise configure tests may fail
+ // note: always use -debug so a PDB file is created
+ args.append(" -link -debug ");
+ args.append(linkargs);
+ }
+
+ return args;
+}
+
+int startprocess(std::string command, std::string args, bool verbose)
+{
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ SECURITY_ATTRIBUTES sa;
+
+ HANDLE childout_read;
+ HANDLE childout_write;
+
+ memset(&sa,0,sizeof(sa));
+ memset(&si,0,sizeof(si));
+ memset(&pi,0,sizeof(pi));
+
+ sa.nLength=sizeof(sa);
+ sa.bInheritHandle=TRUE;
+
+ if(!CreatePipe(&childout_read,&childout_write,&sa,0)) {
+ std::cerr << "Error: could not create stdout pipe" << std::endl;
+ exit(1);
+ }
+
+ si.cb=sizeof(si);
+ si.dwFlags |= STARTF_USESTDHANDLES;
+ si.hStdOutput=childout_write;
+ si.hStdError=childout_write;
+
+ // support ccache
+ size_t pos=command.find("ccache ");
+ size_t len = strlen("ccache ");
+ if(pos == std::string::npos) {
+ pos=command.find("ccache.exe ");
+ len = strlen("ccache.exe ");
+ }
+ if(pos != std::string::npos) {
+ args.insert(0,command.substr(pos+len));
+ command=command.substr(0,pos+len-1);
+ }
+
+ auto cmdline = "\"" + command + "\" " + args;
+
+ if (verbose)
+ std::cerr << "CMD= " << command << " " << args << std::endl;
+
+ // Commandline may be modified by CreateProcess
+ char* cmdlineBuf=_strdup(cmdline.c_str());
+
+ if(!CreateProcess(nullptr, // Process Name
+ cmdlineBuf, // Command Line
+ nullptr, // Process Handle not Inheritable
+ nullptr, // Thread Handle not Inheritable
+ TRUE, // Handles are Inherited
+ 0, // No creation flags
+ nullptr, // Environment for process
+ nullptr, // Use same starting directory
+ &si, // Startup Info
+ &pi) // Process Information
+ ) {
+ auto const e = GetLastError();
+ std::cerr << "Error: could not create process \"" << cmdlineBuf << "\": " << e << std::endl;
+ exit(1);
+ }
+
+ // if you don't close this the process will hang
+ CloseHandle(childout_write);
+
+ // Get Process output
+ char buffer[BUFLEN];
+ DWORD readlen, writelen, ret;
+ HANDLE stdout_handle=GetStdHandle(STD_OUTPUT_HANDLE);
+ while(true) {
+ int success=ReadFile(childout_read,buffer,BUFLEN,&readlen,nullptr);
+ // check if the child process has exited
+ if(GetLastError()==ERROR_BROKEN_PIPE)
+ break;
+ if(!success) {
+ std::cerr << "Error: could not read from subprocess stdout" << std::endl;
+ exit(1);
+ }
+ if(readlen!=0) {
+ WriteFile(stdout_handle,buffer,readlen,&writelen,nullptr);
+ }
+ }
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ GetExitCodeProcess(pi.hProcess, &ret);
+ CloseHandle(pi.hThread);
+ CloseHandle(pi.hProcess);
+ return int(ret);
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/solenv/gcc-wrappers/wrapper.hxx b/solenv/gcc-wrappers/wrapper.hxx
new file mode 100644
index 000000000..d68ab90c9
--- /dev/null
+++ b/solenv/gcc-wrappers/wrapper.hxx
@@ -0,0 +1,28 @@
+/* -*- 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/.
+*/
+
+#ifndef INCLUDED_SOLENV_GCC_WRAPPERS_WRAPPER_HXX
+#define INCLUDED_SOLENV_GCC_WRAPPERS_WRAPPER_HXX
+
+#include <string>
+#include <iostream>
+#include <vector>
+
+std::string getexe(std::string exename, bool maybeempty = false);
+
+void setupccenv();
+
+std::string processccargs(const std::vector<std::string>& rawargs, std::string& env_prefix,
+ bool& verbose);
+
+int startprocess(std::string command, std::string args, bool verbose);
+
+#endif // INCLUDED_SOLENV_GCC_WRAPPERS_WRAPPER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/solenv/gdb/autoload.template b/solenv/gdb/autoload.template
new file mode 100644
index 000000000..fdbcce200
--- /dev/null
+++ b/solenv/gdb/autoload.template
@@ -0,0 +1,32 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import importlib
+import os.path
+import sys
+
+import gdb
+
+PP_PATH = os.path.normpath('%PYTHONDIR%')
+
+if gdb.current_objfile():
+ if PP_PATH not in sys.path:
+ sys.path.insert(0, PP_PATH)
+
+for mod in '%MODULES%'.split():
+ module = importlib.import_module('libreoffice.' + mod)
+ module.register_pretty_printers(gdb.current_objfile())
+
+try:
+ import boost
+ boost.register_pretty_printers(gdb)
+except:
+ pass
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/boost/__init__.py b/solenv/gdb/boost/__init__.py
new file mode 100644
index 000000000..353ee3b09
--- /dev/null
+++ b/solenv/gdb/boost/__init__.py
@@ -0,0 +1,32 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+# GDB pretty printers for Boost.
+#
+# Copyright (C) 2012 Red Hat, Inc., David Tardon <dtardon@redhat.com>
+#
+# This file is part of boost-gdb-printers.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import boost.optional
+import boost.ptr_container
+import boost.smart_ptr
+import boost.unordered
+
+def register_pretty_printers(obj):
+ boost.optional.register_pretty_printers(obj)
+ boost.ptr_container.register_pretty_printers(obj)
+ boost.smart_ptr.register_pretty_printers(obj)
+ boost.unordered.register_pretty_printers(obj)
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/boost/lib/__init__.py b/solenv/gdb/boost/lib/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/solenv/gdb/boost/lib/__init__.py
diff --git a/solenv/gdb/boost/lib/unordered.py b/solenv/gdb/boost/lib/unordered.py
new file mode 100644
index 000000000..ee58d0481
--- /dev/null
+++ b/solenv/gdb/boost/lib/unordered.py
@@ -0,0 +1,129 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+# Helper classes for working with Boost.Unordered.
+#
+# Copyright (C) 2012 Red Hat, Inc., David Tardon <dtardon@redhat.com>
+#
+# This file is part of boost-gdb-printers.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import gdb
+import six
+
+class Unordered(object):
+ '''Common representation of Boost.Unordered types'''
+
+ def __init__(self, value, extractor):
+ self.value = value
+ self.extractor = extractor
+ self.node_type = self._node_type()
+
+ def __len__(self):
+ table = self.value['table_']
+ if table['buckets_']:
+ return int(table['size_'])
+ else:
+ return 0
+
+ def __iter__(self):
+ table = self.value['table_']
+ buckets = table['buckets_']
+ if buckets:
+ first = table['cached_begin_bucket_']
+ last = buckets + table['bucket_count_']
+ else:
+ first = last = None
+ return self._iterator(first, last, self.node_type, self.extractor)
+
+ def empty(self):
+ return not self.value['table_']['buckets_']
+
+ def _node_type(self):
+ hash_table = self.value['table_'].type.fields()[0]
+ assert hash_table.is_base_class
+ hash_buckets = hash_table.type.fields()[0]
+ assert hash_buckets.is_base_class
+ node_type = gdb.lookup_type("%s::node" % hash_buckets.type)
+ assert node_type != None
+ return node_type
+
+ class _iterator(six.Iterator):
+ '''Iterator for Boost.Unordered types'''
+
+ def __init__(self, first_bucket, last_bucket, node_type, extractor):
+ self.bucket = first_bucket
+ self.last_bucket = last_bucket
+ self.node = self.bucket
+ self.node_type = node_type
+ self.value_type = self._value_type()
+ self.extractor = extractor
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if self.node:
+ self.node = self.node.dereference()['next_']
+
+ # we finished the current bucket: go on to the next non-empty one
+ if not self.node:
+ while not self.node and self.bucket != self.last_bucket:
+ self.bucket += 1
+ self.node = self.bucket.dereference()['next_']
+
+ # sorry, no node available
+ if not self.node or self.node == self.bucket:
+ raise StopIteration()
+
+ mapped = self._value()
+ return (self.extractor.key(mapped), self.extractor.value(mapped))
+
+ def _value(self):
+ assert self.node != self.bucket # bucket node has no value
+ assert self.node != None
+ node = self.node.dereference().cast(self.node_type)
+ return node['data_'].cast(self.value_type)
+
+ def _value_type(self):
+ value_base = self.node_type.fields()[1]
+ assert value_base.is_base_class
+ return value_base.type.template_argument(0)
+
+class Map(Unordered):
+
+ def __init__(self, value):
+ super(Map, self).__init__(value, self._extractor())
+
+ class _extractor(object):
+
+ def key(self, node):
+ return node['first']
+
+ def value(self, node):
+ return node['second']
+
+class Set(Unordered):
+
+ def __init__(self, value):
+ super(Set, self).__init__(value, self._extractor())
+
+ class _extractor(object):
+
+ def key(self, node):
+ return None
+
+ def value(self, node):
+ return node
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/boost/optional.py b/solenv/gdb/boost/optional.py
new file mode 100644
index 000000000..08297254e
--- /dev/null
+++ b/solenv/gdb/boost/optional.py
@@ -0,0 +1,56 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+# GDB pretty printers for Boost.Optional.
+#
+# Copyright (C) 2012 Red Hat, Inc., David Tardon <dtardon@redhat.com>
+#
+# This file is part of boost-gdb-printers.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import gdb
+
+import boost.util.printing as printing
+
+class OptionalPrinter:
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ if self.value['m_initialized']:
+ data = self.value['m_storage']['dummy_']['data']
+ ptr_type = self.value.type.template_argument(0).pointer()
+ return "%s %s" % (self.typename, data.cast(ptr_type).dereference())
+ else:
+ return "empty " + self.typename
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ if printer != None:
+ return
+
+ printer = printing.Printer("boost.optional")
+
+ printer.add('boost::optional', OptionalPrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/boost/ptr_container.py b/solenv/gdb/boost/ptr_container.py
new file mode 100644
index 000000000..425d812f5
--- /dev/null
+++ b/solenv/gdb/boost/ptr_container.py
@@ -0,0 +1,248 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+# GDB pretty printers for Boost.Pointer Container.
+#
+# Copyright (C) 2012 Red Hat, Inc., David Tardon <dtardon@redhat.com>
+#
+# This file is part of boost-gdb-printers.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import gdb
+import six
+
+from boost.lib.unordered import Map, Set
+
+import boost.util.printing as printing
+
+std = None
+
+class PtrStdPrinterBase(object):
+
+ def __init__(self, typename, value, seq_tag):
+ self._import_std()
+ self.typename = typename
+ self.value = value
+
+ # (try to) init printer of underlying std sequence and get elements
+ printer = self._get_sequence_printer(seq_tag)
+ if printer:
+ seq = value['c_']
+ if str(seq.type.strip_typedefs()).startswith('std::__debug::'):
+ seq_typename = 'std::__debug::%s' % seq_tag
+ else:
+ seq_typename = 'std::%s' % seq_tag
+ self.sequence = list(printer(seq_typename, seq).children())
+ else:
+ self.sequence = None
+
+ def to_string(self):
+ if self.sequence != None:
+ length = len(self.sequence)
+ if length:
+ return "%s %s" % (self.typename, self.print_size(length))
+ else:
+ return "empty %s" % self.typename
+ else:
+ return "opaque %s" % self.typename
+
+ def children(self):
+ return self._iterator(self.sequence, self.value.type.template_argument(0))
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, sequence, type):
+ self.impl = iter(sequence)
+ self.type = type.pointer()
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ (index, value) = six.advance_iterator(self.impl)
+ return (index, value.cast(self.type).dereference())
+
+ def _import_std(self):
+ global std
+ if not std:
+ try:
+ import libstdcxx.v6.printers
+ std = libstdcxx.v6.printers
+ except:
+ pass
+
+ def _get_sequence_printer(self, typename):
+ if typename == "deque":
+ return std.StdDequePrinter
+ if typename == "list":
+ return std.StdListPrinter
+ if typename == "map":
+ return std.StdMapPrinter
+ if typename == "set":
+ return std.StdSetPrinter
+ if typename == "vector":
+ return std.StdVectorPrinter
+
+class PtrSequencePrinter(PtrStdPrinterBase):
+
+ def __init__(self, typename, value, seq_tag):
+ super(PtrSequencePrinter, self).__init__(typename, value, seq_tag)
+
+ def print_size(self, size):
+ return "of length %s" % size
+
+ def display_hint(self):
+ return 'array'
+
+class PtrSetPrinter(PtrStdPrinterBase):
+
+ def __init__(self, typename, value):
+ super(PtrSetPrinter, self).__init__(typename, value, 'set')
+
+ def print_size(self, size):
+ return "with %s elements" % size
+
+ def display_hint(self):
+ return 'array'
+
+class PtrMapPrinter(PtrStdPrinterBase):
+
+ def __init__(self, typename, value):
+ super(PtrMapPrinter, self).__init__(typename, value, 'map')
+
+ def children(self):
+ type = self.value.type
+ return self._iterator(self.sequence, type.template_argument(0), type.template_argument(1))
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, sequence, key_type, value_type):
+ self.impl = iter(sequence)
+ self.key_type = key_type
+ self.value_type = value_type.pointer()
+ self.key = True
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ (index, value) = six.advance_iterator(self.impl)
+ if self.key:
+ value = value.cast(self.key_type)
+ else:
+ value = value.cast(self.value_type).dereference()
+ self.key = not self.key
+ return (index, value)
+
+ def display_hint(self):
+ return 'map'
+
+ def print_size(self, size):
+ return "with %s elements" % (size / 2)
+
+class PtrBoostPrinterBase(object):
+
+ def __init__(self, typename, value, container, iterator, value_type):
+ self.typename = typename
+ self.impl = container(value['c_'])
+ self.iterator = iterator
+ self.value_type = value_type.pointer()
+
+ def to_string(self):
+ if self.impl.empty():
+ return "empty " + self.typename
+ else:
+ return "%s with %s elements" % (self.typename, len(self.impl))
+
+ def children(self):
+ return self.iterator(iter(self.impl), self.value_type)
+
+class PtrUnorderedMapPrinter(PtrBoostPrinterBase):
+
+ def __init__(self, typename, value):
+ super(PtrUnorderedMapPrinter, self).__init__(typename, value, Map, self._iterator,
+ value.type.template_argument(1))
+
+ def display_hint(self):
+ return 'map'
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, impl, value_type):
+ self.impl = impl
+ self.step = True
+ self.value = None
+ self.value_type = value_type
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if self.step:
+ self.value = six.advance_iterator(self.impl)
+ value = self.value[0]
+ else:
+ value = self.value[1].cast(self.value_type).dereference()
+ self.step = not self.step
+ return ("", value)
+
+class PtrUnorderedSetPrinter(PtrBoostPrinterBase):
+
+ def __init__(self, typename, value):
+ super(PtrUnorderedSetPrinter, self).__init__(typename, value, Set, self._iterator,
+ value.type.template_argument(0))
+
+ def display_hint(self):
+ return 'array'
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, impl, value_type):
+ self.impl = impl
+ self.value_type = value_type
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ return ("", six.advance_iterator(self.impl)[1].cast(self.value_type).dereference())
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ if printer != None:
+ return
+
+ printer = printing.Printer("boost.ptr_container")
+
+ printer.add('boost::ptr_deque', (lambda t, v: PtrSequencePrinter(t, v, "deque")))
+ printer.add('boost::ptr_list', (lambda t, v: PtrSequencePrinter(t, v, "list")))
+ printer.add('boost::ptr_map', PtrMapPrinter)
+ printer.add('boost::ptr_multimap', PtrMapPrinter)
+ printer.add('boost::ptr_multiset', PtrSetPrinter)
+ printer.add('boost::ptr_set', PtrSetPrinter)
+ printer.add('boost::ptr_unordered_map', PtrUnorderedMapPrinter)
+ printer.add('boost::ptr_unordered_multimap', PtrUnorderedMapPrinter)
+ printer.add('boost::ptr_unordered_multiset', PtrUnorderedSetPrinter)
+ printer.add('boost::ptr_unordered_set', PtrUnorderedSetPrinter)
+ printer.add('boost::ptr_vector', (lambda t, v: PtrSequencePrinter(t, v, "vector")))
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/boost/smart_ptr.py b/solenv/gdb/boost/smart_ptr.py
new file mode 100644
index 000000000..60d88278a
--- /dev/null
+++ b/solenv/gdb/boost/smart_ptr.py
@@ -0,0 +1,76 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+# GDB pretty printers for Boost.Smart Ptr.
+#
+# Copyright (C) 2012 Red Hat, Inc., David Tardon <dtardon@redhat.com>
+#
+# This file is part of boost-gdb-printers.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import gdb
+
+import boost.util.printing as printing
+
+
+class SmartPtrPrinter:
+ """Prints smart pointers based on Boost.SmartPtr"""
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ if self.value['px']:
+ print_object = gdb.parameter('print object')
+ value = self.value['px'].dereference()
+ if print_object:
+ dynamic_type = self.value['px'].dynamic_type
+ value = self.value['px'].cast(dynamic_type).dereference()
+ return "%s %s" % (self.typename, value)
+ else:
+ return "empty %s" % (self.typename)
+
+class WeakPtrPrinter:
+ """Prints boost::weak_ptr instances"""
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ value = self.value['px']
+ return "%s %s" % (self.typename, value)
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ if printer != None:
+ return
+
+ printer = printing.Printer("boost.smart_ptr")
+
+ printer.add('boost::shared_ptr', SmartPtrPrinter)
+ # printer.add('boost::shared_array', SmartPtrPrinter)
+ printer.add('boost::weak_ptr', WeakPtrPrinter)
+ printer.add('boost::scoped_ptr', SmartPtrPrinter)
+ # printer.add('boost::scoped_array', SmartPtrPrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/boost/unordered.py b/solenv/gdb/boost/unordered.py
new file mode 100644
index 000000000..2c5672185
--- /dev/null
+++ b/solenv/gdb/boost/unordered.py
@@ -0,0 +1,112 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+# GDB pretty printers for Boost.Unordered.
+#
+# Copyright (C) 2012 Red Hat, Inc., David Tardon <dtardon@redhat.com>
+#
+# This file is part of boost-gdb-printers.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import gdb
+import six
+
+from boost.lib.unordered import Map, Set
+
+import boost.util.printing as printing
+
+class PrinterBase(object):
+ '''Contains common functionality for printing Boost.Unordered types'''
+
+ def __init__(self, typename, value, container, iterator):
+ self.typename = typename
+ self.impl = container(value)
+ self.iterator = iterator
+
+ def to_string(self):
+ if self.impl.empty():
+ return "empty " + self.typename
+ else:
+ return "%s with %s elements" % (self.typename, len(self.impl))
+
+ def children(self):
+ return self.iterator(iter(self.impl))
+
+class UnorderedMapPrinter(PrinterBase):
+
+ def __init__(self, typename, value):
+ super(UnorderedMapPrinter, self).__init__(typename, value, Map, self._iterator)
+
+ def display_hint(self):
+ return 'map'
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, impl):
+ self.impl = impl
+ self.value = None
+ self.step = True
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if self.step:
+ self.value = six.advance_iterator(self.impl)
+ value = self.value[0]
+ else:
+ value = self.value[1]
+ self.step = not self.step
+ return ("", value)
+
+class UnorderedSetPrinter(PrinterBase):
+
+ def __init__(self, typename, value):
+ super(UnorderedSetPrinter, self).__init__(typename, value, Set, self._iterator)
+
+ def display_hint(self):
+ return 'array'
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, impl):
+ self.impl = impl
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ return ("", six.advance_iterator(self.impl)[1])
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ if printer != None:
+ return
+
+ printer = printing.Printer("boost.unordered")
+
+ printer.add('boost::unordered_map', UnorderedMapPrinter)
+ printer.add('boost::unordered_multimap', UnorderedMapPrinter)
+ printer.add('boost::unordered_multiset', UnorderedSetPrinter)
+ printer.add('boost::unordered_set', UnorderedSetPrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/boost/util/__init__.py b/solenv/gdb/boost/util/__init__.py
new file mode 100644
index 000000000..e7992304d
--- /dev/null
+++ b/solenv/gdb/boost/util/__init__.py
@@ -0,0 +1,3 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/boost/util/compatibility.py b/solenv/gdb/boost/util/compatibility.py
new file mode 100644
index 000000000..e704b1992
--- /dev/null
+++ b/solenv/gdb/boost/util/compatibility.py
@@ -0,0 +1,32 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+# Compatibility with older versions of GDB.
+#
+# Copyright (C) 2012 Red Hat, Inc., David Tardon <dtardon@redhat.com>
+#
+# This file is part of boost-gdb-printers.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+import gdb
+
+use_gdb_printing = True
+try:
+ import gdb.printing
+except ImportError:
+ use_gdb_printing = False
+
+use_lazy_string = hasattr(gdb.Value, 'lazy_string')
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/boost/util/printing.py b/solenv/gdb/boost/util/printing.py
new file mode 100644
index 000000000..22bf29f80
--- /dev/null
+++ b/solenv/gdb/boost/util/printing.py
@@ -0,0 +1,137 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+# Printer interface adaptor.
+#
+# Copyright (C) 2012 Red Hat, Inc., David Tardon <dtardon@redhat.com>
+#
+# This file is part of boost-gdb-printers.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+try:
+ from collections.abc import Mapping
+except:
+ from collections import Mapping
+import gdb
+import re
+import six
+
+from boost.util.compatibility import use_gdb_printing
+
+class SimplePrinter(object):
+
+ def __init__(self, name, function):
+ self.name = name
+ self.function = function
+ self.enabled = True
+
+ def invoke(self, val):
+ if not self.enabled:
+ return None
+ return self.function(self.name, val)
+
+class NameLookup(Mapping):
+
+ def __init__(self):
+ self.map = {}
+ self.name_regex = re.compile(r'^([\w:]+)(<.*>)?')
+
+ def add(self, name, printer):
+ self.map[name] = printer
+
+ def __len__(self):
+ return len(self.map)
+
+ def __getitem__(self, type):
+ typename = self._basic_type(type)
+ if typename and typename in self.map:
+ return self.map[typename]
+ return None
+
+ def __iter__(self):
+ return self.map
+
+ def _basic_type(self, type):
+ basic_type = self.basic_type(type)
+ if basic_type:
+ match = self.name_regex.match(basic_type)
+ if match:
+ return match.group(1)
+ return None
+
+ @staticmethod
+ def basic_type(type):
+ if type.code == gdb.TYPE_CODE_REF:
+ type = type.target()
+ type = type.unqualified().strip_typedefs()
+ return type.tag
+
+class FunctionLookup(Mapping):
+
+ def __init__(self):
+ self.map = {}
+
+ def add(self, test, printer):
+ self.map[test] = printer
+
+ def __len__(self):
+ return len(self.map)
+
+ def __getitem__(self, type):
+ for (test, printer) in six.iteritems(self.map):
+ if test(type):
+ return printer
+ return None
+
+ def __iter__(self):
+ return self.map
+
+class Printer(object):
+
+ def __init__(self, name):
+ self.name = name
+ self.subprinters = []
+ self.name_lookup = NameLookup()
+ self.func_lookup = FunctionLookup()
+ self.enabled = True
+
+ def add(self, name, function, lookup = None):
+ printer = SimplePrinter(name, function)
+ self.subprinters.append(printer)
+ if not lookup:
+ self.name_lookup.add(name, printer)
+ else:
+ self.func_lookup.add(lookup, printer)
+
+
+ def __call__(self, val):
+ printer = self.name_lookup[val.type]
+ if not printer:
+ printer = self.func_lookup[val.type]
+
+ if printer:
+ return printer.invoke(val)
+ return None
+
+def register_pretty_printer(printer, obj):
+ '''Registers printer with objfile'''
+
+ if use_gdb_printing:
+ gdb.printing.register_pretty_printer(obj, printer)
+ else:
+ if obj is None:
+ obj = gdb
+ obj.pretty_printers.append(printer)
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/__init__.py b/solenv/gdb/libreoffice/__init__.py
new file mode 100644
index 000000000..06b4ade34
--- /dev/null
+++ b/solenv/gdb/libreoffice/__init__.py
@@ -0,0 +1,10 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/basegfx.py b/solenv/gdb/libreoffice/basegfx.py
new file mode 100644
index 000000000..c14968c91
--- /dev/null
+++ b/solenv/gdb/libreoffice/basegfx.py
@@ -0,0 +1,196 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import gdb
+import six
+
+from libreoffice.util import printing
+
+class B2DRangePrinter(object):
+ '''Prints a B2DRange object.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+ # inject children() func dynamically
+ if not self._isEmpty():
+ self.children = self._children
+
+ def to_string(self):
+ if self._isEmpty():
+ return "empty %s" % (self.typename)
+ else:
+ return "%s" % (self.typename)
+
+ def _isEmpty(self):
+ return (self.value['maRangeX']['mnMinimum'] > self.value['maRangeX']['mnMaximum']
+ or self.value['maRangeY']['mnMinimum'] > self.value['maRangeY']['mnMaximum'])
+
+ def _children(self):
+ left = self.value['maRangeX']['mnMinimum']
+ top = self.value['maRangeY']['mnMinimum']
+ right = self.value['maRangeX']['mnMaximum']
+ bottom = self.value['maRangeY']['mnMaximum']
+ children = [('left', left), ('top', top), ('right', right), ('bottom', bottom)]
+ return children.__iter__()
+
+class B2DPolygonPrinter(object):
+ '''Prints a B2DPolygon object.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+ # inject children() func dynamically
+ if not self._isEmpty():
+ self.children = self._children
+
+ def to_string(self):
+ if self._isEmpty():
+ return "empty %s" % (self.typename)
+ else:
+ return "%s %s" % ('bezier curve' if self._hasCurves() else 'straight line',
+ self.typename)
+
+ def _count(self):
+ # It's a call into the inferior (being debugged) process.
+ # Will not work with core dumps and can cause a deadlock.
+ return int(gdb.parse_and_eval(
+ "(('basegfx::B2DPolygon' *) {})->count()".format(self.value.address)))
+
+ def _isEmpty(self):
+ return self._count() == 0
+
+ def _hasCurves(self):
+ # It's a call into the inferior (being debugged) process.
+ # Will not work with core dumps and can cause a deadlock.
+ return int(gdb.parse_and_eval(
+ "(('basegfx::B2DPolygon' *) {})->areControlPointsUsed()".format(self.value.address))) != 0
+
+ def _children(self):
+ if self._hasCurves():
+ return self._bezierIterator(self._count(), self.value)
+ else:
+ return self._plainIterator(self._count(), self.value)
+
+ class _plainIterator(six.Iterator):
+ def __init__(self, count, value):
+ self.count = count
+ self.value = value
+ self.index = 0
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if self.index >= self.count:
+ raise StopIteration()
+ points = self.value['mpPolygon']['m_pimpl'].dereference()['m_value']['maPoints']['maVector']
+ currPoint = (points['_M_impl']['_M_start'] + self.index).dereference()
+ # doesn't work?
+ #currPoint = gdb.parse_and_eval(
+ # '((basegfx::B2DPolygon*)%d)->getB2DPoint(%d)' % (
+ # self.value.address, self.index))
+ self.index += 1
+ return ('point %d' % (self.index-1),
+ '(%15f, %15f)' % (currPoint['mfX'], currPoint['mfY']))
+
+ class _bezierIterator(six.Iterator):
+ def __init__(self, count, value):
+ self.count = count
+ self.value = value
+ self.index = 0
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if self.index >= self.count:
+ raise StopIteration()
+ points = self.value['mpPolygon']['m_pimpl'].dereference()['m_value']['maPoints']['maVector']
+ currPoint = (points['_M_impl']['_M_start'] + self.index).dereference()
+ #currPoint = gdb.parse_and_eval(
+ # '((basegfx::B2DPolygon*)%d)->getB2DPoint(%d)' % (
+ # self.value.address, self.index))
+
+ # It's a call into the inferior (being debugged) process.
+ # Will not work with core dumps and can cause a deadlock.
+ prevControl = gdb.parse_and_eval(
+ "(('basegfx::B2DPolygon' *) {})->getPrevControlPoint({:d})".format(self.value.address, self.index))
+ # It's a call into the inferior (being debugged) process.
+ # Will not work with core dumps and can cause a deadlock.
+ nextControl = gdb.parse_and_eval(
+ "(('basegfx::B2DPolygon' *) {})->getNextControlPoint({:d})".format(self.value.address, self.index))
+ self.index += 1
+ return ('point %d' % (self.index-1),
+ 'p: (%15f, %15f) c-1: (%15f, %15f) c1: (%15f, %15f)' %
+ (currPoint['mfX'], currPoint['mfY'],
+ prevControl['mfX'], prevControl['mfY'],
+ nextControl['mfX'], nextControl['mfY']))
+
+class B2DPolyPolygonPrinter(object):
+ '''Prints a B2DPolyPolygon object.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ if self._isEmpty():
+ return "empty %s" % (self.typename)
+ else:
+ return "%s %s with %d sub-polygon(s)" % ('closed' if self._isClosed() else 'open',
+ self.typename,
+ self._count())
+
+ def _count(self):
+ # It's a call into the inferior (being debugged) process.
+ # Will not work with core dumps and can cause a deadlock.
+ return int(gdb.parse_and_eval(
+ "(('basegfx::B2DPolyPolygon' *) {})->count()".format(self.value.address)))
+
+ def _isClosed(self):
+ # It's a call into the inferior (being debugged) process.
+ # Will not work with core dumps and can cause a deadlock.
+ return int(gdb.parse_and_eval(
+ "(('basegfx::B2DPolyPolygon' *) {})->isClosed()".format(self.value.address))) != 0
+
+ def _isEmpty(self):
+ return self._count() == 0
+
+ def children(self):
+ if self.value['mpPolyPolygon']['m_pimpl'].type.code in (gdb.TYPE_CODE_PTR, gdb.TYPE_CODE_MEMBERPTR):
+ if self.value['mpPolyPolygon']['m_pimpl']:
+ try:
+ vector = self.value['mpPolyPolygon']['m_pimpl'].dereference()['m_value']['maPolygons']
+ import libstdcxx.v6.printers as std
+ return std.StdVectorPrinter("std::vector", vector).children()
+ except RuntimeError:
+ gdb.write("Cannot access memory at address " + str(self.value['mpPolyPolygon']['m_pimpl'].address))
+
+ return None
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ printer = printing.Printer('libreoffice/basegfx')
+
+ # basic types
+ printer.add('basegfx::B2DRange', B2DRangePrinter)
+ printer.add('basegfx::B2DPolygon', B2DPolygonPrinter)
+ printer.add('basegfx::B2DPolyPolygon', B2DPolyPolygonPrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
+
diff --git a/solenv/gdb/libreoffice/cppu.py b/solenv/gdb/libreoffice/cppu.py
new file mode 100644
index 000000000..5114dbe12
--- /dev/null
+++ b/solenv/gdb/libreoffice/cppu.py
@@ -0,0 +1,156 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import six
+
+from libreoffice.util import printing
+from libreoffice.util.uno import TypeClass, make_uno_type, uno_cast
+
+class UnoAnyPrinter(object):
+ '''Prints UNO any'''
+
+ def __init__(self, typename, value):
+ self.value = value
+ self.typename = typename.replace('com::sun::star::', '')
+
+ def to_string(self):
+ type_desc = self.value['pType']
+ assert type_desc
+ type = make_uno_type(type_desc.dereference())
+ assert type
+ if type_desc.dereference()['eTypeClass'] == TypeClass.VOID:
+ return ('%s(%s)' % (self.typename, type.tag))
+ else:
+ ptr = self.value['pData']
+ assert ptr
+ return ('%s(%s: %s)' % (self.typename, type.tag, str(uno_cast(type, ptr).dereference())))
+
+class UnoReferencePrinter(object):
+ '''Prints reference to a UNO interface'''
+
+ def __init__(self, typename, value):
+ self.value = value
+ self.typename = typename.replace('com::sun::star::', '')
+
+ def to_string(self):
+ iface = self.value['_pInterface']
+ if iface:
+ try:
+ return '%s to (%s) %s' % (self.typename, str(iface.dynamic_type), str(iface))
+ except:
+ # fallback for potential problem:
+ # base class 'com::sun::star::uno::XInterface' is ambiguous
+ return '%s to (XInterface) %s' % (self.typename, str(iface))
+
+ else:
+ return "empty %s" % self.typename
+
+class UnoSequencePrinter(object):
+ '''Prints UNO Sequence'''
+
+ class iterator(six.Iterator):
+ '''Sequence iterator'''
+
+ def __init__(self, first, size):
+ self.item = first
+ self.size = size
+ self.count = 0
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if self.count == self.size:
+ raise StopIteration
+ count = self.count
+ self.count = self.count + 1
+ elem = self.item.dereference()
+ self.item = self.item + 1
+ return ('[%d]' % count, elem)
+
+
+ def __init__(self, typename, value):
+ self.value = value
+ self.typename = typename.replace('com::sun::star::', '')
+
+ def to_string(self):
+ pimpl = self.value['_pSequence']
+ if pimpl:
+ impl = pimpl.dereference()
+ elems = impl['nElements']
+ if elems == 0:
+ return "empty %s" % self.typename
+ else:
+ return "%s of length %d" % (self.typename, elems)
+ else:
+ return "uninitialized %s" % self.typename
+
+ def children(self):
+ pimpl = self.value['_pSequence']
+ if pimpl:
+ impl = pimpl.dereference()
+ elemtype = self.value.type.template_argument(0)
+ elements = impl['elements'].cast(elemtype.pointer())
+ return self.iterator(elements, int(impl['nElements']))
+ else:
+ # TODO is that the best thing to do here?
+ return None
+
+ def display_hint(self):
+ if self.value['_pSequence']:
+ return 'array'
+ else:
+ return None
+
+class UnoTypePrinter(object):
+ '''Prints UNO Type'''
+
+ def __init__(self, typename, value):
+ self.value = value
+ self.typename = typename.replace('com::sun::star::', '')
+
+ def to_string(self):
+ uno = make_uno_type(self.value)
+ if uno:
+ return "%s %s" % (self.typename, uno.tag)
+ # return "%s %s" % (self.typename, uno.typename)
+ else:
+ return "invalid %s" % self.typename
+
+class CppuThreadpoolThreadPoolPrinter(object):
+ '''Prints cppu_threadpool::ThreadPool objects (a hack to avoid infinite recursion through sal.RtlReferencePrinter when printing an rtl::Reference<cppu_threadpool::ThreadPool> whose std::list<cppu_threadpool::WaitingThread*> m_lstThreads member, via rtl::Reference<cppu_threadpool::ORequestThread> thread member, via rtl::Reference<cppu_threadpool::ThreadPool> m_aThreadPool member, has a circular reference back)'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return '%s@%s' % (self.typename, self.value.address)
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ printer = printing.Printer("libreoffice/cppu")
+
+ # basic UNO stuff
+ printer.add('_uno_Any', UnoAnyPrinter)
+ printer.add('com::sun::star::uno::Any', UnoAnyPrinter)
+ printer.add('com::sun::star::uno::Reference', UnoReferencePrinter)
+ printer.add('com::sun::star::uno::Sequence', UnoSequencePrinter)
+ printer.add('com::sun::star::uno::Type', UnoTypePrinter)
+ printer.add('cppu_threadpool::ThreadPool', CppuThreadpoolThreadPoolPrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/sal.py b/solenv/gdb/libreoffice/sal.py
new file mode 100644
index 000000000..8dcfaebe6
--- /dev/null
+++ b/solenv/gdb/libreoffice/sal.py
@@ -0,0 +1,167 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import gdb
+import gdb.types
+import six
+
+from libreoffice.util import printing
+from libreoffice.util.string import StringPrinterHelper
+
+class RtlStringPrinter(StringPrinterHelper):
+ '''Prints rtl_String or rtl_uString'''
+
+ def __init__(self, typename, val, encoding = None):
+ super(RtlStringPrinter, self).__init__(typename, val, encoding)
+
+ def data(self):
+ return self.val['buffer'].address
+
+ def length(self):
+ return self.val['length']
+
+class StringPrinter(StringPrinterHelper):
+ '''Prints rtl:: strings and string buffers'''
+
+ def __init__(self, typename, val, encoding = None):
+ super(StringPrinter, self).__init__(typename, val, encoding)
+
+ def valid(self):
+ return self.val['pData']
+
+ def data(self):
+ assert self.val['pData']
+ return self.val['pData'].dereference()['buffer'].address
+
+ def length(self):
+ assert self.val['pData']
+ return self.val['pData'].dereference()['length']
+
+class SalUnicodePrinter(StringPrinterHelper):
+ '''Prints a sal_Unicode*'''
+
+ def __init__(self, typename, val):
+ super(SalUnicodePrinter, self).__init__(typename, val, 'utf-16')
+
+ def data(self):
+ return self.val
+
+ @staticmethod
+ def query(type):
+ type = type.unqualified()
+ if type.code != gdb.TYPE_CODE_PTR:
+ return False
+ return str(type.target()) == 'sal_Unicode'
+
+class RtlReferencePrinter(object):
+ '''Prints rtl::Reference'''
+
+ def __init__(self, typename, val):
+ self.typename = typename
+ self.val = val
+
+ def to_string(self):
+ pointee = self.val['m_pBody']
+ if pointee:
+ return '%s to %s' % (self.typename, str(pointee))
+ else:
+ return "empty %s" % self.typename
+
+class OslFileStatusPrinter(object):
+ '''Prints oslFileStatus'''
+
+ def __init__(self, typename, val):
+ self.val = val
+
+ def to_string(self):
+ osl_file_type = gdb.lookup_type('oslFileType').strip_typedefs()
+ fields_to_enum_val = gdb.types.make_enum_dict(osl_file_type)
+
+ etype = self.field_val_if_valid('eType')
+ if etype is not None:
+ pretty_etype = '<unknown type>' # in case it's not one of the fields
+
+ for field_name, field_val in six.iteritems(fields_to_enum_val):
+ if etype == field_val:
+ pretty_etype = self.pretty_file_type(field_name)
+ else:
+ pretty_etype = '<invalid type>'
+
+ file_url = self.field_val_if_valid('ustrFileURL')
+ if file_url is not None:
+ pretty_file_url = str(file_url.dereference())
+ else:
+ pretty_file_url = '<invalid file url>'
+
+ pretty_file_status = pretty_etype + ': ' + pretty_file_url
+
+ # for links append the link target if valid
+ if etype == fields_to_enum_val['osl_File_Type_Link']:
+ link_target = self.field_val_if_valid('ustrLinkTargetURL')
+ if link_target is None:
+ pretty_link_target = '<invalid link target>'
+ else:
+ pretty_link_target = str(link_target.dereference())
+
+ pretty_file_status += ' -> ' + pretty_link_target
+
+ return pretty_file_status
+
+ def pretty_file_type(self, file_type_name):
+ if file_type_name != 'osl_File_Type_Regular':
+ return file_type_name.replace('osl_File_Type_', '').lower()
+ else:
+ return 'file' # regular is not very descriptive, file is better
+
+ def field_val_if_valid(self, field):
+ mask_for_field = {'eType': 0x00000001,
+ 'uAttributes': 0x00000002,
+ 'aCreationTime': 0x00000010,
+ 'aAccessTime': 0x00000020,
+ 'aModifyTime': 0x00000040,
+ 'uFileSize': 0x00000080,
+ 'ustrFileName': 0x00000100,
+ 'ustrFileURL': 0x00000200,
+ 'ustrLinkTargetURL': 0x00000400}
+
+ valid_fields = self.val['uValidFields']
+ if valid_fields & mask_for_field[field]:
+ return self.val[field]
+ else:
+ return None
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ printer = printing.Printer("libreoffice/sal")
+
+ # strings and string buffers
+ printer.add('_rtl_String', RtlStringPrinter)
+ printer.add('_rtl_uString', lambda name, val: RtlStringPrinter(name,
+ val, 'utf-16le'))
+ printer.add('rtl::OString', StringPrinter)
+ printer.add('rtl::OUString', lambda name, val: StringPrinter(name, val, 'utf-16'))
+ printer.add('rtl::OStringBuffer', StringPrinter)
+ printer.add('rtl::OUStringBuffer', lambda name, val: StringPrinter(name, val, 'utf-16'))
+ printer.add('sal_Unicode', SalUnicodePrinter, SalUnicodePrinter.query)
+
+ # other stuff
+ printer.add('rtl::Reference', RtlReferencePrinter)
+ printer.add('_oslFileStatus', OslFileStatusPrinter)
+
+ return printer
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/svl.py b/solenv/gdb/libreoffice/svl.py
new file mode 100644
index 000000000..f82b02a7b
--- /dev/null
+++ b/solenv/gdb/libreoffice/svl.py
@@ -0,0 +1,93 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import gdb
+import six
+
+from libreoffice.util import printing
+
+class ItemSetPrinter(object):
+ '''Prints SfxItemSets'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ whichranges = self.which_ranges()
+ return "SfxItemSet of pool %s with parent %s and Which ranges: %s" \
+ % (self.value['m_pPool'], self.value['m_pParent'], whichranges)
+
+ def which_ranges(self):
+ whichranges = self.value['m_pWhichRanges']['m_pairs']
+ whichranges_cnt = self.value['m_pWhichRanges']['m_size']
+ whiches = []
+ for index in range(whichranges_cnt):
+ whiches.append((int(whichranges[index]['first']), int(whichranges[index]['second'])))
+ return whiches
+
+ def children(self):
+ whichranges = self.which_ranges()
+ size = 0
+ whichids = []
+ for (whichfrom, whichto) in whichranges:
+ size += whichto - whichfrom + 1
+ whichids += [which for which in range(whichfrom, whichto+1)]
+ return self._iterator(self.value['m_ppItems'], size, whichids)
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, data, count, whichids):
+ self.data = data
+ self.whichids = whichids
+ self.count = count
+ self.pos = 0
+ self._check_invariant()
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if self.pos == self.count:
+ raise StopIteration()
+
+ which = self.whichids[self.pos]
+ elem = self.data[self.pos]
+ self.pos = self.pos + 1
+
+ self._check_invariant()
+ if (elem == -1):
+ elem = "(Invalid)"
+ elif (elem != 0):
+ # let's try how well that works...
+ elem = elem.cast(elem.dynamic_type).dereference()
+ return (str(which), elem)
+
+ def _check_invariant(self):
+ assert self.count >= 0
+ assert self.data
+ assert self.pos >= 0
+ assert self.pos <= self.count
+ assert len(self.whichids) == self.count
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ printer = printing.Printer("libreoffice/svl")
+
+ printer.add('SfxItemSet', ItemSetPrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/sw.py b/solenv/gdb/libreoffice/sw.py
new file mode 100644
index 000000000..707d0a425
--- /dev/null
+++ b/solenv/gdb/libreoffice/sw.py
@@ -0,0 +1,305 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import six
+import gdb
+from libreoffice.util import printing
+
+class SwPositionPrinter(object):
+ '''Prints SwPosition.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ node = self.value['nNode']['m_pNode'].dereference();
+ block = node['m_pBlock'].dereference();
+ nodeindex = block['nStart'] + node['m_nOffset']
+ offset = self.value['nContent']['m_nIndex']
+ return "%s (node %d, offset %d)" % (self.typename, nodeindex, offset)
+
+class SwNodeIndexPrinter(object):
+ '''Prints SwNodeIndex.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ node = self.value['m_pNode'].dereference();
+ block = node['m_pBlock'].dereference();
+ nodeindex = block['nStart'] + node['m_nOffset']
+ return "%s (node %d)" % (self.typename, nodeindex)
+
+class SwIndexPrinter(object):
+ '''Prints SwIndex.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ offset = self.value['m_nIndex']
+ return "%s (offset %d)" % (self.typename, offset)
+
+class SwPaMPrinter(object):
+ '''Prints SwPaM.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+ def children(self):
+ next_ = self.value['m_pNext']
+ prev = self.value['m_pPrev']
+ point = self.value['m_pPoint'].dereference()
+ mark = self.value['m_pMark'].dereference()
+ children = [ ( 'point', point), ( 'mark', mark ) ]
+ if next_ != self.value.address:
+ children.append(("next", next_))
+ if prev != self.value.address:
+ children.append(("prev", prev))
+ return children.__iter__()
+
+# apparently the purpose of this is to suppress printing all the extra members
+# that SwCursor and SwUnoCursor add
+class SwUnoCursorPrinter(SwPaMPrinter):
+ '''Prints SwUnoCursor.'''
+
+class SwRectPrinter(object):
+ '''Prints SwRect.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+ def children(self):
+ point = self.value['m_Point']
+ size = self.value['m_Size']
+ children = [ ( 'point', point), ( 'size', size ) ]
+ return children.__iter__()
+
+class MarkBasePrinter(object):
+ '''Prints sw::mark::MarkBase.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+ def children(self):
+ m = self.value.cast(self.value.dynamic_type)
+ return [ ( v, m[ v ] )
+ for v in ( 'm_aName', 'm_pPos1', 'm_pPos2' ) ].__iter__()
+
+class SwXTextRangeImplPrinter(object):
+ '''Prints SwXTextRange::Impl.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+ def children(self):
+ mark = self.value['m_pMark'].dereference()
+ children = [('mark', mark)]
+ return children.__iter__()
+
+class SwXTextCursorPrinter(object):
+ '''Prints SwXTextCursor.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+ def children(self):
+ cursor = self.value['m_pUnoCursor']["m_pCursor"]["_M_ptr"]
+ registeredIn = cursor.dereference()
+ children = [('m_pUnoCursor', registeredIn)]
+ return children.__iter__()
+
+class SwUnoImplPtrPrinter(object):
+ """Prints sw::UnoImplPtr"""
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ if self.value['m_p']:
+ return "%s %s" % (self.typename, self.value['m_p'].dereference())
+ else:
+ return "empty %s" % (self.typename,)
+
+class SwXTextRangePrinter(object):
+ '''Prints SwXTextRange.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s %s" % (self.typename, self.value['m_pImpl'])
+
+class BigPtrArrayPrinter(object):
+ '''Prints BigPtrArray.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ length = self.value['m_nSize']
+ if length > 0:
+ return "%s of length %d" % (self.typename, length)
+ else:
+ return "empty %s" % self.typename
+
+ def children(self):
+ return self._iterator(self.value)
+
+ def display_hint(self):
+ return 'array'
+
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, array):
+ # libstdc++ unique_ptr is a std::tuple which contains multiple
+ # _M_head_impl members and gdb may pick the wrong one by default
+ # so have to manually cast it to the one that contains the array
+ self.blocks = array['m_ppInf']['_M_t']['_M_t'].cast(gdb.lookup_type("std::_Head_base<0, BlockInfo**, false>"))['_M_head_impl']
+ self.count = array['m_nSize']
+ self.pos = 0
+ self.block_count = array['m_nBlock']
+ self.block_pos = 0
+ self.block = None
+ self.indent = ""
+ self.max_indent = " "
+ self._next_block(False)
+ self._check_invariant()
+
+ def __iter__(self):
+ return self
+
+ def _node_value(self, node):
+ cur_indent = self.indent
+ if str(node.dynamic_type.target()) == "SwTextNode":
+ # accessing this is completely non-obvious...
+ # also, node.dynamic_cast(node.dynamic_type) is null?
+ value = " TextNode " + \
+ six.text_type(node.cast(node.dynamic_type).dereference()['m_Text'])
+ elif str(node.dynamic_type.target()) == "SwOLENode":
+ value = " OLENode "
+ elif str(node.dynamic_type.target()) == "SwGrfNode":
+ value = " GrfNode "
+ elif str(node.dynamic_type.target()) == "SwSectionNode":
+ value = " SectionNode "
+ self.indent += " "
+ elif str(node.dynamic_type.target()) == "SwTableNode":
+ value = " TableNode "
+ self.indent += " "
+ elif str(node.dynamic_type.target()) == "SwStartNode":
+ value = " StartNode "
+ self.indent += " "
+ elif str(node.dynamic_type.target()) == "SwEndNode":
+ value = " EndNode "
+ self.indent = self.indent[:-1]
+ cur_indent = self.indent
+ elif str(node.dynamic_type.target()) == "SwDummySectionNode":
+ value = "DummySctNode "
+ else: # must be currently being deleted, so has some abstract type
+ value = "~DeletedNode "
+# return "\n[%s%4d%s] %s %s" % (cur_indent, self.pos, \
+# self.max_indent[len(cur_indent):], node, value)
+ return "\n[%4d] %s%s%s %s" % (self.pos, cur_indent, \
+ node, self.max_indent[len(cur_indent):], value)
+
+ def __next__(self):
+ if self.pos == self.count:
+ raise StopIteration()
+
+ name = str(self.pos)
+ node = self.block['mvData']['_M_elems'][self.pos - self.block['nStart']]
+ value = self._node_value(node)
+ if self.pos == self.block['nEnd']:
+ self._next_block()
+ self.pos += 1
+
+ self._check_invariant()
+ return (name, value)
+
+ def _next_block(self, advance = True):
+ if advance:
+ self.block_pos += 1
+
+ if self.block_pos == self.block_count:
+ return
+
+ pblock = self.blocks[self.block_pos]
+ assert pblock
+ block = pblock.dereference()
+ start = block['nStart']
+ end = block['nEnd']
+ assert end - start + 1 == block['nElem']
+ if self.block:
+ assert start == self.block['nEnd'] + 1
+ assert end <= self.count
+ else:
+ assert start == 0
+ self.block = block
+
+ def _check_invariant(self):
+ assert self.pos <= self.count
+ assert self.block_pos <= self.block_count
+ if self.pos == 0 and self.pos < self.count:
+ assert self.block != None
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ printer = printing.Printer("libreoffice/sw")
+ printer.add('BigPtrArray', BigPtrArrayPrinter)
+ printer.add('SwPosition', SwPositionPrinter)
+ printer.add('SwNodeIndex', SwNodeIndexPrinter)
+ printer.add('SwIndex', SwIndexPrinter)
+ printer.add('SwPaM', SwPaMPrinter)
+ printer.add('SwUnoCursor', SwUnoCursorPrinter)
+ printer.add('SwRect', SwRectPrinter)
+ printer.add('sw::mark::Bookmark', MarkBasePrinter)
+ printer.add('sw::mark::MarkBase', MarkBasePrinter)
+ printer.add('sw::mark::UnoMark', MarkBasePrinter)
+ printer.add('sw::mark::IMark', MarkBasePrinter)
+ printer.add('SwXTextRange::Impl', SwXTextRangeImplPrinter)
+ printer.add('sw::UnoImplPtr', SwUnoImplPtrPrinter)
+ printer.add('SwXTextRange', SwXTextRangePrinter)
+ printer.add('SwXTextCursor', SwXTextCursorPrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/tl.py b/solenv/gdb/libreoffice/tl.py
new file mode 100644
index 000000000..8e15bfd47
--- /dev/null
+++ b/solenv/gdb/libreoffice/tl.py
@@ -0,0 +1,220 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import gdb
+
+from libreoffice.util import printing
+
+class BigIntPrinter(object):
+ '''Prints big integer'''
+
+ def __init__(self, typename, val):
+ self.val = val
+
+ def to_string(self):
+ if self.val['bIsSet']:
+ if self.val['bIsBig']:
+ return self._value()
+ else:
+ return self.val['nVal']
+ else:
+ return "unset %s" % self.typename
+
+ def _value(self):
+ len = self.val['nLen']
+ digits = self.val['nNum']
+ dsize = digits.dereference().type.sizeof * 8
+ num = 0
+ # The least significant byte is on index 0
+ for i in reversed(range(0, len)):
+ num <<= dsize
+ num += digits[i]
+ return num
+
+class ColorPrinter(object):
+ '''Prints color as rgb(r, g, b) or rgba(r, g, b, a)'''
+
+ def __init__(self, typename, val):
+ self.val = val
+
+ def to_string(self):
+ r = self.val['R']
+ g = self.val['G']
+ b = self.val['B']
+ t = self.val['T']
+ if t:
+ return "rgba(%d, %d, %d, %d)" % (r, g, b, 255 - t)
+ else:
+ return "rgb(%d, %d, %d)" % (r, g, b)
+
+class DateTimeImpl(object):
+
+ def __init__(self, date, time):
+ self.date = date
+ self.time = time
+
+ def __str__(self):
+ result = ''
+ if self.date:
+ result += str(self.date)
+ if self.time:
+ result += ' '
+ if self.time:
+ result += str(self.time)
+ return result
+
+ @staticmethod
+ def parse(val):
+ return DateTimeImpl(DateImpl.parse(val), TimeImpl.parse(val))
+
+class DateTimePrinter(object):
+ '''Prints date and time'''
+
+ def __init__(self, typename, val):
+ self.val = val
+
+ def to_string(self):
+ return str(DateTimeImpl.parse(self.val))
+
+class DateImpl(DateTimeImpl):
+
+ def __init__(self, year, month, day):
+ super(DateImpl, self).__init__(self, None)
+ self.year = year
+ self.month = month
+ self.day = day
+
+ def __str__(self):
+ return "%d-%d-%d" % (self.year, self.month, self.day)
+
+ @staticmethod
+ def parse(val):
+ date = val['mnDate']
+ y = date / 10000
+ if date < 0:
+ date = -date
+ m = (date / 100) % 100
+ d = date % 100
+ return DateImpl(y, m, d)
+
+class DatePrinter(object):
+ '''Prints date'''
+
+ def __init__(self, typename, val):
+ self.val = val
+
+ def to_string(self):
+ return str(DateImpl.parse(self.val))
+
+class TimeImpl(DateTimeImpl):
+
+ def __init__(self, hour, minute, second, nanosecond = 0):
+ super(TimeImpl, self).__init__(None, self)
+ self.hour = hour
+ self.minute = minute
+ self.second = second
+ self.nanosecond = nanosecond
+
+ def __str__(self):
+ decimal = ''
+ if self.nanosecond != 0:
+ decimal = '.%09d' % self.nanosecond
+ return "%02d:%02d:%02d%s" % (self.hour, self.minute, self.second, decimal)
+
+ @staticmethod
+ def parse(val):
+ time = val['nTime']
+ h = time / 10000000000000
+ m = (time / 100000000000) % 100
+ s = (time / 1000000000) % 100
+ ns = time % 1000000000
+ return TimeImpl(h, m, s, ns)
+
+class TimePrinter(object):
+ '''Prints time'''
+
+ def __init__(self, typename, val):
+ self.val = val
+
+ def to_string(self):
+ return str(TimeImpl.parse(self.val))
+
+class PointPrinter(object):
+ '''Prints a Point.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+ def children(self):
+ x = self.value['nA']
+ y = self.value['nB']
+ children = [('x', x), ('y', y)]
+ return children.__iter__()
+
+class SizePrinter(object):
+ '''Prints a Size.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+ def children(self):
+ width = self.value['nA']
+ height = self.value['nB']
+ children = [('width', width), ('height', height)]
+ return children.__iter__()
+
+class RectanglePrinter(object):
+ '''Prints a Rectangle.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+ def children(self):
+ left = self.value['nLeft']
+ top = self.value['nTop']
+ right = self.value['nRight']
+ bottom = self.value['nBottom']
+ children = [('left', left), ('top', top), ('right', right), ('bottom', bottom)]
+ return children.__iter__()
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ printer = printing.Printer('libreoffice/tl')
+
+ # various types
+ printer.add('BigInt', BigIntPrinter)
+ printer.add('Color', ColorPrinter)
+ printer.add('DateTime', DateTimePrinter)
+ printer.add('Date', DatePrinter)
+ printer.add('Time', TimePrinter)
+ printer.add('Point', PointPrinter)
+ printer.add('Size', SizePrinter)
+ printer.add('Rectangle', RectanglePrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/util/__init__.py b/solenv/gdb/libreoffice/util/__init__.py
new file mode 100644
index 000000000..047763a18
--- /dev/null
+++ b/solenv/gdb/libreoffice/util/__init__.py
@@ -0,0 +1,11 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/util/compatibility.py b/solenv/gdb/libreoffice/util/compatibility.py
new file mode 100644
index 000000000..6d8070997
--- /dev/null
+++ b/solenv/gdb/libreoffice/util/compatibility.py
@@ -0,0 +1,20 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import gdb
+
+use_gdb_printing = True
+try:
+ import gdb.printing
+except ImportError:
+ use_gdb_printing = False
+
+use_lazy_string = hasattr(gdb.Value, 'lazy_string')
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/util/printing.py b/solenv/gdb/libreoffice/util/printing.py
new file mode 100644
index 000000000..a31e353cf
--- /dev/null
+++ b/solenv/gdb/libreoffice/util/printing.py
@@ -0,0 +1,125 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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:
+ from collections.abc import Mapping
+except:
+ from collections import Mapping
+import gdb
+import re
+import six
+
+from libreoffice.util.compatibility import use_gdb_printing
+
+class SimplePrinter(object):
+
+ def __init__(self, name, function):
+ self.name = name
+ self.function = function
+ self.enabled = True
+
+ def invoke(self, val):
+ if not self.enabled:
+ return None
+ return self.function(self.name, val)
+
+class NameLookup(Mapping):
+
+ def __init__(self):
+ self.map = {}
+ self.name_regex = re.compile(r'^([\w:]+)(<.*>)?')
+
+ def add(self, name, printer):
+ self.map[name] = printer
+
+ def __len__(self):
+ return len(self.map)
+
+ def __getitem__(self, type):
+ typename = self._basic_type(type)
+ if typename and typename in self.map:
+ return self.map[typename]
+ return None
+
+ def __iter__(self):
+ return self.map
+
+ def _basic_type(self, type):
+ basic_type = self.basic_type(type)
+ if basic_type:
+ match = self.name_regex.match(basic_type)
+ if match:
+ return match.group(1)
+ return None
+
+ @staticmethod
+ def basic_type(type):
+ if type.code == gdb.TYPE_CODE_REF:
+ type = type.target()
+ type = type.unqualified().strip_typedefs()
+ return type.tag
+
+class FunctionLookup(Mapping):
+
+ def __init__(self):
+ self.map = {}
+
+ def add(self, test, printer):
+ self.map[test] = printer
+
+ def __len__(self):
+ return len(self.map)
+
+ def __getitem__(self, type):
+ for (test, printer) in six.iteritems(self.map):
+ if test(type):
+ return printer
+ return None
+
+ def __iter__(self):
+ return self.map
+
+class Printer(object):
+
+ def __init__(self, name):
+ self.name = name
+ self.subprinters = []
+ self.name_lookup = NameLookup()
+ self.func_lookup = FunctionLookup()
+ self.enabled = True
+
+ def add(self, name, function, lookup = None):
+ printer = SimplePrinter(name, function)
+ self.subprinters.append(printer)
+ if not lookup:
+ self.name_lookup.add(name, printer)
+ else:
+ self.func_lookup.add(lookup, printer)
+
+
+ def __call__(self, val):
+ printer = self.name_lookup[val.type]
+ if not printer:
+ printer = self.func_lookup[val.type]
+
+ if printer:
+ return printer.invoke(val)
+ return None
+
+def register_pretty_printer(printer, obj):
+ '''Registers printer with objfile'''
+
+ if use_gdb_printing:
+ gdb.printing.register_pretty_printer(obj, printer)
+ else:
+ if obj is None:
+ obj = gdb
+ obj.pretty_printers.append(printer)
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/util/string.py b/solenv/gdb/libreoffice/util/string.py
new file mode 100644
index 000000000..742aabbac
--- /dev/null
+++ b/solenv/gdb/libreoffice/util/string.py
@@ -0,0 +1,75 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import gdb
+
+from libreoffice.util.compatibility import use_lazy_string
+
+class StringPrinterHelper(object):
+ '''Base for all string pretty printers'''
+
+ class MustBeImplemented(Exception):
+ pass
+
+ def __init__(self, typename, val, encoding = None):
+ self.typename = typename
+ self.val = val
+ self.encoding = encoding
+
+ def to_string(self):
+ if self.valid():
+ data = self.data()
+ len = self.length()
+ return self.make_string(data, self.encoding, len)
+ else:
+ return "uninitialized %s" % self.typename
+
+ def display_hint(self):
+ if self.valid():
+ return 'string'
+ else:
+ return None
+
+ def valid(self):
+ return True
+
+ def data(self):
+ raise self.MustBeImplemented()
+
+ def length(self):
+ return -1
+
+ @staticmethod
+ def make_string(data, encoding = None, length = -1):
+ '''Creates a new string from memory'''
+
+ if not encoding:
+ encoding = ''
+
+ # we need to determine length, if not given (for sal_Unicode*)
+ if length < 0:
+ length = 0
+ while data[length] != 0 and length <= 512: # arbitrary limit
+ length += 1
+
+ if use_lazy_string:
+ return data.lazy_string(encoding, length)
+
+ # The gdb.Value.string() conversion works on array of bytes, but
+ # the length we have is the length of the string. So we must
+ # multiply it by width of character if the string is Unicode.
+ width = data[0].type.sizeof
+ if width > 1:
+ length = length * width
+
+ char = gdb.lookup_type('char')
+ bytes = data.cast(char.pointer())
+ return bytes.string(encoding, length = length)
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/util/uno.py b/solenv/gdb/libreoffice/util/uno.py
new file mode 100644
index 000000000..2f0d83a6b
--- /dev/null
+++ b/solenv/gdb/libreoffice/util/uno.py
@@ -0,0 +1,516 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import gdb
+import re
+import six
+
+class UnsupportedType(Exception):
+ '''Represents exception thrown when an unsupported UNO type(like
+ array or union) is used.'''
+
+ def __init__(self, type):
+ self.type = type
+
+class UnknownType(Exception):
+ '''Represents exception thrown when an unknown UNO type is used.'''
+
+ def __init__(self, type):
+ self.type = type
+
+class TypeClass(object):
+ '''Represents type class of UNO type.'''
+
+ # type class of void
+ VOID = 0
+ # type class of char
+ CHAR = 1
+ # type class of boolean
+ BOOLEAN = 2
+ # type class of byte
+ BYTE = 3
+ # type class of short
+ SHORT = 4
+ # type class of unsigned short
+ UNSIGNED_SHORT = 5
+ # type class of long
+ LONG = 6
+ # type class of unsigned long
+ UNSIGNED_LONG = 7
+ # type class of hyper
+ HYPER = 8
+ # type class of unsigned hyper
+ UNSIGNED_HYPER = 9
+ # type class of float
+ FLOAT = 10
+ # type class of double
+ DOUBLE = 11
+ # type class of string
+ STRING = 12
+ # type class of type
+ TYPE = 13
+ # type class of any
+ ANY = 14
+ # type class of enum
+ ENUM = 15
+ # type class of typedef
+ TYPEDEF = 16
+ # type class of struct
+ STRUCT = 17
+
+ # type class of exception
+ EXCEPTION = 19
+ # type class of sequence
+ SEQUENCE = 20
+
+ # type class of interface
+ INTERFACE = 22
+ # type class of service (not implemented)
+ SERVICE = 23
+ # type class of module (not implemented)
+ MODULE = 24
+ # type class of interface method
+ INTERFACE_METHOD = 25
+ # type class of interface attribute
+ INTERFACE_ATTRIBUTE = 26
+ # type class of unknown type
+ UNKNOWN = 27
+ # type class of properties
+ PROPERTY = 28
+ # type class of constants
+ CONSTANT = 29
+ # type class of constants groups
+ CONSTANTS = 30
+ # type class of singletons
+ SINGLETON = 31
+
+class TemplateType(object):
+
+ def __init__(self, template, *args):
+ self.template = template
+ self.args = args
+
+ def __str__(self):
+ argtypes = [str(gdb.lookup_type(str(arg)).strip_typedefs()) for arg in self.args]
+ return self.template + '<' + ', '.join(argtypes) + '>'
+
+class Type(object):
+ '''Describes a UNO type.'''
+
+ def __init__(self, typeclass, tag):
+ '''Constructs a new Type.
+ @param[in] typeclass value of com::sun::star::uno::TypeClass
+ @param[in] tag UNO name of the type
+ '''
+ self.typeclass = typeclass
+ self.tag = tag
+ # C++ name of the type
+ self.typename = None
+
+ def type(self):
+ '''Gets gdb.Type for the type'''
+ if self.typename:
+ return gdb.lookup_type(str(self.typename))
+ return None
+
+ @staticmethod
+ def uno2cpp(typename):
+ return str(typename).replace('.', '::')[1:-1]
+
+ def strip_typedefs(self):
+ copy = self.copy()
+ copy.typename = self._strip_typedefs(self.typename)
+ return copy
+
+ def _strip_typedefs(self, typename):
+ template_args = re.compile('([^<]+)(<.*>)')
+ match = template_args.match(typename)
+ type = self._lookup_type(match.group(1))
+ types = []
+ if match.group(2):
+ list_delim = re.compile(', *')
+ # FIXME: this does not work with nested templates
+ for arg in match.group(2).split(list_delim):
+ types.append(self._lookup_type(arg))
+
+ typename = str(type)
+ if not types.empty():
+ typename += '<' + types.join(', ') + '>'
+
+ return typename
+
+ def _lookup_type(self, typename):
+ if typename != '':
+ type = gdb.lookup_type(typename)
+ if type:
+ type = type.strip_typedefs()
+ return type
+
+def make_uno_type(val):
+ '''Creates a UNO type from gdb.Value of type
+ com::sun::star::uno::Type, typelib_TypeDescription, or
+ typelib_TypeDescriptionReference
+ '''
+
+ cssu_type = 'com::sun::star::uno::Type'
+ type_desc = '_typelib_TypeDescription'
+ type_descs =(
+ type_desc,
+ '_typelib_CompoundTypeDescription',
+ '_typelib_StructTypeDescription',
+ '_typelib_IndirectTypeDescription',
+ '_typelib_EnumTypeDescription',
+ '_typelib_InterfaceMemberTypeDescription',
+ '_typelib_InterfaceMethodTypeDescription',
+ '_typelib_InterfaceAttributeTypeDescription',
+ '_typelib_InterfaceTypeDescription'
+ )
+ type_desc_ref = '_typelib_TypeDescriptionReference'
+
+ type = val.type.strip_typedefs()
+
+ if type.tag == cssu_type:
+ pvalue = val['_pType']
+ assert pvalue
+ val = pvalue.dereference()
+ type = val.type.strip_typedefs()
+
+ while type.tag == type_desc_ref:
+ pvalue = val['pType']
+ assert pvalue
+ val = pvalue.dereference()
+ type = val.type.strip_typedefs()
+
+ if type.tag not in type_descs:
+ return None
+
+ # determination of the UNO type
+ full_val = val
+ if type.tag != type_desc:
+ while 'aBase' in val:
+ val = val['aBase']
+ type_class = int(val['eTypeClass'])
+ name = val['pTypeName'].dereference()
+ uno_type = None
+ if type_class == TypeClass.VOID:
+ uno_type = VoidType()
+ elif type_class == TypeClass.CHAR:
+ uno_type = PrimitiveType(type_class, name, 'char')
+ elif type_class == TypeClass.BOOLEAN:
+ uno_type = PrimitiveType(type_class, name, 'sal_Bool')
+ elif type_class == TypeClass.BYTE:
+ uno_type = PrimitiveType(type_class, name, 'sal_Int8')
+ elif type_class == TypeClass.SHORT:
+ uno_type = PrimitiveType(type_class, name, 'sal_Int16')
+ elif type_class == TypeClass.UNSIGNED_SHORT:
+ uno_type = PrimitiveType(type_class, name, 'sal_uInt16')
+ elif type_class == TypeClass.LONG:
+ uno_type = PrimitiveType(type_class, name, 'sal_Int32')
+ elif type_class == TypeClass.UNSIGNED_LONG:
+ uno_type = PrimitiveType(type_class, name, 'sal_uInt32')
+ elif type_class == TypeClass.HYPER:
+ uno_type = PrimitiveType(type_class, name, 'sal_Int64')
+ elif type_class == TypeClass.UNSIGNED_HYPER:
+ uno_type = PrimitiveType(type_class, name, 'sal_uInt64')
+ elif type_class == TypeClass.FLOAT:
+ uno_type = PrimitiveType(type_class, name, 'float')
+ elif type_class == TypeClass.DOUBLE:
+ uno_type = PrimitiveType(type_class, name, 'double')
+ elif type_class == TypeClass.STRING:
+ uno_type = PrimitiveType(type_class, name, 'rtl::OUString')
+ elif type_class == TypeClass.TYPE:
+ uno_type = PrimitiveType(type_class, name, 'com::sun::star::uno::Type')
+ elif type_class == TypeClass.ANY:
+ uno_type = PrimitiveType(type_class, name, 'com::sun::star::uno::Any')
+ elif type_class == TypeClass.ENUM:
+ uno_type = EnumType(val, full_val)
+ elif type_class == TypeClass.TYPEDEF:
+ pass
+ elif type_class == TypeClass.STRUCT:
+ uno_type = StructType(val, full_val)
+ elif type_class == TypeClass.EXCEPTION:
+ uno_type = CompoundType(val, full_val)
+ elif type_class == TypeClass.SEQUENCE:
+ uno_type = IndirectType(val, full_val)
+ elif type_class == TypeClass.INTERFACE:
+ uno_type = InterfaceType(val, full_val)
+ elif type_class == TypeClass.SERVICE:
+ raise UnsupportedType('service')
+ elif type_class == TypeClass.MODULE:
+ raise UnsupportedType('module')
+ elif type_class == TypeClass.INTERFACE_METHOD:
+ uno_type = InterfaceMethodType(val, full_val)
+ elif type_class == TypeClass.INTERFACE_ATTRIBUTE:
+ uno_type = InterfaceAttributeType(val, full_val)
+ elif type_class == TypeClass.UNKNOWN:
+ raise UnknownType(type)
+ elif type_class == TypeClass.PROPERTY:
+ pass
+ elif type_class == TypeClass.CONSTANT:
+ pass
+ elif type_class == TypeClass.CONSTANTS:
+ pass
+ elif type_class == TypeClass.SINGLETON:
+ pass
+ else:
+ raise UnknownType(type)
+
+ assert uno_type
+ return uno_type
+
+def uno_cast(type, val):
+ '''Casts val or pointer to UNO type represented by type'''
+ if val.type.code == gdb.TYPE_CODE_PTR:
+ return val.cast(type.type().pointer())
+ else:
+ return val.cast(type.type())
+
+class VoidType(Type):
+
+ def __init__(self):
+ super(VoidType, self).__init__(TypeClass.VOID, "void")
+ self.typename = "void"
+
+class PrimitiveType(Type):
+
+ def __init__(self, typeclass, typename_uno, typename_cpp):
+ super(PrimitiveType, self).__init__(typeclass, typename_uno)
+ self.typename = str(typename_cpp)
+
+class CompoundType(Type):
+
+ def __init__(self, type, full_type):
+ super(CompoundType, self).__init__(type['eTypeClass'], type['pTypeName'].dereference())
+ self.typename = self.uno2cpp(self.tag)
+ self._type = full_type
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, count, types, names):
+ self.count = count
+ self.members = members
+ self.names = names
+ self.pos = 0
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ assert self.pos >= 0 and self.pos <= self.count
+ if self.pos == self.count:
+ raise StopIteration
+
+ pmember = self.members[self.pos]
+ assert pmember
+ pname = self.names[self.i]
+ assert pname
+ self.pos = self.pos + 1
+ member = make_uno_type(pmember.dereference())
+ assert member
+ name = str(pname.dereference())
+ return (name, member)
+
+ def attributes(self):
+ return _iterator(self._type['nMembers'], self._type['ppTypeRefs'],
+ self._type['ppMemberNames'])
+
+class StructType(CompoundType):
+
+ def __init__(self, type, full_type):
+ full_type = full_type.cast(gdb.lookup_type('_typelib_StructTypeDescription'))
+ super(StructType, self).__init__(type, full_type['aBase'])
+
+class IndirectType(Type):
+
+ def __init__(self, type, full_type):
+ super(IndirectType, self).__init__(type['eTypeClass'], type['pTypeName'].dereference())
+ full_type = full_type.cast(gdb.lookup_type('_typelib_IndirectTypeDescription'))
+ pelem = full_type['pType']
+ assert pelem
+ self.element = make_uno_type(pelem.dereference())
+ assert self.element
+ self.typename = TemplateType('com::sun::star::uno::Sequence', self.element.typename)
+
+class EnumType(Type):
+
+ def __init__(self, type, full_type):
+ super(EnumType, self).__init__(TypeClass.ENUM, type['pTypeName'].dereference())
+ self.typename = self.uno2cpp(self.tag)
+ self._type = full_type.cast(gdb.lookup_type('_typelib_EnumTypeDescription'))
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, count, values, names):
+ self.count = count
+ self.values = values
+ self.names = names
+ self.pos = 0
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ assert self.pos >= 0 and self.pos <= self.count
+ if self.pos == self.count:
+ raise StopIteration
+
+ pvalue = self.values[self.pos]
+ assert pvalue
+ pname = self.names[self.pos]
+ assert pname
+ self.pos = self.pos + 1
+ val = int(pvalue.dereference())
+ name = str(pname.dereference())
+ return (name, val)
+
+ def values(self):
+ return _iterator(self._type['nEnumValues'],
+ self._type['ppEnumNames'], self._type['pEnumValues'])
+
+ def default_value(self):
+ return self._type['nDefaultEnumValue']
+
+class InterfaceMemberType(Type):
+
+ def __init__(self, type, full_type):
+ super(InterfaceMemberType, self).__init__(type['eTypeClass'], type['pTypeName'].dereference())
+ (interface, delim, member) = self.tag.partition('::')
+ self.typename = self.uno2cpp(interface) + '::*' + member
+ full_type = full_type.cast(gdb.lookup_type('_typelib_InterfaceMemberTypeDescription'))
+ self.position = full_type['nPosition']
+ pname = full_type['pMemberName']
+ assert pname
+ self.name = pname.dereference()
+
+class InterfaceMethodType(InterfaceMemberType):
+
+ def __init__(self, type, full_type):
+ full_type = full_type.cast(gdb.lookup_type('_typelib_InterfaceMethodTypeDescription'))
+ super(InterfaceMethodType, self).__init__(type, full_type['aBase'])
+ pret = full_type['pReturnTypeRef']
+ assert pret
+ self.return_type = make_uno_type(pret.dereference())
+ assert self.return_type
+ self.oneway = full_type['bOneWay']
+ self._type = full_type
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, count, values):
+ self.count = count
+ self.values = values
+ self.pos = 0
+ assert values
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ assert self.pos >= 0 and self.pos <= self.count
+ if self.pos == self.count:
+ raise StopIteration
+
+ val = self.values[self.pos]
+ self.pos = self.pos + 1
+ return val
+
+ class parameter(tuple):
+
+ def __init__(self, type):
+ self.__init_tuple(type)
+ self.input = type['bIn']
+ self.output = type['bOut']
+
+ def _init_tuple(self, type):
+ pname = self['pName']
+ assert pname
+ ptype = self['pTypeRef']
+ assert ptype
+ name = str(pname.dereference())
+ type = make_uno_type(ptype.dereference())
+ assert type
+ super(parameter, self).__init__(name, type)
+
+ def parameters(self):
+ for param in _iterator(self._type['nParams'], self._type['pParams']):
+ yield parameter(param)
+
+ def exceptions(self):
+ def make_exception(self, pex):
+ assert pex
+ ex = make_uno_type(pex.dereference())
+ assert ex
+ return ex
+
+ for ex in _iterator(
+ self._type['nExceptions'], self._type['ppExceptions']):
+ yield make_exception(ex)
+
+class InterfaceAttributeType(InterfaceMemberType):
+
+ def __init__(self, type, full_type):
+ full_type = full_type.cast(gdb.lookup_type('_typelib_InterfaceAttributeTypeDescription'))
+ super(InterfaceAttributeType, self).__init__(type, full_type['aBase'])
+ self.readonly = full_type['bReadOnly']
+ ptype = full_type['pAttributeTypeRef']
+ assert ptype
+ self.type = make_uno_type(ptype.dereference())
+ assert self.type
+
+class MembersNotInitialized(Exception):
+ '''Represents exception raised when interface type' members haven't
+ been initialized(i.e. just level 1 initialization has been
+ performed)'''
+ pass
+
+class InterfaceType(Type):
+
+ def __init__(self, type, full_type):
+ super(InterfaceType, self).__init__(TypeClass.INTERFACE, type['pTypeName'].dereference())
+ assert int(type['eTypeClass']) == TypeClass.INTERFACE
+ self.typename = self.uno2cpp(self.tag)
+ full_type = full_type.cast(gdb.lookup_type('_typelib_InterfaceTypeDescription'))
+ self.uik = full_type['aUik']
+ self._type = full_type
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, count, values):
+ assert values
+ self.count = count
+ self.values = values
+ self.pos = 0
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ assert self.pos >= 0 and self.pos <= self.count
+ pvalue = self.values[self.pos]
+ assert pvalue
+ self.pos = self.pos + 1
+ uno = make_uno_type(pvalue.dereference())
+ assert uno
+ return uno
+
+ def members(self):
+ return __members(self._type['nMembers'], self._type['ppMembers'])
+
+ def all_members(self):
+ return __members(self._type['nAllMembers'], self._type['ppAllMembers'])
+
+ def __members(count, values):
+ if values == 0:
+ raise MembersNotInitialized
+ return _iterator(count, values)
+
+ def bases(self):
+ return _iterator(self._type['nBaseTypes'], self._type['ppBaseTypes'])
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/utl.py b/solenv/gdb/libreoffice/utl.py
new file mode 100644
index 000000000..0e6de6ff9
--- /dev/null
+++ b/solenv/gdb/libreoffice/utl.py
@@ -0,0 +1,39 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import gdb
+
+from libreoffice.util import printing
+
+class TranslateIdPrinter(object):
+ '''Prints a TranslateId.'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return self.value['mpContext'].format_string(format='s') + " " + self.value['mpId'].format_string(format='s')
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ printer = printing.Printer('libreoffice/utl')
+
+ # various types
+ printer.add('TranslateId', TranslateIdPrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/vcl.py b/solenv/gdb/libreoffice/vcl.py
new file mode 100644
index 000000000..ce5957475
--- /dev/null
+++ b/solenv/gdb/libreoffice/vcl.py
@@ -0,0 +1,123 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+import six
+import gdb
+from libreoffice.util import printing
+
+class ImplSchedulerDataPrinter(object):
+ '''Prints the ImplSchedulerData linked list.
+
+ This can be used to dump the current state of the scheduler via:
+ p *ImplGetSVData()->maSchedCtx.mpFirstSchedulerData
+
+ This doesn't include currently invoked tasks AKA the stack.
+
+ To dump the scheduler stack of invoked tasks use:
+ p *ImplGetSVData()->maSchedCtx.mpSchedulerStack
+ '''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+ self.timer_type_ptr = gdb.lookup_type("Timer").pointer()
+ self.idle_type_ptr = gdb.lookup_type("Idle").pointer()
+
+ def as_string(self, gdbobj):
+ if gdbobj['mpTask']:
+ task = gdbobj['mpTask'].dereference()
+ timer = gdbobj['mpTask'].dynamic_cast( self.timer_type_ptr )
+ idle = gdbobj['mpTask'].dynamic_cast( self.idle_type_ptr )
+ if idle:
+ task_type = "Idle"
+ elif timer:
+ task_type = "Timer"
+ else:
+ task_type = "Task"
+ res = "{:7s}{:10s} active: {:6s}".format( task_type, str(task['mePriority']).replace('TaskPriority::',''), str(task['mbActive']) )
+ name = task['mpDebugName']
+ if not name:
+ res = res + " (task debug name not set)"
+ else:
+ res = "{} '{}' ({})".format(res, str(name.string()), str(task.dynamic_type))
+ val_type = gdb.lookup_type(str( task.dynamic_type )).pointer()
+ timer = gdbobj['mpTask'].cast( val_type )
+ if task_type == "Timer":
+ res = "{}: {}ms".format(res, timer['mnTimeout'])
+ elif task_type == "Idle":
+ assert 0 == timer['mnTimeout'], "Idle with timeout == {}".format( timer['mnTimeout'] )
+ return res
+ else:
+ return "(no task)"
+
+ def to_string(self):
+ return self.typename
+
+ def children(self):
+ return self._iterator(self)
+
+ def display_hint(self):
+ return 'array'
+
+ class _iterator(six.Iterator):
+
+ def __init__(self, printer):
+ self.pos = 0
+ self.printer = printer
+ self.value = printer.value
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if not self.value:
+ raise StopIteration()
+
+ pos = str(self.pos)
+ name = "\n " + self.printer.as_string(self.value)
+ self.value = self.value['mpNext']
+ self.pos += 1
+
+ return (pos, name)
+
+class ImplSchedulerContextPrinter(object):
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+ self.prio = gdb.lookup_type('TaskPriority')
+
+ def to_string(self):
+ res = "{\n"
+ if self.value['mnTimerPeriod']:
+ res = res + "mnTimerPeriod = " + str(self.value['mnTimerPeriod']) + "\n"
+ if self.value['mpSchedulerStack']:
+ res = res + "STACK, " + str(self.value['mpSchedulerStack'].dereference())
+ if self.value['mpFirstSchedulerData']:
+ for key, value in self.prio.items():
+ first = self.value['mpFirstSchedulerData'][value.enumval]
+ if first:
+ res = res + key.replace('TaskPriority::', '') + ", " + str(first.dereference())
+ return res + "}"
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ printer = printing.Printer("libreoffice/vcl")
+ printer.add('ImplSchedulerData', ImplSchedulerDataPrinter)
+ printer.add('ImplSchedulerContext', ImplSchedulerContextPrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/libreoffice/writerfilter.py b/solenv/gdb/libreoffice/writerfilter.py
new file mode 100644
index 000000000..487263e92
--- /dev/null
+++ b/solenv/gdb/libreoffice/writerfilter.py
@@ -0,0 +1,88 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+from libreoffice.util import printing
+
+class OOXMLPropertySetPrinter(object):
+ '''Prints writerfilter::ooxml::OOXMLPropertySet'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+ def children(self):
+ children = [ ( 'properties', self.value['mProperties'] ) ]
+ return children.__iter__()
+
+class OOXMLPropertyPrinter(object):
+ '''Prints writerfilter::ooxml::OOXMLProperty'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+ def children(self):
+ children = [ ( 'id', self.value['mId'] ),
+ ( 'type', self.value['meType'] ),
+ ( 'value', self.value['mpValue'] ) ]
+ return children.__iter__()
+
+class OOXMLPropertySetValuePrinter(object):
+ '''Prints writerfilter::ooxml::OOXMLPropertySetValue'''
+
+ def __init__(self, typename, value):
+ self.typename = typename
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.typename)
+
+class OOXMLStringValuePrinter(object):
+ '''Prints writerfilter::ooxml::OOXMLStringValue'''
+
+ def __init__(self, typename, value):
+ self.value = value
+
+ def to_string(self):
+ return "%s" % (self.value['mStr'])
+
+class OOXMLIntegerValuePrinter(object):
+ '''Prints writerfilter::ooxml::OOXMLIntegerValue'''
+
+ def __init__(self, typename, value):
+ self.value = value
+
+ def to_string(self):
+ return "%d" % (self.value['mnValue'])
+
+printer = None
+
+def build_pretty_printers():
+ global printer
+
+ printer = printing.Printer("libreoffice/writerfilter")
+ printer.add('writerfilter::ooxml::OOXMLProperty', OOXMLPropertyPrinter)
+ printer.add('writerfilter::ooxml::OOXMLPropertySet', OOXMLPropertySetPrinter)
+ printer.add('writerfilter::ooxml::OOXMLPropertySetValue', OOXMLPropertySetValuePrinter)
+ printer.add('writerfilter::ooxml::OOXMLStringValue', OOXMLStringValuePrinter)
+ printer.add('writerfilter::ooxml::OOXMLIntegerValue', OOXMLIntegerValuePrinter)
+ printer.add('writerfilter::ooxml::OOXMLHexValue', OOXMLIntegerValuePrinter)
+
+def register_pretty_printers(obj):
+ printing.register_pretty_printer(printer, obj)
+
+build_pretty_printers()
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/gdb/six.py b/solenv/gdb/six.py
new file mode 100644
index 000000000..5fe9f8e14
--- /dev/null
+++ b/solenv/gdb/six.py
@@ -0,0 +1,980 @@
+# Copyright (c) 2010-2020 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+from __future__ import absolute_import
+
+import functools
+import itertools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.14.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+PY34 = sys.version_info[0:2] >= (3, 4)
+
+if PY3:
+ string_types = str,
+ integer_types = int,
+ class_types = type,
+ text_type = str
+ binary_type = bytes
+
+ MAXSIZE = sys.maxsize
+else:
+ string_types = basestring,
+ integer_types = (int, long)
+ class_types = (type, types.ClassType)
+ text_type = unicode
+ binary_type = str
+
+ if sys.platform.startswith("java"):
+ # Jython always uses 32 bits.
+ MAXSIZE = int((1 << 31) - 1)
+ else:
+ # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+ class X(object):
+
+ def __len__(self):
+ return 1 << 31
+ try:
+ len(X())
+ except OverflowError:
+ # 32-bit
+ MAXSIZE = int((1 << 31) - 1)
+ else:
+ # 64-bit
+ MAXSIZE = int((1 << 63) - 1)
+ del X
+
+
+def _add_doc(func, doc):
+ """Add documentation to a function."""
+ func.__doc__ = doc
+
+
+def _import_module(name):
+ """Import module, returning the module after the last dot."""
+ __import__(name)
+ return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+ def __init__(self, name):
+ self.name = name
+
+ def __get__(self, obj, tp):
+ result = self._resolve()
+ setattr(obj, self.name, result) # Invokes __set__.
+ try:
+ # This is a bit ugly, but it avoids running this again by
+ # removing this descriptor.
+ delattr(obj.__class__, self.name)
+ except AttributeError:
+ pass
+ return result
+
+
+class MovedModule(_LazyDescr):
+
+ def __init__(self, name, old, new=None):
+ super(MovedModule, self).__init__(name)
+ if PY3:
+ if new is None:
+ new = name
+ self.mod = new
+ else:
+ self.mod = old
+
+ def _resolve(self):
+ return _import_module(self.mod)
+
+ def __getattr__(self, attr):
+ _module = self._resolve()
+ value = getattr(_module, attr)
+ setattr(self, attr, value)
+ return value
+
+
+class _LazyModule(types.ModuleType):
+
+ def __init__(self, name):
+ super(_LazyModule, self).__init__(name)
+ self.__doc__ = self.__class__.__doc__
+
+ def __dir__(self):
+ attrs = ["__doc__", "__name__"]
+ attrs += [attr.name for attr in self._moved_attributes]
+ return attrs
+
+ # Subclasses should override this
+ _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+ def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+ super(MovedAttribute, self).__init__(name)
+ if PY3:
+ if new_mod is None:
+ new_mod = name
+ self.mod = new_mod
+ if new_attr is None:
+ if old_attr is None:
+ new_attr = name
+ else:
+ new_attr = old_attr
+ self.attr = new_attr
+ else:
+ self.mod = old_mod
+ if old_attr is None:
+ old_attr = name
+ self.attr = old_attr
+
+ def _resolve(self):
+ module = _import_module(self.mod)
+ return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+
+ """
+ A meta path importer to import six.moves and its submodules.
+
+ This class implements a PEP302 finder and loader. It should be compatible
+ with Python 2.5 and all existing versions of Python3
+ """
+
+ def __init__(self, six_module_name):
+ self.name = six_module_name
+ self.known_modules = {}
+
+ def _add_module(self, mod, *fullnames):
+ for fullname in fullnames:
+ self.known_modules[self.name + "." + fullname] = mod
+
+ def _get_module(self, fullname):
+ return self.known_modules[self.name + "." + fullname]
+
+ def find_module(self, fullname, path=None):
+ if fullname in self.known_modules:
+ return self
+ return None
+
+ def __get_module(self, fullname):
+ try:
+ return self.known_modules[fullname]
+ except KeyError:
+ raise ImportError("This loader does not know module " + fullname)
+
+ def load_module(self, fullname):
+ try:
+ # in case of a reload
+ return sys.modules[fullname]
+ except KeyError:
+ pass
+ mod = self.__get_module(fullname)
+ if isinstance(mod, MovedModule):
+ mod = mod._resolve()
+ else:
+ mod.__loader__ = self
+ sys.modules[fullname] = mod
+ return mod
+
+ def is_package(self, fullname):
+ """
+ Return true, if the named module is a package.
+
+ We need this method to get correct spec objects with
+ Python 3.4 (see PEP451)
+ """
+ return hasattr(self.__get_module(fullname), "__path__")
+
+ def get_code(self, fullname):
+ """Return None
+
+ Required, if is_package is implemented"""
+ self.__get_module(fullname) # eventually raises ImportError
+ return None
+ get_source = get_code # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+
+ """Lazy loading of moved objects"""
+ __path__ = [] # mark as package
+
+
+_moved_attributes = [
+ MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+ MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+ MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+ MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+ MovedAttribute("intern", "__builtin__", "sys"),
+ MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+ MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
+ MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
+ MovedAttribute("getoutput", "commands", "subprocess"),
+ MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+ MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
+ MovedAttribute("reduce", "__builtin__", "functools"),
+ MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+ MovedAttribute("StringIO", "StringIO", "io"),
+ MovedAttribute("UserDict", "UserDict", "collections"),
+ MovedAttribute("UserList", "UserList", "collections"),
+ MovedAttribute("UserString", "UserString", "collections"),
+ MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+ MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+ MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+ MovedModule("builtins", "__builtin__"),
+ MovedModule("configparser", "ConfigParser"),
+ MovedModule("collections_abc", "collections", "collections.abc" if sys.version_info >= (3, 3) else "collections"),
+ MovedModule("copyreg", "copy_reg"),
+ MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+ MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"),
+ MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"),
+ MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+ MovedModule("http_cookies", "Cookie", "http.cookies"),
+ MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+ MovedModule("html_parser", "HTMLParser", "html.parser"),
+ MovedModule("http_client", "httplib", "http.client"),
+ MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+ MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"),
+ MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+ MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+ MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+ MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+ MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+ MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+ MovedModule("cPickle", "cPickle", "pickle"),
+ MovedModule("queue", "Queue"),
+ MovedModule("reprlib", "repr"),
+ MovedModule("socketserver", "SocketServer"),
+ MovedModule("_thread", "thread", "_thread"),
+ MovedModule("tkinter", "Tkinter"),
+ MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+ MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+ MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+ MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+ MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+ MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+ MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+ MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+ MovedModule("tkinter_colorchooser", "tkColorChooser",
+ "tkinter.colorchooser"),
+ MovedModule("tkinter_commondialog", "tkCommonDialog",
+ "tkinter.commondialog"),
+ MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+ MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+ MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+ MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+ "tkinter.simpledialog"),
+ MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+ MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+ MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+ MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+ MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+ MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+]
+# Add windows specific modules.
+if sys.platform == "win32":
+ _moved_attributes += [
+ MovedModule("winreg", "_winreg"),
+ ]
+
+for attr in _moved_attributes:
+ setattr(_MovedItems, attr.name, attr)
+ if isinstance(attr, MovedModule):
+ _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+ MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+ MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+ MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+ MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+ MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+ MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+ MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+ MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+ MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+ MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+ MovedAttribute("quote", "urllib", "urllib.parse"),
+ MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+ MovedAttribute("unquote", "urllib", "urllib.parse"),
+ MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+ MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"),
+ MovedAttribute("urlencode", "urllib", "urllib.parse"),
+ MovedAttribute("splitquery", "urllib", "urllib.parse"),
+ MovedAttribute("splittag", "urllib", "urllib.parse"),
+ MovedAttribute("splituser", "urllib", "urllib.parse"),
+ MovedAttribute("splitvalue", "urllib", "urllib.parse"),
+ MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+ MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+ setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+ "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+ MovedAttribute("URLError", "urllib2", "urllib.error"),
+ MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+ MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+ setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+ "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+ MovedAttribute("urlopen", "urllib2", "urllib.request"),
+ MovedAttribute("install_opener", "urllib2", "urllib.request"),
+ MovedAttribute("build_opener", "urllib2", "urllib.request"),
+ MovedAttribute("pathname2url", "urllib", "urllib.request"),
+ MovedAttribute("url2pathname", "urllib", "urllib.request"),
+ MovedAttribute("getproxies", "urllib", "urllib.request"),
+ MovedAttribute("Request", "urllib2", "urllib.request"),
+ MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+ MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+ MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+ MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+ MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+ MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+ MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+ MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+ MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+ MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+ MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+ MovedAttribute("URLopener", "urllib", "urllib.request"),
+ MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+ MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+ MovedAttribute("parse_http_list", "urllib2", "urllib.request"),
+ MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+ setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+ "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+ MovedAttribute("addbase", "urllib", "urllib.response"),
+ MovedAttribute("addclosehook", "urllib", "urllib.response"),
+ MovedAttribute("addinfo", "urllib", "urllib.response"),
+ MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+ setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+ "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+
+ """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+ MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+ setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+ "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+
+ """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+ __path__ = [] # mark as package
+ parse = _importer._get_module("moves.urllib_parse")
+ error = _importer._get_module("moves.urllib_error")
+ request = _importer._get_module("moves.urllib_request")
+ response = _importer._get_module("moves.urllib_response")
+ robotparser = _importer._get_module("moves.urllib_robotparser")
+
+ def __dir__(self):
+ return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+ "moves.urllib")
+
+
+def add_move(move):
+ """Add an item to six.moves."""
+ setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+ """Remove item from six.moves."""
+ try:
+ delattr(_MovedItems, name)
+ except AttributeError:
+ try:
+ del moves.__dict__[name]
+ except KeyError:
+ raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+ _meth_func = "__func__"
+ _meth_self = "__self__"
+
+ _func_closure = "__closure__"
+ _func_code = "__code__"
+ _func_defaults = "__defaults__"
+ _func_globals = "__globals__"
+else:
+ _meth_func = "im_func"
+ _meth_self = "im_self"
+
+ _func_closure = "func_closure"
+ _func_code = "func_code"
+ _func_defaults = "func_defaults"
+ _func_globals = "func_globals"
+
+
+try:
+ advance_iterator = next
+except NameError:
+ def advance_iterator(it):
+ return it.next()
+next = advance_iterator
+
+
+try:
+ callable = callable
+except NameError:
+ def callable(obj):
+ return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+ def get_unbound_function(unbound):
+ return unbound
+
+ create_bound_method = types.MethodType
+
+ def create_unbound_method(func, cls):
+ return func
+
+ Iterator = object
+else:
+ def get_unbound_function(unbound):
+ return unbound.im_func
+
+ def create_bound_method(func, obj):
+ return types.MethodType(func, obj, obj.__class__)
+
+ def create_unbound_method(func, cls):
+ return types.MethodType(func, None, cls)
+
+ class Iterator(object):
+
+ def next(self):
+ return type(self).__next__(self)
+
+ callable = callable
+_add_doc(get_unbound_function,
+ """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+ def iterkeys(d, **kw):
+ return iter(d.keys(**kw))
+
+ def itervalues(d, **kw):
+ return iter(d.values(**kw))
+
+ def iteritems(d, **kw):
+ return iter(d.items(**kw))
+
+ def iterlists(d, **kw):
+ return iter(d.lists(**kw))
+
+ viewkeys = operator.methodcaller("keys")
+
+ viewvalues = operator.methodcaller("values")
+
+ viewitems = operator.methodcaller("items")
+else:
+ def iterkeys(d, **kw):
+ return d.iterkeys(**kw)
+
+ def itervalues(d, **kw):
+ return d.itervalues(**kw)
+
+ def iteritems(d, **kw):
+ return d.iteritems(**kw)
+
+ def iterlists(d, **kw):
+ return d.iterlists(**kw)
+
+ viewkeys = operator.methodcaller("viewkeys")
+
+ viewvalues = operator.methodcaller("viewvalues")
+
+ viewitems = operator.methodcaller("viewitems")
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+ "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+ "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+ def b(s):
+ return s.encode("latin-1")
+
+ def u(s):
+ return s
+ unichr = chr
+ import struct
+ int2byte = struct.Struct(">B").pack
+ del struct
+ byte2int = operator.itemgetter(0)
+ indexbytes = operator.getitem
+ iterbytes = iter
+ import io
+ StringIO = io.StringIO
+ BytesIO = io.BytesIO
+ del io
+ _assertCountEqual = "assertCountEqual"
+ if sys.version_info[1] <= 1:
+ _assertRaisesRegex = "assertRaisesRegexp"
+ _assertRegex = "assertRegexpMatches"
+ _assertNotRegex = "assertNotRegexpMatches"
+ else:
+ _assertRaisesRegex = "assertRaisesRegex"
+ _assertRegex = "assertRegex"
+ _assertNotRegex = "assertNotRegex"
+else:
+ def b(s):
+ return s
+ # Workaround for standalone backslash
+
+ def u(s):
+ return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+ unichr = unichr
+ int2byte = chr
+
+ def byte2int(bs):
+ return ord(bs[0])
+
+ def indexbytes(buf, i):
+ return ord(buf[i])
+ iterbytes = functools.partial(itertools.imap, ord)
+ import StringIO
+ StringIO = BytesIO = StringIO.StringIO
+ _assertCountEqual = "assertItemsEqual"
+ _assertRaisesRegex = "assertRaisesRegexp"
+ _assertRegex = "assertRegexpMatches"
+ _assertNotRegex = "assertNotRegexpMatches"
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+def assertCountEqual(self, *args, **kwargs):
+ return getattr(self, _assertCountEqual)(*args, **kwargs)
+
+
+def assertRaisesRegex(self, *args, **kwargs):
+ return getattr(self, _assertRaisesRegex)(*args, **kwargs)
+
+
+def assertRegex(self, *args, **kwargs):
+ return getattr(self, _assertRegex)(*args, **kwargs)
+
+
+def assertNotRegex(self, *args, **kwargs):
+ return getattr(self, _assertNotRegex)(*args, **kwargs)
+
+
+if PY3:
+ exec_ = getattr(moves.builtins, "exec")
+
+ def reraise(tp, value, tb=None):
+ try:
+ if value is None:
+ value = tp()
+ if value.__traceback__ is not tb:
+ raise value.with_traceback(tb)
+ raise value
+ finally:
+ value = None
+ tb = None
+
+else:
+ def exec_(_code_, _globs_=None, _locs_=None):
+ """Execute code in a namespace."""
+ if _globs_ is None:
+ frame = sys._getframe(1)
+ _globs_ = frame.f_globals
+ if _locs_ is None:
+ _locs_ = frame.f_locals
+ del frame
+ elif _locs_ is None:
+ _locs_ = _globs_
+ exec("""exec _code_ in _globs_, _locs_""")
+
+ exec_("""def reraise(tp, value, tb=None):
+ try:
+ raise tp, value, tb
+ finally:
+ tb = None
+""")
+
+
+if sys.version_info[:2] > (3,):
+ exec_("""def raise_from(value, from_value):
+ try:
+ raise value from from_value
+ finally:
+ value = None
+""")
+else:
+ def raise_from(value, from_value):
+ raise value
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+ def print_(*args, **kwargs):
+ """The new-style print function for Python 2.4 and 2.5."""
+ fp = kwargs.pop("file", sys.stdout)
+ if fp is None:
+ return
+
+ def write(data):
+ if not isinstance(data, basestring):
+ data = str(data)
+ # If the file has an encoding, encode unicode with it.
+ if (isinstance(fp, file) and
+ isinstance(data, unicode) and
+ fp.encoding is not None):
+ errors = getattr(fp, "errors", None)
+ if errors is None:
+ errors = "strict"
+ data = data.encode(fp.encoding, errors)
+ fp.write(data)
+ want_unicode = False
+ sep = kwargs.pop("sep", None)
+ if sep is not None:
+ if isinstance(sep, unicode):
+ want_unicode = True
+ elif not isinstance(sep, str):
+ raise TypeError("sep must be None or a string")
+ end = kwargs.pop("end", None)
+ if end is not None:
+ if isinstance(end, unicode):
+ want_unicode = True
+ elif not isinstance(end, str):
+ raise TypeError("end must be None or a string")
+ if kwargs:
+ raise TypeError("invalid keyword arguments to print()")
+ if not want_unicode:
+ for arg in args:
+ if isinstance(arg, unicode):
+ want_unicode = True
+ break
+ if want_unicode:
+ newline = unicode("\n")
+ space = unicode(" ")
+ else:
+ newline = "\n"
+ space = " "
+ if sep is None:
+ sep = space
+ if end is None:
+ end = newline
+ for i, arg in enumerate(args):
+ if i:
+ write(sep)
+ write(arg)
+ write(end)
+if sys.version_info[:2] < (3, 3):
+ _print = print_
+
+ def print_(*args, **kwargs):
+ fp = kwargs.get("file", sys.stdout)
+ flush = kwargs.pop("flush", False)
+ _print(*args, **kwargs)
+ if flush and fp is not None:
+ fp.flush()
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+ # This does exactly the same what the :func:`py3:functools.update_wrapper`
+ # function does on Python versions after 3.2. It sets the ``__wrapped__``
+ # attribute on ``wrapper`` object and it doesn't raise an error if any of
+ # the attributes mentioned in ``assigned`` and ``updated`` are missing on
+ # ``wrapped`` object.
+ def _update_wrapper(wrapper, wrapped,
+ assigned=functools.WRAPPER_ASSIGNMENTS,
+ updated=functools.WRAPPER_UPDATES):
+ for attr in assigned:
+ try:
+ value = getattr(wrapped, attr)
+ except AttributeError:
+ continue
+ else:
+ setattr(wrapper, attr, value)
+ for attr in updated:
+ getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
+ wrapper.__wrapped__ = wrapped
+ return wrapper
+ _update_wrapper.__doc__ = functools.update_wrapper.__doc__
+
+ def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+ updated=functools.WRAPPER_UPDATES):
+ return functools.partial(_update_wrapper, wrapped=wrapped,
+ assigned=assigned, updated=updated)
+ wraps.__doc__ = functools.wraps.__doc__
+
+else:
+ wraps = functools.wraps
+
+
+def with_metaclass(meta, *bases):
+ """Create a base class with a metaclass."""
+ # This requires a bit of explanation: the basic idea is to make a dummy
+ # metaclass for one level of class instantiation that replaces itself with
+ # the actual metaclass.
+ class metaclass(type):
+
+ def __new__(cls, name, this_bases, d):
+ if sys.version_info[:2] >= (3, 7):
+ # This version introduced PEP 560 that requires a bit
+ # of extra care (we mimic what is done by __build_class__).
+ resolved_bases = types.resolve_bases(bases)
+ if resolved_bases is not bases:
+ d['__orig_bases__'] = bases
+ else:
+ resolved_bases = bases
+ return meta(name, resolved_bases, d)
+
+ @classmethod
+ def __prepare__(cls, name, this_bases):
+ return meta.__prepare__(name, bases)
+ return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+ """Class decorator for creating a class with a metaclass."""
+ def wrapper(cls):
+ orig_vars = cls.__dict__.copy()
+ slots = orig_vars.get('__slots__')
+ if slots is not None:
+ if isinstance(slots, str):
+ slots = [slots]
+ for slots_var in slots:
+ orig_vars.pop(slots_var)
+ orig_vars.pop('__dict__', None)
+ orig_vars.pop('__weakref__', None)
+ if hasattr(cls, '__qualname__'):
+ orig_vars['__qualname__'] = cls.__qualname__
+ return metaclass(cls.__name__, cls.__bases__, orig_vars)
+ return wrapper
+
+
+def ensure_binary(s, encoding='utf-8', errors='strict'):
+ """Coerce **s** to six.binary_type.
+
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+
+ For Python 3:
+ - `str` -> encoded to `bytes`
+ - `bytes` -> `bytes`
+ """
+ if isinstance(s, text_type):
+ return s.encode(encoding, errors)
+ elif isinstance(s, binary_type):
+ return s
+ else:
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
+def ensure_str(s, encoding='utf-8', errors='strict'):
+ """Coerce *s* to `str`.
+
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ if not isinstance(s, (text_type, binary_type)):
+ raise TypeError("not expecting type '%s'" % type(s))
+ if PY2 and isinstance(s, text_type):
+ s = s.encode(encoding, errors)
+ elif PY3 and isinstance(s, binary_type):
+ s = s.decode(encoding, errors)
+ return s
+
+
+def ensure_text(s, encoding='utf-8', errors='strict'):
+ """Coerce *s* to six.text_type.
+
+ For Python 2:
+ - `unicode` -> `unicode`
+ - `str` -> `unicode`
+
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ if isinstance(s, binary_type):
+ return s.decode(encoding, errors)
+ elif isinstance(s, text_type):
+ return s
+ else:
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
+def python_2_unicode_compatible(klass):
+ """
+ A class decorator that defines __unicode__ and __str__ methods under Python 2.
+ Under Python 3 it does nothing.
+
+ To support Python 2 and 3 with a single code base, define a __str__ method
+ returning text and apply this decorator to the class.
+ """
+ if PY2:
+ if '__str__' not in klass.__dict__:
+ raise ValueError("@python_2_unicode_compatible cannot be applied "
+ "to %s because it doesn't define __str__()." %
+ klass.__name__)
+ klass.__unicode__ = klass.__str__
+ klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
+ return klass
+
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = [] # required for PEP 302 and PEP 451
+__package__ = __name__ # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+ __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+ for i, importer in enumerate(sys.meta_path):
+ # Here's some real nastiness: Another "instance" of the six module might
+ # be floating around. Therefore, we can't use isinstance() to check for
+ # the six meta path importer, since the other six instance will have
+ # inserted an importer with different class.
+ if (type(importer).__name__ == "_SixMetaPathImporter" and
+ importer.name == __name__):
+ del sys.meta_path[i]
+ break
+ del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
diff --git a/solenv/inc/ant.properties b/solenv/inc/ant.properties
new file mode 100644
index 000000000..c77b130db
--- /dev/null
+++ b/solenv/inc/ant.properties
@@ -0,0 +1,29 @@
+#
+# 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 .
+#
+# x-no-translate
+build.bin=${build.dir}/bin
+build.class=${build.dir}/class
+build.inc=${build.dir}/inc
+build.lib=${build.dir}/lib
+build.misc=${build.dir}/misc
+build.obj=${build.dir}/obj
+build.res=${build.dir}/res
+build.slb=${build.dir}/slb
+build.slo=${build.dir}/slo
+build.srs=${build.dir}/srs
+
diff --git a/solenv/inc/doxygen.cfg b/solenv/inc/doxygen.cfg
new file mode 100644
index 000000000..2bdabc731
--- /dev/null
+++ b/solenv/inc/doxygen.cfg
@@ -0,0 +1,2402 @@
+# Doxyfile 1.8.9.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "$(DOXYGEN_PROJECTNAME) ($(DOXYGEN_VERSION)) "
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER = 1
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = $(DOXYGEN_OUTPUT)
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES = "tpl=\par Template parameter: \n" \
+ "since=\par Available since: \n" \
+ "derive=\par Derive: \n" \
+ "attention=\par Attention: \n"
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = NO
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = NO
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = NO
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT =
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = $(DOXYGEN_INPUT)
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE = vcl/inc/pch/
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# compiled with the --with-libclang option.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT =
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 1
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT =
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT =
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT =
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION =
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH = $(DOXYGEN_INCLUDE_PATH)
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED = LINUX \
+ UNX \
+ VCL \
+ GCC \
+ X86_64 \
+ _DEBUG_RUNTIME \
+ NPTL \
+ GLIBC=2 \
+ NEW_SOLAR \
+ _USE_NAMESPACE=1 \
+ UNIX \
+ DEBUG \
+ DBG_UTIL \
+ OSL_DEBUG_LEVEL=2 \
+ CUI \
+ EXCEPTIONS_ON \
+ DOXYGEN_ONLY
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES = $(DOXYGEN_REF_TAGFILES)
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE = $(DOXYGEN_OUR_TAGFILE)
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = YES
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = YES
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 500
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = NO
diff --git a/solenv/inc/doxygen_doc.cfg b/solenv/inc/doxygen_doc.cfg
new file mode 100644
index 000000000..dfcf174ee
--- /dev/null
+++ b/solenv/inc/doxygen_doc.cfg
@@ -0,0 +1,2402 @@
+# Doxyfile 1.8.9.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "$(DOXYGEN_PROJECTNAME) ($(DOXYGEN_VERSION)) "
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER = 1
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = $(DOXYGEN_OUTPUT)
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES = "tpl=\par Template parameter: \n" \
+ "since=\par Available since: \n" \
+ "derive=\par Derive: \n" \
+ "attention=\par Attention: \n"
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 2
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = NO
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = NO
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = NO
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT =
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = $(DOXYGEN_INPUT)
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE = vcl/inc/pch/
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# compiled with the --with-libclang option.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT =
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 1
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT =
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT =
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT =
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION =
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH = $(DOXYGEN_INCLUDE_PATH)
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED = LINUX \
+ UNX \
+ VCL \
+ GCC \
+ X86_64 \
+ _DEBUG_RUNTIME \
+ NPTL \
+ GLIBC=2 \
+ NEW_SOLAR \
+ _USE_NAMESPACE=1 \
+ UNIX \
+ DEBUG \
+ DBG_UTIL \
+ OSL_DEBUG_LEVEL=2 \
+ CUI \
+ EXCEPTIONS_ON \
+ DOXYGEN_ONLY
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES = $(DOXYGEN_REF_TAGFILES)
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE = $(DOXYGEN_OUR_TAGFILE)
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 8
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = YES
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = YES
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 500
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 10
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = YES
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES \ No newline at end of file
diff --git a/solenv/inc/doxygen_tag.cfg b/solenv/inc/doxygen_tag.cfg
new file mode 100644
index 000000000..a2f2e6026
--- /dev/null
+++ b/solenv/inc/doxygen_tag.cfg
@@ -0,0 +1,2402 @@
+# Doxyfile 1.8.9.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "$(DOXYGEN_PROJECTNAME) ($(DOXYGEN_VERSION)) "
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER = 1
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = $(DOXYGEN_OUTPUT)
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = NO
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES = "tpl=\par Template parameter: \n" \
+ "since=\par Available since: \n" \
+ "derive=\par Derive: \n" \
+ "attention=\par Attention: \n"
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 2
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = NO
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = NO
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = NO
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT =
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces.
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = $(DOXYGEN_INPUT)
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank the
+# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii,
+# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp,
+# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown,
+# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf,
+# *.qsf, *.as and *.js.
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE = vcl/inc/pch/
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# compiled with the --with-libclang option.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT =
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 1
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT =
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. To get the times font for
+# instance you can specify
+# EXTRA_PACKAGES=times
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT =
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT =
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION =
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH = $(DOXYGEN_INCLUDE_PATH)
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED = LINUX \
+ UNX \
+ VCL \
+ GCC \
+ X86_64 \
+ _DEBUG_RUNTIME \
+ NPTL \
+ GLIBC=2 \
+ NEW_SOLAR \
+ _USE_NAMESPACE=1 \
+ UNIX \
+ DEBUG \
+ DBG_UTIL \
+ OSL_DEBUG_LEVEL=2 \
+ CUI \
+ EXCEPTIONS_ON \
+ DOXYGEN_ONLY
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES = $(DOXYGEN_REF_TAGFILES)
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE = $(DOXYGEN_OUR_TAGFILE)
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = NO
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = NO
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = NO
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = NO
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = NO
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = NO
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot.
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd and svg.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = YES
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 500
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = NO
diff --git a/solenv/inc/langlist.mk b/solenv/inc/langlist.mk
new file mode 100644
index 000000000..bae4c5043
--- /dev/null
+++ b/solenv/inc/langlist.mk
@@ -0,0 +1,171 @@
+#
+# 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 .
+#
+
+# Complete list of all supported localizations (ISO codes)
+completelangiso=af \
+am \
+ar \
+as \
+ast \
+be \
+bg \
+bn \
+bn-IN \
+bo \
+br \
+brx \
+bs \
+ca \
+ca-valencia \
+ckb \
+cs \
+cy \
+da \
+de \
+dgo \
+dsb \
+dz \
+el \
+en-GB \
+en-US \
+en-ZA \
+eo \
+es \
+et \
+eu \
+fa \
+fi \
+fr \
+fur \
+fy \
+ga \
+gd \
+gl \
+gu \
+gug \
+he \
+hsb \
+hi \
+hr \
+hu \
+id \
+is \
+it \
+ja \
+ka \
+kab \
+kk \
+km \
+kmr-Latn \
+kn \
+ko \
+kok \
+ks \
+lb \
+lo \
+lt \
+lv \
+mai \
+mk \
+ml \
+mn \
+mni \
+mr \
+my \
+nb \
+ne \
+nl \
+nn \
+nr \
+nso \
+oc \
+om \
+or \
+pa-IN \
+pl \
+pt \
+pt-BR \
+ro \
+ru \
+rw \
+sa-IN \
+sat \
+sd \
+sr-Latn \
+si \
+sid \
+sk \
+sl \
+sq \
+sr \
+ss \
+st \
+sv \
+sw-TZ \
+szl \
+ta \
+te \
+tg \
+th \
+tn \
+tr \
+ts \
+tt \
+ug \
+uk \
+uz \
+ve \
+vec \
+vi \
+xh \
+zh-CN \
+zh-TW \
+zu
+
+ifneq ($(WITH_LANG),ALL)
+gb_WITH_LANG=$(WITH_LANG)
+else
+# expand ALL based on language list)
+gb_WITH_LANG=$(completelangiso)
+endif
+gb_HELP_LANGS := en-US
+
+ifneq ($(ENABLE_RELEASE_BUILD),TRUE)
+ifneq ($(WITH_LANG),)
+gb_WITH_LANG += qtz
+gb_HELP_LANGS += qtz
+endif
+endif
+
+gb_TRANS_LANGS = $(filter-out en-US,$(filter-out qtz,$(gb_WITH_LANG)))
+
+gb_HELP_LANGS += \
+ $(foreach lang,$(filter-out $(WITH_POOR_HELP_LOCALIZATIONS),$(gb_TRANS_LANGS)),\
+ $(if \
+ $(and \
+ $(wildcard $(SRCDIR)/helpcontent2/source/auxiliary/$(lang)),\
+ $(wildcard $(SRCDIR)/translations/source/$(lang)/helpcontent2)),\
+ $(lang)))
+
+# Langs that need special handling for registry files. This is done by
+# MAKE_LANG_SPECIFIC flag in scp.
+gb_CJK_LANGS := $(filter $(gb_WITH_LANG),ja ko zh-CN zh-TW)
+gb_CTL_LANGS := $(filter $(gb_WITH_LANG),ar bo dz fa gu he hi km ky-CN lo my ne or pa-IN ta th)
+gb_CTLSEQCHECK_LANGS := $(filter $(gb_CTL_LANGS),km lo th)
+
+# vim: set noet ts=4 sw=4:
diff --git a/solenv/inc/mime.types b/solenv/inc/mime.types
new file mode 100644
index 000000000..9248e092f
--- /dev/null
+++ b/solenv/inc/mime.types
@@ -0,0 +1,216 @@
+#
+# 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 .
+#
+# This file controls what Internet media types are sent to the client for
+# given file extension(s). Sending the correct media type to the client
+# is important so they know how to handle the content of the file.
+# For more information about Internet media types, please read
+# RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type
+# registry is at <ftp://ftp.iana.org/assignments/media-types/>.
+# MIME type Extension
+application/EDI-Consent
+application/EDI-X12
+application/EDIFACT
+application/activemessage
+application/andrew-inset ez
+application/applefile
+application/atomicmail
+application/cals-1840
+application/commonground
+application/cybercash
+application/cu-seeme csm cu
+application/dca-rft
+application/dec-dx
+application/eshop
+application/excel xls
+application/ghostview
+application/hyperstudio
+application/iges
+application/mac-binhex40 hqx
+application/mac-compactpro cpt
+application/macwriteii
+application/marc
+application/mathematica
+application/msword doc dot wrd
+application/news-message-id
+application/news-transmission
+application/octet-stream bin dms lha lzh exe class iso
+application/oda oda
+application/pdf pdf
+application/pgp pgp
+application/pgp-encrypted
+application/pgp-keys
+application/pgp-signature pgp
+application/postscript ai eps ps
+application/powerpoint ppt
+application/remote-printing
+application/rtf rtf
+application/slate
+application/wita
+application/wordperfect5.1 wp5
+application/vnd.wap.wbxml wbxml
+application/vnd.wap.wmlc wmlc
+application/vnd.wap.wmlscriptc wmlsc
+application/x-123 wk
+application/x-Wingz wz
+application/x-bcpio bcpio
+application/x-bzip2 bz2
+application/x-cdlink vcd
+application/x-chess-pgn pgn
+application/x-compress z Z
+application/x-cpio cpio
+application/x-csh csh
+application/x-debian-package deb
+application/x-director dcr dir dxr
+application/x-dvi dvi
+application/x-gtar gtar tgz
+application/x-gunzip gz
+application/x-gzip gz
+application/x-hdf hdf
+application/x-httpd-php phtml pht php
+application/x-javascript js
+application/x-java-jnlp-file jnlp
+application/x-kword kwd kwt
+application/x-kspread ksp
+application/x-kpresenter kpr kpt
+application/x-kchart chrt
+application/x-koan skp skd skt skm
+application/x-latex latex
+application/x-maker frm maker frame fm fb book fbdoc
+application/x-mif mif
+application/x-msdos-program com exe bat
+application/x-netcdf nc cdf
+application/x-ns-proxy-autoconfig pac
+application/x-perl pl pm
+application/x-rad rad
+application/x-rpm rpm spm
+application/x-sh sh
+application/x-shar shar
+application/x-stuffit sit
+application/x-sv4cpio sv4cpio
+application/x-sv4crc sv4crc
+application/x-tar tar
+application/x-tcl tcl
+application/x-tex tex
+application/x-texinfo texinfo texi
+application/x-troff t tr roff
+application/x-troff-man man
+application/x-troff-me me
+application/x-troff-ms ms
+application/x-ustar ustar
+application/x-wais-source src
+application/xhtml+xml xhtml xht
+application/zip zip
+audio/basic au snd
+audio/midi mid midi kar
+audio/mpeg mpga mp2 mp3
+audio/x-mpegurl m3u
+audio/x-aiff aif aifc aiff
+audio/x-realaudio ra
+audio/x-wav wav
+chemical/x-pdb pdb
+chemical/x-xyz xyz
+image/bmp bmp
+image/gif gif
+image/ief ief
+image/jpeg jpeg jpg jpe
+image/png png
+image/tiff tiff tif
+image/vnd.djvu djvu djv
+image/vnd.wap.wbmp wbmp
+image/x-cmu-raster ras
+image/x-portable-anymap pnm
+image/x-portable-bitmap pbm
+image/x-portable-graymap pgm
+image/x-portable-pixmap ppm
+image/x-rgb rgb
+image/x-xbitmap xbm
+image/x-xpixmap xpm
+image/x-xwindowdump xwd
+message/external-body
+message/news
+message/partial
+message/rfc822
+model/iges igs iges
+model/mesh msh mesh silo
+model/vrml wrl vrml
+multipart/alternative
+multipart/appledouble
+multipart/digest
+multipart/mixed
+multipart/parallel
+text/css css
+text/html html htm
+text/plain asc txt c cc h hh cpp hpp
+text/richtext rtx
+text/rtf rtf
+text/sgml sgml sgm
+text/tab-separated-values tsv
+text/x-setext etx
+text/x-vCalendar vcs
+text/x-vCard vcf
+text/xml xml dtd xsl
+video/dl dl
+video/fli fli
+video/gl gl
+video/mpeg mp2 mpe mpeg mpg
+video/quicktime qt mov
+video/x-msvideo avi
+video/x-sgi-movie movie
+x-conference/x-cooltalk ice
+x-world/x-vrml wrl vrml
+audio/x-pn-realaudio rmm ram
+audio/vnd.rn-realaudio ra
+application/smil smi smil
+text/vnd.rn-realtext rt
+video/vnd.rn-realvideo rv
+application/sdp sdp
+application/x-sdp sdp
+application/vnd.rn-realmedia rm
+image/vnd.rn-realpix rp
+application/vnd.oasis.opendocument.text odt
+application/vnd.oasis.opendocument.text-template ott
+application/vnd.oasis.opendocument.text-web oth
+application/vnd.oasis.opendocument.text-master odm
+application/vnd.oasis.opendocument.text-master-template otm
+application/vnd.oasis.opendocument.graphics odg
+application/vnd.oasis.opendocument.graphics-template otg
+application/vnd.oasis.opendocument.presentation odp
+application/vnd.oasis.opendocument.presentation-template otp
+application/vnd.oasis.opendocument.spreadsheet ods
+application/vnd.oasis.opendocument.spreadsheet-template ots
+application/vnd.oasis.opendocument.chart odc
+application/vnd.oasis.opendocument.formula odf
+application/vnd.oasis.opendocument.image odi
+application/vnd.sun.xml.writer sxw
+application/vnd.sun.xml.writer.template stw
+application/vnd.sun.xml.writer.global sxg
+application/vnd.stardivision.writer sdw vor
+application/vnd.stardivision.writer-global sgl
+application/vnd.sun.xml.calc sxc
+application/vnd.sun.xml.calc.template stc
+application/vnd.stardivision.calc sdc
+application/vnd.stardivision.chart sds
+application/vnd.sun.xml.impress sxi
+application/vnd.sun.xml.impress.template sti
+application/vnd.stardivision.impress sdd sdp
+application/vnd.sun.xml.draw sxd
+application/vnd.sun.xml.draw.template std
+application/vnd.stardivision.draw sda
+application/vnd.sun.xml.math sxm
+application/vnd.stardivision.math smf
+application/vnd.sun.xml.base odb
diff --git a/solenv/lldb/libreoffice/LO.py b/solenv/lldb/libreoffice/LO.py
new file mode 100644
index 000000000..3c1134cca
--- /dev/null
+++ b/solenv/lldb/libreoffice/LO.py
@@ -0,0 +1,106 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+#
+
+# To use, add something like this to your ~/.lldbinit:
+# command script import '~/lo/sim/solenv/lldb/libreoffice/LO.py'
+
+import lldb
+
+def rtl_String_summary(valobj, dict):
+ if valobj.TypeIsPointerType():
+ return rtl_String_summary(valobj.Dereference(), dict)
+
+ length = valobj.GetChildMemberWithName('length').GetValueAsUnsigned(0)
+ buffer = valobj.GetChildMemberWithName('buffer')
+ buffer_ptr = buffer.AddressOf();
+
+# return '"' + buffer_ptr.GetPointeeData(0, length).GetString(lldb.SBError(), 0) + '"'
+ return sal_ascii_string(buffer_ptr, length)
+
+def rtl_OString_summary(valobj, dict):
+ return rtl_String_summary(valobj.GetChildMemberWithName('pData'), dict)
+
+def sal_ascii_string(buffer_ptr, length):
+ e = lldb.SBError()
+
+ s = '"'
+ i = 0
+ while i < length:
+ c = buffer_ptr.GetPointeeData(i, 1).GetUnsignedInt8(e, 0)
+ if c == ord('"'): s = s + '\\"'
+ elif c == ord('\\'): s = s + '\\\\'
+ elif c == ord('\n'): s = s + '\\n'
+ elif c == ord('\r'): s = s + '\\r'
+ elif c == ord('\t'):
+ s = s + '\\t'
+ elif c < ord(' '):
+ s = s + '\\{:03o}'.format(c)
+ elif c < 127:
+ s = s + chr(c)
+ else:
+ s = s + '\\u{:04x}'.format(c)
+ i = i + 1
+ s = s + '"'
+
+ return s
+
+def rtl_uString_summary(valobj, dict):
+ # print "valobj = " + str(valobj) + ", valobj.GetData() = " + str(valobj.GetData()) + ", valobj.GetTypeName() = " + str(valobj.GetTypeName())
+
+ # As we don't use --skip-pointers when doing the "type summary add" for this function,
+ # the value to be printed might actually be a pointer to a rtl_uString. Weird, huh?
+ if valobj.TypeIsPointerType():
+ return rtl_uString_summary(valobj.Dereference(), dict)
+
+ length = valobj.GetChildMemberWithName('length').GetValueAsUnsigned(0)
+ buffer = valobj.GetChildMemberWithName('buffer')
+
+ buffer_ptr = buffer.AddressOf();
+
+ return sal_unicode_string(buffer_ptr, length)
+
+def rtl_OUString_summary(valobj, dict):
+ return rtl_uString_summary(valobj.GetChildMemberWithName('pData'), dict)
+
+def sal_unicode_string(buffer_ptr, length):
+ e = lldb.SBError()
+
+ s = '"'
+ i = 0
+ while i < length:
+ c = buffer_ptr.GetPointeeData(i, 1).GetUnsignedInt16(e, 0)
+ if c == ord('"'):
+ s = s + '\\"'
+ elif c == ord('\\'):
+ s = s + '\\\\'
+ elif c == ord('\n'):
+ s = s + '\\n'
+ elif c == ord('\r'):
+ s = s + '\\r'
+ elif c == ord('\t'):
+ s = s + '\\t'
+ elif c < ord(' '):
+ s = s + '\\{:03o}'.format(c)
+ elif c < 127:
+ s = s + chr(c)
+ else:
+ s = s + '\\u{:04x}'.format(c)
+ i = i + 1
+ s = s + '"'
+
+ return s
+
+# Automatically install the above summary functions when this is loaded
+def __lldb_init_module(debugger, dict):
+ debugger.HandleCommand("type summary add --skip-references --python-function LO.rtl_String_summary rtl_String")
+ debugger.HandleCommand("type summary add --skip-pointers --skip-references --python-function LO.rtl_OString_summary rtl::OString")
+ debugger.HandleCommand("type summary add --skip-references --python-function LO.rtl_uString_summary rtl_uString")
+ debugger.HandleCommand("type summary add --skip-pointers --skip-references --python-function LO.rtl_OUString_summary rtl::OUString")
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/lockfile/README b/solenv/lockfile/README
new file mode 100644
index 000000000..94a0182c2
--- /dev/null
+++ b/solenv/lockfile/README
@@ -0,0 +1,6 @@
+All files (except for the dummy maillock.h) were copied from liblockfile 1.17.
+
+Just the max sleep time was adjusted in lockfile.c / lockfile_create_save_tmplock:
+
++ if (sleeptime > 60) sleeptime = 60;
+- if (sleeptime > 5) sleeptime = 5;
diff --git a/solenv/lockfile/autoconf.h.in b/solenv/lockfile/autoconf.h.in
new file mode 100644
index 000000000..7695d5496
--- /dev/null
+++ b/solenv/lockfile/autoconf.h.in
@@ -0,0 +1,30 @@
+/* autoconf.h.in. Generated automatically from configure.in by autoheader. */
+/*
+
+acconfig.h - template used by autoheader to create config.h.in
+config.h.in - used by autoconf to create config.h
+config.h - created by autoconf; contains defines generated by autoconf
+
+*/
+
+
+/* Define if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Is the mailspool group writable */
+#undef MAILGROUP
+
+/* Define if you have the utime function. */
+#undef HAVE_UTIME
+
+/* Define if you have the utimes function. */
+#undef HAVE_UTIMES
+
+/* Define if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define if you have the <paths.h> header file. */
+#undef HAVE_PATHS_H
+
+/* Define if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
diff --git a/solenv/lockfile/dotlockfile.c b/solenv/lockfile/dotlockfile.c
new file mode 100644
index 000000000..a25cdc550
--- /dev/null
+++ b/solenv/lockfile/dotlockfile.c
@@ -0,0 +1,457 @@
+/*
+ * dotlockfile.c Command line version of liblockfile.
+ * Runs setgid mail so is able to lock mailboxes
+ * as well. Liblockfile can call this command.
+ *
+ * Copyright (C) Miquel van Smoorenburg and contributors 1999-2021
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ */
+
+#include "autoconf.h"
+
+#include <sys/types.h>
+#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#include <sys/wait.h>
+#include <stdio.h>
+#include <string.h>
+#include <pwd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <errno.h>
+#include "maillock.h"
+#include "lockfile.h"
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifndef HAVE_GETOPT_H
+extern int getopt();
+extern char *optarg;
+extern int optind;
+#endif
+
+static volatile char *tmplock;
+static int quiet;
+
+/*
+ * If we got SIGINT, SIGQUIT, SIGHUP, remove the
+ * tempfile and re-raise the signal.
+ */
+static void got_signal(int sig)
+{
+ if (tmplock && tmplock[0])
+ unlink((char *)tmplock);
+ signal(sig, SIG_DFL);
+ raise(sig);
+}
+
+static void ignore_signal(int sig)
+{
+ (void)sig;
+}
+
+/*
+ * Install signal handler only if the signal was
+ * not ignored already.
+ */
+static int set_signal(int sig, void (*handler)(int))
+{
+ struct sigaction sa;
+
+ if (sigaction(sig, NULL, &sa) < 0)
+ return -1;
+ if (sa.sa_handler == SIG_IGN)
+ return 0;
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_handler = handler;
+ return sigaction(sig, &sa, NULL);
+}
+
+/*
+ * Sleep for an amount of time while regularly checking if
+ * our parent is still alive.
+ */
+int check_sleep(int sleeptime, int flags)
+{
+ int i;
+ int interval = 5;
+ static int ppid = 0;
+
+ if (ppid == 0) ppid = getppid();
+
+ if (flags & L_INTERVAL_D_)
+ interval = 1;
+
+ for (i = 0; i < sleeptime; i += interval) {
+ sleep(interval);
+ if (kill(ppid, 0) < 0 && errno == ESRCH)
+ return L_ERROR;
+ }
+ return 0;
+}
+
+/*
+ * Split a filename up in file and directory.
+ */
+#ifdef MAILGROUP
+static int fn_split(char *fn, char **fn_p, char **dir_p)
+{
+ static char *buf = NULL;
+ char *p;
+
+ if (buf)
+ free (buf);
+ buf = (char *) malloc (strlen (fn) + 1);
+ if (! buf)
+ return L_ERROR;
+ strcpy(buf, fn);
+ if ((p = strrchr(buf, '/')) != NULL) {
+ *p++ = 0;
+ *fn_p = p;
+ *dir_p = buf;
+ } else {
+ *fn_p = fn;
+ *dir_p = ".";
+ }
+ return L_SUCCESS;
+}
+#endif
+
+/*
+ * Return name of lockfile for mail.
+ */
+static char *mlockname(char *user)
+{
+ static char *buf = NULL;
+ char *e;
+
+ if (buf)
+ free(buf);
+
+ e = getenv("MAIL");
+ if (e) {
+ buf = (char *)malloc(strlen(e)+6);
+ if (!buf)
+ return NULL;
+ sprintf(buf, "%s.lock", e);
+ } else {
+ buf = (char *)malloc(strlen(MAILDIR)+strlen(user)+6);
+ if (!buf)
+ return NULL;
+ sprintf(buf, "%s%s.lock", MAILDIR, user);
+ }
+ return buf;
+}
+
+static void perror_exit(const char *why)
+{
+ if (!quiet) {
+ fprintf(stderr, "dotlockfile: ");
+ perror(why);
+ }
+ exit(L_ERROR);
+}
+
+/*
+ * Print usage message and exit.
+ */
+static void usage(void)
+{
+ fprintf(stderr, "Usage: dotlockfile -l [-r retries] [-i interval] [-p] [-q] <-m|lockfile>\n");
+ fprintf(stderr, " dotlockfile -l [-r retries] [-i interval] [-p] [-q] <-m|lockfile> [-P] command args...\n");
+ fprintf(stderr, " dotlockfile -u|-t\n");
+ exit(1);
+}
+
+int main(int argc, char **argv)
+{
+ struct passwd *pwd;
+ struct lockargs_s_ args = { 0 };
+ gid_t gid, egid;
+ char *lockfile = NULL;
+ char **cmd = NULL;
+ int c, r;
+ int retries = 5;
+ int interval = 0;
+ int flags = 0;
+ int lock = 0;
+ int unlock = 0;
+ int check = 0;
+ int touch = 0;
+ int writepid = 0;
+ int passthrough = 0;
+ int cwd_fd = -1;
+ int need_privs = 0;
+ pid_t pid = -1;
+ int e, wstatus;
+
+ /*
+ * Remember real and effective gid, and
+ * drop privs for now.
+ */
+ gid = getgid();
+ egid = getegid();
+ if (gid != egid) {
+ if (setregid(-1, gid) < 0)
+ perror_exit("setregid(-1, gid)");
+ }
+
+ set_signal(SIGINT, got_signal);
+ set_signal(SIGQUIT, got_signal);
+ set_signal(SIGHUP, got_signal);
+ set_signal(SIGTERM, got_signal);
+ set_signal(SIGPIPE, got_signal);
+
+ /*
+ * Process the options.
+ */
+ while ((c = getopt(argc, argv, "+qpNr:mluci:tP")) != EOF) switch(c) {
+ case 'q':
+ quiet = 1;
+ break;
+ case 'p':
+ writepid = 1;
+ break;
+ case 'N':
+ /* NOP */
+ break;
+ case 'r':
+ retries = atoi(optarg);
+ if (retries <= 0 &&
+ retries != -1 && strcmp(optarg, "0") != 0) {
+ if (!quiet)
+ fprintf(stderr, "dotlockfile: "
+ "-r %s: invalid argument\n",
+ optarg);
+ return L_ERROR;
+ }
+ if (retries == -1) {
+ /* 4000 years */
+ retries = 0x7ffffff0;
+ }
+ break;
+ case 'm':
+ if ((pwd = getpwuid(geteuid())) == NULL) {
+ if (!quiet)
+ fprintf(stderr, "dotlockfile: You don't exist. Go away.\n");
+ return L_ERROR;
+ }
+ lockfile = mlockname(pwd->pw_name);
+ if (!lockfile) {
+ if (!quiet)
+ perror("dotlockfile");
+ return L_ERROR;
+ }
+ break;
+ case 'l':
+ lock = 1;
+ break;
+ case 'u':
+ unlock = 1;
+ break;
+ case 'c':
+ check = 1;
+ break;
+ case 'i':
+ interval = atoi(optarg);
+ if (interval <= 0 && strcmp(optarg, "0") != 0) {
+ fprintf(stderr, "dotlockfile: -i needs argument >= 0\n");
+ return L_ERROR;
+ }
+ flags |= L_INTERVAL_D_;
+ args.interval = interval;
+ break;
+ case 't':
+ touch = 1;
+ break;
+ case 'P':
+ passthrough = 1;
+ break;
+ default:
+ usage();
+ break;
+ }
+
+ /*
+ * next argument may be lockfile name
+ */
+ if (!lockfile) {
+ if (optind == argc)
+ usage();
+ lockfile = argv[optind++];
+ }
+
+ /*
+ * next arguments may be command [args...]
+ */
+ if (optind < argc)
+ cmd = argv + optind;
+
+ /*
+ * Options sanity check
+ */
+ if ((cmd || lock) && (touch || check || unlock))
+ usage();
+
+ if (writepid)
+ flags |= (cmd ? L_PID : L_PPID);
+
+#ifdef MAXPATHLEN
+ if (strlen(lockfile) >= MAXPATHLEN) {
+ if (!quiet)
+ fprintf(stderr, "dotlockfile: %s: name too long\n", lockfile);
+ return L_NAMELEN;
+ }
+#endif
+
+ /*
+ * Check if we run setgid.
+ */
+#ifdef MAILGROUP
+ if (gid != egid) {
+ /*
+ * See if the requested lock is for a mailbox.
+ * First, remember current working directory.
+ */
+#ifdef O_PATH
+ cwd_fd = open(".", O_PATH|O_CLOEXEC);
+#else
+ cwd_fd = open(".", O_RDONLY|O_CLOEXEC);
+#endif
+ if (cwd_fd < 0) {
+ if (!quiet)
+ fprintf(stderr, "dotlockfile: opening \".\": %s\n",
+ strerror(errno));
+ return L_ERROR;
+ }
+ /*
+ * Now change directory to the directory the lockfile is in.
+ */
+ char *file, *dir;
+ r = fn_split(lockfile, &file, &dir);
+ if (r != L_SUCCESS) {
+ if (!quiet)
+ perror("dotlockfile");
+ return L_ERROR;
+ }
+ if (chdir(dir) != 0) {
+ if (!quiet)
+ fprintf(stderr, "dotlockfile: %s: %s\n", dir, strerror(errno));
+ return L_ERROR;
+ }
+
+ lockfile = file;
+ need_privs = is_maillock(lockfile);
+ }
+#endif
+
+ /*
+ * See if we actually need to run setgid.
+ */
+ if (need_privs) {
+ if (setregid(gid, egid) != 0)
+ perror_exit("setregid");
+ } else {
+ if (gid != egid && setgid(gid) != 0)
+ perror_exit("setgid");
+ }
+
+ /*
+ * Simple check for a valid lockfile ?
+ */
+ if (check)
+ return (lockfile_check(lockfile, flags) < 0) ? 1 : 0;
+
+
+ /*
+ * Touch lock ?
+ */
+ if (touch)
+ return (lockfile_touch(lockfile) < 0) ? 1 : 0;
+
+ /*
+ * Remove lockfile?
+ */
+ if (unlock)
+ return (lockfile_remove(lockfile) == 0) ? 0 : 1;
+
+
+ /*
+ * No, lock.
+ */
+ r = lockfile_create_set_tmplock(lockfile, &tmplock, retries, flags, &args);
+ if (r != 0 || !cmd)
+ return r;
+
+
+ /*
+ * Spawn command.
+ *
+ * Using an empty signal handler means that we ignore the
+ * signal, but that it's restored to SIG_DFL at execve().
+ */
+ set_signal(SIGINT, ignore_signal);
+ set_signal(SIGQUIT, ignore_signal);
+ set_signal(SIGHUP, ignore_signal);
+ set_signal(SIGALRM, ignore_signal);
+
+ pid = fork();
+ if (pid < 0) {
+ if (!quiet)
+ perror("fork");
+ lockfile_remove(lockfile);
+ exit(L_ERROR);
+ }
+ if (pid == 0) {
+ /* drop setgid */
+ if (gid != egid && setgid(gid) < 0) {
+ perror("setgid");
+ exit(127);
+ }
+ /* restore current working directory */
+ if (cwd_fd >= 0) {
+ if (fchdir(cwd_fd) < 0) {
+ perror("dotlockfile: restoring cwd:");
+ exit(127);
+ }
+ close(cwd_fd);
+ }
+ /* exec */
+ execvp(cmd[0], cmd);
+ perror(cmd[0]);
+ exit(127);
+ }
+
+ /* wait for child */
+ while (1) {
+ if (!writepid)
+ alarm(30);
+ e = waitpid(pid, &wstatus, 0);
+ if (e >= 0 || errno != EINTR)
+ break;
+ if (!writepid)
+ lockfile_touch(lockfile);
+ }
+
+ alarm(0);
+ lockfile_remove(lockfile);
+
+ if (passthrough) {
+ if (WIFEXITED(wstatus))
+ return WEXITSTATUS(wstatus);
+ if (WIFSIGNALED(wstatus))
+ return 128+WTERMSIG(wstatus);
+ }
+ return 0;
+}
+
diff --git a/solenv/lockfile/lockfile.c b/solenv/lockfile/lockfile.c
new file mode 100644
index 000000000..52be40b0f
--- /dev/null
+++ b/solenv/lockfile/lockfile.c
@@ -0,0 +1,611 @@
+/*
+ * lockfile.c Safely creates a lockfile, also over NFS.
+ * This file also holds the implementation for
+ * the Svr4 maillock functions.
+ *
+ * Copyright (C) Miquel van Smoorenburg and contributors 1997-2021.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ */
+
+#include "autoconf.h"
+
+#include <sys/types.h>
+#if HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+#include <errno.h>
+#include "lockfile.h"
+#include "maillock.h"
+
+#ifdef HAVE_UTIME
+#include <utime.h>
+#endif
+
+#ifdef LIB
+static char *mlockfile;
+static int islocked = 0;
+#endif
+
+#ifdef MAILGROUP
+/*
+ * Get the id of the mailgroup, by statting the helper program.
+ * If it is setgroup-id, then the group is the mailgroup.
+ */
+static int mailgid()
+{
+ struct stat st;
+
+ if (stat(LOCKPROG, &st) != 0)
+ return (gid_t)-1;
+ if ((st.st_mode & 02000) == 0)
+ return (gid_t)-1;
+ return st.st_gid;
+}
+
+/*
+ * Is this a lock for a mailbox? Check:
+ * - is the file in /path/to/USERNAME.lock format
+ * - is /path/to/USERNAME present and owned by us
+ * - is /path/to writable by group mail
+ *
+ * To be safe in a setgid program, chdir() into the lockfile
+ * directory first, then pass in the basename of the lockfile.
+ */
+#ifdef LIB
+static
+#endif
+int is_maillock(const char *lockfile)
+{
+ struct stat st;
+ gid_t gid;
+ char tmp[1024];
+ char *p;
+
+ /* remove .lock suffix */
+ strncpy(tmp, lockfile, sizeof(tmp) - 1);
+ tmp[sizeof(tmp) - 1] = 0;
+ if ((p = strrchr(tmp, '.')) == NULL || strcmp(p, ".lock") != 0)
+ return 0;
+ *p = 0;
+
+ /* file to lock must exist, and must be owned by us */
+ if (lstat(tmp, &st) != 0 ||
+ (st.st_mode & S_IFMT) != S_IFREG || st.st_uid != getuid())
+ return 0;
+
+ /* Directory this file is in must be writable by group mail. */
+ if ((gid = mailgid()) == (gid_t)-1)
+ return 0;
+ if ((p = strrchr(tmp, '/')) != NULL)
+ *p = 0;
+ else
+ strncpy(tmp, ".", sizeof(tmp));
+ if (stat(tmp, &st) != 0 || st.st_gid != gid || (st.st_mode & 0020) == 0)
+ return 0;
+
+ return 1;
+}
+
+#ifdef LIB
+/*
+ * Call external program to do the actual locking.
+ */
+static int run_helper(char *opt, const char *lockfile, int retries, int flags)
+{
+ sigset_t set, oldset;
+ char buf[8];
+ pid_t pid, n;
+ int st;
+
+ /*
+ * Better safe than sorry.
+ */
+ if (geteuid() == 0)
+ return L_ERROR;
+
+ /*
+ * Block SIGCHLD. The main program might have installed
+ * handlers we don't want to call.
+ */
+ sigemptyset(&set);
+ sigaddset(&set, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &set, &oldset);
+
+ /*
+ * Fork, execute locking program and wait.
+ */
+ if ((pid = fork()) < 0)
+ return L_ERROR;
+ if (pid == 0) {
+ /* drop privs */
+ if (setuid(geteuid()) < 0) {
+ perror("setuid");
+ _exit(L_ERROR);
+ }
+ snprintf(buf, sizeof(buf), "%d", retries % 1000);
+ execl(LOCKPROG, LOCKPROG, opt, "-r", buf, "-q",
+ (flags & L_PID) ? "-p" : "-N", lockfile, NULL);
+ _exit(L_ERROR);
+ }
+
+ /*
+ * Wait for return status - do something appropriate
+ * if program died or returned L_ERROR.
+ */
+ while ((n = waitpid(pid, &st, 0)) != pid)
+ if (n < 0 && errno != EINTR)
+ break;
+ if (!sigismember(&oldset, SIGCHLD))
+ sigprocmask(SIG_UNBLOCK, &set, NULL);
+ if (n < 0)
+ return L_ERROR;
+ if (!WIFEXITED(st) || WEXITSTATUS(st) == L_ERROR) {
+ errno = EINTR;
+ return L_ERROR;
+ }
+
+ return WEXITSTATUS(st);
+}
+#endif /* LIB*/
+
+#endif /* MAILGROUP */
+
+#define TMPLOCKSTR ".lk"
+#define TMPLOCKSTRSZ strlen(TMPLOCKSTR)
+#define TMPLOCKPIDSZ 5
+#define TMPLOCKTIMESZ 1
+#define TMPLOCKSYSNAMESZ 23
+#define TMPLOCKFILENAMESZ (TMPLOCKSTRSZ + TMPLOCKPIDSZ + \
+ TMPLOCKTIMESZ + TMPLOCKSYSNAMESZ)
+
+static int lockfilename(const char *lockfile, char *tmplock, size_t tmplocksz)
+{
+ char sysname[256];
+ char *p;
+
+#ifdef MAXPATHLEN
+ /*
+ * Safety measure.
+ */
+ if (strlen(lockfile) + TMPLOCKFILENAMESZ > MAXPATHLEN) {
+ errno = ENAMETOOLONG;
+ return L_ERROR;
+ }
+#endif
+
+ if (strlen(lockfile) + TMPLOCKFILENAMESZ + 1 > tmplocksz) {
+ errno = EINVAL;
+ return L_ERROR;
+ }
+
+ /*
+ * Create a temp lockfile (hopefully unique) and write
+ * either our pid/ppid in it, or 0\0 for svr4 compatibility.
+ */
+ if (gethostname(sysname, sizeof(sysname)) < 0)
+ return L_ERROR;
+ if ((p = strchr(sysname, '.')) != NULL)
+ *p = 0;
+ /* strcpy is safe: length-check above, limited at snprintf below */
+ strcpy(tmplock, lockfile);
+ if ((p = strrchr(tmplock, '/')) == NULL)
+ p = tmplock;
+ else
+ p++;
+ if (snprintf(p, TMPLOCKFILENAMESZ, "%s%0*d%0*x%s", TMPLOCKSTR,
+ TMPLOCKPIDSZ, (int)getpid(),
+ TMPLOCKTIMESZ, (int)time(NULL) & 15,
+ sysname) < 0) {
+ // never happens but gets rid of gcc truncation warning.
+ errno = EOVERFLOW;
+ return L_ERROR;
+ }
+
+ return 0;
+}
+
+/*
+ * Create a lockfile.
+ */
+static int lockfile_create_save_tmplock(const char *lockfile,
+ char *tmplock, size_t tmplocksz,
+ volatile char **xtmplock,
+ int retries, int flags, const struct lockargs_s_ *args)
+{
+ struct stat st, st1;
+ char pidbuf[40];
+ pid_t pid = 0;
+ int sleeptime = 0;
+ int statfailed = 0;
+ int fd;
+ int i, e, pidlen;
+ int dontsleep = 1;
+ int tries = retries + 1;
+
+ /* process optional flags that have arguments */
+ if (flags & L_INTERVAL_D_) {
+ sleeptime = args->interval;
+ }
+
+ /* decide which PID to write to the lockfile */
+ if (flags & L_PID)
+ pid = getpid();
+ if (flags & L_PPID) {
+ pid = getppid();
+ if (pid == 1) {
+ /* orphaned */
+ return L_ORPHANED;
+ }
+ }
+ pidlen = snprintf(pidbuf, sizeof(pidbuf), "%d\n", pid);
+ if (pidlen < 0 || pidlen > (int) sizeof(pidbuf) - 1) {
+ errno = EOVERFLOW;
+ return L_ERROR;
+ }
+
+ /* create temporary lockfile */
+ if ((i = lockfilename(lockfile, tmplock, tmplocksz)) != 0)
+ return i;
+ if (xtmplock)
+ *xtmplock = tmplock;
+ fd = open(tmplock, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0644);
+ if (fd < 0) {
+ /* permission denied? perhaps try suid helper */
+#if defined(LIB) && defined(MAILGROUP)
+ if (errno == EACCES && is_maillock(lockfile))
+ return run_helper("-l", lockfile, retries, flags);
+#endif
+ return L_TMPLOCK;
+ }
+ i = write(fd, pidbuf, pidlen);
+ e = errno;
+
+ if (close(fd) != 0) {
+ e = errno;
+ i = -1;
+ }
+ if (i != pidlen) {
+ unlink(tmplock);
+ tmplock[0] = 0;
+ errno = i < 0 ? e : EAGAIN;
+ return L_TMPWRITE;
+ }
+
+ /*
+ * Now try to link the temporary lock to the lock.
+ */
+ for (i = 0; i < tries && tries > 0; i++) {
+ if (!dontsleep) {
+ if (!(flags & L_INTERVAL_D_))
+ sleeptime += 5;
+
+ if (sleeptime > 5) sleeptime = 5;
+#ifdef LIB
+ sleep(sleeptime);
+#else
+ if ((e = check_sleep(sleeptime, flags)) != 0) {
+ unlink(tmplock);
+ tmplock[0] = 0;
+ return e;
+ }
+#endif
+ }
+ dontsleep = 0;
+
+
+ /*
+ * Now lock by linking the tempfile to the lock.
+ *
+ * KLUDGE: some people say the return code of
+ * link() over NFS can't be trusted.
+ * EXTRA FIX: the value of the nlink field
+ * can't be trusted (may be cached).
+ */
+ (void)!link(tmplock, lockfile);
+
+ if (lstat(tmplock, &st1) < 0) {
+ tmplock[0] = 0;
+ return L_ERROR; /* Can't happen */
+ }
+
+ if (lstat(lockfile, &st) < 0) {
+ if (statfailed++ > 5) {
+ /*
+ * Normally, this can't happen; either
+ * another process holds the lockfile or
+ * we do. So if this error pops up
+ * repeatedly, just exit...
+ */
+ e = errno;
+ (void)unlink(tmplock);
+ tmplock[0] = 0;
+ errno = e;
+ return L_MAXTRYS;
+ }
+ continue;
+ }
+
+ /*
+ * See if we got the lock.
+ */
+ if (st.st_rdev == st1.st_rdev &&
+ st.st_ino == st1.st_ino) {
+ (void)unlink(tmplock);
+ tmplock[0] = 0;
+ return L_SUCCESS;
+ }
+ statfailed = 0;
+
+ /*
+ * If there is a lockfile and it is invalid,
+ * remove the lockfile.
+ */
+ if (lockfile_check(lockfile, flags) == -1) {
+ if (unlink(lockfile) < 0 && errno != ENOENT) {
+ /*
+ * we failed to unlink the stale
+ * lockfile, give up.
+ */
+ return L_RMSTALE;
+ }
+ dontsleep = 1;
+ /*
+ * If the lockfile was invalid, then the first
+ * try wasn't valid either - make sure we
+ * try at least once more.
+ */
+ if (tries == 1) tries++;
+ }
+
+ }
+ (void)unlink(tmplock);
+ tmplock[0] = 0;
+ errno = EAGAIN;
+ return L_MAXTRYS;
+}
+
+#ifdef LIB
+static
+#endif
+int lockfile_create_set_tmplock(const char *lockfile, volatile char **xtmplock, int retries, int flags, const struct lockargs_s_ *args)
+{
+ char *tmplock;
+ int r, e;
+ size_t l;
+
+ l = strlen(lockfile)+TMPLOCKFILENAMESZ+1;
+ if ((tmplock = (char *)malloc(l)) == NULL)
+ return L_ERROR;
+ tmplock[0] = 0;
+ r = lockfile_create_save_tmplock(lockfile,
+ tmplock, l, xtmplock, retries, flags, args);
+ if (xtmplock)
+ *xtmplock = NULL;
+ e = errno;
+ free(tmplock);
+ errno = e;
+ return r;
+}
+
+#ifdef LIB
+int lockfile_create(const char *lockfile, int retries, int flags)
+{
+ /* check against unknown flags */
+ if (flags & ~(L_PID|L_PPID)) {
+ errno = EINVAL;
+ return L_ERROR;
+ }
+ return lockfile_create_set_tmplock(lockfile, NULL, retries, flags, NULL);
+}
+
+#ifdef STATIC
+int lockfile_create2(const char *lockfile, int retries,
+ int flags, struct lockargs_s_ *args, int args_sz)
+{
+
+ #define FLAGS_WITH_ARGS (L_INTERVAL_D_)
+ #define KNOWN_FLAGS (L_PID|L_PPID|L_INTERVAL_D_)
+
+ /* check if size is the same (version check) */
+ if (args != NULL && sizeof(struct lockargs_s_) != args_sz) {
+ errno = EINVAL;
+ return L_ERROR;
+ }
+ /* some flags _must_ have a non-null args */
+ if (args == NULL && (flags & FLAGS_WITH_ARGS)) {
+ errno = EINVAL;
+ return L_ERROR;
+ }
+ /* check against unknown flags */
+ if (flags & ~KNOWN_FLAGS) {
+ errno = EINVAL;
+ return L_ERROR;
+ }
+ return lockfile_create_set_tmplock(lockfile, NULL, retries, flags, args);
+}
+#endif
+
+#endif
+
+/*
+ * See if a valid lockfile is present.
+ * Returns 0 if so, -1 if not.
+ */
+int lockfile_check(const char *lockfile, int flags)
+{
+ struct stat st, st2;
+ char buf[16];
+ time_t now;
+ pid_t pid;
+ int fd, len, r;
+
+ if (stat(lockfile, &st) < 0)
+ return -1;
+
+ /*
+ * Get the contents and mtime of the lockfile.
+ */
+ time(&now);
+ pid = 0;
+ if ((fd = open(lockfile, O_RDONLY)) >= 0) {
+ /*
+ * Try to use 'atime after read' as now, this is
+ * the time of the filesystem. Should not get
+ * confused by 'atime' or 'noatime' mount options.
+ */
+ len = 0;
+ if (fstat(fd, &st) == 0 &&
+ (len = read(fd, buf, sizeof(buf))) >= 0 &&
+ fstat(fd, &st2) == 0 &&
+ st.st_atime != st2.st_atime)
+ now = st.st_atime;
+ close(fd);
+ if (len > 0 && (flags & (L_PID|L_PPID))) {
+ buf[len] = 0;
+ pid = atoi(buf);
+ }
+ }
+
+ if (pid > 0) {
+ /*
+ * If we have a pid, see if the process
+ * owning the lockfile is still alive.
+ */
+ r = kill(pid, 0);
+ if (r == 0 || errno == EPERM)
+ return 0;
+ if (r < 0 && errno == ESRCH)
+ return -1;
+ /* EINVAL - FALLTHRU */
+ }
+
+ /*
+ * Without a pid in the lockfile, the lock
+ * is valid if it is newer than 5 mins.
+ */
+
+ if (now < st.st_mtime + 300)
+ return 0;
+
+ return -1;
+}
+
+/*
+ * Remove a lock.
+ */
+int lockfile_remove(const char *lockfile)
+{
+ if (unlink(lockfile) < 0) {
+#if defined(LIB) && defined(MAILGROUP)
+ if (errno == EACCES && is_maillock(lockfile))
+ return run_helper("-u", lockfile, 0, 0);
+#endif
+ return errno == ENOENT ? 0 : -1;
+ }
+ return 0;
+}
+
+/*
+ * Touch a lock.
+ */
+int lockfile_touch(const char *lockfile)
+{
+#ifdef HAVE_UTIME
+ return utime(lockfile, NULL);
+#else
+ return utimes(lockfile, NULL);
+#endif
+}
+
+#ifdef LIB
+/*
+ * Lock a mailfile. This looks a lot like the SVR4 function.
+ * Arguments: lusername, retries.
+ */
+int maillock(const char *name, int retries)
+{
+ char *p, *mail;
+ char *newlock;
+ int i, e;
+ int len, newlen;
+
+ if (islocked) return 0;
+
+#ifdef MAXPATHLEN
+ if (strlen(name) + sizeof(MAILDIR) + 6 > MAXPATHLEN) {
+ errno = ENAMETOOLONG;
+ return L_NAMELEN;
+ }
+#endif
+
+ /*
+ * If $MAIL is for the same username as "name"
+ * then use $MAIL instead.
+ */
+
+ len = strlen(name)+strlen(MAILDIR)+6;
+ mlockfile = (char *)malloc(len);
+ if (!mlockfile)
+ return L_ERROR;
+ sprintf(mlockfile, "%s%s.lock", MAILDIR, name);
+ if ((mail = getenv("MAIL")) != NULL) {
+ if ((p = strrchr(mail, '/')) != NULL)
+ p++;
+ else
+ p = mail;
+ if (strcmp(p, name) == 0) {
+ newlen = strlen(mail)+6;
+#ifdef MAXPATHLEN
+ if (newlen > MAXPATHLEN) {
+ errno = ENAMETOOLONG;
+ return L_NAMELEN;
+ }
+#endif
+ if (newlen > len) {
+ newlock = (char *)realloc (mlockfile, newlen);
+ if (newlock == NULL) {
+ e = errno;
+ free (mlockfile);
+ mlockfile = NULL;
+ errno = e;
+ return L_ERROR;
+ }
+ mlockfile = newlock;
+ }
+ sprintf(mlockfile, "%s.lock", mail);
+ }
+ }
+ i = lockfile_create(mlockfile, retries, 0);
+ if (i == 0) islocked = 1;
+
+ return i;
+}
+
+void mailunlock(void)
+{
+ if (!islocked) return;
+ lockfile_remove(mlockfile);
+ free (mlockfile);
+ islocked = 0;
+}
+
+void touchlock(void)
+{
+ lockfile_touch(mlockfile);
+}
+#endif
+
diff --git a/solenv/lockfile/lockfile.h b/solenv/lockfile/lockfile.h
new file mode 100644
index 000000000..f2f72022f
--- /dev/null
+++ b/solenv/lockfile/lockfile.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 1999 Miquel van Smoorenburg
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Library General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * On Debian GNU/Linux systems, the complete text of the GNU Library
+ * General Public License can be found in `/usr/doc/copyright/LGPL'.
+ * You can also find a copy on the GNU website at http://www.gnu.org/
+ */
+#ifndef LOCKFILE_H_
+#define LOCKFILE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Prototypes.
+ */
+int lockfile_create(const char *lockfile, int retries, int flags);
+int lockfile_remove(const char *lockfile);
+int lockfile_touch(const char *lockfile);
+int lockfile_check(const char *lockfile, int flags);
+
+/*
+ * Return values for lockfile_create()
+ */
+#define L_SUCCESS 0 /* Lockfile created */
+#define L_NAMELEN 1 /* Recipient name too long */
+#define L_TMPLOCK 2 /* Error creating temp lockfile */
+#define L_TMPWRITE 3 /* Can't write pid into temp lockfile */
+#define L_MAXTRYS 4 /* Failed after max. number of attempts */
+#define L_ERROR 5 /* Unknown error; check errno */
+#define L_MANLOCK 6 /* Cannot set mandatory lock on tempfile */
+#define L_ORPHANED 7 /* Called with L_PPID but parent is gone */
+#define L_RMSTALE 8 /* Failed to remove stale lockfile */
+
+/*
+ * Flag values for lockfile_create()
+ */
+#define L_PID 16 /* Put PID in lockfile */
+#define L_PPID 32 /* Put PPID in lockfile */
+
+/*
+ * Experimental.
+ */
+struct lockargs_s_ {
+ int interval; /* Static interval between retries */
+};
+#define L_INTERVAL_D_ 64 /* Specify consistent retry interval */
+#ifdef LOCKFILE_EXPERIMENTAL
+#define lockargs lockargs_s_
+#define L_INTERVAL L_INTERVAL_D_
+int lockfile_create2(const char *lockfile, int retries,
+ int flags, struct lockargs *args, int args_sz);
+#endif
+
+#ifndef LIB
+int check_sleep(int, int);
+#endif
+int is_maillock(const char *lockfile);
+int lockfile_create_set_tmplock(const char *lockfile, volatile char **tmplock,
+ int retries, int flags, const struct lockargs_s_ *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LOCKFILE_H */
diff --git a/solenv/lockfile/maillock.h b/solenv/lockfile/maillock.h
new file mode 100644
index 000000000..565e002d0
--- /dev/null
+++ b/solenv/lockfile/maillock.h
@@ -0,0 +1 @@
+#define MAILDIR "/very/likely/doesnt/exists"
diff --git a/solenv/maven/BUCK b/solenv/maven/BUCK
new file mode 100644
index 000000000..fd1252df0
--- /dev/null
+++ b/solenv/maven/BUCK
@@ -0,0 +1,44 @@
+include_defs('//solenv/maven/VERSION')
+include_defs('//solenv/maven/package.defs')
+
+URL = 'https://oss.sonatype.org/content/repositories/snapshots' \
+ if LIBREOFFICE_VERSION.endswith('-SNAPSHOT') else \
+ 'https://oss.sonatype.org/service/local/staging/deploy/maven2'
+
+maven_package(
+ repository = 'sonatype-nexus-staging',
+ url = URL,
+ version = LIBREOFFICE_VERSION,
+ jar = {
+ 'juh': '//:juh',
+ 'jurt': '//:jurt',
+ 'officebean': '//:officebean',
+ 'ridl': '//:ridl',
+ 'unoil': '//:unoil',
+ 'unoloader': '//:unoloader',
+ 'libreoffice': '//:libreoffice',
+ },
+ src = {
+ 'juh': '//javaunohelper:juh-src',
+ 'jurt': '//jurt:jurt-src',
+ 'officebean': '//bean:officebean-src',
+ 'ridl': '//ridljar:ridl-src',
+ 'unoil': '//unoil:unoil-src',
+ 'unoloader': '//ridljar/source/unoloader:unoloader-src',
+ 'libreoffice': '//ridljar:libreoffice-src',
+ },
+ doc = {
+ 'juh': '//javaunohelper:juh-javadoc',
+ 'jurt': '//jurt:jurt-javadoc',
+ 'officebean': '//bean:officebean-javadoc',
+ 'ridl': '//ridljar:ridl-javadoc',
+ 'unoil': '//unoil:unoil-javadoc',
+ 'unoloader': '//ridljar/source/unoloader:unoloader-javadoc',
+ 'libreoffice': '//ridljar:libreoffice-javadoc',
+ },
+)
+
+python_binary(
+ name = 'mvn',
+ main = 'mvn.py',
+)
diff --git a/solenv/maven/README.md b/solenv/maven/README.md
new file mode 100644
index 000000000..0b19cd2fe
--- /dev/null
+++ b/solenv/maven/README.md
@@ -0,0 +1,384 @@
+= Uploading LibreOffice API to Maven Central
+
+This file documents the prerequisites and workflow to upload LibreOffice
+API to Maven Central or local Maven repository.
+
+To install LibreOffice API to local Maven repository or deploy the API
+to the Maven Central, extra build toolchain is required.
+
+`Ant` is used to bootstrap `Buck` build tool. `Buck` build tool is
+used to build sources and javadocs for the API and install or deploy
+the artifacts to Maven repository. `Maven` commands are invoked for
+that from within `Buck` driven build - so make sure you've maven
+installed, too. To be able to upload the API to Maven Central, access
+must be granted to LibreOffice project on OSSRH.
+
+
+== Buck
+
+`Buck` is new build tool that uses Python to write build files. It is
+maintained by Facebook and is available under Apache 2 license.
+
+
+=== Installing Buck
+
+There is currently no binary distribution of `Buck`, so it has to be manually
+built and installed. Apache Ant and gcc are required.
+
+Clone the git and build it:
+
+----
+ git clone https://github.com/facebook/buck
+ cd buck
+ ant
+----
+
+If you don't have a `bin/` directory in your home directory, create one:
+
+----
+ mkdir ~/bin
+----
+
+Add the `~/bin` folder to the path:
+
+----
+ PATH=~/bin:$PATH
+----
+
+Note that the buck executable needs to be available in all shell sessions,
+so also make sure it is appended to the path globally.
+
+Add a symbolic link in `~/bin` to the buck and buckd executables:
+
+----
+ ln -s `pwd`/bin/buck ~/bin/
+ ln -s `pwd`/bin/buckd ~/bin/
+----
+
+Verify that `buck` is accessible:
+
+----
+ which buck
+----
+
+To enable autocompletion of buck commands, install the autocompletion
+script from `./scripts/buck_completion.bash` in the buck project. Refer
+to the script's header comments for installation instructions.
+
+
+=== Prerequisites
+
+Buck requires Python version 2.7 to be installed. The Maven download toolchain
+requires `curl` to be installed.
+
+
+=== Using Buck daemon
+
+Buck ships with a daemon command `buckd`, which uses the
+link:https://github.com/martylamb/nailgun[Nailgun] protocol for running
+Java programs from the command line without incurring the JVM startup
+overhead.
+
+Using a Buck daemon can save significant amounts of time as it avoids the
+overhead of starting a Java virtual machine, loading the buck class files
+and parsing the build files for each command.
+
+It is safe to run several buck daemons started from different project
+directories and they will not interfere with each other. Buck's documentation
+covers daemon in http://facebook.github.io/buck/command/buckd.html[buckd].
+
+To use `buckd` the additional
+link:https://facebook.github.io/watchman[watchman] program must be installed.
+
+To disable `buckd`, the environment variable `NO_BUCKD` must be set. It's not
+recommended to put it in the shell config, as it can be forgotten about it and
+then assumed Buck was working as it should when it should be using buckd.
+Prepend the variable to Buck invocation instead:
+
+----
+ NO_BUCKD=1 buck build api
+----
+
+
+=== Installing watchman
+
+Watchman is used internally by Buck to monitor directory trees and is needed
+for buck daemon to work properly. Because buckd is activated by default in the
+latest version of Buck, it searches for the watchman executable in the
+path and issues a warning when it is not found and kills buckd.
+
+To prepare watchman installation on Linux:
+
+----
+ git clone https://github.com/facebook/watchman.git
+ cd watchman
+ ./autogen.sh
+----
+
+To install it in user home directory (without root privileges):
+
+----
+ ./configure --prefix $HOME/watchman
+ make install
+----
+
+To install it system wide:
+
+----
+ ./configure
+ make
+ sudo make install
+----
+
+Put $HOME/watchman/bin/watchman in path or link to $HOME/bin/watchman.
+
+To install watchman on macOS:
+
+----
+ brew install --HEAD watchman
+----
+
+See the original documentation for more information:
+link:https://facebook.github.io/watchman/docs/install.html[Watchman
+installation].
+
+
+=== Override Buck's settings
+
+Additional JVM args for Buck can be set in `.buckjavaargs` in the
+project root directory. For example to override Buck's default 1GB
+heap size:
+
+----
+ cat > .buckjavaargs <<EOF
+ -XX:MaxPermSize=512m -Xms8000m -Xmx16000m
+ EOF
+----
+
+
+== Preparations to publish LibreOffice API to Maven Central
+
+
+=== Deploy Configuration settings for Maven Central
+
+
+To be able to publish artifacts to Maven Central some preparations must
+be done:
+
+* Create an account on
+link:https://issues.sonatype.org/secure/Signup!default.jspa[Sonatype's Jira].
+
+Sonatype is the company that runs Maven Central and you need a Sonatype
+account to be able to upload artifacts to Maven Central.
+
+* Configure your Sonatype user and password in `~/.m2/settings.xml`:
+
+----
+<settings>
+ <servers>
+ <server>
+ <id>sonatype-nexus-staging</id>
+ <username>USER</username>
+ <password>PASSWORD</password>
+ </server>
+ </servers>
+</settings>
+----
+
+* Request permissions to upload artifacts to the `org.libreoffice`
+repository on Maven Central:
+
+Ask for this permission by adding a comment on the
+link:https://issues.sonatype.org/browse/OSSRH-19129[OSSRH-19129] Jira
+ticket at Sonatype.
+
+The request needs to be approved by someone who already has this
+permission by commenting on the same issue.
+
+* Generate and publish a PGP key
+
+Generate and publish a PGP key as described in
+link:http://central.sonatype.org/pages/working-with-pgp-signatures.html[
+Working with PGP Signatures].
+
+Please be aware that after publishing your public key it may take a
+while until it is visible to the Sonatype server.
+
+The PGP key is needed to be able to sign the artifacts before the
+upload to Maven Central.
+
+The PGP passphrase can be put in `~/.m2/settings.xml`, or
+alternatively make gpg use the agent to provide and cache the
+credentials:
+
+----
+<settings>
+ <profiles>
+ <profile>
+ <id>gpg</id>
+ <properties>
+ <gpg.executable>gpg2</gpg.executable>
+ <gpg.passphrase>mypassphrase</gpg.passphrase>
+ <gpg.keyname>mykeynameoremail</gpg.keyname>
+ <gpg.useAgent>true</gpg.useAgent>
+ </properties>
+ </profile>
+ </profiles>
+ <activeProfiles>
+ <activeProfile>gpg</activeProfile>
+ </activeProfiles>
+</settings>
+----
+
+It can also be included in the key chain on macOS.
+
+
+== Update Versions
+
+Before publishing new artifacts to Maven Central, `LIBREOFFICE_VERSION`
+in the `VERSION` file must be updated, e.g. change it from `5.0.0` to `5.1.0`.
+
+In addition the version must be updated in a number of pom.xml files.
+
+To do this run the `./solenv/bin/version.py` script and provide the new
+version as parameter, e.g.:
+
+----
+ ./solenv/bin/version.py 5.1.0
+----
+
+
+== Build LibreOffice
+
+Build LibreOffice as usually, so that API JARs are created.
+
+
+== Publish the LibreOffice artifacts to local Maven repository
+
+Execute this command to install LibreOffice API to your local Maven
+repository. For troubleshooting, the environment variable `VERBOSE`
+can be set:
+
+----
+ VERBOSE=1 buck build api_install
+----
+
+Once executed, the local Maven repository contains the LibreOffice API
+artifacts:
+
+----
+ $ ls -1 ~/.m2/repository/org/libreoffice/unoil/5.1.0/
+ _maven.repositories
+ unoil-5.1.0.jar
+ unoil-5.1.0-javadoc.jar
+ unoil-5.1.0.pom
+ unoil-5.1.0-sources.jar
+----
+
+
+== Publish the LibreOffice artifacts to Maven Central
+
+* Make sure you have done the configuration for deploying to Maven Central.
+* Make sure that the version is updated in the `VERSION` file and in
+the `pom.xml` files as described above.
+
+Push the API to Maven Central:
+
+----
+ buck build api_deploy
+----
+
+For troubleshooting, the environment variable `VERBOSE` can be set. This
+prints out the commands that are executed by the Buck build process:
+
+----
+ VERBOSE=1 buck build api_deploy
+----
+
+If no artifacts are uploaded, clean the `buck-out` folder and retry:
+
+----
+ rm -rf buck-out
+----
+
+* To where the artifacts are uploaded depends on the `LIBREOFFICE_VERSION`
+in the `VERSION` file:
+
+** SNAPSHOT versions are directly uploaded into the Sonatype snapshots
+repository and no further action is needed:
+
+https://oss.sonatype.org/content/repositories/snapshots/org/libreoffice/
+
+** Release versions are uploaded into a staging repository in the
+link:https://oss.sonatype.org/[Sonatype Nexus Server].
+
+* Verify the staging repository
+
+** Go to the link:https://oss.sonatype.org/[Sonatype Nexus Server] and
+sign in with your Sonatype credentials.
+
+** Click on 'Build Promotion' in the left navigation bar under
+'Staging Repositories' and find the `orglibreoffice-XXXX` staging
+repository.
+
+** Verify its content
+
+While the staging repository is open you can upload further content and
+also replace uploaded artifacts. If something is wrong with the staging
+repository you can drop it by selecting it and clicking on `Drop`.
+
+** Run Sonatype validations on the staging repository
+
+Select the staging repository and click on `Close`. This runs the
+Sonatype validations on the staging repository. The repository will
+only be closed if everything is OK. A closed repository cannot be
+modified anymore, but you may still drop it if you find any issues.
+
+** Test closed staging repository
+
+Once a repository is closed you can find the URL to it in the `Summary`
+section, e.g. https://oss.sonatype.org/content/repositories/orglibreoffice-4711
+
+Use this URL for further testing of the artifacts in this repository,
+e.g. to try building an extension against this API in this repository
+update the version in the `pom.xml` and configure the repository:
+
+----
+ <repositories>
+ <repository>
+ <id>mexus-staging-repository</id>
+ <url>https://oss.sonatype.org/content/repositories/orglibreoffice-4711</url>
+ </repository>
+ </repositories>
+----
+
+* Release the staging repository
+
+How to release a staging repository is described in the
+link:https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide#SonatypeOSSMavenRepositoryUsageGuide-8.a.2.ReleasingaStagingRepository[
+Sonatype OSS Maven Repository Usage Guide].
+
+[WARNING]
+Releasing artifacts to Maven Central cannot be undone!
+
+** Find the closed staging repository in the
+link:https://oss.sonatype.org/[Sonatype Nexus Server], select it and
+click on `Release`.
+
+** The released artifacts are available in
+https://oss.sonatype.org/content/repositories/releases/org/libreoffice/
+
+** It may take up to 2 hours until the artifacts appear on Maven
+Central:
+
+http://central.maven.org/maven2/org/libreoffice/
+
+* [optional]: View download statistics
+
+** Sign in to the
+link:https://oss.sonatype.org/[Sonatype Nexus Server].
+
+** Click on 'Views/Repositories' in the left navigation bar under
+'Central Statistics'.
+
+** Select `org.libreoffice` as `Project`.
diff --git a/solenv/maven/VERSION b/solenv/maven/VERSION
new file mode 100644
index 000000000..c99b63d49
--- /dev/null
+++ b/solenv/maven/VERSION
@@ -0,0 +1,7 @@
+# Maven style API version (e.g. '2.x-SNAPSHOT').
+#
+# Used by :install and :deploy when talking to the destination repository. As
+# we currently have no stable releases, we use the "build number" scheme
+# described at:
+# http://mojo.codehaus.org/versions-maven-plugin/version-rules.html
+LIBREOFFICE_VERSION = '@version@'
diff --git a/solenv/maven/mvn.py b/solenv/maven/mvn.py
new file mode 100755
index 000000000..5b45447da
--- /dev/null
+++ b/solenv/maven/mvn.py
@@ -0,0 +1,78 @@
+#!/usr/bin/python
+# 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/.
+
+from __future__ import print_function
+from optparse import OptionParser
+from os import path, environ
+from subprocess import check_output
+from sys import stderr
+
+M = {
+ 'juh': 'javaunohelper',
+ 'jurt': 'jurt',
+ 'officebean': 'bean',
+ 'ridl': 'ridljar',
+ 'unoil': 'unoil',
+ 'unoloader': 'ridljar',
+ 'libreoffice': 'ridljar',
+}
+
+opts = OptionParser()
+opts.add_option('--repository', help='maven repository id')
+opts.add_option('--url', help='maven repository url')
+opts.add_option('-o')
+opts.add_option('-a', help='action (valid actions are: install,deploy)')
+opts.add_option('-v', help='gerrit version')
+opts.add_option('-s', action='append', help='triplet of artifactId:type:path')
+
+args, ctx = opts.parse_args()
+if not args.v:
+ print('version is empty', file=stderr)
+ exit(1)
+
+root = path.abspath(__file__)
+while not path.exists(path.join(root, '.buckconfig')):
+ root = path.dirname(root)
+
+if 'install' == args.a:
+ cmd = [
+ 'mvn',
+ 'install:install-file',
+ '-Dversion=%s' % args.v,
+ ]
+elif 'deploy' == args.a:
+ cmd = [
+ 'mvn',
+ 'gpg:sign-and-deploy-file',
+ '-DrepositoryId=%s' % args.repository,
+ '-Durl=%s' % args.url,
+ ]
+else:
+ print("unknown action -a %s" % args.a, file=stderr)
+ exit(1)
+
+for spec in args.s:
+ artifact, packaging_type, src = spec.split(':')
+ exe = cmd + [
+ '-DpomFile=%s' % path.join(root, '%s/pom.%s.xml' % (M[artifact], artifact)),
+ '-Dpackaging=%s' % packaging_type,
+ '-Dfile=%s' % src,
+ ]
+ try:
+ if environ.get('VERBOSE'):
+ print(' '.join(exe), file=stderr)
+ check_output(exe)
+ except Exception as e:
+ print('%s command failed: %s' % (args.a, e), file=stderr)
+ exit(1)
+
+with open(args.o, 'w') as fd:
+ if args.repository:
+ print('Repository: %s' % args.repository, file=fd)
+ if args.url:
+ print('URL: %s' % args.url, file=fd)
+ print('Version: %s' % args.v, file=fd)
diff --git a/solenv/maven/package.defs b/solenv/maven/package.defs
new file mode 100644
index 000000000..2c67d8fe9
--- /dev/null
+++ b/solenv/maven/package.defs
@@ -0,0 +1,28 @@
+def maven_package(
+ version,
+ repository = None,
+ url = None,
+ jar = {},
+ src = {},
+ doc = {}):
+ cmd = ['$(exe //solenv/maven:mvn)', '-v', version, '-o', '$OUT']
+ api_cmd = []
+ for type,d in [('jar', jar), ('java-source', src), ('javadoc', doc)]:
+ for a,t in d.iteritems():
+ api_cmd.append('-s %s:%s:$(location %s)' % (a,type,t))
+
+ genrule(
+ name = 'api_install',
+ cmd = ' '.join(cmd + api_cmd + ['-a', 'install']),
+ out = 'api_install.info',
+ )
+
+ if repository and url:
+ genrule(
+ name = 'api_deploy',
+ cmd = ' '.join(cmd + api_cmd + [
+ '-a', 'deploy',
+ '--repository', repository,
+ '--url', url]),
+ out = 'api_deploy.info',
+ )
diff --git a/solenv/qa/python/gbuildtojson.py b/solenv/qa/python/gbuildtojson.py
new file mode 100644
index 000000000..b54c901e9
--- /dev/null
+++ b/solenv/qa/python/gbuildtojson.py
@@ -0,0 +1,157 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-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/.
+
+'''
+
+import subprocess
+import unittest
+import json
+import os
+import os.path
+import tempfile
+import shutil
+
+
+# these contortions seem unavoidable for windows
+def getgbuildtesttools(testcase):
+ with open(os.path.join(os.environ['WORKDIR'], 'CustomTarget', 'solenv', 'gbuildtesttools.done'), 'r') as f:
+ gbuildtesttools = json.load(f)
+ testcase.make = gbuildtesttools['MAKE']
+ testcase.bash = gbuildtesttools['BASH']
+ testcase.gbuildtojson = gbuildtesttools['GBUILDTOJSON']
+
+makeenvvars = ['MAKEOVERRIDES', 'MAKEFLAGS', 'MAKE_TERMERR', 'MAKE_TERMOUT', 'MAKELEVEL', 'MFLAGS', 'GBUILD_TRACE']
+def clearmakevars():
+ if 'LD_LIBRARY_PATH' in os.environ:
+ os.environ['GBUILDTOJSON_LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
+ del(os.environ['LD_LIBRARY_PATH']) # built with ASAN; prevent that
+ for makeenvvar in makeenvvars:
+ if makeenvvar in os.environ:
+ del os.environ[makeenvvar]
+
+
+class CheckGbuildToJson(unittest.TestCase):
+ def setUp(self):
+ getgbuildtesttools(self)
+ clearmakevars()
+ self.tempwork = tempfile.mkdtemp(prefix='gbuild')
+
+ def tearDown(self):
+ shutil.rmtree(self.tempwork)
+
+ def test_gbuildtojson(self):
+ os.makedirs(os.path.join(self.tempwork, 'LinkTarget', 'Executable'))
+ shutil.copy(self.gbuildtojson, os.path.join(self.tempwork, 'LinkTarget', 'Executable'))
+ (bashscripthandle, bashscriptname) = tempfile.mkstemp('gbuild')
+ bashscript = os.fdopen(bashscripthandle, 'w', newline='\n')
+ bashscript.write("set -e\n")
+ bashscript.write("cd %s/solenv/qa/python/selftest\n" % os.environ['SRCDIR'])
+ bashscript.write("%s gbuildtojson WORKDIR=%s\n" % (self.make, self.tempwork.replace('\\', '/')))
+ bashscript.close()
+ subprocess.check_call([self.bash, bashscriptname.replace('\\', '/')])
+ os.remove(bashscriptname)
+ jsonfiles = os.listdir(os.path.join(self.tempwork, 'GbuildToJson', 'Library'))
+ gbuildlibs = []
+ for jsonfilename in jsonfiles:
+ with open(os.path.join(self.tempwork, 'GbuildToJson', 'Library', jsonfilename), 'r') as f:
+ gbuildlibs.append(json.load(f))
+ foundlibs = set()
+ for lib in gbuildlibs:
+ self.assertEqual(set(lib.keys()), set(['MAKEFILE', 'ASMOBJECTS', 'CFLAGS', 'CFLAGSAPPEND', 'COBJECTS', 'CXXCLRFLAGS', 'CXXCLRFLAGSAPPEND', 'CXXCLROBJECTS', 'CXXFLAGS', 'CXXFLAGSAPPEND', 'CXXOBJECTS', 'DEFS', 'LEXOBJECTS', 'GENCOBJECTS', 'GENCXXOBJECTS', 'GENCXXCLROBJECTS', 'ILIBTARGET', 'INCLUDE', 'JAVAOBJECTS', 'LINKED_LIBS', 'LINKED_STATIC_LIBS', 'LINKTARGET', 'OBJCFLAGS', 'OBJCFLAGSAPPEND', 'OBJCOBJECTS', 'OBJCXXFLAGS', 'OBJCXXFLAGSAPPEND', 'OBJCXXOBJECTS', 'PYTHONOBJECTS', 'YACCOBJECTS']))
+ if lib['LINKTARGET'].find('gbuildselftestdep') != -1:
+ foundlibs.add('gbuildselftestdep')
+ elif lib['LINKTARGET'].find('gbuildselftest') != -1:
+ foundlibs.add('gbuildselftest')
+ self.assertIn('-Igbuildtojsontestinclude', lib['INCLUDE'].split())
+ self.assertIn('gbuildselftestdep', lib['LINKED_LIBS'].split())
+ self.assertIn('solenv/qa/python/selftest/selftestobject', lib['CXXOBJECTS'].split())
+ self.assertIn('-DGBUILDSELFTESTDEF', lib['DEFS'].split())
+ self.assertIn('-DGBUILDSELFTESTCXXFLAG', lib['CXXFLAGSAPPEND'].split())
+ self.assertIn('-DGBUILDSELFTESTCFLAG', lib['CFLAGSAPPEND'].split())
+ else:
+ self.assertTrue(False)
+ self.assertEqual(foundlibs, set(['gbuildselftest', 'gbuildselftestdep']))
+ self.assertEqual(len(foundlibs), 2)
+ jsonfiles = os.listdir(os.path.join(self.tempwork, 'GbuildToJson', 'Executable'))
+ gbuildexes = []
+ for jsonfilename in jsonfiles:
+ with open(os.path.join(self.tempwork, 'GbuildToJson', 'Executable', jsonfilename), 'r') as f:
+ gbuildexes.append(json.load(f))
+ foundexes = set()
+ for exe in gbuildexes:
+ if exe['LINKTARGET'].find('gbuildselftestexe') != -1:
+ foundexes.add('gbuildselftestexe')
+ else:
+ self.assertTrue(False)
+ self.assertEqual(foundexes, set(['gbuildselftestexe']))
+ self.assertEqual(len(foundexes), 1)
+
+class CheckGbuildToJsonModules(unittest.TestCase):
+ def setUp(self):
+ getgbuildtesttools(self)
+ clearmakevars()
+ self.tempwork = tempfile.mkdtemp(prefix='gbuild')
+ self.tempsrc = tempfile.mkdtemp(prefix='gbuild')
+ self.srcdir = os.environ['SRCDIR']
+ self.builddir = os.environ['BUILDDIR']
+ if os.environ['OS'] == 'WNT':
+ self.tempworkmixed = self.tempwork.replace('\\','/')
+ self.tempsrcmixed = self.tempsrc.replace('\\','/')
+ self.srcdirnative = self.srcdir.replace('/','\\')
+ self.builddirnative = self.builddir.replace('/','\\')
+ else:
+ self.tempworkmixed = self.tempwork
+ self.tempsrcmixed = self.tempsrc
+ self.srcdirnative = self.srcdir
+ self.builddirnative = self.builddir
+ shutil.copyfile(os.path.join(self.builddirnative, 'config_host.mk'), os.path.join(self.tempsrc, 'config_host.mk'))
+ shutil.copyfile(os.path.join(self.builddirnative, 'config_host_lang.mk'), os.path.join(self.tempsrc, 'config_host_lang.mk'))
+ shutil.copytree(os.path.join(self.builddirnative, 'config_host'), os.path.join(self.tempsrc, 'config_host'))
+ shutil.copyfile(os.path.join(self.srcdirnative, 'Repository.mk'), os.path.join(self.tempsrc, 'Repository.mk'))
+ shutil.copyfile(os.path.join(self.srcdirnative, 'RepositoryExternal.mk'), os.path.join(self.tempsrc, 'RepositoryExternal.mk'))
+ shutil.copyfile(os.path.join(self.srcdirnative, 'RepositoryFixes.mk'), os.path.join(self.tempsrc, 'RepositoryFixes.mk'))
+ #print('copytree from _%s_ to _%s_' % (os.path.join(self.srcdirnative, 'solenv').replace('\\', '#').replace('/', '!'), os.path.join(self.tempsrc, 'solenv').replace('\\', '#').replace('/', '!')))
+ shutil.copytree(os.path.join(self.srcdirnative, 'solenv'), os.path.join(self.tempsrc, 'solenv'))
+ shutil.copytree(os.path.join(self.srcdirnative, 'pch'), os.path.join(self.tempsrc, 'pch'))
+
+ def tearDown(self):
+ shutil.rmtree(self.tempsrc)
+ shutil.rmtree(self.tempwork)
+
+ def test_gbuildtojson(self):
+ modules = ['accessibility', 'android', 'animations', 'apple_remote', 'avmedia', 'basctl', 'basegfx', 'basic', 'bean', 'canvas', 'chart2', 'codemaker', 'comphelper', 'cppcanvas', 'cui', 'dbaccess', 'desktop', 'drawinglayer', 'editeng', 'embeddedobj', 'embedserv', 'eventattacher', 'extras', 'filter', 'forms', 'formula', 'fpicker', 'framework', 'hwpfilter', 'i18nlangtag', 'i18nutil', 'idl', 'idlc', 'instsetoo_native', 'io', 'ios', 'jvmaccess', 'jvmfwk', 'l10ntools', 'librelogo', 'libreofficekit', 'linguistic', 'lotuswordpro', 'nlpsolver', 'o3tl', 'offapi', 'officecfg', 'onlineupdate', 'oovbaapi', 'oox', 'opencl', 'package', 'postprocess', 'pyuno', 'registry', 'remotebridges', 'reportbuilder', 'reportdesign', 'ridljar', 'salhelper', 'sax', 'sc', 'sccomp', 'scp2', 'scripting', 'sd', 'sdext', 'setup_native', 'sfx2', 'slideshow', 'smoketest', 'soltools', 'sot', 'starmath', 'store', 'svgio', 'emfio', 'svl', 'svtools', 'svx', 'sw', 'swext', 'sysui', 'test', 'testtools', 'toolkit', 'ucb', 'ucbhelper', 'udkapi', 'uitest', 'UnoControls', 'unodevtools', 'unoidl', 'unoil', 'unotest', 'unotools', 'unoxml', 'ure', 'uui', 'vbahelper', 'vcl', 'winaccessibility', 'wizards', 'writerperfect', 'xmerge', 'xmlhelp', 'xmloff', 'xmlreader', 'xmlscript', 'xmlsecurity']
+ if os.environ['OS'] == 'WNT':
+ # for now, use a limited subset for testing on windows as it is so annoyingly slow on this
+ modules = ['chart2', 'cui', 'dbaccess', 'framework', 'oox', 'sfx2', 'svl', 'svtools', 'svx', 'toolkit', 'vcl', 'xmloff']
+ for module in modules:
+ shutil.rmtree(self.tempwork)
+ os.makedirs(os.path.join(self.tempwork, 'LinkTarget', 'Executable'))
+ shutil.copy(self.gbuildtojson, os.path.join(self.tempwork, 'LinkTarget', 'Executable'))
+ if module != 'solenv':
+ shutil.copytree(os.path.join(os.environ['SRCDIR'], module), os.path.join(self.tempsrc, module),
+ ignore=shutil.ignore_patterns('.#*', '#*', '*~'))
+ # ignore Emacs lock (.#*), auto-save (#*), and backup (*~) files
+ (bashscripthandle, bashscriptname) = tempfile.mkstemp(prefix='gbuild')
+ bashscript = os.fdopen(bashscripthandle, 'w', newline='\n')
+ bashscript.write("set -e\n")
+ bashscript.write("cd %s/%s\n" % (self.tempsrc.replace('\\','/'), module))
+ bashscript.write("%s gbuildtojson WORKDIR=%s SRCDIR=%s\n" % (self.make, self.tempwork.replace('\\', '/'), self.tempsrc.replace('\\','/')))
+ bashscript.close()
+ subprocess.check_call([self.bash, bashscriptname.replace('\\', '/')])
+ os.remove(bashscriptname)
+ jsonfiles = os.listdir(os.path.join(self.tempwork, 'GbuildToJson', 'Library'))
+ gbuildlibs = []
+ for jsonfilename in jsonfiles:
+ with open(os.path.join(self.tempwork, 'GbuildToJson', 'Library', jsonfilename), 'r') as f:
+ gbuildlibs.append(json.load(f))
+
+
+if __name__ == "__main__":
+ unittest.main()
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/solenv/qa/python/selftest/Executable_gbuildselftestexe.mk b/solenv/qa/python/selftest/Executable_gbuildselftestexe.mk
new file mode 100644
index 000000000..c43a77190
--- /dev/null
+++ b/solenv/qa/python/selftest/Executable_gbuildselftestexe.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_Executable_Executable,gbuildselftestexe))
+
+$(eval $(call gb_Executable_add_exception_objects,gbuildselftestexe,\
+ solenv/qa/python/selftest/selftestexeobject \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/qa/python/selftest/Library_gbuildselftest.mk b/solenv/qa/python/selftest/Library_gbuildselftest.mk
new file mode 100644
index 000000000..bed015c09
--- /dev/null
+++ b/solenv/qa/python/selftest/Library_gbuildselftest.mk
@@ -0,0 +1,37 @@
+# -*- 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_Library_Library,gbuildselftest))
+
+$(eval $(call gb_Library_set_include,gbuildselftest,\
+ -Igbuildtojsontestinclude\
+ $$(INCLUDE) \
+))
+
+$(eval $(call gb_Library_add_defs,gbuildselftest,\
+ -DGBUILDSELFTESTDEF \
+))
+
+$(eval $(call gb_Library_add_cxxflags,gbuildselftest,\
+ -DGBUILDSELFTESTCXXFLAG \
+))
+
+$(eval $(call gb_Library_add_cflags,gbuildselftest,\
+ -DGBUILDSELFTESTCFLAG \
+))
+
+$(eval $(call gb_Library_use_libraries,gbuildselftest,\
+ gbuildselftestdep \
+))
+
+$(eval $(call gb_Library_add_exception_objects,gbuildselftest,\
+ solenv/qa/python/selftest/selftestobject \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/qa/python/selftest/Library_gbuildselftestdep.mk b/solenv/qa/python/selftest/Library_gbuildselftestdep.mk
new file mode 100644
index 000000000..b28450c48
--- /dev/null
+++ b/solenv/qa/python/selftest/Library_gbuildselftestdep.mk
@@ -0,0 +1,15 @@
+# -*- 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_Library_Library,gbuildselftestdep))
+
+$(eval $(call gb_Library_add_exception_objects,gbuildselftestdep,\
+ solenv/qa/python/selftest/selftestdepobject \
+))
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/qa/python/selftest/Makefile b/solenv/qa/python/selftest/Makefile
new file mode 100644
index 000000000..3566a727b
--- /dev/null
+++ b/solenv/qa/python/selftest/Makefile
@@ -0,0 +1,21 @@
+# -*- 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))))
+
+ifeq (,$(BUILDDIR))
+gb_partial_build__makefile_dir=$(dir $(abspath $(firstword $(MAKEFILE_LIST))))
+BUILDDIR := $(gb_partial_build__makefile_dir)../../../..
+endif
+
+gb_GBUILDSELFTEST=t
+
+include $(module_directory)/../../../gbuild/partial_build.mk
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/qa/python/selftest/Module_selftest.mk b/solenv/qa/python/selftest/Module_selftest.mk
new file mode 100644
index 000000000..37c53fdbf
--- /dev/null
+++ b/solenv/qa/python/selftest/Module_selftest.mk
@@ -0,0 +1,18 @@
+# -*- 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,gbuildtojsontest))
+
+$(eval $(call gb_Module_add_targets,gbuildtojsontest,\
+ Library_gbuildselftestdep \
+ Library_gbuildselftest \
+ Executable_gbuildselftestexe \
+))
+
+# vim: set shiftwidth=4 tabstop=4 noexpandtab:
diff --git a/solenv/qa/python/selftest/selftestdepobject.cxx b/solenv/qa/python/selftest/selftestdepobject.cxx
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/solenv/qa/python/selftest/selftestdepobject.cxx
diff --git a/solenv/qa/python/selftest/selftestexeobject.cxx b/solenv/qa/python/selftest/selftestexeobject.cxx
new file mode 100644
index 000000000..78f2de106
--- /dev/null
+++ b/solenv/qa/python/selftest/selftestexeobject.cxx
@@ -0,0 +1 @@
+int main(void) { return 0; }
diff --git a/solenv/qa/python/selftest/selftestobject.cxx b/solenv/qa/python/selftest/selftestobject.cxx
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/solenv/qa/python/selftest/selftestobject.cxx
diff --git a/solenv/sanitizers/ubsan-suppressions b/solenv/sanitizers/ubsan-suppressions
new file mode 100644
index 000000000..7adaa1e92
--- /dev/null
+++ b/solenv/sanitizers/ubsan-suppressions
@@ -0,0 +1,21 @@
+#
+# 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/.
+#
+
+# Various places in sc rely on floating-point division by zero to produce
+# infinity (as triggered by e.g. CppunitTest_sc_functions_test); silence those UBSan
+# reports by adding
+# suppressions=/path-to-this/solenv/sanitizers/ubsan-suppressions to the
+# UBSAN_OPTIONS environment variable (and making sure to compile with
+# -fsanitize-recover=float-divide-by-zero):
+
+float-divide-by-zero:/sc/source/core/tool/interpr1.cxx$
+float-divide-by-zero:/sc/source/core/tool/interpr2.cxx$
+float-divide-by-zero:/sc/source/core/tool/interpr3.cxx$
+float-divide-by-zero:/sc/source/core/tool/interpr8.cxx$
+float-divide-by-zero:/scaddins/source/analysis/analysis.cxx$
+float-divide-by-zero:/scaddins/source/analysis/financial.cxx$
diff --git a/solenv/sanitizers/ui/cui.false b/solenv/sanitizers/ui/cui.false
new file mode 100644
index 000000000..fcd145e35
--- /dev/null
+++ b/solenv/sanitizers/ui/cui.false
@@ -0,0 +1,4 @@
+cui/uiconfig/ui/aboutdialog.ui://GtkImage[@id='imAbout'] no-labelled-by
+cui/uiconfig/ui/aboutdialog.ui://GtkImage[@id='imBrand'] no-labelled-by
+cui/uiconfig/ui/aboutdialog.ui://GtkLabel[@id='lbAbout'] orphan-label
+cui/uiconfig/ui/aboutdialog.ui://GtkLabel[@id='lbCopyright'] orphan-label
diff --git a/solenv/sanitizers/ui/cui.suppr b/solenv/sanitizers/ui/cui.suppr
new file mode 100644
index 000000000..ac34d70d0
--- /dev/null
+++ b/solenv/sanitizers/ui/cui.suppr
@@ -0,0 +1,224 @@
+cui/uiconfig/ui/applyautofmtpage.ui://GtkLabel[@id='label1'] orphan-label
+cui/uiconfig/ui/applyautofmtpage.ui://GtkLabel[@id='label2'] orphan-label
+cui/uiconfig/ui/applylocalizedpage.ui://GtkLabel[@id='singlestartex'] orphan-label
+cui/uiconfig/ui/applylocalizedpage.ui://GtkLabel[@id='singleendex'] orphan-label
+cui/uiconfig/ui/applylocalizedpage.ui://GtkLabel[@id='doublestartex'] orphan-label
+cui/uiconfig/ui/applylocalizedpage.ui://GtkLabel[@id='doubleendex'] orphan-label
+cui/uiconfig/ui/baselinksdialog.ui://GtkLabel[@id='SOURCE2'] orphan-label
+cui/uiconfig/ui/baselinksdialog.ui://GtkLabel[@id='TYPE2'] orphan-label
+cui/uiconfig/ui/baselinksdialog.ui://GtkLabel[@id='UPDATE'] orphan-label
+cui/uiconfig/ui/baselinksdialog.ui://GtkLabel[@id='FULL_SOURCE_NAME'] orphan-label
+cui/uiconfig/ui/baselinksdialog.ui://GtkLabel[@id='FULL_TYPE_NAME'] orphan-label
+cui/uiconfig/ui/imagetabpage.ui://GtkLabel[@id='label4'] orphan-label
+cui/uiconfig/ui/imagetabpage.ui://GtkLabel[@id='label9'] orphan-label
+cui/uiconfig/ui/imagetabpage.ui://GtkSpinButton[@id='tileoffmtr'] no-labelled-by
+cui/uiconfig/ui/cellalignment.ui://GtkLabel[@id='labelSTR_BOTTOMLOCK'] orphan-label
+cui/uiconfig/ui/cellalignment.ui://GtkLabel[@id='labelSTR_TOPLOCK'] orphan-label
+cui/uiconfig/ui/cellalignment.ui://GtkLabel[@id='labelSTR_CELLLOCK'] orphan-label
+cui/uiconfig/ui/cellalignment.ui://GtkLabel[@id='labelABCD'] orphan-label
+cui/uiconfig/ui/certdialog.ui://GtkLabel[@id='manual'] orphan-label
+cui/uiconfig/ui/certdialog.ui://GtkLabel[@id='certdir'] orphan-label
+cui/uiconfig/ui/charnamepage.ui://GtkLabel[@id='lbWestFontinfo'] orphan-label
+cui/uiconfig/ui/charnamepage.ui://GtkLabel[@id='lbCJKFontinfo'] orphan-label
+cui/uiconfig/ui/charnamepage.ui://GtkLabel[@id='lbCTLFontinfo'] orphan-label
+cui/uiconfig/ui/comment.ui://GtkButton[@id='previous'] button-no-label
+cui/uiconfig/ui/comment.ui://GtkButton[@id='next'] button-no-label
+cui/uiconfig/ui/comment.ui://GtkLabel[@id='label2'] orphan-label
+cui/uiconfig/ui/comment.ui://GtkLabel[@id='lastedit'] orphan-label
+cui/uiconfig/ui/comment.ui://GtkLabel[@id='alttitle'] orphan-label
+cui/uiconfig/ui/connpooloptions.ui://GtkLabel[@id='driverlabel'] orphan-label
+cui/uiconfig/ui/connpooloptions.ui://GtkLabel[@id='driver'] orphan-label
+cui/uiconfig/ui/databaselinkdialog.ui://GtkLabel[@id='alttitle'] orphan-label
+cui/uiconfig/ui/dimensionlinestabpage.ui://GtkLabel[@id='FT_POSITION'] orphan-label
+cui/uiconfig/ui/dimensionlinestabpage.ui://GtkLabel[@id='STR_MEASURE_AUTOMATIC'] orphan-label
+cui/uiconfig/ui/fmsearchdialog.ui://GtkLabel[@id='replacedesc'] orphan-label
+cui/uiconfig/ui/fmsearchdialog.ui://GtkLabel[@id='ftRecordLabel'] orphan-label
+cui/uiconfig/ui/fmsearchdialog.ui://GtkLabel[@id='ftRecord'] orphan-label
+cui/uiconfig/ui/fmsearchdialog.ui://GtkLabel[@id='ftHint'] orphan-label
+cui/uiconfig/ui/gradientpage.ui://GtkLabel[@id='centerft'] orphan-label
+cui/uiconfig/ui/gradientpage.ui://GtkScale[@id='angleslider'] no-labelled-by
+cui/uiconfig/ui/gradientpage.ui://GtkScale[@id='borderslider'] no-labelled-by
+cui/uiconfig/ui/effectspage.ui://GtkLabel[@id='a11ywarning'] orphan-label
+cui/uiconfig/ui/eventsconfigpage.ui://GtkLabel[@id='label1'] orphan-label
+cui/uiconfig/ui/galleryapplyprogress.ui://GtkLabel[@id='file'] orphan-label
+cui/uiconfig/ui/gallerygeneralpage.ui://GtkLabel[@id='label1'] orphan-label
+cui/uiconfig/ui/gallerygeneralpage.ui://GtkLabel[@id='modified'] orphan-label
+cui/uiconfig/ui/gallerygeneralpage.ui://GtkLabel[@id='label2'] orphan-label
+cui/uiconfig/ui/gallerygeneralpage.ui://GtkLabel[@id='type'] orphan-label
+cui/uiconfig/ui/gallerygeneralpage.ui://GtkLabel[@id='label3'] orphan-label
+cui/uiconfig/ui/gallerygeneralpage.ui://GtkLabel[@id='label4'] orphan-label
+cui/uiconfig/ui/gallerygeneralpage.ui://GtkLabel[@id='location'] orphan-label
+cui/uiconfig/ui/gallerygeneralpage.ui://GtkLabel[@id='contents'] orphan-label
+cui/uiconfig/ui/gallerysearchprogress.ui://GtkLabel[@id='file'] orphan-label
+cui/uiconfig/ui/gallerysearchprogress.ui://GtkLabel[@id='dir'] orphan-label
+cui/uiconfig/ui/galleryupdateprogress.ui://GtkLabel[@id='file'] orphan-label
+cui/uiconfig/ui/graphictestdlg.ui://GtkLabel[@id='gptest_label'] orphan-label
+cui/uiconfig/ui/graphictestdlg.ui://GtkLabel[@id='gptest_detail'] orphan-label
+cui/uiconfig/ui/hangulhanjaconversiondialog.ui://GtkLabel[@id='originalword'] orphan-label
+cui/uiconfig/ui/hangulhanjaconversiondialog.ui://GtkLabel[@id='label4'] orphan-label
+cui/uiconfig/ui/hangulhanjaconversiondialog.ui://GtkLabel[@id='label5'] orphan-label
+cui/uiconfig/ui/hangulhanjaconversiondialog.ui://GtkLabel[@id='label6'] orphan-label
+cui/uiconfig/ui/hyperlinkmarkdialog.ui://GtkLabel[@id='error'] orphan-label
+cui/uiconfig/ui/hatchpage.ui://GtkLabel[@id='angleft'] orphan-label
+cui/uiconfig/ui/hatchpage.ui://GtkScale[@id='angleslider'] no-labelled-by
+cui/uiconfig/ui/hyperlinkdocpage.ui://GtkLabel[@id='url_label'] orphan-label
+cui/uiconfig/ui/hyperlinkdocpage.ui://GtkLabel[@id='url'] orphan-label
+cui/uiconfig/ui/iconchangedialog.ui://GtkTextView[@id='addrTextview'] no-labelled-by
+cui/uiconfig/ui/iconchangedialog.ui://GtkLabel[@id='label1'] orphan-label
+cui/uiconfig/ui/iconselectordialog.ui://GtkLabel[@id='noteLabel'] orphan-label
+cui/uiconfig/ui/tipofthedaydialog.ui://GtkLabel[@id='lbTitle'] orphan-label
+cui/uiconfig/ui/tipofthedaydialog.ui://GtkLabel[@id='lbText'] orphan-label
+cui/uiconfig/ui/insertfloatingframe.ui://GtkLabel[@id='label6'] orphan-label
+cui/uiconfig/ui/insertfloatingframe.ui://GtkLabel[@id='label7'] orphan-label
+cui/uiconfig/ui/insertfloatingframe.ui://GtkLabel[@id='widthlabel'] orphan-label
+cui/uiconfig/ui/insertfloatingframe.ui://GtkLabel[@id='heightlabel'] orphan-label
+cui/uiconfig/ui/insertoleobject.ui://GtkEntry[@id='urled'] no-labelled-by
+cui/uiconfig/ui/javastartparametersdialog.ui://GtkLabel[@id='label6'] orphan-label
+cui/uiconfig/ui/lineendstabpage.ui://GtkLabel[@id='FT_LINE_END_STYLE'] orphan-label
+cui/uiconfig/ui/lineendstabpage.ui://GtkComboBox[@id='LB_LINEENDS'] no-labelled-by
+cui/uiconfig/ui/linestyletabpage.ui://GtkSpinButton[@id='NUM_FLD_2'] no-labelled-by
+cui/uiconfig/ui/linestyletabpage.ui://GtkSpinButton[@id='MTR_FLD_LENGTH_2'] no-labelled-by
+cui/uiconfig/ui/macroselectordialog.ui://GtkLabel[@id='helpmacro'] orphan-label
+cui/uiconfig/ui/menuassignpage.ui://GtkLabel[@id='searchlabel'] orphan-label
+cui/uiconfig/ui/menuassignpage.ui://GtkLabel[@id='leftfunctionlabel'] orphan-label
+cui/uiconfig/ui/menuassignpage.ui://GtkLabel[@id='scopelabel'] orphan-label
+cui/uiconfig/ui/menuassignpage.ui://GtkLabel[@id='targetlabel'] orphan-label
+cui/uiconfig/ui/menuassignpage.ui://GtkLabel[@id='rightfunctionlabel'] orphan-label
+cui/uiconfig/ui/menuassignpage.ui://GtkLabel[@id='customizelabel'] orphan-label
+cui/uiconfig/ui/movemenu.ui://GtkLabel[@id='label1'] orphan-label
+cui/uiconfig/ui/movemenu.ui://GtkTreeView[@id='menulist'] no-labelled-by
+cui/uiconfig/ui/newlibdialog.ui://GtkEntry[@id='entry'] duplicate-mnemonic
+cui/uiconfig/ui/newlibdialog.ui://GtkLabel[@id='altmacrotitle'] orphan-label
+cui/uiconfig/ui/newlibdialog.ui://GtkLabel[@id='altrenametitle'] orphan-label
+cui/uiconfig/ui/numberingformatpage.ui://GtkLabel[@id='commentft'] orphan-label
+cui/uiconfig/ui/numberingoptionspage.ui://GtkLabel[@id='separator'] orphan-label
+cui/uiconfig/ui/objecttitledescdialog.ui://GtkLabel[@id='desc_label'] orphan-label
+cui/uiconfig/ui/optadvancedpage.ui://GtkLabel[@id='selectruntime'] orphan-label
+cui/uiconfig/ui/optadvancedpage.ui://GtkLabel[@id='javapath'] orphan-label
+cui/uiconfig/ui/optappearancepage.ui://GtkLabel[@id='uielements'] orphan-label
+cui/uiconfig/ui/optappearancepage.ui://GtkLabel[@id='colorsetting'] orphan-label
+cui/uiconfig/ui/optappearancepage.ui://GtkLabel[@id='on'] orphan-label
+cui/uiconfig/ui/optasianpage.ui://GtkLabel[@id='hintft'] orphan-label
+cui/uiconfig/ui/optctlpage.ui://GtkLabel[@id='label3'] orphan-label
+cui/uiconfig/ui/optemailpage.ui://GtkImage[@id='lockemail'] no-labelled-by
+cui/uiconfig/ui/optemailpage.ui://GtkLabel[@id='browsetitle'] orphan-label
+cui/uiconfig/ui/optemailpage.ui://GtkLabel[@id='suppress'] orphan-label
+cui/uiconfig/ui/optemailpage.ui://GtkCheckButton[@id='suppressHidden'] button-no-label
+cui/uiconfig/ui/optemailpage.ui://GtkImage[@id='lockSuppressHidden'] no-labelled-by
+cui/uiconfig/ui/optfltrembedpage.ui://GtkLabel[@id='label2'] orphan-label
+cui/uiconfig/ui/optfltrembedpage.ui://GtkLabel[@id='label3'] orphan-label
+cui/uiconfig/ui/optfltrembedpage.ui://GtkLabel[@id='label5'] orphan-label
+cui/uiconfig/ui/optgeneralpage.ui://GtkLabel[@id='toyear'] orphan-label
+cui/uiconfig/ui/optonlineupdatepage.ui://GtkLabel[@id='lastchecked'] orphan-label
+cui/uiconfig/ui/optonlineupdatepage.ui://GtkLabel[@id='destpathlabel'] orphan-label
+cui/uiconfig/ui/optonlineupdatepage.ui://GtkLabel[@id='destpath'] orphan-label
+cui/uiconfig/ui/optonlineupdatepage.ui://GtkLabel[@id='useragent_label'] orphan-label
+cui/uiconfig/ui/optonlineupdatepage.ui://GtkLabel[@id='useragent_changed'] orphan-label
+cui/uiconfig/ui/optonlineupdatepage.ui://GtkLabel[@id='useragent'] orphan-label
+cui/uiconfig/ui/optonlineupdatepage.ui://GtkLabel[@id='neverchecked'] orphan-label
+cui/uiconfig/ui/optopenclpage.ui://GtkLabel[@id='openclused'] orphan-label
+cui/uiconfig/ui/optopenclpage.ui://GtkLabel[@id='openclnotused'] orphan-label
+cui/uiconfig/ui/optproxypage.ui://GtkLabel[@id='noproxydesc'] orphan-label
+cui/uiconfig/ui/optsavepage.ui://GtkLabel[@id='autosave_mins'] orphan-label
+cui/uiconfig/ui/optsavepage.ui://GtkLabel[@id='odfwarning_label'] orphan-label
+cui/uiconfig/ui/optsavepage.ui://GtkImage[@id='odfwarning_image'] no-labelled-by
+cui/uiconfig/ui/optsecuritypage.ui://GtkLabel[@id='label9'] orphan-label
+cui/uiconfig/ui/optsecuritypage.ui://GtkLabel[@id='label7'] orphan-label
+cui/uiconfig/ui/optsecuritypage.ui://GtkLabel[@id='label5'] orphan-label
+cui/uiconfig/ui/optsecuritypage.ui://GtkLabel[@id='masterpasswordtext'] orphan-label
+cui/uiconfig/ui/optsecuritypage.ui://GtkLabel[@id='nopasswordsave'] orphan-label
+cui/uiconfig/ui/optsecuritypage.ui://GtkLabel[@id='label4'] orphan-label
+cui/uiconfig/ui/optviewpage.ui://GtkLabel[@id='skiaenabled'] orphan-label
+cui/uiconfig/ui/optviewpage.ui://GtkLabel[@id='skiadisabled'] orphan-label
+cui/uiconfig/ui/pageformatpage.ui://GtkRadioButton[@id='radiobuttonPortrait'] labelled-by-and-mnemonic
+cui/uiconfig/ui/pageformatpage.ui://GtkSpinButton[@id='spinMargLeft'] duplicate-mnemonic
+cui/uiconfig/ui/pageformatpage.ui://GtkSpinButton[@id='spinMargRight'] duplicate-mnemonic
+cui/uiconfig/ui/pageformatpage.ui://GtkLabel[@id='labelMsg'] orphan-label
+cui/uiconfig/ui/paragalignpage.ui://GtkLabel[@id='labelST_RIGHTALIGN_ASIAN'] orphan-label
+cui/uiconfig/ui/paragalignpage.ui://GtkLabel[@id='labelST_LEFTALIGN_ASIAN'] orphan-label
+cui/uiconfig/ui/paraindentspacing.ui://GtkLabel[@id='labelST_LINEDIST_ABS'] orphan-label
+cui/uiconfig/ui/paraindentspacing.ui://GtkComboBoxText[@id='comboLB_LINEDIST'] no-labelled-by
+cui/uiconfig/ui/paraindentspacing.ui://GtkLabel[@id='labelFT_LINEDIST'] orphan-label
+cui/uiconfig/ui/paraindentspacing.ui://GtkSpinButton[@id='spinED_LINEDISTPERCENT'] no-labelled-by
+cui/uiconfig/ui/paraindentspacing.ui://GtkSpinButton[@id='spinED_LINEDISTMETRIC'] no-labelled-by
+cui/uiconfig/ui/password.ui://GtkLabel[@id='label1'] orphan-label
+cui/uiconfig/ui/pastespecial.ui://GtkLabel[@id='label2'] orphan-label
+cui/uiconfig/ui/pastespecial.ui://GtkLabel[@id='source'] orphan-label
+cui/uiconfig/ui/paratabspage.ui://GtkSpinButton[@id='SP_TABPOS'] no-labelled-by
+cui/uiconfig/ui/paratabspage.ui://GtkEntry[@id='ED_TABPOS'] no-labelled-by
+cui/uiconfig/ui/patterntabpage.ui://GtkLabel[@id='label4'] orphan-label
+cui/uiconfig/ui/percentdialog.ui://GtkSpinButton[@id='margin'] no-labelled-by
+cui/uiconfig/ui/personalization_tab.ui://GtkToggleButton[@id='default0'] button-no-label
+cui/uiconfig/ui/personalization_tab.ui://GtkToggleButton[@id='default1'] button-no-label
+cui/uiconfig/ui/personalization_tab.ui://GtkToggleButton[@id='default2'] button-no-label
+cui/uiconfig/ui/personalization_tab.ui://GtkToggleButton[@id='default3'] button-no-label
+cui/uiconfig/ui/personalization_tab.ui://GtkToggleButton[@id='default4'] button-no-label
+cui/uiconfig/ui/personalization_tab.ui://GtkToggleButton[@id='default5'] button-no-label
+cui/uiconfig/ui/personalization_tab.ui://GtkToggleButton[@id='default6'] button-no-label
+cui/uiconfig/ui/personalization_tab.ui://GtkToggleButton[@id='default7'] button-no-label
+cui/uiconfig/ui/personalization_tab.ui://GtkToggleButton[@id='default8'] button-no-label
+cui/uiconfig/ui/pickgraphicpage.ui://GtkLabel[@id='errorft'] orphan-label
+cui/uiconfig/ui/positionpage.ui://GtkLabel[@id='rotateandscale'] orphan-label
+cui/uiconfig/ui/positionpage.ui://GtkLabel[@id='scale'] orphan-label
+cui/uiconfig/ui/securityoptionsdialog.ui://GtkImage[@id='lockwhenprinting'] no-labelled-by
+cui/uiconfig/ui/securityoptionsdialog.ui://GtkImage[@id='locksavesenddocs'] no-labelled-by
+cui/uiconfig/ui/securityoptionsdialog.ui://GtkImage[@id='lockwhensigning'] no-labelled-by
+cui/uiconfig/ui/securityoptionsdialog.ui://GtkImage[@id='lockwhenpdf'] no-labelled-by
+cui/uiconfig/ui/securityoptionsdialog.ui://GtkLabel[@id='label3'] orphan-label
+cui/uiconfig/ui/signsignatureline.ui://GtkTextView[@id='edit_comment'] duplicate-mnemonic
+cui/uiconfig/ui/signsignatureline.ui://GtkLabel[@id='label_or'] orphan-label
+cui/uiconfig/ui/specialcharacters.ui://GtkLabel[@id='hexulabel'] orphan-label
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar2'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar3'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar4'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar5'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar6'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar7'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar8'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar9'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar10'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar11'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar12'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar13'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar14'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar15'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='viewchar16'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar2'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar4'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar3'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar5'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar6'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar7'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar8'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar16'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar15'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar14'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar13'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar12'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar11'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar10'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='favchar9'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='showcharset'] no-labelled-by
+cui/uiconfig/ui/specialcharacters.ui://GtkDrawingArea[@id='searchcharset'] no-labelled-by
+cui/uiconfig/ui/spellingdialog.ui://GtkLabel[@id='explain'] orphan-label
+cui/uiconfig/ui/spellingdialog.ui://GtkLabel[@id='resumeft'] orphan-label
+cui/uiconfig/ui/spellingdialog.ui://GtkLabel[@id='nosuggestionsft'] orphan-label
+cui/uiconfig/ui/spellingdialog.ui://GtkLabel[@id='alttitleft'] orphan-label
+cui/uiconfig/ui/spinbox.ui://GtkSpinButton[@id='spin'] no-labelled-by
+cui/uiconfig/ui/storedwebconnectiondialog.ui://GtkLabel[@id='label1'] orphan-label
+cui/uiconfig/ui/textanimtabpage.ui://GtkLabel[@id='FT_COUNT'] orphan-label
+cui/uiconfig/ui/textanimtabpage.ui://GtkLabel[@id='FT_AMOUNT'] orphan-label
+cui/uiconfig/ui/textanimtabpage.ui://GtkLabel[@id='FT_DELAY'] orphan-label
+cui/uiconfig/ui/textflowpage.ui://GtkLabel[@id='labelOrphan'] orphan-label
+cui/uiconfig/ui/textflowpage.ui://GtkLabel[@id='labelWidow'] orphan-label
+cui/uiconfig/ui/thesaurus.ui://GtkLabel[@id='notfound'] orphan-label
+cui/uiconfig/ui/toolbarmodedialog.ui://GtkLabel[@id='lbInfo'] orphan-label
+cui/uiconfig/ui/tsaurldialog.ui://GtkLabel[@id='label2'] orphan-label
+cui/uiconfig/ui/tsaurldialog.ui://GtkLabel[@id='enteraurl'] orphan-label
+cui/uiconfig/ui/twolinespage.ui://GtkLabel[@id='label29'] orphan-label
+cui/uiconfig/ui/twolinespage.ui://GtkLabel[@id='label30'] orphan-label
+cui/uiconfig/ui/twolinespage.ui://GtkTreeView[@id='startbracket'] no-labelled-by
+cui/uiconfig/ui/twolinespage.ui://GtkTreeView[@id='endbracket'] no-labelled-by
+cui/uiconfig/ui/wordcompletionpage.ui://GtkSpinButton[@id='maxentries'] duplicate-mnemonic
+cui/uiconfig/ui/wordcompletionpage.ui://GtkLabel[@id='wordcompletion'] orphan-label
+cui/uiconfig/ui/wordcompletionpage.ui://GtkLabel[@id='collectedwords'] orphan-label
diff --git a/solenv/sanitizers/ui/dbaccess.suppr b/solenv/sanitizers/ui/dbaccess.suppr
new file mode 100644
index 000000000..cf67d5b78
--- /dev/null
+++ b/solenv/sanitizers/ui/dbaccess.suppr
@@ -0,0 +1,75 @@
+dbaccess/uiconfig/ui/applycolpage.ui://GtkButton[@id='colrh'] button-no-label
+dbaccess/uiconfig/ui/applycolpage.ui://GtkButton[@id='colsrh'] button-no-label
+dbaccess/uiconfig/ui/applycolpage.ui://GtkButton[@id='collh'] button-no-label
+dbaccess/uiconfig/ui/applycolpage.ui://GtkButton[@id='colslh'] button-no-label
+dbaccess/uiconfig/ui/authentificationpage.ui://GtkLabel[@id='header'] orphan-label
+dbaccess/uiconfig/ui/authentificationpage.ui://GtkLabel[@id='helptext'] orphan-label
+dbaccess/uiconfig/ui/collectionviewdialog.ui://GtkLabel[@id='currentPathLabel'] orphan-label
+dbaccess/uiconfig/ui/copytablepage.ui://GtkLabel[@id='infoLabel'] orphan-label
+dbaccess/uiconfig/ui/dbaseindexdialog.ui://GtkButton[@id='add'] button-no-label
+dbaccess/uiconfig/ui/dbaseindexdialog.ui://GtkButton[@id='addall'] button-no-label
+dbaccess/uiconfig/ui/dbaseindexdialog.ui://GtkButton[@id='remove'] button-no-label
+dbaccess/uiconfig/ui/dbaseindexdialog.ui://GtkButton[@id='removeall'] button-no-label
+dbaccess/uiconfig/ui/dbasepage.ui://GtkLabel[@id='specMessageLabel'] orphan-label
+dbaccess/uiconfig/ui/dbwizconnectionpage.ui://GtkLabel[@id='header'] orphan-label
+dbaccess/uiconfig/ui/dbwizconnectionpage.ui://GtkLabel[@id='helptext'] orphan-label
+dbaccess/uiconfig/ui/dbwizmysqlintropage.ui://GtkLabel[@id='label2'] orphan-label
+dbaccess/uiconfig/ui/dbwizmysqlnativepage.ui://GtkLabel[@id='helptext'] orphan-label
+dbaccess/uiconfig/ui/dbwizspreadsheetpage.ui://GtkLabel[@id='helptext'] orphan-label
+dbaccess/uiconfig/ui/dbwiztextpage.ui://GtkLabel[@id='helptext'] orphan-label
+dbaccess/uiconfig/ui/fielddescpanel.ui://GtkTextView[@id='textview'] no-labelled-by
+dbaccess/uiconfig/ui/fielddialog.ui://GtkLabel[@id='alttitle'] orphan-label
+dbaccess/uiconfig/ui/finalpagewizard.ui://GtkLabel[@id='headerText'] orphan-label
+dbaccess/uiconfig/ui/finalpagewizard.ui://GtkLabel[@id='helpText'] orphan-label
+dbaccess/uiconfig/ui/finalpagewizard.ui://GtkLabel[@id='additionalText'] orphan-label
+dbaccess/uiconfig/ui/finalpagewizard.ui://GtkLabel[@id='finishText'] orphan-label
+dbaccess/uiconfig/ui/generalpagedialog.ui://GtkLabel[@id='specialMessage'] orphan-label
+dbaccess/uiconfig/ui/generalpagewizard.ui://GtkLabel[@id='headerText'] orphan-label
+dbaccess/uiconfig/ui/generalpagewizard.ui://GtkLabel[@id='helpText'] orphan-label
+dbaccess/uiconfig/ui/generalpagewizard.ui://GtkLabel[@id='sourceTypeHeader'] orphan-label
+dbaccess/uiconfig/ui/generalpagewizard.ui://GtkLabel[@id='specialMessage'] orphan-label
+dbaccess/uiconfig/ui/indexdesigndialog.ui://GtkLabel[@id='DESC_LABEL'] orphan-label
+dbaccess/uiconfig/ui/indexdesigndialog.ui://GtkLabel[@id='DESCRIPTION'] orphan-label
+dbaccess/uiconfig/ui/indexdesigndialog.ui://GtkLabel[@id='FIELDS_LABEL'] orphan-label
+dbaccess/uiconfig/ui/jdbcconnectionpage.ui://GtkLabel[@id='header'] orphan-label
+dbaccess/uiconfig/ui/jdbcconnectionpage.ui://GtkLabel[@id='helptext'] orphan-label
+dbaccess/uiconfig/ui/joindialog.ui://GtkLabel[@id='helptext'] orphan-label
+dbaccess/uiconfig/ui/ldapconnectionpage.ui://GtkLabel[@id='header'] orphan-label
+dbaccess/uiconfig/ui/ldapconnectionpage.ui://GtkLabel[@id='helpLabel'] orphan-label
+dbaccess/uiconfig/ui/ldapconnectionpage.ui://GtkLabel[@id='portNumDefLabel'] orphan-label
+dbaccess/uiconfig/ui/mysqlnativesettings.ui://GtkLabel[@id='defaultport'] orphan-label
+dbaccess/uiconfig/ui/mysqlnativesettings.ui://GtkEntry[@id='socket'] no-labelled-by
+dbaccess/uiconfig/ui/mysqlnativesettings.ui://GtkEntry[@id='namedpipe'] no-labelled-by
+dbaccess/uiconfig/ui/namematchingpage.ui://GtkButton[@id='up'] button-no-label
+dbaccess/uiconfig/ui/namematchingpage.ui://GtkButton[@id='down'] button-no-label
+dbaccess/uiconfig/ui/namematchingpage.ui://GtkButton[@id='up_right'] button-no-label
+dbaccess/uiconfig/ui/namematchingpage.ui://GtkButton[@id='down_right'] button-no-label
+dbaccess/uiconfig/ui/queryfilterdialog.ui://GtkLabel[@id='label2'] orphan-label
+dbaccess/uiconfig/ui/queryfilterdialog.ui://GtkLabel[@id='label5'] orphan-label
+dbaccess/uiconfig/ui/queryfilterdialog.ui://GtkLabel[@id='label6'] orphan-label
+dbaccess/uiconfig/ui/queryfilterdialog.ui://GtkLabel[@id='label7'] orphan-label
+dbaccess/uiconfig/ui/querypropertiesdialog.ui://GtkLabel[@id='limit-label'] orphan-label
+dbaccess/uiconfig/ui/querypropertiesdialog.ui://GtkLabel[@id='distinctvalues'] orphan-label
+dbaccess/uiconfig/ui/savedialog.ui://GtkLabel[@id='descriptionft'] orphan-label
+dbaccess/uiconfig/ui/specialjdbcconnectionpage.ui://GtkLabel[@id='header'] orphan-label
+dbaccess/uiconfig/ui/specialjdbcconnectionpage.ui://GtkLabel[@id='helpLabel'] orphan-label
+dbaccess/uiconfig/ui/specialjdbcconnectionpage.ui://GtkLabel[@id='portNumDefLabel'] orphan-label
+dbaccess/uiconfig/ui/sortdialog.ui://GtkLabel[@id='label2'] orphan-label
+dbaccess/uiconfig/ui/sortdialog.ui://GtkLabel[@id='label3'] orphan-label
+dbaccess/uiconfig/ui/sortdialog.ui://GtkLabel[@id='label4'] orphan-label
+dbaccess/uiconfig/ui/sortdialog.ui://GtkLabel[@id='label5'] orphan-label
+dbaccess/uiconfig/ui/sortdialog.ui://GtkLabel[@id='label6'] orphan-label
+dbaccess/uiconfig/ui/sortdialog.ui://GtkComboBoxText[@id='field1'] no-labelled-by
+dbaccess/uiconfig/ui/sortdialog.ui://GtkComboBoxText[@id='value1'] no-labelled-by
+dbaccess/uiconfig/ui/sortdialog.ui://GtkComboBoxText[@id='field2'] no-labelled-by
+dbaccess/uiconfig/ui/sortdialog.ui://GtkComboBoxText[@id='field3'] no-labelled-by
+dbaccess/uiconfig/ui/sortdialog.ui://GtkComboBoxText[@id='value2'] no-labelled-by
+dbaccess/uiconfig/ui/sortdialog.ui://GtkComboBoxText[@id='value3'] no-labelled-by
+dbaccess/uiconfig/ui/tablesfilterpage.ui://GtkLabel[@id='label2'] orphan-label
+dbaccess/uiconfig/ui/tablesjoindialog.ui://GtkLabel[@id='title'] orphan-label
+dbaccess/uiconfig/ui/tablesjoindialog.ui://GtkLabel[@id='alttitle'] orphan-label
+dbaccess/uiconfig/ui/tabletitle.ui://GtkImage[@id='image'] no-labelled-by
+dbaccess/uiconfig/ui/taskwindow.ui://GtkTreeView[@id='treeview'] no-labelled-by
+dbaccess/uiconfig/ui/textpage.ui://GtkEntry[@id='extension'] no-labelled-by
+dbaccess/uiconfig/ui/textpage.ui://GtkLabel[@id='example'] orphan-label
+dbaccess/uiconfig/ui/useradminpage.ui://GtkLabel[@id='label3'] orphan-label
diff --git a/solenv/sanitizers/ui/desktop.suppr b/solenv/sanitizers/ui/desktop.suppr
new file mode 100644
index 000000000..d0168c5be
--- /dev/null
+++ b/solenv/sanitizers/ui/desktop.suppr
@@ -0,0 +1,20 @@
+desktop/uiconfig/ui/dependenciesdialog.ui://GtkLabel[@id='label1'] orphan-label
+desktop/uiconfig/ui/dependenciesdialog.ui://GtkTreeView[@id='depListTreeview'] no-labelled-by
+desktop/uiconfig/ui/extensionmanager.ui://GtkLabel[@id='progressft'] orphan-label
+desktop/uiconfig/ui/extensionmanager.ui://GtkProgressBar[@id='progressbar'] no-labelled-by
+desktop/uiconfig/ui/licensedialog.ui://GtkLabel[@id='head'] orphan-label
+desktop/uiconfig/ui/licensedialog.ui://GtkLabel[@id='label2'] orphan-label
+desktop/uiconfig/ui/licensedialog.ui://GtkLabel[@id='label3'] orphan-label
+desktop/uiconfig/ui/licensedialog.ui://GtkImage[@id='arrow1'] no-labelled-by
+desktop/uiconfig/ui/licensedialog.ui://GtkImage[@id='arrow2'] no-labelled-by
+desktop/uiconfig/ui/licensedialog.ui://GtkLabel[@id='label4'] orphan-label
+desktop/uiconfig/ui/licensedialog.ui://GtkLabel[@id='label5'] orphan-label
+desktop/uiconfig/ui/updatedialog.ui://GtkLabel[@id='UPDATE_LABEL'] orphan-label
+desktop/uiconfig/ui/updatedialog.ui://GtkLabel[@id='UPDATE_CHECKING'] orphan-label
+desktop/uiconfig/ui/updatedialog.ui://GtkSpinner[@id='THROBBER'] no-labelled-by
+desktop/uiconfig/ui/updatedialog.ui://GtkLabel[@id='DESCRIPTION_LABEL'] orphan-label
+desktop/uiconfig/ui/updateinstalldialog.ui://GtkLabel[@id='EXTENSION_NAME'] orphan-label
+desktop/uiconfig/ui/updaterequireddialog.ui://GtkLabel[@id='updatelabel'] orphan-label
+desktop/uiconfig/ui/updaterequireddialog.ui://GtkDrawingArea[@id='extensions'] no-labelled-by
+desktop/uiconfig/ui/updaterequireddialog.ui://GtkLabel[@id='progresslabel'] orphan-label
+desktop/uiconfig/ui/updaterequireddialog.ui://GtkProgressBar[@id='progress'] no-labelled-by
diff --git a/solenv/sanitizers/ui/filter.suppr b/solenv/sanitizers/ui/filter.suppr
new file mode 100644
index 000000000..c0199933c
--- /dev/null
+++ b/solenv/sanitizers/ui/filter.suppr
@@ -0,0 +1,25 @@
+filter/uiconfig/ui/pdfgeneralpage.ui://GtkLabel[@id='slides'] orphan-label
+filter/uiconfig/ui/pdfgeneralpage.ui://GtkLabel[@id='selectedsheets'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='label5'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='label6'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='label7'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='label8'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='label30'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='label9'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='label11'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='label12'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='label13'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='label14'] orphan-label
+filter/uiconfig/ui/pdfsecuritypage.ui://GtkLabel[@id='setpasswordstitle'] orphan-label
+filter/uiconfig/ui/testxmlfilter.ui://GtkLabel[@id='label3'] orphan-label
+filter/uiconfig/ui/testxmlfilter.ui://GtkLabel[@id='label4'] orphan-label
+filter/uiconfig/ui/testxmlfilter.ui://GtkLabel[@id='exportxsltfile'] orphan-label
+filter/uiconfig/ui/testxmlfilter.ui://GtkLabel[@id='currentfilename'] orphan-label
+filter/uiconfig/ui/testxmlfilter.ui://GtkLabel[@id='label5'] orphan-label
+filter/uiconfig/ui/testxmlfilter.ui://GtkLabel[@id='templateimport'] orphan-label
+filter/uiconfig/ui/testxmlfilter.ui://GtkLabel[@id='importxsltfile'] orphan-label
+filter/uiconfig/ui/testxmlfilter.ui://GtkLabel[@id='label6'] orphan-label
+filter/uiconfig/ui/testxmlfilter.ui://GtkLabel[@id='importxslttemplate'] orphan-label
+filter/uiconfig/ui/testxmlfilter.ui://GtkLabel[@id='recentfilename'] orphan-label
+filter/uiconfig/ui/warnpdfdialog.ui://GtkLabel[@id='message'] orphan-label
+filter/uiconfig/ui/warnpdfdialog.ui://GtkTreeView[@id='errors'] no-labelled-by
diff --git a/solenv/sanitizers/ui/formula.suppr b/solenv/sanitizers/ui/formula.suppr
new file mode 100644
index 000000000..cfdfe80b4
--- /dev/null
+++ b/solenv/sanitizers/ui/formula.suppr
@@ -0,0 +1,9 @@
+formula/uiconfig/ui/formuladialog.ui://GtkLabel[@id='editname'] orphan-label
+formula/uiconfig/ui/formuladialog.ui://GtkLabel[@id='label3'] orphan-label
+formula/uiconfig/ui/formuladialog.ui://GtkLabel[@id='headline'] orphan-label
+formula/uiconfig/ui/formuladialog.ui://GtkLabel[@id='funcname'] orphan-label
+formula/uiconfig/ui/formuladialog.ui://GtkLabel[@id='funcdesc'] orphan-label
+formula/uiconfig/ui/formuladialog.ui://GtkEntry[@id='ED_REF'] no-labelled-by
+formula/uiconfig/ui/parameter.ui://GtkLabel[@id='editdesc'] orphan-label
+formula/uiconfig/ui/parameter.ui://GtkLabel[@id='parname'] orphan-label
+formula/uiconfig/ui/parameter.ui://GtkLabel[@id='pardesc'] orphan-label
diff --git a/solenv/sanitizers/ui/fps.suppr b/solenv/sanitizers/ui/fps.suppr
new file mode 100644
index 000000000..f0ddabb48
--- /dev/null
+++ b/solenv/sanitizers/ui/fps.suppr
@@ -0,0 +1,4 @@
+fpicker/uiconfig/ui/breadcrumb.ui://GtkLabel[@id='label'] orphan-label
+fpicker/uiconfig/ui/explorerfiledialog.ui://GtkCheckButton[@id='link'] button-no-label
+fpicker/uiconfig/ui/explorerfiledialog.ui://GtkCheckButton[@id='cb_preview'] button-no-label
+fpicker/uiconfig/ui/explorerfiledialog.ui://GtkMenuToolButton[@id='up_btn'] button-no-label
diff --git a/solenv/sanitizers/ui/libreofficekit.suppr b/solenv/sanitizers/ui/libreofficekit.suppr
new file mode 100644
index 000000000..caa7b0328
--- /dev/null
+++ b/solenv/sanitizers/ui/libreofficekit.suppr
@@ -0,0 +1,9 @@
+libreofficekit/qa/gtktiledviewer/gtv.ui://GtkLabel[@id='zoomlabel'] orphan-label
+libreofficekit/qa/gtktiledviewer/gtv.ui://GtkLabel[@id='redlinelabel'] orphan-label
+libreofficekit/qa/gtktiledviewer/gtv.ui://GtkEntry[@id='findbar_entry'] no-labelled-by
+libreofficekit/qa/gtktiledviewer/gtv.ui://GtkLabel[@id='findbar_label'] orphan-label
+libreofficekit/qa/gtktiledviewer/gtv.ui://GtkComboBoxText[@id='combo_partselector'] no-labelled-by
+libreofficekit/qa/gtktiledviewer/gtv.ui://GtkComboBoxText[@id='combo_partsmodeselector'] no-labelled-by
+libreofficekit/qa/gtktiledviewer/gtv.ui://GtkComboBoxText[@id='combo_recentunoselector'] no-labelled-by
+libreofficekit/qa/gtktiledviewer/gtv.ui://GtkEntry[@id='addressbar_entry'] no-labelled-by
+libreofficekit/qa/gtktiledviewer/gtv.ui://GtkEntry[@id='formulabar_entry'] no-labelled-by
diff --git a/solenv/sanitizers/ui/modules/BasicIDE.suppr b/solenv/sanitizers/ui/modules/BasicIDE.suppr
new file mode 100644
index 000000000..d504ecaaa
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/BasicIDE.suppr
@@ -0,0 +1,7 @@
+basctl/uiconfig/basicide/ui/basicmacrodialog.ui://GtkLabel[@id='macrofromft'] orphan-label
+basctl/uiconfig/basicide/ui/basicmacrodialog.ui://GtkLabel[@id='macrotoft'] orphan-label
+basctl/uiconfig/basicide/ui/defaultlanguage.ui://GtkLabel[@id='defined'] orphan-label
+basctl/uiconfig/basicide/ui/defaultlanguage.ui://GtkLabel[@id='added'] orphan-label
+basctl/uiconfig/basicide/ui/defaultlanguage.ui://GtkLabel[@id='alttitle'] orphan-label
+basctl/uiconfig/basicide/ui/dockingwatch.ui://GtkButton[@id='remove'] button-no-label
+basctl/uiconfig/basicide/ui/managelanguages.ui://GtkLabel[@id='label2'] orphan-label
diff --git a/solenv/sanitizers/ui/modules/dbreport.suppr b/solenv/sanitizers/ui/modules/dbreport.suppr
new file mode 100644
index 000000000..58fea796e
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/dbreport.suppr
@@ -0,0 +1,10 @@
+reportdesign/uiconfig/dbreport/ui/conditionwin.ui://GtkLabel[@id='headerLabel'] orphan-label
+reportdesign/uiconfig/dbreport/ui/conditionwin.ui://GtkComboBoxText[@id='typeCombobox'] no-labelled-by
+reportdesign/uiconfig/dbreport/ui/conditionwin.ui://GtkComboBoxText[@id='opCombobox'] no-labelled-by
+reportdesign/uiconfig/dbreport/ui/conditionwin.ui://GtkEntry[@id='lhsEntry'] no-labelled-by
+reportdesign/uiconfig/dbreport/ui/conditionwin.ui://GtkLabel[@id='andLabel'] orphan-label
+reportdesign/uiconfig/dbreport/ui/conditionwin.ui://GtkEntry[@id='rhsEntry'] no-labelled-by
+reportdesign/uiconfig/dbreport/ui/conditionwin.ui://GtkButton[@id='upButton'] button-no-label
+reportdesign/uiconfig/dbreport/ui/conditionwin.ui://GtkButton[@id='downButton'] button-no-label
+reportdesign/uiconfig/dbreport/ui/floatingfield.ui://GtkLabel[@id='helptext'] orphan-label
+reportdesign/uiconfig/dbreport/ui/floatingsort.ui://GtkLabel[@id='helptext'] orphan-label
diff --git a/solenv/sanitizers/ui/modules/sabpilot.suppr b/solenv/sanitizers/ui/modules/sabpilot.suppr
new file mode 100644
index 000000000..d137cf839
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/sabpilot.suppr
@@ -0,0 +1,18 @@
+extensions/uiconfig/sabpilot/ui/contenttablepage.ui://GtkLabel[@id='datasourcelabel'] orphan-label
+extensions/uiconfig/sabpilot/ui/contenttablepage.ui://GtkLabel[@id='contenttypelabel'] orphan-label
+extensions/uiconfig/sabpilot/ui/contenttablepage.ui://GtkLabel[@id='formtablelabel'] orphan-label
+extensions/uiconfig/sabpilot/ui/contenttablepage.ui://GtkLabel[@id='datasource'] orphan-label
+extensions/uiconfig/sabpilot/ui/contenttablepage.ui://GtkLabel[@id='contenttype'] orphan-label
+extensions/uiconfig/sabpilot/ui/contenttablepage.ui://GtkLabel[@id='formtable'] orphan-label
+extensions/uiconfig/sabpilot/ui/gridfieldsselectionpage.ui://GtkLabel[@id='datasourcelabel'] orphan-label
+extensions/uiconfig/sabpilot/ui/gridfieldsselectionpage.ui://GtkLabel[@id='contenttypelabel'] orphan-label
+extensions/uiconfig/sabpilot/ui/gridfieldsselectionpage.ui://GtkLabel[@id='formtablelabel'] orphan-label
+extensions/uiconfig/sabpilot/ui/gridfieldsselectionpage.ui://GtkLabel[@id='datasource'] orphan-label
+extensions/uiconfig/sabpilot/ui/gridfieldsselectionpage.ui://GtkLabel[@id='contenttype'] orphan-label
+extensions/uiconfig/sabpilot/ui/gridfieldsselectionpage.ui://GtkLabel[@id='formtable'] orphan-label
+extensions/uiconfig/sabpilot/ui/groupradioselectionpage.ui://GtkLabel[@id='datasourcelabel'] orphan-label
+extensions/uiconfig/sabpilot/ui/groupradioselectionpage.ui://GtkLabel[@id='contenttypelabel'] orphan-label
+extensions/uiconfig/sabpilot/ui/groupradioselectionpage.ui://GtkLabel[@id='formtablelabel'] orphan-label
+extensions/uiconfig/sabpilot/ui/groupradioselectionpage.ui://GtkLabel[@id='datasource'] orphan-label
+extensions/uiconfig/sabpilot/ui/groupradioselectionpage.ui://GtkLabel[@id='contenttype'] orphan-label
+extensions/uiconfig/sabpilot/ui/groupradioselectionpage.ui://GtkLabel[@id='formtable'] orphan-label
diff --git a/solenv/sanitizers/ui/modules/sbibliography.suppr b/solenv/sanitizers/ui/modules/sbibliography.suppr
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/sbibliography.suppr
diff --git a/solenv/sanitizers/ui/modules/scalc.false b/solenv/sanitizers/ui/modules/scalc.false
new file mode 100644
index 000000000..e798fa3e6
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/scalc.false
@@ -0,0 +1,66 @@
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkComboBox[@id='comboLB_DEFINED'] duplicate-mnemonic
+sc/uiconfig/scalc/ui/advancedfilterdialog.ui://GtkButton[@id='rbfilterarea'] button-no-label
+sc/uiconfig/scalc/ui/advancedfilterdialog.ui://GtkButton[@id='rbcopyarea'] button-no-label
+sc/uiconfig/scalc/ui/analysisofvariancedialog.ui://GtkButton[@id='input-range-button'] button-no-label
+sc/uiconfig/scalc/ui/analysisofvariancedialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/chisquaretestdialog.ui://GtkButton[@id='input-range-button'] button-no-label
+sc/uiconfig/scalc/ui/chisquaretestdialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/conditionalformatdialog.ui://GtkButton[@id='rbassign'] button-no-label
+sc/uiconfig/scalc/ui/consolidatedialog.ui://GtkButton[@id='rbdataarea'] button-no-label
+sc/uiconfig/scalc/ui/consolidatedialog.ui://GtkButton[@id='rbdestarea'] button-no-label
+sc/uiconfig/scalc/ui/correlationdialog.ui://GtkButton[@id='input-range-button'] button-no-label
+sc/uiconfig/scalc/ui/correlationdialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/covariancedialog.ui://GtkButton[@id='input-range-button'] button-no-label
+sc/uiconfig/scalc/ui/covariancedialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/definedatabaserangedialog.ui://GtkButton[@id='assignrb'] button-no-label
+sc/uiconfig/scalc/ui/definename.ui://GtkButton[@id='refbutton'] button-no-label
+sc/uiconfig/scalc/ui/descriptivestatisticsdialog.ui://GtkButton[@id='input-range-button'] button-no-label
+sc/uiconfig/scalc/ui/descriptivestatisticsdialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/exponentialsmoothingdialog.ui://GtkButton[@id='input-range-button'] button-no-label
+sc/uiconfig/scalc/ui/exponentialsmoothingdialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/fourieranalysisdialog.ui://GtkButton[@id='input-range-button'] button-no-label
+sc/uiconfig/scalc/ui/fourieranalysisdialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/goalseekdlg.ui://GtkButton[@id='formulabutton'] button-no-label
+sc/uiconfig/scalc/ui/goalseekdlg.ui://GtkButton[@id='varbutton'] button-no-label
+sc/uiconfig/scalc/ui/namerangesdialog.ui://GtkButton[@id='rbassign'] button-no-label
+sc/uiconfig/scalc/ui/namerangesdialog.ui://GtkButton[@id='rbassign2'] button-no-label
+sc/uiconfig/scalc/ui/managenamesdialog.ui://GtkButton[@id='assign'] button-no-label
+sc/uiconfig/scalc/ui/movingaveragedialog.ui://GtkButton[@id='input-range-button'] button-no-label
+sc/uiconfig/scalc/ui/movingaveragedialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/multipleoperationsdialog.ui://GtkButton[@id='formulasref'] button-no-label
+sc/uiconfig/scalc/ui/multipleoperationsdialog.ui://GtkButton[@id='rowref'] button-no-label
+sc/uiconfig/scalc/ui/multipleoperationsdialog.ui://GtkButton[@id='colref'] button-no-label
+sc/uiconfig/scalc/ui/pivottablelayoutdialog.ui://GtkButton[@id='destination-button'] button-no-label
+sc/uiconfig/scalc/ui/pivottablelayoutdialog.ui://GtkButton[@id='source-button'] button-no-label
+sc/uiconfig/scalc/ui/printareasdialog.ui://GtkButton[@id='rbprintarea'] button-no-label
+sc/uiconfig/scalc/ui/printareasdialog.ui://GtkButton[@id='rbrepeatrow'] button-no-label
+sc/uiconfig/scalc/ui/printareasdialog.ui://GtkButton[@id='rbrepeatcol'] button-no-label
+sc/uiconfig/scalc/ui/randomnumbergenerator.ui://GtkButton[@id='cell-range-button'] button-no-label
+sc/uiconfig/scalc/ui/regressiondialog.ui://GtkButton[@id='variable1-range-button'] button-no-label
+sc/uiconfig/scalc/ui/regressiondialog.ui://GtkButton[@id='variable2-range-button'] button-no-label
+sc/uiconfig/scalc/ui/regressiondialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/samplingdialog.ui://GtkButton[@id='input-range-button'] button-no-label
+sc/uiconfig/scalc/ui/samplingdialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/showchangesdialog.ui://GtkButton[@id='rangeref'] button-no-label
+sc/uiconfig/scalc/ui/simplerefdialog.ui://GtkButton[@id='assignref'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='changebutton'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='targetbutton'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='valuebutton'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='ref1button'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='ref2button'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='ref3button'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='ref4button'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='val1button'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='val2button'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='val3button'] button-no-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkButton[@id='val4button'] button-no-label
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkButton[@id='rbcopyarea'] button-no-label
+sc/uiconfig/scalc/ui/ttestdialog.ui://GtkButton[@id='variable1-range-button'] button-no-label
+sc/uiconfig/scalc/ui/ttestdialog.ui://GtkButton[@id='variable2-range-button'] button-no-label
+sc/uiconfig/scalc/ui/ttestdialog.ui://GtkButton[@id='output-range-button'] button-no-label
+sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkButton[@id='validref'] no-labelled-by
+sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkButton[@id='validref'] button-no-label
+sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkButton[@id='ref'] button-no-label
+sc/uiconfig/scalc/ui/ztestdialog.ui://GtkButton[@id='variable1-range-button'] button-no-label
+sc/uiconfig/scalc/ui/ztestdialog.ui://GtkButton[@id='variable2-range-button'] button-no-label
+sc/uiconfig/scalc/ui/ztestdialog.ui://GtkButton[@id='output-range-button'] button-no-label
diff --git a/solenv/sanitizers/ui/modules/scalc.suppr b/solenv/sanitizers/ui/modules/scalc.suppr
new file mode 100644
index 000000000..a7ff05735
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/scalc.suppr
@@ -0,0 +1,160 @@
+sc/uiconfig/scalc/ui/advancedfilterdialog.ui://GtkLabel[@id='dbarealabel'] orphan-label
+sc/uiconfig/scalc/ui/advancedfilterdialog.ui://GtkLabel[@id='dbarea'] orphan-label
+sc/uiconfig/scalc/ui/cellprotectionpage.ui://GtkLabel[@id='label1'] orphan-label
+sc/uiconfig/scalc/ui/cellprotectionpage.ui://GtkLabel[@id='label4'] orphan-label
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkLabel[@id='number'] orphan-label
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkLabel[@id='condition'] orphan-label
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkComboBoxText[@id='type'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkLabel[@id='valueft'] orphan-label
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkEntry[@id='edcolscalemin'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkEntry[@id='edcolscalemiddle'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkEntry[@id='edcolscalemax'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkComboBoxText[@id='colscalemiddle'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkComboBoxText[@id='typeis'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkComboBoxText[@id='datetype'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkComboBoxText[@id='colorformat'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkEntry[@id='val1'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkEntry[@id='val2'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkComboBoxText[@id='iconsettype'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionalentry.ui://GtkEntry[@id='formula'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionaliconset.ui://GtkLabel[@id='label'] orphan-label
+sc/uiconfig/scalc/ui/conditionaliconset.ui://GtkEntry[@id='entry'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionaliconset.ui://GtkComboBoxText[@id='listbox'] no-labelled-by
+sc/uiconfig/scalc/ui/conditionaliconset.ui://GtkImage[@id='icon'] no-labelled-by
+sc/uiconfig/scalc/ui/conflictsdialog.ui://GtkLabel[@id='label1'] orphan-label
+sc/uiconfig/scalc/ui/dapiservicedialog.ui://GtkLabel[@id='label2'] orphan-label
+sc/uiconfig/scalc/ui/dapiservicedialog.ui://GtkLabel[@id='label3'] orphan-label
+sc/uiconfig/scalc/ui/dapiservicedialog.ui://GtkLabel[@id='label4'] orphan-label
+sc/uiconfig/scalc/ui/dapiservicedialog.ui://GtkLabel[@id='label5'] orphan-label
+sc/uiconfig/scalc/ui/dapiservicedialog.ui://GtkLabel[@id='label6'] orphan-label
+sc/uiconfig/scalc/ui/dapiservicedialog.ui://GtkEntry[@id='password'] no-labelled-by
+sc/uiconfig/scalc/ui/dapiservicedialog.ui://GtkEntry[@id='user'] no-labelled-by
+sc/uiconfig/scalc/ui/dapiservicedialog.ui://GtkEntry[@id='name'] no-labelled-by
+sc/uiconfig/scalc/ui/dapiservicedialog.ui://GtkEntry[@id='source'] no-labelled-by
+sc/uiconfig/scalc/ui/dapiservicedialog.ui://GtkComboBoxText[@id='service'] no-labelled-by
+sc/uiconfig/scalc/ui/databaroptions.ui://GtkLabel[@id='str_same_value'] orphan-label
+sc/uiconfig/scalc/ui/datafielddialog.ui://GtkLabel[@id='label2'] orphan-label
+sc/uiconfig/scalc/ui/datafielddialog.ui://GtkLabel[@id='name'] orphan-label
+sc/uiconfig/scalc/ui/datafieldoptionsdialog.ui://GtkComboBoxText[@id='layout'] duplicate-mnemonic
+sc/uiconfig/scalc/ui/dataform.ui://GtkLabel[@id='label'] orphan-label
+sc/uiconfig/scalc/ui/datastreams.ui://GtkLabel[@id='label6'] orphan-label
+sc/uiconfig/scalc/ui/datastreams.ui://GtkEntry[@id='range'] no-labelled-by
+sc/uiconfig/scalc/ui/datastreams.ui://GtkEntry[@id='limit'] no-labelled-by
+sc/uiconfig/scalc/ui/definedatabaserangedialog.ui://GtkLabel[@id='Source'] orphan-label
+sc/uiconfig/scalc/ui/definedatabaserangedialog.ui://GtkLabel[@id='Operations'] orphan-label
+sc/uiconfig/scalc/ui/definedatabaserangedialog.ui://GtkLabel[@id='invalid'] orphan-label
+sc/uiconfig/scalc/ui/definename.ui://GtkLabel[@id='label'] orphan-label
+sc/uiconfig/scalc/ui/doubledialog.ui://GtkEntry[@id='value'] no-labelled-by
+sc/uiconfig/scalc/ui/externaldata.ui://GtkLabel[@id='secondsft'] orphan-label
+sc/uiconfig/scalc/ui/fourieranalysisdialog.ui://GtkLabel[@id='error-message'] orphan-label
+sc/uiconfig/scalc/ui/functionpanel.ui://GtkLabel[@id='funcdesc'] orphan-label
+sc/uiconfig/scalc/ui/groupbynumber.ui://GtkEntry[@id='edit_by'] no-labelled-by
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkLabel[@id='labelFT_H_CUSTOM'] orphan-label
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkLabel[@id='labelFT_F_CUSTOM'] orphan-label
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkLabel[@id='label2'] orphan-label
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkLabel[@id='labelSTR_HF_NONE_IN_BRACKETS'] orphan-label
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkLabel[@id='labelSTR_PAGE'] orphan-label
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkLabel[@id='labelSTR_HF_OF_QUESTION'] orphan-label
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkLabel[@id='labelSTR_HF_CONFIDENTIAL'] orphan-label
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkLabel[@id='labelSTR_HF_CREATED_BY'] orphan-label
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkLabel[@id='labelSTR_HF_CUSTOMIZED'] orphan-label
+sc/uiconfig/scalc/ui/headerfootercontent.ui://GtkLabel[@id='labelSTR_HF_OF'] orphan-label
+sc/uiconfig/scalc/ui/imoptdialog.ui://GtkLabel[@id='charsetft'] orphan-label
+sc/uiconfig/scalc/ui/inputbar.ui://GtkButton[@id='up'] button-no-label
+sc/uiconfig/scalc/ui/inputbar.ui://GtkButton[@id='down'] button-no-label
+sc/uiconfig/scalc/ui/insertsheet.ui://GtkLabel[@id='path'] orphan-label
+sc/uiconfig/scalc/ui/integerdialog.ui://GtkSpinButton[@id='value'] no-labelled-by
+sc/uiconfig/scalc/ui/notebookbar_groups.ui://GtkLabel[@id='filegrouplabel'] orphan-label
+sc/uiconfig/scalc/ui/notebookbar_groups.ui://GtkLabel[@id='clipboardgrouplabel'] orphan-label
+sc/uiconfig/scalc/ui/notebookbar_groups.ui://GtkLabel[@id='formatgrouplabel'] orphan-label
+sc/uiconfig/scalc/ui/notebookbar_groups.ui://GtkLabel[@id='tablegrouplabel'] orphan-label
+sc/uiconfig/scalc/ui/notebookbar_groups.ui://GtkLabel[@id='insertgrouplabel'] orphan-label
+sc/uiconfig/scalc/ui/notebookbar_groups.ui://GtkLabel[@id='imagegrouplabel'] orphan-label
+sc/uiconfig/scalc/ui/managenamesdialog.ui://GtkLabel[@id='info'] orphan-label
+sc/uiconfig/scalc/ui/managenamesdialog.ui://GtkLabel[@id='label2'] orphan-label
+sc/uiconfig/scalc/ui/mergecellsdialog.ui://GtkLabel[@id='label'] orphan-label
+sc/uiconfig/scalc/ui/mergecellsdialog.ui://GtkImage[@id='imMergeFirstCell'] no-labelled-by
+sc/uiconfig/scalc/ui/mergecellsdialog.ui://GtkImage[@id='imMergeKeepHidden'] no-labelled-by
+sc/uiconfig/scalc/ui/mergecellsdialog.ui://GtkImage[@id='imMergeEmptyHidden'] no-labelled-by
+sc/uiconfig/scalc/ui/movecopysheet.ui://GtkEntry[@id='newName'] no-labelled-by
+sc/uiconfig/scalc/ui/movecopysheet.ui://GtkLabel[@id='newNameWarn'] orphan-label
+sc/uiconfig/scalc/ui/movecopysheet.ui://GtkLabel[@id='warnunused'] orphan-label
+sc/uiconfig/scalc/ui/movecopysheet.ui://GtkLabel[@id='warnempty'] orphan-label
+sc/uiconfig/scalc/ui/movecopysheet.ui://GtkLabel[@id='warninvalid'] orphan-label
+sc/uiconfig/scalc/ui/movingaveragedialog.ui://GtkLabel[@id='interval-label'] orphan-label
+sc/uiconfig/scalc/ui/movingaveragedialog.ui://GtkSpinButton[@id='interval-spin'] no-labelled-by
+sc/uiconfig/scalc/ui/nosolutiondialog.ui://GtkLabel[@id='label1'] orphan-label
+sc/uiconfig/scalc/ui/nosolutiondialog.ui://GtkLabel[@id='error'] orphan-label
+sc/uiconfig/scalc/ui/passfragment.ui://GtkButton[@id='button'] button-no-label
+sc/uiconfig/scalc/ui/pivotfielddialog.ui://GtkLabel[@id='label2'] orphan-label
+sc/uiconfig/scalc/ui/pivotfielddialog.ui://GtkLabel[@id='name'] orphan-label
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkComboBoxText[@id='connect1'] missing-label-for
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkComboBoxText[@id='field1'] missing-label-for
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkComboBoxText[@id='field2'] missing-label-for
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkComboBoxText[@id='field3'] missing-label-for
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkComboBoxText[@id='cond1'] missing-label-for
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkComboBoxText[@id='cond2'] missing-label-for
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkComboBoxText[@id='cond3'] missing-label-for
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkComboBoxText[@id='val1'] missing-label-for
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkComboBoxText[@id='val2'] missing-label-for
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkComboBoxText[@id='val3'] missing-label-for
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkLabel[@id='dbarealabel'] orphan-label
+sc/uiconfig/scalc/ui/pivotfilterdialog.ui://GtkLabel[@id='dbarea'] orphan-label
+sc/uiconfig/scalc/ui/pivottablelayoutdialog.ui://GtkLabel[@id='label6'] orphan-label
+sc/uiconfig/scalc/ui/protectsheetdlg.ui://GtkLabel[@id='protected'] orphan-label
+sc/uiconfig/scalc/ui/protectsheetdlg.ui://GtkLabel[@id='unprotected'] orphan-label
+sc/uiconfig/scalc/ui/protectsheetdlg.ui://GtkLabel[@id='insert-columns'] orphan-label
+sc/uiconfig/scalc/ui/protectsheetdlg.ui://GtkLabel[@id='insert-rows'] orphan-label
+sc/uiconfig/scalc/ui/protectsheetdlg.ui://GtkLabel[@id='delete-columns'] orphan-label
+sc/uiconfig/scalc/ui/protectsheetdlg.ui://GtkLabel[@id='delete-rows'] orphan-label
+sc/uiconfig/scalc/ui/regressiondialog.ui://GtkLabel[@id='error-message'] orphan-label
+sc/uiconfig/scalc/ui/retypepassdialog.ui://GtkLabel[@id='descLabel'] orphan-label
+sc/uiconfig/scalc/ui/retypepassdialog.ui://GtkLabel[@id='docStatusLabel'] orphan-label
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='connect1'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='connect2'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='field1'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='field2'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='field3'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='cond1'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='cond2'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='cond3'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='val1'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='val2'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='val3'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBoxText[@id='val4'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBox[@id='color1'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBox[@id='color2'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBox[@id='color3'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkComboBox[@id='color4'] missing-label-for
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkLabel[@id='dbarealabel'] orphan-label
+sc/uiconfig/scalc/ui/standardfilterdialog.ui://GtkLabel[@id='dbarea'] orphan-label
+sc/uiconfig/scalc/ui/scenariodialog.ui://GtkLabel[@id='alttitle'] orphan-label
+sc/uiconfig/scalc/ui/scenariodialog.ui://GtkLabel[@id='createdft'] orphan-label
+sc/uiconfig/scalc/ui/scenariodialog.ui://GtkLabel[@id='onft'] orphan-label
+sc/uiconfig/scalc/ui/searchresults.ui://GtkLabel[@id='lbSearchResults'] orphan-label
+sc/uiconfig/scalc/ui/sharedocumentdlg.ui://GtkLabel[@id='warning'] orphan-label
+sc/uiconfig/scalc/ui/showchangesdialog.ui://GtkEntry[@id='range'] no-labelled-by
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkLabel[@id='targetlabel'] orphan-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkLabel[@id='changelabel'] orphan-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkLabel[@id='cellreflabel'] orphan-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkLabel[@id='oplabel'] orphan-label
+sc/uiconfig/scalc/ui/solverdlg.ui://GtkLabel[@id='constraintlabel'] orphan-label
+sc/uiconfig/scalc/ui/solverprogressdialog.ui://GtkLabel[@id='label2'] orphan-label
+sc/uiconfig/scalc/ui/solverprogressdialog.ui://GtkLabel[@id='progress'] orphan-label
+sc/uiconfig/scalc/ui/solversuccessdialog.ui://GtkLabel[@id='label1'] orphan-label
+sc/uiconfig/scalc/ui/solversuccessdialog.ui://GtkLabel[@id='label2'] orphan-label
+sc/uiconfig/scalc/ui/solversuccessdialog.ui://GtkLabel[@id='result'] orphan-label
+sc/uiconfig/scalc/ui/sortwarning.ui://GtkLabel[@id='sorttext'] orphan-label
+sc/uiconfig/scalc/ui/sortwarning.ui://GtkLabel[@id='sorttip'] orphan-label
+sc/uiconfig/scalc/ui/statisticsinfopage.ui://GtkLabel[@id='nopages'] orphan-label
+sc/uiconfig/scalc/ui/statisticsinfopage.ui://GtkLabel[@id='nocells'] orphan-label
+sc/uiconfig/scalc/ui/statisticsinfopage.ui://GtkLabel[@id='nosheets'] orphan-label
+sc/uiconfig/scalc/ui/statisticsinfopage.ui://GtkLabel[@id='noformula'] orphan-label
+sc/uiconfig/scalc/ui/textimportcsv.ui://GtkLabel[@id='textalttitle'] orphan-label
+sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkLabel[@id='hintft'] orphan-label
+sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkLabel[@id='sourcefile'] orphan-label
+sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkTreeView[@id='tree'] no-labelled-by
+sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkLabel[@id='label5'] orphan-label
+sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkEntry[@id='edit'] no-labelled-by
+sc/uiconfig/scalc/ui/sparklinedialog.ui://GtkSpinButton[@id='seMinAxis'] no-labelled-by
+sc/uiconfig/scalc/ui/sparklinedialog.ui://GtkSpinButton[@id='seMaxAxis'] no-labelled-by
diff --git a/solenv/sanitizers/ui/modules/scanner.suppr b/solenv/sanitizers/ui/modules/scanner.suppr
new file mode 100644
index 000000000..19944a25c
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/scanner.suppr
@@ -0,0 +1,5 @@
+extensions/uiconfig/scanner/ui/sanedialog.ui://GtkLabel[@id='optionTitleLabel'] orphan-label
+extensions/uiconfig/scanner/ui/sanedialog.ui://GtkLabel[@id='optionsDescLabel'] orphan-label
+extensions/uiconfig/scanner/ui/sanedialog.ui://GtkCheckButton[@id='boolCheckbutton'] button-no-label
+extensions/uiconfig/scanner/ui/sanedialog.ui://GtkEntry[@id='stringEntry'] no-labelled-by
+extensions/uiconfig/scanner/ui/sanedialog.ui://GtkEntry[@id='numericEntry'] no-labelled-by
diff --git a/solenv/sanitizers/ui/modules/schart.suppr b/solenv/sanitizers/ui/modules/schart.suppr
new file mode 100644
index 000000000..da1ebbe98
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/schart.suppr
@@ -0,0 +1,50 @@
+chart2/uiconfig/ui/columnfragment.ui://GtkEntry[@id='entry'] no-labelled-by
+chart2/uiconfig/ui/dlg_DataLabel.ui://GtkLabel[@id='CT_LABEL_DIAL'] orphan-label
+chart2/uiconfig/ui/dlg_DataLabel.ui://GtkLabel[@id='STR_DLG_NUMBERFORMAT_FOR_PERCENTAGE_VALUE'] orphan-label
+chart2/uiconfig/ui/dlg_DataLabel.ui://GtkLabel[@id='FT_LABEL_DEGREES'] orphan-label
+chart2/uiconfig/ui/dlg_InsertErrorBars.ui://GtkLabel[@id='STR_DATA_SELECT_RANGE_FOR_POSITIVE_ERRORBARS'] orphan-label
+chart2/uiconfig/ui/dlg_InsertErrorBars.ui://GtkLabel[@id='STR_DATA_SELECT_RANGE_FOR_NEGATIVE_ERRORBARS'] orphan-label
+chart2/uiconfig/ui/dlg_InsertErrorBars.ui://GtkLabel[@id='STR_CONTROLTEXT_ERROR_BARS_FROM_DATA'] orphan-label
+chart2/uiconfig/ui/sidebarelements.ui://GtkLabel[@id='placement_label'] orphan-label
+chart2/uiconfig/ui/sidebarelements.ui://GtkComboBoxText[@id='comboboxtext_legend'] no-labelled-by
+chart2/uiconfig/ui/sidebarelements.ui://GtkLabel[@id='text_title'] orphan-label
+chart2/uiconfig/ui/sidebarelements.ui://GtkLabel[@id='text_subtitle'] orphan-label
+chart2/uiconfig/ui/sidebarerrorbar.ui://GtkLabel[@id='label3'] orphan-label
+chart2/uiconfig/ui/sidebarerrorbar.ui://GtkLabel[@id='label4'] orphan-label
+chart2/uiconfig/ui/sidebarerrorbar.ui://GtkSpinButton[@id='spinbutton_pos'] no-labelled-by
+chart2/uiconfig/ui/sidebarerrorbar.ui://GtkSpinButton[@id='spinbutton_neg'] no-labelled-by
+chart2/uiconfig/ui/sidebarerrorbar.ui://GtkLabel[@id='label5'] orphan-label
+chart2/uiconfig/ui/sidebarseries.ui://GtkLabel[@id='label_series_tmpl'] orphan-label
+chart2/uiconfig/ui/smoothlinesdlg.ui://GtkLabel[@id='TypeLabel'] orphan-label
+chart2/uiconfig/ui/titlerotationtabpage.ui://GtkLabel[@id='degreeL'] orphan-label
+chart2/uiconfig/ui/titlerotationtabpage.ui://GtkLabel[@id='labelABCD'] orphan-label
+chart2/uiconfig/ui/titlerotationtabpage.ui://GtkLabel[@id='textdirL'] orphan-label
+chart2/uiconfig/ui/tp_3D_SceneIllumination.ui://GtkButton[@id='corner'] button-no-label
+chart2/uiconfig/ui/tp_3D_SceneIllumination.ui://GtkScale[@id='hori'] no-labelled-by
+chart2/uiconfig/ui/tp_3D_SceneIllumination.ui://GtkScale[@id='vert'] no-labelled-by
+chart2/uiconfig/ui/tp_axisLabel.ui://GtkLabel[@id='degreeL'] orphan-label
+chart2/uiconfig/ui/tp_axisLabel.ui://GtkLabel[@id='labelABCD'] orphan-label
+chart2/uiconfig/ui/tp_axisLabel.ui://GtkLabel[@id='textdirL'] orphan-label
+chart2/uiconfig/ui/tp_ChartType.ui://GtkLabel[@id='FT_CAPTION_FOR_WIZARD'] orphan-label
+chart2/uiconfig/ui/tp_DataLabel.ui://GtkLabel[@id='CT_LABEL_DIAL'] orphan-label
+chart2/uiconfig/ui/tp_DataLabel.ui://GtkLabel[@id='STR_DLG_NUMBERFORMAT_FOR_PERCENTAGE_VALUE'] orphan-label
+chart2/uiconfig/ui/tp_DataLabel.ui://GtkLabel[@id='FT_LABEL_DEGREES'] orphan-label
+chart2/uiconfig/ui/tp_DataSource.ui://GtkLabel[@id='FT_CAPTION_FOR_WIZARD'] orphan-label
+chart2/uiconfig/ui/tp_DataSource.ui://GtkLabel[@id='FT_DATALABELS'] orphan-label
+chart2/uiconfig/ui/tp_ErrorBars.ui://GtkLabel[@id='STR_DATA_SELECT_RANGE_FOR_POSITIVE_ERRORBARS'] orphan-label
+chart2/uiconfig/ui/tp_ErrorBars.ui://GtkLabel[@id='STR_DATA_SELECT_RANGE_FOR_NEGATIVE_ERRORBARS'] orphan-label
+chart2/uiconfig/ui/tp_ErrorBars.ui://GtkLabel[@id='STR_CONTROLTEXT_ERROR_BARS_FROM_DATA'] orphan-label
+chart2/uiconfig/ui/tp_LegendPosition.ui://GtkLabel[@id='FT_LEGEND_TEXTDIR'] orphan-label
+chart2/uiconfig/ui/tp_RangeChooser.ui://GtkLabel[@id='FT_CAPTION_FOR_WIZARD'] orphan-label
+chart2/uiconfig/ui/tp_RangeChooser.ui://GtkLabel[@id='STR_PAGE_DATA_RANGE'] orphan-label
+chart2/uiconfig/ui/tp_SeriesToAxis.ui://GtkLabel[@id='FT_MISSING_VALUES'] orphan-label
+chart2/uiconfig/ui/tp_Scale.ui://GtkLabel[@id='TXT_STEP_MAIN'] orphan-label
+chart2/uiconfig/ui/tp_Scale.ui://GtkLabel[@id='TXT_STEP_HELP'] orphan-label
+chart2/uiconfig/ui/tp_Scale.ui://GtkLabel[@id='TXT_STEP_HELP_COUNT'] orphan-label
+chart2/uiconfig/ui/tp_Scale.ui://GtkLabel[@id='TXT_ORIGIN'] orphan-label
+chart2/uiconfig/ui/tp_Trendline.ui://GtkImage[@id='imageLinear'] no-labelled-by
+chart2/uiconfig/ui/tp_Trendline.ui://GtkImage[@id='imageLogarithmic'] no-labelled-by
+chart2/uiconfig/ui/tp_Trendline.ui://GtkImage[@id='imageExponential'] no-labelled-by
+chart2/uiconfig/ui/tp_Trendline.ui://GtkImage[@id='imagePower'] no-labelled-by
+chart2/uiconfig/ui/tp_Trendline.ui://GtkImage[@id='imagePolynomial'] no-labelled-by
+chart2/uiconfig/ui/tp_Trendline.ui://GtkImage[@id='imageMovingAverage'] no-labelled-by
diff --git a/solenv/sanitizers/ui/modules/sdraw.suppr b/solenv/sanitizers/ui/modules/sdraw.suppr
new file mode 100644
index 000000000..e9cf87982
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/sdraw.suppr
@@ -0,0 +1,8 @@
+sd/uiconfig/sdraw/ui/breakdialog.ui://GtkLabel[@id='label1'] orphan-label
+sd/uiconfig/sdraw/ui/breakdialog.ui://GtkLabel[@id='label2'] orphan-label
+sd/uiconfig/sdraw/ui/breakdialog.ui://GtkLabel[@id='label3'] orphan-label
+sd/uiconfig/sdraw/ui/breakdialog.ui://GtkLabel[@id='metafiles'] orphan-label
+sd/uiconfig/sdraw/ui/breakdialog.ui://GtkLabel[@id='metaobjects'] orphan-label
+sd/uiconfig/sdraw/ui/breakdialog.ui://GtkLabel[@id='drawingobjects'] orphan-label
+sd/uiconfig/sdraw/ui/namedesign.ui://GtkEntry[@id='entry'] no-labelled-by
+sd/uiconfig/sdraw/ui/paranumberingtab.ui://GtkSpinButton[@id='spinbuttonNF_NEW_START'] no-labelled-by
diff --git a/solenv/sanitizers/ui/modules/simpress.suppr b/solenv/sanitizers/ui/modules/simpress.suppr
new file mode 100644
index 000000000..33453296b
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/simpress.suppr
@@ -0,0 +1,29 @@
+sd/uiconfig/simpress/ui/annotation.ui://GtkDrawingArea[@id='editview'] no-labelled-by
+sd/uiconfig/simpress/ui/customanimationfragment.ui://GtkSpinButton[@id='fontsize'] no-labelled-by
+sd/uiconfig/simpress/ui/customanimationfragment.ui://GtkSpinButton[@id='rotate'] no-labelled-by
+sd/uiconfig/simpress/ui/customanimationfragment.ui://GtkSpinButton[@id='transparent'] no-labelled-by
+sd/uiconfig/simpress/ui/customanimationfragment.ui://GtkSpinButton[@id='scale'] no-labelled-by
+sd/uiconfig/simpress/ui/customanimationfragment.ui://GtkEntry[@id='entry'] no-labelled-by
+sd/uiconfig/simpress/ui/customanimationeffecttab.ui://GtkLabel[@id='prop_label1'] orphan-label
+sd/uiconfig/simpress/ui/dockinganimation.ui://GtkLabel[@id='label3'] orphan-label
+sd/uiconfig/simpress/ui/dockinganimation.ui://GtkLabel[@id='count'] orphan-label
+sd/uiconfig/simpress/ui/headerfootertab.ui://GtkRadioButton[@id='rb_auto'] missing-label-for
+sd/uiconfig/simpress/ui/headerfootertab.ui://GtkLabel[@id='replacement_a'] orphan-label
+sd/uiconfig/simpress/ui/headerfootertab.ui://GtkLabel[@id='replacement_b'] orphan-label
+sd/uiconfig/simpress/ui/layoutwindow.ui://GtkButton[@id='more'] button-no-label
+sd/uiconfig/simpress/ui/notebookbar_groups.ui://GtkLabel[@id='filegrouplabel'] orphan-label
+sd/uiconfig/simpress/ui/notebookbar_groups.ui://GtkLabel[@id='clipboardgrouplabel'] orphan-label
+sd/uiconfig/simpress/ui/notebookbar_groups.ui://GtkLabel[@id='formatgrouplabel'] orphan-label
+sd/uiconfig/simpress/ui/notebookbar_groups.ui://GtkLabel[@id='slidegrouplabel'] orphan-label
+sd/uiconfig/simpress/ui/notebookbar_groups.ui://GtkLabel[@id='insertgrouplabel'] orphan-label
+sd/uiconfig/simpress/ui/notebookbar_groups.ui://GtkLabel[@id='imagegrouplabel'] orphan-label
+sd/uiconfig/simpress/ui/pagesfieldbox.ui://GtkSpinButton[@id='pagesfield'] no-labelled-by
+sd/uiconfig/simpress/ui/presentationdialog.ui://GtkLabel[@id='externalmonitor_str'] orphan-label
+sd/uiconfig/simpress/ui/presentationdialog.ui://GtkLabel[@id='monitor_str'] orphan-label
+sd/uiconfig/simpress/ui/presentationdialog.ui://GtkLabel[@id='allmonitors_str'] orphan-label
+sd/uiconfig/simpress/ui/presentationdialog.ui://GtkLabel[@id='external_str'] orphan-label
+sd/uiconfig/simpress/ui/prntopts.ui://GtkCheckButton[@id='frontcb'] missing-label-for
+sd/uiconfig/simpress/ui/prntopts.ui://GtkCheckButton[@id='backcb'] missing-label-for
+sd/uiconfig/simpress/ui/sidebarslidebackground.ui://GtkComboBoxText[@id='masterslide'] no-labelled-by
+sd/uiconfig/simpress/ui/sidebarslidebackground.ui://GtkLabel[@id='masterlabel'] orphan-label
+sd/uiconfig/simpress/ui/sidebarslidebackground.ui://GtkLabel[@id='customlabel'] orphan-label
diff --git a/solenv/sanitizers/ui/modules/smath.suppr b/solenv/sanitizers/ui/modules/smath.suppr
new file mode 100644
index 000000000..011a7aa39
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/smath.suppr
@@ -0,0 +1,35 @@
+starmath/uiconfig/smath/ui/catalogdialog.ui://GtkLabel[@id='label1'] orphan-label
+starmath/uiconfig/smath/ui/catalogdialog.ui://GtkLabel[@id='symbolname'] orphan-label
+starmath/uiconfig/smath/ui/catalogdialog.ui://GtkDrawingArea[@id='symbolsetdisplay'] no-labelled-by
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='1label1'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='1label2'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='1label3'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='2label1'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='2label2'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='3label1'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='3label2'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='4label1'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='4label2'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='5label1'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='5label2'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='6label1'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='6label2'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='6label4'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='7label1'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='7label2'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='8label1'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='8label2'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='9label1'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='9label2'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='10label1'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='10label2'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='10label3'] orphan-label
+starmath/uiconfig/smath/ui/spacingdialog.ui://GtkLabel[@id='10label4'] orphan-label
+starmath/uiconfig/smath/ui/symdefinedialog.ui://GtkDrawingArea[@id='charsetDisplay'] no-labelled-by
+starmath/uiconfig/smath/ui/symdefinedialog.ui://GtkLabel[@id='oldSymbolName'] orphan-label
+starmath/uiconfig/smath/ui/symdefinedialog.ui://GtkDrawingArea[@id='oldSymbolDisplay'] no-labelled-by
+starmath/uiconfig/smath/ui/symdefinedialog.ui://GtkLabel[@id='oldSymbolSetName'] orphan-label
+starmath/uiconfig/smath/ui/symdefinedialog.ui://GtkLabel[@id='symbolName'] orphan-label
+starmath/uiconfig/smath/ui/symdefinedialog.ui://GtkDrawingArea[@id='symbolDisplay'] no-labelled-by
+starmath/uiconfig/smath/ui/symdefinedialog.ui://GtkLabel[@id='symbolSetName'] orphan-label
+starmath/uiconfig/smath/ui/symdefinedialog.ui://GtkImage[@id='rightArrow'] no-labelled-by
diff --git a/solenv/sanitizers/ui/modules/spropctrlr.suppr b/solenv/sanitizers/ui/modules/spropctrlr.suppr
new file mode 100644
index 000000000..5a7ccb3e5
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/spropctrlr.suppr
@@ -0,0 +1,15 @@
+extensions/uiconfig/spropctrlr/ui/browserline.ui://GtkLabel[@id='label'] orphan-label
+extensions/uiconfig/spropctrlr/ui/datefield.ui://GtkEntry[@id='entry'] no-labelled-by
+extensions/uiconfig/spropctrlr/ui/datefield.ui://GtkMenuButton[@id='button'] button-no-label
+extensions/uiconfig/spropctrlr/ui/datetimefield.ui://GtkSpinButton[@id='timefield'] no-labelled-by
+extensions/uiconfig/spropctrlr/ui/formattedcontrol.ui://GtkSpinButton[@id='formattedcontrol'] no-labelled-by
+extensions/uiconfig/spropctrlr/ui/formattedsample.ui://GtkEntry[@id='entry'] no-labelled-by
+extensions/uiconfig/spropctrlr/ui/formattedsample.ui://GtkSpinButton[@id='sample'] no-labelled-by
+extensions/uiconfig/spropctrlr/ui/formlinksdialog.ui://GtkLabel[@id='explanationLabel'] orphan-label
+extensions/uiconfig/spropctrlr/ui/formlinksdialog.ui://GtkLabel[@id='detailLabel'] orphan-label
+extensions/uiconfig/spropctrlr/ui/formlinksdialog.ui://GtkLabel[@id='masterLabel'] orphan-label
+extensions/uiconfig/spropctrlr/ui/hyperlinkfield.ui://GtkEntry[@id='entry'] no-labelled-by
+extensions/uiconfig/spropctrlr/ui/multiline.ui://GtkEntry[@id='entry'] no-labelled-by
+extensions/uiconfig/spropctrlr/ui/numericfield.ui://GtkSpinButton[@id='numericfield'] no-labelled-by
+extensions/uiconfig/spropctrlr/ui/textfield.ui://GtkEntry[@id='textfield'] no-labelled-by
+extensions/uiconfig/spropctrlr/ui/timefield.ui://GtkSpinButton[@id='timefield'] no-labelled-by
diff --git a/solenv/sanitizers/ui/modules/swriter.false b/solenv/sanitizers/ui/modules/swriter.false
new file mode 100644
index 000000000..8777e8a32
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/swriter.false
@@ -0,0 +1,14 @@
+sw/uiconfig/swriter/ui/sortdialog.ui://GtkLabel[@id='order'] orphan-label
+sw/uiconfig/swriter/ui/pageformatpanel.ui://GtkLabel[@id='customlabel'] orphan-label
+sw/uiconfig/swriter/ui/pagestylespanel.ui://GtkLabel[@id='customlabel'] orphan-label
+sw/uiconfig/swriter/ui/pagefooterpanel.ui://GtkLabel[@id='customlabel'] orphan-label
+sw/uiconfig/swriter/ui/pageheaderpanel.ui://GtkLabel[@id='customlabel'] orphan-label
+sw/uiconfig/swriter/ui/previewmenu.ui://GtkRadioMenuItem[@id='zoom20'] button-no-label
+sw/uiconfig/swriter/ui/previewmenu.ui://GtkRadioMenuItem[@id='zoom40'] button-no-label
+sw/uiconfig/swriter/ui/previewmenu.ui://GtkRadioMenuItem[@id='zoom50'] button-no-label
+sw/uiconfig/swriter/ui/previewmenu.ui://GtkRadioMenuItem[@id='zoom75'] button-no-label
+sw/uiconfig/swriter/ui/previewmenu.ui://GtkRadioMenuItem[@id='zoom100'] button-no-label
+sw/uiconfig/swriter/ui/assignfieldsdialog.ui://GtkLabel[@id='addresselem'] orphan-label
+sw/uiconfig/swriter/ui/assignfieldsdialog.ui://GtkLabel[@id='previewelem'] orphan-label
+sw/uiconfig/swriter/ui/assignfieldsdialog.ui://GtkLabel[@id='matchelem'] orphan-label
+sw/uiconfig/swriter/ui/assignfragment.ui://GtkLabel[@id='preview'] orphan-label
diff --git a/solenv/sanitizers/ui/modules/swriter.suppr b/solenv/sanitizers/ui/modules/swriter.suppr
new file mode 100644
index 000000000..c7ae2f09a
--- /dev/null
+++ b/solenv/sanitizers/ui/modules/swriter.suppr
@@ -0,0 +1,199 @@
+sw/uiconfig/swriter/ui/abstractdialog.ui://GtkLabel[@id='label4'] orphan-label
+sw/uiconfig/swriter/ui/addentrydialog.ui://GtkEntry[@id='entry'] no-labelled-by
+sw/uiconfig/swriter/ui/annotation.ui://GtkDrawingArea[@id='editview'] no-labelled-by
+sw/uiconfig/swriter/ui/annotation.ui://GtkMenuButton[@id='menubutton'] button-no-label
+sw/uiconfig/swriter/ui/asciifilterdialog.ui://GtkLabel[@id='label5'] orphan-label
+sw/uiconfig/swriter/ui/authenticationsettingsdialog.ui://GtkLabel[@id='label1'] orphan-label
+sw/uiconfig/swriter/ui/authenticationsettingsdialog.ui://GtkLabel[@id='label2'] orphan-label
+sw/uiconfig/swriter/ui/authenticationsettingsdialog.ui://GtkLabel[@id='label3'] orphan-label
+sw/uiconfig/swriter/ui/bibliographyentry.ui://GtkLabel[@id='label2'] orphan-label
+sw/uiconfig/swriter/ui/bibliographyentry.ui://GtkLabel[@id='label3'] orphan-label
+sw/uiconfig/swriter/ui/bibliographyentry.ui://GtkLabel[@id='author'] orphan-label
+sw/uiconfig/swriter/ui/bibliographyentry.ui://GtkLabel[@id='title'] orphan-label
+sw/uiconfig/swriter/ui/bibliofragment.ui://GtkEntry[@id='entry'] no-labelled-by
+sw/uiconfig/swriter/ui/bibliofragment.ui://GtkComboBoxText[@id='listbox'] no-labelled-by
+sw/uiconfig/swriter/ui/bibliofragment.ui://GtkComboBoxText[@id='combobox'] no-labelled-by
+sw/uiconfig/swriter/ui/bibliofragment.ui://GtkLabel[@id='label'] orphan-label
+sw/uiconfig/swriter/ui/cardmediumpage.ui://GtkLabel[@id='formatinfo'] orphan-label
+sw/uiconfig/swriter/ui/cardmediumpage.ui://GtkComboBoxText[@id='hiddentype'] no-labelled-by
+sw/uiconfig/swriter/ui/ccdialog.ui://GtkLabel[@id='label4'] orphan-label
+sw/uiconfig/swriter/ui/checkbox.ui://GtkCheckButton[@id='checkbutton'] button-no-label
+sw/uiconfig/swriter/ui/columnpage.ui://GtkSpinButton[@id='width3mf'] labelled-by-and-mnemonic
+sw/uiconfig/swriter/ui/columnpage.ui://GtkSpinButton[@id='width2mf'] labelled-by-and-mnemonic
+sw/uiconfig/swriter/ui/columnpage.ui://GtkSpinButton[@id='width1mf'] labelled-by-and-mnemonic
+sw/uiconfig/swriter/ui/conditionpage.ui://GtkComboBoxText[@id='filter'] no-labelled-by
+sw/uiconfig/swriter/ui/converttexttable.ui://GtkLabel[@id='label4'] orphan-label
+sw/uiconfig/swriter/ui/customizeaddrlistdialog.ui://GtkButton[@id='down'] button-no-label
+sw/uiconfig/swriter/ui/customizeaddrlistdialog.ui://GtkButton[@id='up'] button-no-label
+sw/uiconfig/swriter/ui/editbox.ui://GtkEntry[@id='entry'] no-labelled-by
+sw/uiconfig/swriter/ui/editsectiondialog.ui://GtkEntry[@id='filename'] duplicate-mnemonic
+sw/uiconfig/swriter/ui/endnotepage.ui://GtkLabel[@id='label19'] orphan-label
+sw/uiconfig/swriter/ui/endnotepage.ui://GtkLabel[@id='label22'] orphan-label
+sw/uiconfig/swriter/ui/endnotepage.ui://GtkLabel[@id='offset'] orphan-label
+sw/uiconfig/swriter/ui/endnotepage.ui://GtkLabel[@id='label25'] orphan-label
+sw/uiconfig/swriter/ui/endnotepage.ui://GtkLabel[@id='label20'] orphan-label
+sw/uiconfig/swriter/ui/endnotepage.ui://GtkLabel[@id='pagestyleft'] orphan-label
+sw/uiconfig/swriter/ui/endnotepage.ui://GtkLabel[@id='label27'] orphan-label
+sw/uiconfig/swriter/ui/endnotepage.ui://GtkLabel[@id='label28'] orphan-label
+sw/uiconfig/swriter/ui/exchangedatabases.ui://GtkLabel[@id='label7'] orphan-label
+sw/uiconfig/swriter/ui/exchangedatabases.ui://GtkLabel[@id='label2'] orphan-label
+sw/uiconfig/swriter/ui/exchangedatabases.ui://GtkLabel[@id='dbnameft'] orphan-label
+sw/uiconfig/swriter/ui/flddocumentpage.ui://GtkSpinButton[@id='offset'] duplicate-mnemonic
+sw/uiconfig/swriter/ui/fldrefpage.ui://GtkLabel[@id='label4'] orphan-label
+sw/uiconfig/swriter/ui/fldvarpage.ui://GtkLabel[@id='label5'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='label6'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='label7'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='label8'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='offset'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='label11'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='label4'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='pagestyleft'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='label15'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='label16'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='label17'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkLabel[@id='label18'] orphan-label
+sw/uiconfig/swriter/ui/footnotepage.ui://GtkRadioButton[@id='pospagecb'] labelled-by-and-mnemonic
+sw/uiconfig/swriter/ui/frmaddpage.ui://GtkLabel[@id='label2'] orphan-label
+sw/uiconfig/swriter/ui/gotopagedialog.ui://GtkLabel[@id='page_count'] orphan-label
+sw/uiconfig/swriter/ui/hfmenubutton.ui://GtkMenuItem[@id='edit'] button-no-label
+sw/uiconfig/swriter/ui/hfmenubutton.ui://GtkMenuItem[@id='delete'] button-no-label
+sw/uiconfig/swriter/ui/hfmenubutton.ui://GtkButton[@id='button'] button-no-label
+sw/uiconfig/swriter/ui/hfmenubutton.ui://GtkMenuButton[@id='menubutton'] button-no-label
+sw/uiconfig/swriter/ui/inputeditbox.ui://GtkEntry[@id='entry'] no-labelled-by
+sw/uiconfig/swriter/ui/insertbookmark.ui://GtkLabel[@id='lbForbiddenChars'] orphan-label
+sw/uiconfig/swriter/ui/insertbreak.ui://GtkSpinButton[@id='pagenumsb'] missing-label-for
+sw/uiconfig/swriter/ui/insertcaption.ui://GtkEntry[@id='caption_edit'] no-labelled-by
+sw/uiconfig/swriter/ui/insertdbcolumnsdialog.ui://GtkComboBoxText[@id='parastyle'] missing-label-for
+sw/uiconfig/swriter/ui/insertdbcolumnsdialog.ui://GtkComboBoxText[@id='parastyle'] labelled-by-and-mnemonic
+sw/uiconfig/swriter/ui/insertscript.ui://GtkLabel[@id='label1'] orphan-label
+sw/uiconfig/swriter/ui/jumpposbox.ui://GtkEntry[@id='jumppos'] no-labelled-by
+sw/uiconfig/swriter/ui/labelformatpage.ui://GtkSpinButton[@id='top'] duplicate-mnemonic
+sw/uiconfig/swriter/ui/labelformatpage.ui://GtkDrawingArea[@id='preview'] no-labelled-by
+sw/uiconfig/swriter/ui/linenumbering.ui://GtkLabel[@id='format'] orphan-label
+sw/uiconfig/swriter/ui/linenumbering.ui://GtkLabel[@id='intervallines'] orphan-label
+sw/uiconfig/swriter/ui/linenumbering.ui://GtkLabel[@id='lines'] orphan-label
+sw/uiconfig/swriter/ui/mergeconnectdialog.ui://GtkLabel[@id='label2'] orphan-label
+sw/uiconfig/swriter/ui/numparapage.ui://GtkCheckButton[@id='checkCB_NUMBER_NEW_START'] missing-labelled-by
+sw/uiconfig/swriter/ui/optcomparison.ui://GtkSpinButton[@id='ignorelen'] no-labelled-by
+sw/uiconfig/swriter/ui/optfonttabpage.ui://GtkLabel[@id='font_label'] orphan-label
+sw/uiconfig/swriter/ui/opttablepage.ui://GtkLabel[@id='label10'] orphan-label
+sw/uiconfig/swriter/ui/opttablepage.ui://GtkLabel[@id='label11'] orphan-label
+sw/uiconfig/swriter/ui/opttablepage.ui://GtkLabel[@id='label12'] orphan-label
+sw/uiconfig/swriter/ui/opttablepage.ui://GtkLabel[@id='label13'] orphan-label
+sw/uiconfig/swriter/ui/opttablepage.ui://GtkLabel[@id='label4'] orphan-label
+sw/uiconfig/swriter/ui/opttablepage.ui://GtkLabel[@id='label14'] orphan-label
+sw/uiconfig/swriter/ui/outlinenumberingpage.ui://GtkDrawingArea[@id='preview'] no-labelled-by
+sw/uiconfig/swriter/ui/pbmenubutton.ui://GtkMenuButton[@id='menubutton'] button-no-label
+sw/uiconfig/swriter/ui/poseditbox.ui://GtkEntry[@id='entry'] no-labelled-by
+sw/uiconfig/swriter/ui/mailmerge.ui://GtkLabel[@id='fieldlabel'] orphan-label
+sw/uiconfig/swriter/ui/mailmerge.ui://GtkLabel[@id='mailformatlabel'] orphan-label
+sw/uiconfig/swriter/ui/mmaddressblockpage.ui://GtkLabel[@id='currentaddress'] orphan-label
+sw/uiconfig/swriter/ui/mmaddressblockpage.ui://GtkLabel[@id='label2'] orphan-label
+sw/uiconfig/swriter/ui/mmaddressblockpage.ui://GtkLabel[@id='label3'] orphan-label
+sw/uiconfig/swriter/ui/mmaddressblockpage.ui://GtkLabel[@id='label4'] orphan-label
+sw/uiconfig/swriter/ui/mmaddressblockpage.ui://GtkLabel[@id='settingsft1'] orphan-label
+sw/uiconfig/swriter/ui/mmaddressblockpage.ui://GtkLabel[@id='settingsft'] orphan-label
+sw/uiconfig/swriter/ui/mmaddressblockpage.ui://GtkLabel[@id='documentindex'] orphan-label
+sw/uiconfig/swriter/ui/mmaddressblockpage.ui://GtkLabel[@id='label6'] orphan-label
+sw/uiconfig/swriter/ui/mmaddressblockpage.ui://GtkLabel[@id='settingsft2'] orphan-label
+sw/uiconfig/swriter/ui/mmcreatingdialog.ui://GtkLabel[@id='label1'] orphan-label
+sw/uiconfig/swriter/ui/mmcreatingdialog.ui://GtkLabel[@id='label2'] orphan-label
+sw/uiconfig/swriter/ui/mmcreatingdialog.ui://GtkLabel[@id='label3'] orphan-label
+sw/uiconfig/swriter/ui/mmcreatingdialog.ui://GtkLabel[@id='progress'] orphan-label
+sw/uiconfig/swriter/ui/mmmailbody.ui://GtkLabel[@id='femalefi'] orphan-label
+sw/uiconfig/swriter/ui/mmmailbody.ui://GtkLabel[@id='femalecolft'] orphan-label
+sw/uiconfig/swriter/ui/mmmailbody.ui://GtkLabel[@id='femalefieldft'] orphan-label
+sw/uiconfig/swriter/ui/mmoutputtypepage.ui://GtkLabel[@id='letterft'] orphan-label
+sw/uiconfig/swriter/ui/mmoutputtypepage.ui://GtkLabel[@id='emailft'] orphan-label
+sw/uiconfig/swriter/ui/mmsendmails.ui://GtkLabel[@id='label3'] orphan-label
+sw/uiconfig/swriter/ui/mmsendmails.ui://GtkLabel[@id='transferstatus'] orphan-label
+sw/uiconfig/swriter/ui/mmsendmails.ui://GtkLabel[@id='paused'] orphan-label
+sw/uiconfig/swriter/ui/mmsendmails.ui://GtkProgressBar[@id='progress'] no-labelled-by
+sw/uiconfig/swriter/ui/mmsendmails.ui://GtkLabel[@id='errorstatus'] orphan-label
+sw/uiconfig/swriter/ui/mmsalutationpage.ui://GtkLabel[@id='documentindex'] orphan-label
+sw/uiconfig/swriter/ui/mmsalutationpage.ui://GtkLabel[@id='femalefi'] orphan-label
+sw/uiconfig/swriter/ui/navigatorcontextmenu.ui://GtkMenuItem[@id='800'] button-no-label
+sw/uiconfig/swriter/ui/notebookbar_groups.ui://GtkLabel[@id='filegrouplabel'] orphan-label
+sw/uiconfig/swriter/ui/notebookbar_groups.ui://GtkLabel[@id='clipboardgrouplabel'] orphan-label
+sw/uiconfig/swriter/ui/notebookbar_groups.ui://GtkLabel[@id='formatgrouplabel'] orphan-label
+sw/uiconfig/swriter/ui/notebookbar_groups.ui://GtkLabel[@id='insertgrouplabel'] orphan-label
+sw/uiconfig/swriter/ui/notebookbar_groups.ui://GtkLabel[@id='tablegrouplabel'] orphan-label
+sw/uiconfig/swriter/ui/notebookbar_groups.ui://GtkLabel[@id='imagegrouplabel'] orphan-label
+sw/uiconfig/swriter/ui/outlinebutton.ui://GtkButton[@id='show'] button-no-label
+sw/uiconfig/swriter/ui/outlinebutton.ui://GtkButton[@id='hide'] button-no-label
+sw/uiconfig/swriter/ui/pagemargincontrol.ui://GtkSpinButton[@id='hidden'] no-labelled-by
+sw/uiconfig/swriter/ui/pagesizecontrol.ui://GtkSpinButton[@id='metric'] no-labelled-by
+sw/uiconfig/swriter/ui/printmonitordialog.ui://GtkLabel[@id='docname'] orphan-label
+sw/uiconfig/swriter/ui/printmonitordialog.ui://GtkLabel[@id='printing'] orphan-label
+sw/uiconfig/swriter/ui/printmonitordialog.ui://GtkLabel[@id='printer'] orphan-label
+sw/uiconfig/swriter/ui/printmonitordialog.ui://GtkLabel[@id='printinfo'] orphan-label
+sw/uiconfig/swriter/ui/readonlymenu.ui://GtkMenuItem[@id='backgroundtogallery'] button-no-label
+sw/uiconfig/swriter/ui/renameentrydialog.ui://GtkEntry[@id='entry'] no-labelled-by
+sw/uiconfig/swriter/ui/savelabeldialog.ui://GtkLabel[@id='label2'] orphan-label
+sw/uiconfig/swriter/ui/savelabeldialog.ui://GtkLabel[@id='label3'] orphan-label
+sw/uiconfig/swriter/ui/savemonitordialog.ui://GtkLabel[@id='docname'] orphan-label
+sw/uiconfig/swriter/ui/savemonitordialog.ui://GtkLabel[@id='saving'] orphan-label
+sw/uiconfig/swriter/ui/savemonitordialog.ui://GtkLabel[@id='printer'] orphan-label
+sw/uiconfig/swriter/ui/savemonitordialog.ui://GtkLabel[@id='printinfo'] orphan-label
+sw/uiconfig/swriter/ui/sectionpage.ui://GtkEntry[@id='filename'] duplicate-mnemonic
+sw/uiconfig/swriter/ui/sectionpage.ui://GtkEntry[@id='sectionnames-entry'] no-labelled-by
+sw/uiconfig/swriter/ui/selectaddressdialog.ui://GtkLabel[@id='desc'] orphan-label
+sw/uiconfig/swriter/ui/selectaddressdialog.ui://GtkLabel[@id='label2'] orphan-label
+sw/uiconfig/swriter/ui/selectaddressdialog.ui://GtkLabel[@id='connecting'] orphan-label
+sw/uiconfig/swriter/ui/selecttabledialog.ui://GtkLabel[@id='select'] orphan-label
+sw/uiconfig/swriter/ui/spellmenu.ui://GtkMenuItem[@id='spelldialog'] button-no-label
+sw/uiconfig/swriter/ui/spellmenu.ui://GtkMenuItem[@id='correctdialog'] button-no-label
+sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='nopages'] orphan-label
+sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='notables'] orphan-label
+sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='nogrfs'] orphan-label
+sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='nooles'] orphan-label
+sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='noparas'] orphan-label
+sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='nowords'] orphan-label
+sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='nochars'] orphan-label
+sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='nocharsexspaces'] orphan-label
+sw/uiconfig/swriter/ui/statisticsinfopage.ui://GtkLabel[@id='nolines'] orphan-label
+sw/uiconfig/swriter/ui/testmailsettings.ui://GtkImage[@id='image1'] no-labelled-by
+sw/uiconfig/swriter/ui/testmailsettings.ui://GtkImage[@id='image2'] no-labelled-by
+sw/uiconfig/swriter/ui/testmailsettings.ui://GtkLabel[@id='establish'] orphan-label
+sw/uiconfig/swriter/ui/testmailsettings.ui://GtkLabel[@id='find'] orphan-label
+sw/uiconfig/swriter/ui/testmailsettings.ui://GtkLabel[@id='result1'] orphan-label
+sw/uiconfig/swriter/ui/testmailsettings.ui://GtkLabel[@id='result2'] orphan-label
+sw/uiconfig/swriter/ui/tocentriespage.ui://GtkLabel[@id='levelft'] orphan-label
+sw/uiconfig/swriter/ui/tocentriespage.ui://GtkLabel[@id='typeft'] orphan-label
+sw/uiconfig/swriter/ui/tocentriespage.ui://GtkLabel[@id='label15'] orphan-label
+sw/uiconfig/swriter/ui/tocentriespage.ui://GtkLabel[@id='label16'] orphan-label
+sw/uiconfig/swriter/ui/tocentriespage.ui://GtkLabel[@id='label17'] orphan-label
+sw/uiconfig/swriter/ui/tocindexpage.ui://GtkButton[@id='styles'] missing-label-for
+sw/uiconfig/swriter/ui/tablecolumnpage.ui://GtkSpinButton[@id='spacefmt'] no-labelled-by
+sw/uiconfig/swriter/ui/tablepreviewdialog.ui://GtkLabel[@id='description'] orphan-label
+sw/uiconfig/swriter/ui/tabletextflowpage.ui://GtkSpinButton[@id='pagenonf'] missing-label-for
+sw/uiconfig/swriter/ui/tabletextflowpage.ui://GtkLabel[@id='label39'] orphan-label
+sw/uiconfig/swriter/ui/textgridpage.ui://GtkLabel[@id='labelFT_CHARRANGE'] orphan-label
+sw/uiconfig/swriter/ui/textgridpage.ui://GtkLabel[@id='labelFT_LINERANGE'] orphan-label
+sw/uiconfig/swriter/ui/titlepage.ui://GtkSpinButton[@id='NF_PAGE_START'] missing-label-for
+sw/uiconfig/swriter/ui/tokenwidget.ui://GtkButton[@id='left'] button-no-label
+sw/uiconfig/swriter/ui/tokenwidget.ui://GtkButton[@id='right'] button-no-label
+sw/uiconfig/swriter/ui/toxbuttonwidget.ui://GtkToggleButton[@id='button'] button-no-label
+sw/uiconfig/swriter/ui/toxentrywidget.ui://GtkEntry[@id='entry'] no-labelled-by
+sw/uiconfig/swriter/ui/unfloatbutton.ui://GtkButton[@id='button'] button-no-label
+sw/uiconfig/swriter/ui/watermarkdialog.ui://GtkLabel[@id='TextLabel'] orphan-label
+sw/uiconfig/swriter/ui/watermarkdialog.ui://GtkLabel[@id='FontLabel'] orphan-label
+sw/uiconfig/swriter/ui/watermarkdialog.ui://GtkLabel[@id='AngleLabel'] orphan-label
+sw/uiconfig/swriter/ui/watermarkdialog.ui://GtkLabel[@id='TransparencyLabel'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='label1'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='label2'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='label3'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='selectwords'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='selectchars'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='selectcharsnospaces'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='label9'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='label10'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='docwords'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='docchars'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='doccharsnospaces'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='cjkcharsft'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='selectcjkchars'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='doccjkchars'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='standardizedpages'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='selectstandardizedpages'] orphan-label
+sw/uiconfig/swriter/ui/wordcount.ui://GtkLabel[@id='docstandardizedpages'] orphan-label
diff --git a/solenv/sanitizers/ui/sfx.suppr b/solenv/sanitizers/ui/sfx.suppr
new file mode 100644
index 000000000..1700676c2
--- /dev/null
+++ b/solenv/sanitizers/ui/sfx.suppr
@@ -0,0 +1,51 @@
+sfx2/uiconfig/ui/bookmarkdialog.ui://GtkLabel[@id='alttitle'] orphan-label
+sfx2/uiconfig/ui/charmapcontrol.ui://GtkLabel[@id='label1'] orphan-label
+sfx2/uiconfig/ui/charmapcontrol.ui://GtkLabel[@id='label2'] orphan-label
+sfx2/uiconfig/ui/checkin.ui://GtkLabel[@id='label2'] orphan-label
+sfx2/uiconfig/ui/checkin.ui://GtkTextView[@id='VersionComment'] no-labelled-by
+sfx2/uiconfig/ui/cmisline.ui://GtkLabel[@id='name'] orphan-label
+sfx2/uiconfig/ui/cmisline.ui://GtkLabel[@id='type'] orphan-label
+sfx2/uiconfig/ui/cmisline.ui://GtkEntry[@id='value'] no-labelled-by
+sfx2/uiconfig/ui/cmisline.ui://GtkSpinButton[@id='time'] no-labelled-by
+sfx2/uiconfig/ui/custominfopage.ui://GtkLabel[@id='name'] orphan-label
+sfx2/uiconfig/ui/custominfopage.ui://GtkLabel[@id='type'] orphan-label
+sfx2/uiconfig/ui/custominfopage.ui://GtkLabel[@id='value'] orphan-label
+sfx2/uiconfig/ui/deck.ui://GtkImage[@id='addonimage'] no-labelled-by
+sfx2/uiconfig/ui/deck.ui://GtkLabel[@id='label'] orphan-label
+sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showcreate'] orphan-label
+sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showmodify'] orphan-label
+sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showsigned'] orphan-label
+sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showprint'] orphan-label
+sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showedittime'] orphan-label
+sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showrevision'] orphan-label
+sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showsize'] orphan-label
+sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showtype'] orphan-label
+sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='showtemplate'] orphan-label
+sfx2/uiconfig/ui/documentinfopage.ui://GtkImage[@id='icon'] no-labelled-by
+sfx2/uiconfig/ui/documentinfopage.ui://GtkLabel[@id='nameed'] orphan-label
+sfx2/uiconfig/ui/extrabutton.ui://GtkButton[@id='button'] button-no-label
+sfx2/uiconfig/ui/helpindexpage.ui://GtkEntry[@id='termentry'] no-labelled-by
+sfx2/uiconfig/ui/helpwindow.ui://GtkCheckButton[@id='checkbutton'] button-no-label
+sfx2/uiconfig/ui/helpwindow.ui://GtkToolButton[@id='index'] button-no-label
+sfx2/uiconfig/ui/licensedialog.ui://GtkLabel[@id='label'] orphan-label
+sfx2/uiconfig/ui/loadtemplatedialog.ui://GtkLabel[@id='alttitle'] orphan-label
+sfx2/uiconfig/ui/loadtemplatedialog.ui://GtkDrawingArea[@id='image'] no-labelled-by
+sfx2/uiconfig/ui/managestylepage.ui://GtkLabel[@id='desc'] orphan-label
+sfx2/uiconfig/ui/startcenter.ui://GtkLabel[@id='create_label'] orphan-label
+sfx2/uiconfig/ui/startcenter.ui://GtkLabel[@id='althelplabel'] orphan-label
+sfx2/uiconfig/ui/tabbarcontents.ui://GtkToggleToolButton[@id='toggle'] button-no-label
+sfx2/uiconfig/ui/tabbutton.ui://GtkToggleToolButton[@id='toggle'] button-no-label
+sfx2/uiconfig/ui/templatepanel.ui://GtkToggleToolButton[@id='1'] button-no-label
+sfx2/uiconfig/ui/templatepanel.ui://GtkToggleToolButton[@id='2'] button-no-label
+sfx2/uiconfig/ui/templatepanel.ui://GtkToggleToolButton[@id='3'] button-no-label
+sfx2/uiconfig/ui/templatepanel.ui://GtkToggleToolButton[@id='4'] button-no-label
+sfx2/uiconfig/ui/templatepanel.ui://GtkToggleToolButton[@id='5'] button-no-label
+sfx2/uiconfig/ui/templatepanel.ui://GtkToggleToolButton[@id='6'] button-no-label
+sfx2/uiconfig/ui/templatepanel.ui://GtkToggleToolButton[@id='65535'] button-no-label
+sfx2/uiconfig/ui/templatedlg.ui://GtkLabel[@id='label1'] orphan-label
+sfx2/uiconfig/ui/versioncommentdialog.ui://GtkLabel[@id='timestamp'] orphan-label
+sfx2/uiconfig/ui/versioncommentdialog.ui://GtkLabel[@id='author'] orphan-label
+sfx2/uiconfig/ui/versioncommentdialog.ui://GtkTextView[@id='textview'] no-labelled-by
+sfx2/uiconfig/ui/linefragment.ui://GtkEntry[@id='duration'] no-labelled-by
+sfx2/uiconfig/ui/linefragment.ui://GtkEntry[@id='valueedit'] no-labelled-by
+sfx2/uiconfig/ui/linefragment.ui://GtkSpinButton[@id='time'] no-labelled-by
diff --git a/solenv/sanitizers/ui/svt.suppr b/solenv/sanitizers/ui/svt.suppr
new file mode 100644
index 000000000..188bd9ea0
--- /dev/null
+++ b/solenv/sanitizers/ui/svt.suppr
@@ -0,0 +1,40 @@
+svtools/uiconfig/ui/checkboxcontrol.ui://GtkCheckButton[@id='checkbox'] button-no-label
+svtools/uiconfig/ui/editcontrol.ui://GtkEntry[@id='entry'] no-labelled-by
+svtools/uiconfig/ui/graphicexport.ui://GtkScale[@id='compressionjpgwebpsb'] no-labelled-by
+svtools/uiconfig/ui/graphicexport.ui://GtkScale[@id='compressionpngsb'] no-labelled-by
+svtools/uiconfig/ui/graphicexport.ui://GtkLabel[@id='estsizeft'] orphan-label
+svtools/uiconfig/ui/placeedit.ui://GtkButton[@id='repositoriesRefresh'] button-no-label
+svtools/uiconfig/ui/printersetupdialog.ui://GtkLabel[@id='label3'] orphan-label
+svtools/uiconfig/ui/printersetupdialog.ui://GtkLabel[@id='label4'] orphan-label
+svtools/uiconfig/ui/printersetupdialog.ui://GtkLabel[@id='label5'] orphan-label
+svtools/uiconfig/ui/printersetupdialog.ui://GtkLabel[@id='label6'] orphan-label
+svtools/uiconfig/ui/printersetupdialog.ui://GtkLabel[@id='status'] orphan-label
+svtools/uiconfig/ui/printersetupdialog.ui://GtkLabel[@id='type'] orphan-label
+svtools/uiconfig/ui/printersetupdialog.ui://GtkLabel[@id='comment'] orphan-label
+svtools/uiconfig/ui/printersetupdialog.ui://GtkLabel[@id='location'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_java'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_mailmerge_install'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_pdf'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_bibliography_install'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_assigning_folders'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_assigning_javaparameters'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_adding_path'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_language_change'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_exp_features'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_extension_install'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='reason_skia'] orphan-label
+svtools/uiconfig/ui/restartdialog.ui://GtkLabel[@id='label'] orphan-label
+svtools/uiconfig/ui/spinfieldcontrol.ui://GtkSpinButton[@id='spinbutton'] no-labelled-by
+svtools/uiconfig/ui/tabbaredit.ui://GtkEntry[@id='entry'] no-labelled-by
+svtools/uiconfig/ui/tabbuttons.ui://GtkButton[@id='first'] button-no-label
+svtools/uiconfig/ui/tabbuttons.ui://GtkButton[@id='next'] button-no-label
+svtools/uiconfig/ui/tabbuttons.ui://GtkButton[@id='prev'] button-no-label
+svtools/uiconfig/ui/tabbuttons.ui://GtkButton[@id='last'] button-no-label
+svtools/uiconfig/ui/tabbuttons.ui://GtkButton[@id='add'] button-no-label
+svtools/uiconfig/ui/tabbuttonsmirrored.ui://GtkButton[@id='first'] button-no-label
+svtools/uiconfig/ui/tabbuttonsmirrored.ui://GtkButton[@id='next'] button-no-label
+svtools/uiconfig/ui/tabbuttonsmirrored.ui://GtkButton[@id='prev'] button-no-label
+svtools/uiconfig/ui/tabbuttonsmirrored.ui://GtkButton[@id='last'] button-no-label
+svtools/uiconfig/ui/tabbuttonsmirrored.ui://GtkButton[@id='add'] button-no-label
+svtools/uiconfig/ui/thineditcontrol.ui://GtkEntry[@id='entry'] no-labelled-by
+svtools/uiconfig/ui/thineditcontrol.ui://GtkSpinButton[@id='spinbutton'] no-labelled-by
diff --git a/solenv/sanitizers/ui/svx.false b/solenv/sanitizers/ui/svx.false
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/solenv/sanitizers/ui/svx.false
diff --git a/solenv/sanitizers/ui/svx.suppr b/solenv/sanitizers/ui/svx.suppr
new file mode 100644
index 000000000..62512a391
--- /dev/null
+++ b/solenv/sanitizers/ui/svx.suppr
@@ -0,0 +1,86 @@
+svx/uiconfig/ui/absrecbox.ui://GtkEntry[@id='entry-frame'] no-labelled-by
+svx/uiconfig/ui/absrecbox.ui://GtkEntry[@id='entry-noframe'] no-labelled-by
+svx/uiconfig/ui/addinstancedialog.ui://GtkLabel[@id='alttitle'] orphan-label
+svx/uiconfig/ui/addmodeldialog.ui://GtkLabel[@id='alttitle'] orphan-label
+svx/uiconfig/ui/addnamespacedialog.ui://GtkLabel[@id='alttitle'] orphan-label
+svx/uiconfig/ui/asianphoneticguidedialog.ui://GtkLabel[@id='basetextft'] orphan-label
+svx/uiconfig/ui/asianphoneticguidedialog.ui://GtkLabel[@id='rubytextft'] orphan-label
+svx/uiconfig/ui/checkbuttonbox.ui://GtkCheckButton[@id='checkbutton'] button-no-label
+svx/uiconfig/ui/colorwindow.ui://GtkButton[@id='auto_color_button'] button-no-label
+svx/uiconfig/ui/columnswindow.ui://GtkSpinButton[@id='spinbutton'] no-labelled-by
+svx/uiconfig/ui/compressgraphicdialog.ui://GtkLabel[@id='label13'] orphan-label
+svx/uiconfig/ui/compressgraphicdialog.ui://GtkLabel[@id='label14'] orphan-label
+svx/uiconfig/ui/compressgraphicdialog.ui://GtkLabel[@id='label16'] orphan-label
+svx/uiconfig/ui/crashreportdlg.ui://GtkLabel[@id='ed_pre'] orphan-label
+svx/uiconfig/ui/crashreportdlg.ui://GtkTextView[@id='ed_post'] no-labelled-by
+svx/uiconfig/ui/crashreportdlg.ui://GtkTextView[@id='ed_bugreport'] no-labelled-by
+svx/uiconfig/ui/depthwindow.ui://GtkRadioButton[@id='depth0'] button-no-label
+svx/uiconfig/ui/depthwindow.ui://GtkRadioButton[@id='depth1'] button-no-label
+svx/uiconfig/ui/depthwindow.ui://GtkRadioButton[@id='depth2'] button-no-label
+svx/uiconfig/ui/depthwindow.ui://GtkRadioButton[@id='depth3'] button-no-label
+svx/uiconfig/ui/depthwindow.ui://GtkRadioButton[@id='depth4'] button-no-label
+svx/uiconfig/ui/docking3deffects.ui://GtkButton[@id='corner'] button-no-label
+svx/uiconfig/ui/docking3deffects.ui://GtkScale[@id='horiscale'] no-labelled-by
+svx/uiconfig/ui/docking3deffects.ui://GtkScale[@id='vertscale'] no-labelled-by
+svx/uiconfig/ui/dockingcolorreplace.ui://GtkLabel[@id='label2'] orphan-label
+svx/uiconfig/ui/dockingcolorreplace.ui://GtkLabel[@id='label3'] orphan-label
+svx/uiconfig/ui/dockingcolorreplace.ui://GtkLabel[@id='label4'] orphan-label
+svx/uiconfig/ui/docrecoverybrokendialog.ui://GtkLabel[@id='label1'] orphan-label
+svx/uiconfig/ui/docrecoveryprogressdialog.ui://GtkLabel[@id='label2'] orphan-label
+svx/uiconfig/ui/docrecoveryrecoverdialog.ui://GtkLabel[@id='desc'] orphan-label
+svx/uiconfig/ui/docrecoverysavedialog.ui://GtkLabel[@id='label1'] orphan-label
+svx/uiconfig/ui/findreplacedialog.ui://GtkLabel[@id='searchdesc'] orphan-label
+svx/uiconfig/ui/findreplacedialog.ui://GtkLabel[@id='entirecells'] orphan-label
+svx/uiconfig/ui/findreplacedialog.ui://GtkLabel[@id='replacedesc'] orphan-label
+svx/uiconfig/ui/findreplacedialog.ui://GtkLabel[@id='label7'] orphan-label
+svx/uiconfig/ui/findreplacedialog.ui://GtkRadioButton[@id='rows'] labelled-by-and-mnemonic
+svx/uiconfig/ui/floatingcontour.ui://GtkLabel[@id='statuspos'] orphan-label
+svx/uiconfig/ui/floatingcontour.ui://GtkLabel[@id='statussize'] orphan-label
+svx/uiconfig/ui/findreplacedialog-mobile.ui://GtkLabel[@id='label4'] orphan-label
+svx/uiconfig/ui/findreplacedialog-mobile.ui://GtkLabel[@id='searchdesc'] orphan-label
+svx/uiconfig/ui/findreplacedialog-mobile.ui://GtkLabel[@id='entirecells'] orphan-label
+svx/uiconfig/ui/findreplacedialog-mobile.ui://GtkLabel[@id='label5'] orphan-label
+svx/uiconfig/ui/findreplacedialog-mobile.ui://GtkLabel[@id='replacedesc'] orphan-label
+svx/uiconfig/ui/findreplacedialog-mobile.ui://GtkLabel[@id='label7'] orphan-label
+svx/uiconfig/ui/findreplacedialog-mobile.ui://GtkLabel[@id='searchinlabel'] orphan-label
+svx/uiconfig/ui/findreplacedialog-mobile.ui://GtkComboBoxText[@id='calcsearchin'] no-labelled-by
+svx/uiconfig/ui/fontworkgallerydialog.ui://GtkLabel[@id='label1'] orphan-label
+svx/uiconfig/ui/grafctrlbox.ui://GtkSpinButton[@id='spinfield'] no-labelled-by
+svx/uiconfig/ui/headfootformatpage.ui://GtkLabel[@id='labelHeaderFormat'] orphan-label
+svx/uiconfig/ui/headfootformatpage.ui://GtkLabel[@id='labelFooterFormat'] orphan-label
+svx/uiconfig/ui/imapdialog.ui://GtkLabel[@id='statusurl'] orphan-label
+svx/uiconfig/ui/imapdialog.ui://GtkLabel[@id='statuspos'] orphan-label
+svx/uiconfig/ui/imapdialog.ui://GtkLabel[@id='statussize'] orphan-label
+svx/uiconfig/ui/labelbox.ui://GtkLabel[@id='label'] orphan-label
+svx/uiconfig/ui/mediaplayback.ui://GtkEntry[@id='timeedit'] no-labelled-by
+svx/uiconfig/ui/medialine.ui://GtkEntry[@id='timeedit'] no-labelled-by
+svx/uiconfig/ui/medialine.ui://GtkLabel[@id='url'] orphan-label
+svx/uiconfig/ui/medialine.ui://GtkScale[@id='timeslider'] no-labelled-by
+svx/uiconfig/ui/medialine.ui://GtkScale[@id='volumeslider'] no-labelled-by
+svx/uiconfig/ui/mediawindow.ui://GtkEntry[@id='timeedit'] no-labelled-by
+svx/uiconfig/ui/mediawindow.ui://GtkLabel[@id='url'] orphan-label
+svx/uiconfig/ui/mediawindow.ui://GtkScale[@id='timeslider'] no-labelled-by
+svx/uiconfig/ui/mediawindow.ui://GtkScale[@id='volumeslider'] no-labelled-by
+svx/uiconfig/ui/metricfieldbox.ui://GtkSpinButton[@id='metricfield'] no-labelled-by
+svx/uiconfig/ui/navigationbar.ui://GtkEntry[@id='entry-noframe'] no-labelled-by
+svx/uiconfig/ui/numberingwindow.ui://GtkButton[@id='more'] button-no-label
+svx/uiconfig/ui/optgridpage.ui://GtkLabel[@id='label4'] orphan-label
+svx/uiconfig/ui/optgridpage.ui://GtkLabel[@id='label5'] orphan-label
+svx/uiconfig/ui/paralinespacingcontrol.ui://GtkSpinButton[@id='percent_box'] no-labelled-by
+svx/uiconfig/ui/paralinespacingcontrol.ui://GtkSpinButton[@id='metric_box'] no-labelled-by
+svx/uiconfig/ui/redlinefilterpage.ui://GtkCheckButton[@id='comment'] missing-labelled-by
+svx/uiconfig/ui/redlinefilterpage.ui://GtkComboBoxText[@id='actionlist'] missing-label-for
+svx/uiconfig/ui/redlinefilterpage.ui://GtkComboBoxText[@id='authorlist'] missing-label-for
+svx/uiconfig/ui/redlinefilterpage.ui://GtkEntry[@id='rangeedit'] missing-label-for
+svx/uiconfig/ui/redlinefilterpage.ui://GtkComboBoxText[@id='datecond'] missing-label-for
+svx/uiconfig/ui/redlinefilterpage.ui://GtkLabel[@id='and'] orphan-label
+svx/uiconfig/ui/safemodedialog.ui://GtkLabel[@id='label1'] orphan-label
+svx/uiconfig/ui/safemodedialog.ui://GtkLabel[@id='label3'] orphan-label
+svx/uiconfig/ui/safemodedialog.ui://GtkLabel[@id='label4'] orphan-label
+svx/uiconfig/ui/sidebararea.ui://GtkLabel[@id='filllabel'] orphan-label
+svx/uiconfig/ui/sidebararea.ui://GtkLabel[@id='transparencylabel'] orphan-label
+svx/uiconfig/ui/sidebarshadow.ui://GtkLabel[@id='transparency_label'] orphan-label
+svx/uiconfig/ui/sidebarshadow.ui://GtkSpinButton[@id='FIELD_TRANSPARENCY'] no-labelled-by
+svx/uiconfig/ui/sidebarshadow.ui://GtkScale[@id='transparency_slider'] no-labelled-by
+svx/uiconfig/ui/sidebarline.ui://GtkMenuToolButton[@id='SelectWidth'] button-no-label
+svx/uiconfig/ui/textcharacterspacingcontrol.ui://GtkSpinButton[@id='kerning'] no-labelled-by
diff --git a/solenv/sanitizers/ui/uui.suppr b/solenv/sanitizers/ui/uui.suppr
new file mode 100644
index 000000000..96d00fc94
--- /dev/null
+++ b/solenv/sanitizers/ui/uui.suppr
@@ -0,0 +1,18 @@
+uui/uiconfig/ui/filterselect.ui://GtkLabel[@id='url'] orphan-label
+uui/uiconfig/ui/authfallback.ui://GtkLabel[@id='google_prefix_label'] orphan-label
+uui/uiconfig/ui/authfallback.ui://GtkEntry[@id='google_code'] no-labelled-by
+uui/uiconfig/ui/authfallback.ui://GtkLabel[@id='label1'] orphan-label
+uui/uiconfig/ui/authfallback.ui://GtkEntry[@id='code'] no-labelled-by
+uui/uiconfig/ui/authfallback.ui://GtkEntry[@id='url'] no-labelled-by
+uui/uiconfig/ui/authfallback.ui://GtkLabel[@id='instructions'] orphan-label
+uui/uiconfig/ui/logindialog.ui://GtkLabel[@id='loginrealm'] orphan-label
+uui/uiconfig/ui/logindialog.ui://GtkLabel[@id='wrongloginrealm'] orphan-label
+uui/uiconfig/ui/logindialog.ui://GtkLabel[@id='wrongrequestinfo'] orphan-label
+uui/uiconfig/ui/logindialog.ui://GtkLabel[@id='requestinfo'] orphan-label
+uui/uiconfig/ui/logindialog.ui://GtkLabel[@id='errorinfo'] orphan-label
+uui/uiconfig/ui/macrowarnmedium.ui://GtkLabel[@id='descr1Label'] orphan-label
+uui/uiconfig/ui/macrowarnmedium.ui://GtkLabel[@id='signsLabel'] orphan-label
+uui/uiconfig/ui/setmasterpassworddlg.ui://GtkLabel[@id='label1'] orphan-label
+uui/uiconfig/ui/setmasterpassworddlg.ui://GtkLabel[@id='label4'] orphan-label
+uui/uiconfig/ui/simplenameclash.ui://GtkLabel[@id='warning'] orphan-label
+uui/uiconfig/ui/simplenameclash.ui://GtkEntry[@id='newname'] no-labelled-by
diff --git a/solenv/sanitizers/ui/vcl.suppr b/solenv/sanitizers/ui/vcl.suppr
new file mode 100644
index 000000000..a07c25780
--- /dev/null
+++ b/solenv/sanitizers/ui/vcl.suppr
@@ -0,0 +1,38 @@
+vcl/uiconfig/ui/aboutbox.ui://GtkImage[@id='logo'] no-labelled-by
+vcl/uiconfig/ui/aboutbox.ui://GtkLabel[@id='logoreplacement'] orphan-label
+vcl/uiconfig/ui/aboutbox.ui://GtkTextView[@id='version'] no-labelled-by
+vcl/uiconfig/ui/aboutbox.ui://GtkLabel[@id='description'] orphan-label
+vcl/uiconfig/ui/aboutbox.ui://GtkLabel[@id='copyright'] orphan-label
+vcl/uiconfig/ui/combobox.ui://GtkEntry[@id='entry'] no-labelled-by
+vcl/uiconfig/ui/combobox.ui://GtkToggleButton[@id='button'] button-no-label
+vcl/uiconfig/ui/combobox.ui://GtkMenuButton[@id='overlaybutton'] button-no-label
+vcl/uiconfig/ui/cupspassworddialog.ui://GtkLabel[@id='text'] orphan-label
+vcl/uiconfig/ui/menutogglebutton3.ui://GtkToggleButton[@id='togglebutton'] button-no-label
+vcl/uiconfig/ui/menutogglebutton3.ui://GtkButton[@id='menubutton'] button-no-label
+vcl/uiconfig/ui/menutogglebutton4.ui://GtkToggleButton[@id='togglebutton'] button-no-label
+vcl/uiconfig/ui/menutogglebutton4.ui://GtkButton[@id='menubutton'] button-no-label
+vcl/uiconfig/ui/printdialog.ui://GtkLabel[@id='totalnumpages'] orphan-label
+vcl/uiconfig/ui/printdialog.ui://GtkImage[@id='collateimage'] no-labelled-by
+vcl/uiconfig/ui/printdialog.ui://GtkLabel[@id='pagemargintxt2'] orphan-label
+vcl/uiconfig/ui/printdialog.ui://GtkLabel[@id='sheetmargintxt2'] orphan-label
+vcl/uiconfig/ui/printdialog.ui://GtkComboBoxText[@id='scriptdirection'] no-labelled-by
+vcl/uiconfig/ui/printerdevicepage.ui://GtkEntry[@id='custom'] no-labelled-by
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='labelfoo'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label4'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label5'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkSpinButton[@id='spinbutton1'] no-labelled-by
+vcl/qa/cppunit/builder/demo.ui://GtkComboBox[@id='combobox1'] no-labelled-by
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label6'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label7'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label8'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkEntry[@id='entry1'] no-labelled-by
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label3'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label10'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label20'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkDrawingArea[@id='drawingarea1'] no-labelled-by
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label34'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label35'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label36'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label37'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label38'] orphan-label
+vcl/qa/cppunit/builder/demo.ui://GtkLabel[@id='label39'] orphan-label
diff --git a/solenv/sanitizers/ui/xmlsec.suppr b/solenv/sanitizers/ui/xmlsec.suppr
new file mode 100644
index 000000000..f5a49510d
--- /dev/null
+++ b/solenv/sanitizers/ui/xmlsec.suppr
@@ -0,0 +1,37 @@
+xmlsecurity/uiconfig/ui/certpage.ui://GtkLabel[@id='certok'] orphan-label
+xmlsecurity/uiconfig/ui/certpage.ui://GtkLabel[@id='certnotok'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkImage[@id='certimage'] no-labelled-by
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='label1'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='hintnotrust'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='issued_to'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='issued_to_value'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='issued_by'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='issued_by_value'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='valid_from'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkImage[@id='keyimage'] no-labelled-by
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='privatekey'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='valid_to'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='valid_from_value'] orphan-label
+xmlsecurity/uiconfig/ui/certgeneral.ui://GtkLabel[@id='valid_to_value'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='dochint'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='signed'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='issued'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='date'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='description'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='type'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='macrohint'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='packagehint'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='validft'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkImage[@id='validimg'] no-labelled-by
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='invalidft'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='oldsignatureft'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkLabel[@id='notvalidatedft'] orphan-label
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkImage[@id='invalidimg'] no-labelled-by
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkImage[@id='oldsignatureimg'] no-labelled-by
+xmlsecurity/uiconfig/ui/digitalsignaturesdialog.ui://GtkImage[@id='notvalidatedimg'] no-labelled-by
+xmlsecurity/uiconfig/ui/securitytrustpage.ui://GtkImage[@id='lockcertimg'] no-labelled-by
+xmlsecurity/uiconfig/ui/securitytrustpage.ui://GtkLabel[@id='label8'] orphan-label
+xmlsecurity/uiconfig/ui/securitytrustpage.ui://GtkImage[@id='lockfileimg'] no-labelled-by
+xmlsecurity/uiconfig/ui/selectcertificatedialog.ui://GtkLabel[@id='sign'] orphan-label
+xmlsecurity/uiconfig/ui/selectcertificatedialog.ui://GtkLabel[@id='encrypt'] orphan-label
+xmlsecurity/uiconfig/ui/selectcertificatedialog.ui://GtkLabel[@id='description-label'] orphan-label
diff --git a/solenv/sanitizers/valgrind-suppressions b/solenv/sanitizers/valgrind-suppressions
new file mode 100644
index 000000000..1f1dfe042
--- /dev/null
+++ b/solenv/sanitizers/valgrind-suppressions
@@ -0,0 +1,39 @@
+#
+# 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/.
+#
+
+# Pass this file to valgrind with
+# --suppressions=solenv/sanitizers/valgrind-suppressions
+#
+
+
+#
+# Ignore module-static data allocated when we dlopen() glib
+{
+ glib1
+ Memcheck:Leak
+ match-leak-kinds: possible
+ ...
+ fun:g_type_register_*
+ ...
+ fun:osl_loadModule
+ ...
+}
+{
+ glib2
+ Memcheck:Leak
+ match-leak-kinds: possible
+ fun:calloc
+ fun:g_malloc0
+ obj:*libgobject*
+ ...
+ fun:call_init.part.0
+ ...
+ fun:osl_loadModule
+ ...
+}
+
diff --git a/solenv/vs/LibreOffice.natvis b/solenv/vs/LibreOffice.natvis
new file mode 100644
index 000000000..cca25a146
--- /dev/null
+++ b/solenv/vs/LibreOffice.natvis
@@ -0,0 +1,496 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ * 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/.
+ *
+-->
+<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
+ <Type Name="rtl::OUString">
+ <DisplayString>{*pData}</DisplayString>
+ <StringView>*pData,su</StringView>
+ </Type>
+ <Type Name="rtl::OString">
+ <DisplayString>{*pData}</DisplayString>
+ <StringView>*pData,s</StringView>
+ </Type>
+ <Type Name="_rtl_uString">
+ <DisplayString Condition="length == 0">empty</DisplayString>
+ <DisplayString>u"{buffer,[length]sub}"</DisplayString>
+ <StringView>buffer,[length]sub</StringView>
+ </Type>
+ <Type Name="_rtl_String">
+ <DisplayString Condition="length == 0">empty</DisplayString>
+ <DisplayString>{buffer,[length]s}</DisplayString>
+ <StringView>buffer,[length]s</StringView>
+ </Type>
+ <Type Name="rtl::OUStringLiteral &lt; * &gt;">
+ <DisplayString>{str}</DisplayString>
+ <StringView>str</StringView>
+ </Type>
+ <Type Name="_uno_Any">
+ <!--
+ typelib_TypeClass_VOID = 0,
+ typelib_TypeClass_TYPEDEF = 16,
+ typelib_TypeClass_STRUCT = 17,
+ typelib_TypeClass_UNION = 18,/** Deprecated, UNOIDL does not have a union concept.*/
+ typelib_TypeClass_ARRAY = 21,/** Deprecated, UNOIDL does not have an array concept.*/
+ typelib_TypeClass_SERVICE = 23,/** (not implemented) */
+ typelib_TypeClass_MODULE = 24,/** (not implemented) */
+ typelib_TypeClass_INTERFACE_METHOD = 25,
+ typelib_TypeClass_INTERFACE_ATTRIBUTE = 26,
+ typelib_TypeClass_UNKNOWN = 27,
+ typelib_TypeClass_PROPERTY = 28,
+ typelib_TypeClass_CONSTANT = 29,
+ typelib_TypeClass_CONSTANTS = 30,
+ typelib_TypeClass_SINGLETON = 31,
+ -->
+ <DisplayString Condition="pType->eTypeClass == 1" >{*((wchar_t*)pData),c} (CHAR)</DisplayString><!-- typelib_TypeClass_CHAR -->
+ <DisplayString Condition="pType->eTypeClass == 2" >{*((bool*)pData),d} (BOOLEAN)</DisplayString><!-- typelib_TypeClass_BOOLEAN -->
+ <DisplayString Condition="pType->eTypeClass == 3" >{*((unsigned char*)pData),d} (BYTE)</DisplayString><!-- typelib_TypeClass_BYTE -->
+ <DisplayString Condition="pType->eTypeClass == 4" >{*((short*)pData),d} (SHORT)</DisplayString><!-- typelib_TypeClass_SHORT -->
+ <DisplayString Condition="pType->eTypeClass == 5" >{*((unsigned short*)pData),d} (UNSIGNED_SHORT)</DisplayString><!-- typelib_TypeClass_UNSIGNED_SHORT -->
+ <DisplayString Condition="pType->eTypeClass == 6" >{*((int*)pData),d} (LONG)</DisplayString><!-- typelib_TypeClass_LONG -->
+ <DisplayString Condition="pType->eTypeClass == 7" >{*((unsigned int*)pData),d} (UNSIGNED_LONG)</DisplayString><!-- typelib_TypeClass_UNSIGNED_LONG -->
+ <DisplayString Condition="pType->eTypeClass == 8" >{*((__int64*)pData),d} (HYPER)</DisplayString><!-- typelib_TypeClass_HYPER -->
+ <DisplayString Condition="pType->eTypeClass == 9" >{*((unsigned __int64*)pData),d} (UNSIGNED_HYPER)</DisplayString><!-- typelib_TypeClass_UNSIGNED_HYPER -->
+ <DisplayString Condition="pType->eTypeClass == 10">{*((float*)pData)} (FLOAT)</DisplayString><!-- typelib_TypeClass_FLOAT -->
+ <DisplayString Condition="pType->eTypeClass == 11">{*((double*)pData)} (DOUBLE)</DisplayString><!-- typelib_TypeClass_DOUBLE -->
+ <DisplayString Condition="pType->eTypeClass == 12">{*((rtl::OUString*)pData)} (STRING)</DisplayString><!-- typelib_TypeClass_STRING -->
+ <DisplayString Condition="pType->eTypeClass == 13">{*((com::sun::star::uno::Type*)pData)} (TYPE)</DisplayString><!-- typelib_TypeClass_TYPE -->
+ <DisplayString Condition="pType->eTypeClass == 14">{*((_uno_Any*)pData)} (ANY)</DisplayString><!-- typelib_TypeClass_ANY -->
+ <DisplayString Condition="pType->eTypeClass == 15">{*((sal_Int32*)pData),d} (ENUM)</DisplayString><!-- typelib_TypeClass_ENUM -->
+ <DisplayString Condition="pType->eTypeClass == 19">{*((com::sun::star::uno::Exception *)pData)} (EXCEPTION)</DisplayString><!-- typelib_TypeClass_EXCEPTION -->
+ <DisplayString Condition="pType->eTypeClass == 20">{*((uno_Sequence **)pData)} (SEQUENCE)</DisplayString><!-- typelib_TypeClass_SEQUENCE -->
+ <DisplayString Condition="pType->eTypeClass == 22">{*((com::sun::star::uno::BaseReference *)pData)} (INTERFACE)</DisplayString><!-- typelib_TypeClass_INTERFACE -->
+ <DisplayString>{pType->eTypeClass,en}</DisplayString>
+ <Expand>
+ <ExpandedItem Condition="pType->eTypeClass == 19">(com::sun::star::uno::Exception *)pData</ExpandedItem>
+ <ExpandedItem Condition="pType->eTypeClass == 20">*(uno_Sequence **)pData</ExpandedItem>
+ <ExpandedItem Condition="pType->eTypeClass == 22">(com::sun::star::uno::BaseReference *)pData</ExpandedItem>
+ <Item Name="Data" Condition="pType->eTypeClass != 19 &amp;&amp; pType->eTypeClass != 20 &amp;&amp; pType->eTypeClass != 22">pData</Item>
+ </Expand>
+ </Type>
+ <Type Name="basegfx::internal::ImplMatLine &lt; 3 &gt;">
+ <DisplayString>{mfValue[0]}, {mfValue[1]}, {mfValue[2]}</DisplayString>
+ </Type>
+ <Type Name="basegfx::internal::ImplHomMatrixTemplate &lt; 3 &gt;">
+ <DisplayString>{{{maLine[0]}}}, {{{maLine[1]}}}, {mpLine}</DisplayString>
+ </Type>
+ <Type Name="o3tl::cow_wrapper &lt; basegfx::Impl2DHomMatrix,o3tl::UnsafeRefCountingPolicy &gt;::impl_t">
+ <DisplayString>{m_value}</DisplayString>
+ </Type>
+ <Type Name="o3tl::cow_wrapper &lt; basegfx::Impl2DHomMatrix,o3tl::UnsafeRefCountingPolicy &gt;">
+ <DisplayString>{m_pimpl}</DisplayString>
+ </Type>
+ <Type Name="basegfx::B2DHomMatrix">
+ <DisplayString>{mpImpl}</DisplayString>
+ </Type>
+ <Type Name="Point">
+ <DisplayString>X:{nA}, Y:{nB}</DisplayString>
+ </Type>
+ <Type Name="Size">
+ <DisplayString>W:{nA}, H:{nB}</DisplayString>
+ </Type>
+ <Type Name="Range">
+ <DisplayString>Min:{nA}, Max:{nB}</DisplayString>
+ </Type>
+ <Type Name="Selection">
+ <DisplayString>Min:{nA}, Max:{nB}</DisplayString>
+ </Type>
+ <Type Name="Pair">
+ <DisplayString>A:{nA}, B:{nB}</DisplayString>
+ </Type>
+ <Type Name="SwRect">
+ <DisplayString>{m_Point}, {m_Size}</DisplayString>
+ </Type>
+ <Type Name="tools::Rectangle">
+ <DisplayString IncludeView="w">{nRight==-32767?0:(nRight-nLeft+(nLeft>nRight?(-1):(1)))}</DisplayString>
+ <DisplayString IncludeView="h">{nBottom==-32767?0:(nBottom-nTop+(nTop>nBottom?(-1):(1)))}</DisplayString>
+ <DisplayString IncludeView="sz" Condition="nRight==-32767 || nBottom==-32767">empty</DisplayString>
+ <DisplayString IncludeView="sz">{*this,view(w)nd} x {*this,view(h)nd}</DisplayString>
+ <DisplayString>{{ LT=[{nLeft} , {nTop}] RB=[{nRight} , {nBottom}] [{*this,view(sz)}] }}</DisplayString>
+ </Type>
+ <Type Name="_sal_Sequence">
+ <DisplayString Condition="nElements == 0">_sal_Sequence (empty)</DisplayString>
+ <DisplayString>_sal_Sequence of {nElements,d} elements</DisplayString>
+ </Type>
+ <Type Name="com::sun::star::uno::Sequence &lt; signed char &gt;">
+ <DisplayString Condition="_pSequence->nElements == 0">Sequence (empty)</DisplayString>
+ <DisplayString>Sequence of {_pSequence->nElements,d} signed char</DisplayString>
+ <Expand>
+ <ArrayItems>
+ <Size>_pSequence->nElements</Size>
+ <ValuePointer>reinterpret_cast &lt; const char* &gt;( _pSequence->elements )</ValuePointer>
+ </ArrayItems>
+ </Expand>
+ </Type>
+ <Type Name="com::sun::star::uno::Sequence &lt; * &gt;">
+ <DisplayString Condition="_pSequence->nElements == 0">Sequence (empty)</DisplayString>
+ <DisplayString>Sequence of {_pSequence->nElements,d} {"$T1",sb}</DisplayString>
+ <Expand>
+ <ArrayItems>
+ <Size>_pSequence->nElements</Size>
+ <ValuePointer>reinterpret_cast &lt; const $T1 * &gt;( _pSequence->elements )</ValuePointer>
+ </ArrayItems>
+ </Expand>
+ </Type>
+ <Type Name="BigPtrArray">
+ <DisplayString>{{{m_nSize,d} nodes}}</DisplayString>
+ <Expand>
+ <CustomListItems>
+ <!-- Visualiser needs to know the type of variable (including pointer type).
+ If later we try to assign an incompatible value, visualiser will error out.
+ For pointers, valid syntax is e.g. "(BlockInfo*)nullptr" -->
+ <Variable Name="blocks" InitialValue="m_ppInf._Mypair._Myval2"/>
+ <Variable Name="count" InitialValue="m_nSize"/>
+ <Variable Name="pos" InitialValue="0"/>
+ <Variable Name="block_count" InitialValue="m_nBlock"/>
+ <Variable Name="block_pos" InitialValue="0"/>
+ <Variable Name="block" InitialValue="blocks[0]"/>
+ <Variable Name="next_block" InitialValue="block"/>
+
+ <Size>m_nSize</Size>
+
+ <Break Condition="block_pos &gt;= block_count"/>
+ <Break Condition="block == nullptr"/>
+ <Break Condition="block-&gt;nStart != 0"/>
+ <Break Condition="block-&gt;nEnd - block-&gt;nStart + 1 != block-&gt;nElem"/>
+
+ <Loop>
+ <Break Condition="pos &gt;= count"/>
+ <Item>*block-&gt;mvData._Elems[ pos - block-&gt;nStart ]</Item>
+ <If Condition="pos == block-&gt;nEnd">
+ <Exec>block_pos++</Exec>
+ <Break Condition="block_pos &gt;= block_count"/>
+ <Exec>next_block = blocks[block_pos]</Exec>
+ <Break Condition="next_block == nullptr"/>
+ <Break Condition="next_block-&gt;nEnd - next_block-&gt;nStart + 1 != next_block-&gt;nElem"/>
+ <Break Condition="next_block-&gt;nStart != block-&gt;nEnd + 1"/>
+ <Break Condition="next_block-&gt;nEnd &lt;= count"/>
+ <Exec>block = next_block</Exec>
+ </If>
+ <Exec>pos++</Exec>
+ </Loop>
+
+ </CustomListItems>
+ </Expand>
+ </Type>
+ <Type Name="SwNode">
+ <DisplayString IncludeView="No">[{m_pBlock->nStart + m_nOffset,d}]</DisplayString>
+ <DisplayString IncludeView="Name">Node</DisplayString>
+ <DisplayString>{*this,view(No)nd} {{{*this,view(Name)}}}</DisplayString>
+ <Expand>
+ <Item Name="No">m_pBlock->nStart + m_nOffset,d</Item>
+ <Item Name="Nodes">static_cast &lt; SwNodes* &gt;(m_pBlock->pBigArr)</Item>
+ </Expand>
+ </Type>
+ <Type Name="SwEndNode">
+ <DisplayString IncludeView="For" Condition="m_pStartOfSection != nullptr">- for {*(SwNode*)m_pStartOfSection,view(No)nd}</DisplayString>
+ <DisplayString IncludeView="For"/>
+ <DisplayString IncludeView="Name">EndNode</DisplayString>
+ <DisplayString>{*(SwNode*)this,nd} {*this,view(For)nd}</DisplayString>
+ </Type>
+ <Type Name="SwStartNode">
+ <DisplayString IncludeView="Till">- till {*(SwNode*)m_pEndOfSection,view(No)nd}</DisplayString>
+ <DisplayString IncludeView="Name" Condition="m_eStartNodeType == 0">NormalStartNode</DisplayString>
+ <DisplayString IncludeView="Name" Condition="m_eStartNodeType == 1">TableBoxStartNode</DisplayString>
+ <DisplayString IncludeView="Name" Condition="m_eStartNodeType == 2">FlyStartNode</DisplayString>
+ <DisplayString IncludeView="Name" Condition="m_eStartNodeType == 3">FootnoteStartNode</DisplayString>
+ <DisplayString IncludeView="Name" Condition="m_eStartNodeType == 4">HeaderStartNode</DisplayString>
+ <DisplayString IncludeView="Name" Condition="m_eStartNodeType == 5">FooterStartNode</DisplayString>
+ <DisplayString IncludeView="Name">StartNode {m_nNodeType,en}</DisplayString>
+ <DisplayString>{*(SwNode*)this,nd} {*this,view(Till)nd}</DisplayString>
+ </Type>
+ <Type Name="SwContentNode">
+ <DisplayString IncludeView="Name">ContentNode</DisplayString>
+ <DisplayString>{*(SwNode*)this,nd}</DisplayString>
+ </Type>
+ <Type Name="SwOLENode">
+ <DisplayString IncludeView="Name">OLENode</DisplayString>
+ <DisplayString>{*(SwNode*)this,nd}</DisplayString>
+ </Type>
+ <Type Name="SwGrfNode">
+ <DisplayString IncludeView="Name">GrfNode</DisplayString>
+ <DisplayString>{*(SwNode*)this,nd}</DisplayString>
+ </Type>
+ <Type Name="SwSectionNode">
+ <DisplayString IncludeView="Name">SectionNode</DisplayString>
+ <DisplayString>{*(SwStartNode*)this,nd}</DisplayString>
+ </Type>
+ <Type Name="SwTableNode">
+ <DisplayString IncludeView="Name">TableNode</DisplayString>
+ <DisplayString>{*(SwStartNode*)this,nd}</DisplayString>
+ </Type>
+ <Type Name="SwDummySectionNode">
+ <DisplayString IncludeView="Name">DummySectionNode</DisplayString>
+ <DisplayString>{*(SwNode*)this,nd}</DisplayString>
+ </Type>
+ <Type Name="SwTextNode">
+ <DisplayString IncludeView="Name">TextNode: {m_Text}</DisplayString>
+ <DisplayString>{*(SwNode*)this,nd}</DisplayString>
+ </Type>
+ <Type Name="SwNodeIndex">
+ <DisplayString>{{{*m_pNode}}}</DisplayString>
+ </Type>
+ <Type Name="SwIndex">
+ <DisplayString>{{{m_nIndex}}}</DisplayString>
+ </Type>
+ <Type Name="SwPosition">
+ <DisplayString>{{Node: {nNode} Content: {nContent}}}</DisplayString>
+ </Type>
+ <Type Name="SwPaM">
+ <DisplayString>{{Point: {*m_pPoint} Mark: {*m_pMark}}}</DisplayString>
+ </Type>
+ <Type Name="SwFrameFormats">
+ <DisplayString Condition="m_Array.node_count == 0">empty</DisplayString>
+ <DisplayString>Size: {m_Array.node_count}</DisplayString>
+ <Expand>
+ <IndexListItems>
+ <Size>m_Array.node_count</Size>
+ <ValueNode>**reinterpret_cast &lt; value_type* &gt; (&amp;static_cast &lt; ByPos::node_type* &gt; (static_cast &lt; ByPos::node_type::trampoline* &gt; (m_PosIndex.ptrs.spc.data_[$i]))->space)</ValueNode>
+ </IndexListItems>
+ </Expand>
+ </Type>
+ <Type Name="SwFormat">
+ <DisplayString>Format: "{m_aFormatName,sub}"</DisplayString>
+ </Type>
+ <Type Name="com::sun::star::uno::BaseReference">
+ <DisplayString Condition="_pInterface == nullptr">empty</DisplayString>
+ <DisplayString>{{{_pInterface}}}</DisplayString>
+ </Type>
+ <Type Name="com::sun::star::uno::Reference &lt; * &gt;">
+ <DisplayString Condition="_pInterface == nullptr">empty</DisplayString>
+ <DisplayString>{{{reinterpret_cast &lt; $T1 * &gt;(_pInterface)}}}</DisplayString>
+ <Expand>
+ <ExpandedItem>reinterpret_cast &lt; $T1 * &gt;(_pInterface)</ExpandedItem>
+ </Expand>
+ </Type>
+ <Type Name="rtl::Reference &lt; * &gt;">
+ <DisplayString Condition="m_pBody == nullptr">empty</DisplayString>
+ <DisplayString>{{{reinterpret_cast &lt; $T1 * &gt;(m_pBody)}}}</DisplayString>
+ <Expand>
+ <ExpandedItem>reinterpret_cast &lt; $T1 * &gt;(m_pBody)</ExpandedItem>
+ </Expand>
+ </Type>
+ <Type Name="VclPtr &lt; * &gt;">
+ <DisplayString>{m_rInnerRef}</DisplayString>
+ <Expand>
+ <ExpandedItem>m_rInnerRef</ExpandedItem>
+ </Expand>
+ </Type>
+ <Type Name="com::sun::star::uno::Type">
+ <DisplayString>{_pType->eTypeClass,en}</DisplayString>
+ <Expand>
+ <Item Name="Type Class">_pType->eTypeClass,en</Item>
+ <Item Name="Type Name">_pType->pTypeName</Item>
+ <Item Condition="_pType->pType != nullptr" Name="Size">_pType->pType->nSize</Item>
+ <Item Condition="_pType->pType != nullptr" Name="Alignment">_pType->pType->nAlignment</Item>
+ </Expand>
+ </Type>
+ <Type Name="SfxBoolItem">
+ <DisplayString>{{which={m_nWhich,x}}} {m_bValue}</DisplayString>
+ </Type>
+ <Type Name="SfxEnumItem &lt; * &gt;">
+ <DisplayString>{{which={m_nWhich,x}}} {m_nValue}</DisplayString>
+ </Type>
+ <Type Name="CntUnencodedStringItem">
+ <DisplayString>{{which={m_nWhich,x}}} {m_aValue}</DisplayString>
+ </Type>
+ <Type Name="SfxUnoAnyItem">
+ <DisplayString>{{which={m_nWhich,x}}} {aValue}</DisplayString>
+ </Type>
+ <Type Name="SvxFontItem">
+ <DisplayString>{{which={m_nWhich,x}}} Font family: {aFamilyName,sub}</DisplayString>
+ </Type>
+ <Type Name="SfxInt16Item">
+ <DisplayString>{{which={m_nWhich,x}}} Int16: {m_nValue}</DisplayString>
+ </Type>
+ <Type Name="CntUInt16Item">
+ <DisplayString>{{which={m_nWhich,x}}} uInt16: {m_nValue}</DisplayString>
+ </Type>
+ <Type Name="CntByteItem">
+ <DisplayString>{{which={m_nWhich,x}}} uInt8: {m_nValue}</DisplayString>
+ </Type>
+ <Type Name="CntInt32Item">
+ <DisplayString>{{which={m_nWhich,x}}} Int32: {m_nValue}</DisplayString>
+ </Type>
+ <Type Name="CntUInt32Item">
+ <DisplayString>{{which={m_nWhich,x}}} uInt32: {m_nValue}</DisplayString>
+ </Type>
+ <Type Name="SfxGrabBagItem">
+ <DisplayString>
+ {{which={m_nWhich,x}}} GrabBag {{size={m_aMap._Mypair._Myval2._Myval2._Mysize,d}}}
+ </DisplayString>
+ <Expand>
+ <ExpandedItem>m_aMap</ExpandedItem>
+ </Expand>
+ </Type>
+ <Type Name="SfxPoolItem">
+ <DisplayString>{{which={m_nWhich,x}}}</DisplayString>
+ </Type>
+ <Type Name="WhichRangesContainer">
+ <DisplayString>{{size={m_size,d}}}</DisplayString>
+ <Expand>
+ <ArrayItems>
+ <Size>m_size</Size>
+ <ValuePointer>m_pairs</ValuePointer>
+ </ArrayItems>
+ </Expand>
+ </Type>
+ <Type Name="SfxItemSet">
+ <DisplayString>{{size={m_nCount,d}}}</DisplayString>
+ <Expand>
+ <CustomListItems>
+ <Variable Name='pCurItem' InitialValue='m_ppItems'/>
+ <Variable Name='nRanges' InitialValue='m_pWhichRanges.m_size'/>
+ <Variable Name='nCurRange' InitialValue='0'/>
+ <Variable Name='nCurWhich' InitialValue='0'/>
+ <Loop Condition='nCurRange &lt; nRanges'>
+ <Exec>nCurWhich = m_pWhichRanges.m_pairs[nCurRange].first</Exec>
+ <Loop Condition='nCurWhich &lt;= m_pWhichRanges.m_pairs[nCurRange].second'>
+ <Item Condition='*pCurItem'>**pCurItem</Item>
+ <Exec>++pCurItem</Exec>
+ <Exec>++nCurWhich</Exec>
+ </Loop>
+ <Exec>++nCurRange</Exec>
+ </Loop>
+ </CustomListItems>
+ <Item Name="Which Ranges">m_pWhichRanges</Item>
+ <Item Condition="m_pParent != nullptr" Name="Parent">*m_pParent</Item>
+ </Expand>
+ </Type>
+ <Type Name="sax_fastparser::FastAttributeList">
+ <DisplayString>{{size={maAttributeTokens.size(),d}}}</DisplayString>
+ <Expand>
+ <CustomListItems>
+ <Variable Name='i' InitialValue='0'/>
+ <Loop Condition='i &lt; maAttributeTokens.size()'>
+ <Item Name='{maAttributeTokens[i],x}'>mpChunk + maAttributeValues[i]</Item>
+ <Exec>++i</Exec>
+ </Loop>
+ </CustomListItems>
+ </Expand>
+ </Type>
+ <Type Name='writerfilter::ooxml::OOXMLProperty'>
+ <DisplayString>{meType,en} {mId,d}: {*mpValue}</DisplayString>
+ <Expand HideRawView='true'>
+ <Item Name='Type'>meType</Item>
+ <Item Name='Id'>mId,d</Item> <!-- see workdir/CustomTarget/writerfilter/source/ooxml/resourceids.hxx -->
+ <Item Name='Value'>*mpValue</Item>
+ </Expand>
+ </Type>
+ <Type Name='writerfilter::ooxml::OOXMLStringValue'>
+ <DisplayString>"{mStr,sub}"</DisplayString>
+ <StringView>mStr</StringView>
+ </Type>
+ <Type Name='writerfilter::ooxml::OOXMLBooleanValue'>
+ <DisplayString>{mbValue}</DisplayString>
+ </Type>
+ <Type Name='writerfilter::ooxml::OOXMLIntegerValue'>
+ <DisplayString>{mnValue}</DisplayString>
+ </Type>
+ <Type Name='writerfilter::ooxml::OOXMLNthPtMeasureValue&lt;*&gt;'>
+ <DisplayString>{mnValue,d}/{$T1,d}={mnValue*1.0/$T1,g} pt</DisplayString>
+ </Type>
+ <Type Name='writerfilter::ooxml::OOXMLPropertySetValue'>
+ <DisplayString>{{Property set size={mpPropertySet->mProperties.size(),d}}}</DisplayString>
+ <Expand>
+ <IndexListItems>
+ <Size>mpPropertySet->mProperties.size()</Size>
+ <ValueNode>*mpPropertySet->mProperties[$i]</ValueNode>
+ </IndexListItems>
+ </Expand>
+ </Type>
+ <Type Name='writerfilter::ooxml::OOXMLPropertySet'>
+ <DisplayString>{{{maType} {{size={mProperties.size(),d}}}}}</DisplayString>
+ <Expand HideRawView='true'>
+ <IndexListItems>
+ <Size>mProperties.size()</Size>
+ <ValueNode>*mProperties[$i]</ValueNode>
+ </IndexListItems>
+ <Item Name='Type'>maType</Item>
+ </Expand>
+ </Type>
+ <Type Name='writerfilter::rtftok::RTFSprms'>
+ <DisplayString>{{Params: {m_pSprms.pObj->size()}}}</DisplayString>
+ <Expand>
+ <ArrayItems>
+ <Size>m_pSprms.pObj->size()</Size>
+ <ValuePointer>m_pSprms.pObj->_Mypair._Myval2._Myfirst</ValuePointer>
+ </ArrayItems>
+ </Expand>
+ </Type>
+ <Type Name='tools::SvRef&lt;*&gt;'>
+ <DisplayString Condition="pObj!=nullptr">{*pObj}</DisplayString>
+ <DisplayString Condition="pObj==nullptr">nullptr</DisplayString>
+ <Expand>
+ <ExpandedItem Condition="pObj!=nullptr">*pObj</ExpandedItem>
+ </Expand>
+ </Type>
+ <Type Name='SwFrame'>
+ <DisplayString IncludeView='min'>{mnFrameType,en} of {mpUpper->mnFrameType,en} {(void*)mpUpper}</DisplayString>
+ <DisplayString Condition='!mpUpper'>{{{mnFrameType,en}}}</DisplayString>
+ <DisplayString>{{{*this,view(min)}}}</DisplayString>
+ <Expand>
+ <Synthetic Name='Frame'>
+ <DisplayString>Area: {maFrameArea}; Print Area: {maFramePrintArea}</DisplayString>
+ <Expand>
+ <Item Name='Area'>maFrameArea</Item>
+ <Item Name='Print Area'>maFramePrintArea</Item>
+ </Expand>
+ </Synthetic>
+ <Item Name='Upper'>mpUpper</Item>
+ </Expand>
+ </Type>
+ <Type Name='SwLayoutFrame'>
+ <DisplayString>{(SwFrame&amp;)*this}</DisplayString>
+ <Expand>
+ <ExpandedItem>(SwFrame&amp;)(*this)</ExpandedItem>
+ <Synthetic Name='Lowers' Condition='m_pLower'>
+ <Expand>
+ <CustomListItems>
+ <Variable Name="pChild" InitialValue="m_pLower"/>
+ <Loop>
+ <Break Condition="!pChild"/>
+ <Item>pChild</Item>
+ <Exec>pChild = pChild->mpNext</Exec>
+ </Loop>
+ </CustomListItems>
+ </Expand>
+ </Synthetic>
+ </Expand>
+ </Type>
+ <Type Name="SwRowFrame">
+ <DisplayString Condition="m_bIsRepeatedHeadline">{{Headline {(SwFrame&amp;)*this,view(min)}}}</DisplayString>
+ <DisplayString>{(SwFrame&amp;)*this}</DisplayString>
+ <Expand>
+ <ExpandedItem>(SwLayoutFrame&amp;)(*this)</ExpandedItem>
+ </Expand>
+ </Type>
+ <Type Name="SwTabFrame">
+ <DisplayString Condition="m_pPrecede">{{Follow {(SwFrame&amp;)*this,view(min)}}}</DisplayString>
+ <DisplayString>{(SwFrame&amp;)*this}</DisplayString>
+ <Expand>
+ <ExpandedItem>(SwLayoutFrame&amp;)(*this)</ExpandedItem>
+ </Expand>
+ </Type>
+ <Type Name="boost::optional&lt;*&gt;">
+ <DisplayString Condition="!m_initialized">Optional not set</DisplayString>
+ <DisplayString>{*reinterpret_cast&lt;$T1 *&gt;(m_storage.dummy_.data)}</DisplayString>
+ <Expand>
+ <Item Name="initialized">m_initialized</Item>
+ <Item Name="data">*reinterpret_cast&lt;$T1 *&gt;(m_storage.dummy_.data)</Item>
+ </Expand>
+ </Type>
+ <Type Name="ErrCode">
+ <DisplayString Condition="m_value == 0">None</DisplayString>
+ <DisplayString IncludeView="dynamic" Condition="m_value &amp; (31UL &lt;&lt; 26)">dynamic: {(m_value >> 26) &amp; 31UL} </DisplayString>
+ <DisplayString IncludeView="dynamic"/>
+ <DisplayString IncludeView="detail">{{{*this,view(dynamic)}area: {static_cast&lt;ErrCodeArea>((m_value >> 13) &amp; 0x01fff),en}, class: {static_cast&lt;ErrCodeClass>((m_value >> 8) &amp; 0x1f),en}, code: {m_value &amp; 0xff}}}</DisplayString>
+ <DisplayString Condition="m_value &amp; 0x80000000UL">Warning: {*this,view(detail)}</DisplayString>
+ <DisplayString>Error: {*this,view(detail)}</DisplayString>
+ </Type>
+</AutoVisualizer>
diff --git a/solenv/wsl/wsl-lo-helper.cpp b/solenv/wsl/wsl-lo-helper.cpp
new file mode 100644
index 000000000..1a90580b6
--- /dev/null
+++ b/solenv/wsl/wsl-lo-helper.cpp
@@ -0,0 +1,246 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 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/.
+ */
+
+/*
+ * This is a tool that will be useful for various tasks if/when we build LO on WSL
+ *
+ * It is a Win32 program, not a Linux (WSL) one.
+ *
+ * Compile as: cl -MD wsl-lo-helper.cpp advapi32.lib
+ */
+
+#include <cstdio>
+#include <cstring>
+
+#include <Windows.h>
+
+static void print_result(const wchar_t* argv0, const wchar_t* result)
+{
+ char output[1000];
+ if (WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, result, -1, output, sizeof(output), NULL,
+ NULL)
+ == 0)
+ {
+ fprintf(stderr, "%S --8.3: Could not convert result to UTF-8.\n", argv0);
+ exit(1);
+ }
+
+ // Intentionally output no newline at end
+ printf("%s", output);
+ fflush(stdout);
+}
+
+static REGSAM parse_bitness(const wchar_t* argv0, const wchar_t* command, const wchar_t* bitness)
+{
+ if (wcscmp(bitness, L"32") == 0)
+ return KEY_WOW64_32KEY;
+ else if (wcscmp(bitness, L"64") == 0)
+ return KEY_WOW64_64KEY;
+ else
+ {
+ fprintf(stderr, "%S %S: Use 32 or 64.\n", argv0, command);
+ exit(1);
+ }
+}
+
+static void parse_hive(const wchar_t* argv0, const wchar_t* path, HKEY* hivep,
+ const wchar_t** hive_namep)
+{
+ if (wcscmp(path, L"HKEY_CLASSES_ROOT") == 0)
+ {
+ *hivep = HKEY_CLASSES_ROOT;
+ *hive_namep = L"HKEY_CLASSES_ROOT";
+ }
+ else if (wcscmp(path, L"HKEY_CURRENT_CONFIG") == 0)
+ {
+ *hivep = HKEY_CURRENT_CONFIG;
+ *hive_namep = L"HKEY_CURRENT_CONFIG";
+ }
+ else if (wcscmp(path, L"HKEY_CURRENT_USER") == 0)
+ {
+ *hivep = HKEY_CURRENT_USER;
+ *hive_namep = L"HKEY_CURRENT_USER";
+ }
+ else if (wcscmp(path, L"HKEY_LOCAL_MACHINE") == 0)
+ {
+ *hivep = HKEY_LOCAL_MACHINE;
+ *hive_namep = L"HKEY_LOCAL_MACHINE";
+ }
+ else if (wcscmp(path, L"HKEY_USERS") == 0)
+ {
+ *hivep = HKEY_USERS;
+ *hive_namep = L"HKEY_USERS";
+ }
+ else
+ {
+ fprintf(stderr, "%S: Invalid Registry hive %S.\n", argv0, path);
+ exit(1);
+ }
+}
+
+int wmain(int argc, wchar_t** argv)
+{
+ if (argc <= 1)
+ {
+ fprintf(stderr, "%S: Usage:\n", argv[0]);
+ fprintf(stderr, "%S --8.3 <windows-pathname>\n", argv[0]);
+ fprintf(stderr, " Print the 8.3 form of a Windows pathnam. Fail it not present.\n");
+ fprintf(stderr, "%S --read-registry [32|64] <path>\n", argv[0]);
+ fprintf(stderr, " Read a string value from the Registry and print it.\n");
+ fprintf(stderr, "%S --list-registry [32|64] <path>\n", argv[0]);
+ fprintf(stderr, " List subkeys of a key in the Registry.\n");
+ exit(1);
+ }
+
+ if (wcscmp(argv[1], L"--8.3") == 0)
+ {
+ if (argc != 3)
+ {
+ fprintf(stderr, "%S --8.3: One pathname argument expected\n", argv[0]);
+ exit(1);
+ }
+
+ // The argument should be a pathname in Windows format. The
+ // output will be the 8.3 pathname if present. If not present,
+ // return failure.
+
+ wchar_t woutput[1000];
+ if (GetShortPathNameW(argv[2], woutput, sizeof(woutput) / sizeof(woutput[0])) == 0)
+ {
+ fprintf(stderr, "%S --8.3: Could not get short pathname of %S.\n", argv[0], argv[2]);
+ exit(1);
+ }
+
+ print_result(argv[0], woutput);
+ }
+ else if (wcscmp(argv[1], L"--read-registry") == 0)
+ {
+ if (argc != 4)
+ {
+ fprintf(stderr, "%S --read-registry: Bitness and path arguments expected.\n", argv[0]);
+ exit(1);
+ }
+
+ REGSAM sam = parse_bitness(argv[0], L"--read-registry", argv[2]);
+
+ wchar_t* path = wcsdup(argv[3]);
+
+ for (wchar_t* p = path; *p != L'\0'; p++)
+ if (*p == '/')
+ *p = '\\';
+
+ wchar_t* const first_backslash = wcschr(path, L'\\');
+ if (first_backslash == NULL)
+ {
+ fprintf(stderr, "%S: Invalid path %S to value in the Registry.\n", argv[0], path);
+ exit(1);
+ }
+
+ *first_backslash = L'\0';
+ wchar_t* const key_path = first_backslash + 1;
+
+ HKEY hive;
+ const wchar_t* hive_name;
+ parse_hive(argv[0], path, &hive, &hive_name);
+
+ DWORD type;
+ wchar_t result[1000];
+ DWORD count = sizeof(result);
+
+ wchar_t* last_backslash = wcsrchr(key_path, L'\\');
+ if (last_backslash == NULL)
+ {
+ fprintf(stderr, "%S: Invalid path %S\\%S to value in the Registry.\n", argv[0],
+ hive_name, key_path);
+ exit(1);
+ }
+
+ *last_backslash = L'\0';
+ wchar_t* value = last_backslash + 1;
+
+ HKEY key;
+ if (RegOpenKeyExW(hive, key_path, 0, KEY_QUERY_VALUE | sam, &key) != ERROR_SUCCESS)
+ {
+ fprintf(stderr, "%S: Opening key %S\\%S in %S-bit Registry failed.\n", argv[0],
+ hive_name, key_path, argv[2]);
+ exit(1);
+ }
+
+ if (RegQueryValueExW(key, value, NULL, &type, (LPBYTE)result, &count) != ERROR_SUCCESS)
+ {
+ fprintf(stderr, "%S: Reading value %S\\%S\\%S from %S-bit Registry failed.\n", argv[0],
+ hive_name, key_path, value, argv[2]);
+ exit(1);
+ }
+ if (type != REG_SZ)
+ {
+ fprintf(stderr, "%S: Value %S\\%S\\%S is not a string.\n", argv[0], hive_name, key_path,
+ value);
+ exit(1);
+ }
+ print_result(argv[0], result);
+ }
+ else if (wcscmp(argv[1], L"--list-registry") == 0)
+ {
+ if (argc != 4)
+ {
+ fprintf(stderr, "%S --list-registry: Bitness and path arguments expected.\n", argv[0]);
+ exit(1);
+ }
+
+ REGSAM sam = parse_bitness(argv[0], L"--list-registry", argv[2]);
+
+ wchar_t* path = wcsdup(argv[3]);
+
+ for (wchar_t* p = path; *p != L'\0'; p++)
+ if (*p == '/')
+ *p = '\\';
+
+ wchar_t* const first_backslash = wcschr(path, L'\\');
+ if (first_backslash == NULL)
+ {
+ fprintf(stderr, "%S: Invalid path %S to key in the Registry.\n", argv[0], path);
+ exit(1);
+ }
+
+ *first_backslash = L'\0';
+ wchar_t* const key_path = first_backslash + 1;
+
+ HKEY hive;
+ const wchar_t* hive_name;
+ parse_hive(argv[0], path, &hive, &hive_name);
+
+ HKEY key;
+ if (RegOpenKeyExW(hive, key_path, 0, KEY_ENUMERATE_SUB_KEYS | sam, &key) != ERROR_SUCCESS)
+ {
+ fprintf(stderr, "%S: Opening key %S\\%S in %S-bit Registry failed.\n", argv[0],
+ hive_name, key_path, argv[2]);
+ exit(1);
+ }
+
+ DWORD index = 0;
+ wchar_t name[256];
+ DWORD namelen = sizeof(name) / sizeof(name[0]);
+ while (RegEnumKeyExW(key, index, name, &namelen, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
+ {
+ printf("%S\n", name);
+ index++;
+ namelen = sizeof(name) / sizeof(name[0]);
+ }
+ }
+ else
+ {
+ fprintf(stderr, "%S: Unrecognized sub-command %S.\n", argv[0], argv[1]);
+ exit(1);
+ }
+
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */