diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:06:44 +0000 |
commit | ed5640d8b587fbcfed7dd7967f3de04b37a76f26 (patch) | |
tree | 7a5f7c6c9d02226d7471cb3cc8fbbf631b415303 /solenv | |
parent | Initial commit. (diff) | |
download | libreoffice-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 '')
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> » ${module_name}" "$BASE_OUTPUT/${module_name}.html" + text="<p><b>View module in:</b>" + text="${text} <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} <a href=\"${module_name}/html/classes.html\">Doxygen</a>" + fi + text="${text} </p><p> </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> </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> » ${module_name}" "$BASE_OUTPUT/${module_name}.html" + text="<p><b>View module in:</b>" + text="${text} <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} <a href=\"${module_name}/html/classes.html\">Doxygen</a>" + fi + text="${text} </p><p> </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> </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>
</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 Binary files differnew file mode 100644 index 000000000..15cb0ecb3 --- /dev/null +++ b/solenv/gbuild/empty.zip 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 < * >"> + <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 && pType->eTypeClass != 20 && pType->eTypeClass != 22">pData</Item> + </Expand> + </Type> + <Type Name="basegfx::internal::ImplMatLine < 3 >"> + <DisplayString>{mfValue[0]}, {mfValue[1]}, {mfValue[2]}</DisplayString> + </Type> + <Type Name="basegfx::internal::ImplHomMatrixTemplate < 3 >"> + <DisplayString>{{{maLine[0]}}}, {{{maLine[1]}}}, {mpLine}</DisplayString> + </Type> + <Type Name="o3tl::cow_wrapper < basegfx::Impl2DHomMatrix,o3tl::UnsafeRefCountingPolicy >::impl_t"> + <DisplayString>{m_value}</DisplayString> + </Type> + <Type Name="o3tl::cow_wrapper < basegfx::Impl2DHomMatrix,o3tl::UnsafeRefCountingPolicy >"> + <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 < signed char >"> + <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 < const char* >( _pSequence->elements )</ValuePointer> + </ArrayItems> + </Expand> + </Type> + <Type Name="com::sun::star::uno::Sequence < * >"> + <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 < const $T1 * >( _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 >= block_count"/> + <Break Condition="block == nullptr"/> + <Break Condition="block->nStart != 0"/> + <Break Condition="block->nEnd - block->nStart + 1 != block->nElem"/> + + <Loop> + <Break Condition="pos >= count"/> + <Item>*block->mvData._Elems[ pos - block->nStart ]</Item> + <If Condition="pos == block->nEnd"> + <Exec>block_pos++</Exec> + <Break Condition="block_pos >= block_count"/> + <Exec>next_block = blocks[block_pos]</Exec> + <Break Condition="next_block == nullptr"/> + <Break Condition="next_block->nEnd - next_block->nStart + 1 != next_block->nElem"/> + <Break Condition="next_block->nStart != block->nEnd + 1"/> + <Break Condition="next_block->nEnd <= 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 < SwNodes* >(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 < value_type* > (&static_cast < ByPos::node_type* > (static_cast < ByPos::node_type::trampoline* > (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 < * >"> + <DisplayString Condition="_pInterface == nullptr">empty</DisplayString> + <DisplayString>{{{reinterpret_cast < $T1 * >(_pInterface)}}}</DisplayString> + <Expand> + <ExpandedItem>reinterpret_cast < $T1 * >(_pInterface)</ExpandedItem> + </Expand> + </Type> + <Type Name="rtl::Reference < * >"> + <DisplayString Condition="m_pBody == nullptr">empty</DisplayString> + <DisplayString>{{{reinterpret_cast < $T1 * >(m_pBody)}}}</DisplayString> + <Expand> + <ExpandedItem>reinterpret_cast < $T1 * >(m_pBody)</ExpandedItem> + </Expand> + </Type> + <Type Name="VclPtr < * >"> + <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 < * >"> + <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 < nRanges'> + <Exec>nCurWhich = m_pWhichRanges.m_pairs[nCurRange].first</Exec> + <Loop Condition='nCurWhich <= 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 < 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<*>'> + <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<*>'> + <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&)*this}</DisplayString> + <Expand> + <ExpandedItem>(SwFrame&)(*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&)*this,view(min)}}}</DisplayString> + <DisplayString>{(SwFrame&)*this}</DisplayString> + <Expand> + <ExpandedItem>(SwLayoutFrame&)(*this)</ExpandedItem> + </Expand> + </Type> + <Type Name="SwTabFrame"> + <DisplayString Condition="m_pPrecede">{{Follow {(SwFrame&)*this,view(min)}}}</DisplayString> + <DisplayString>{(SwFrame&)*this}</DisplayString> + <Expand> + <ExpandedItem>(SwLayoutFrame&)(*this)</ExpandedItem> + </Expand> + </Type> + <Type Name="boost::optional<*>"> + <DisplayString Condition="!m_initialized">Optional not set</DisplayString> + <DisplayString>{*reinterpret_cast<$T1 *>(m_storage.dummy_.data)}</DisplayString> + <Expand> + <Item Name="initialized">m_initialized</Item> + <Item Name="data">*reinterpret_cast<$T1 *>(m_storage.dummy_.data)</Item> + </Expand> + </Type> + <Type Name="ErrCode"> + <DisplayString Condition="m_value == 0">None</DisplayString> + <DisplayString IncludeView="dynamic" Condition="m_value & (31UL << 26)">dynamic: {(m_value >> 26) & 31UL} </DisplayString> + <DisplayString IncludeView="dynamic"/> + <DisplayString IncludeView="detail">{{{*this,view(dynamic)}area: {static_cast<ErrCodeArea>((m_value >> 13) & 0x01fff),en}, class: {static_cast<ErrCodeClass>((m_value >> 8) & 0x1f),en}, code: {m_value & 0xff}}}</DisplayString> + <DisplayString Condition="m_value & 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: */ |