From 6aef1b70c70a0b4060659f8798568157a0c8b520 Mon Sep 17 00:00:00 2001 From: Yixun Lan Date: Thu, 1 Dec 2022 19:35:49 +0800 Subject: app-office/libreoffice: import 7.3.7.2 from portage tree Signed-off-by: Yixun Lan --- app-office/libreoffice/Manifest | 4 +- .../libreoffice-7.2.6.2-poppler-22.03.0.patch | 33 - ...Add-missing-nSize-set-for-Poppler-22.04.0.patch | 31 - ...t-FreeBSD-patch-for-Poppler-22.04.0-build.patch | 78 - .../files/libreoffice-7.3.6.2-riscv64.patch | 1964 -------------------- app-office/libreoffice/libreoffice-7.3.6.2.ebuild | 661 ------- app-office/libreoffice/libreoffice-7.3.7.2.ebuild | 655 +++++++ 7 files changed, 657 insertions(+), 2769 deletions(-) delete mode 100644 app-office/libreoffice/files/libreoffice-7.2.6.2-poppler-22.03.0.patch delete mode 100644 app-office/libreoffice/files/libreoffice-7.3.3.2-Add-missing-nSize-set-for-Poppler-22.04.0.patch delete mode 100644 app-office/libreoffice/files/libreoffice-7.3.3.2-Import-FreeBSD-patch-for-Poppler-22.04.0-build.patch delete mode 100644 app-office/libreoffice/files/libreoffice-7.3.6.2-riscv64.patch delete mode 100644 app-office/libreoffice/libreoffice-7.3.6.2.ebuild create mode 100644 app-office/libreoffice/libreoffice-7.3.7.2.ebuild diff --git a/app-office/libreoffice/Manifest b/app-office/libreoffice/Manifest index e41d0f5..691b425 100644 --- a/app-office/libreoffice/Manifest +++ b/app-office/libreoffice/Manifest @@ -18,7 +18,7 @@ DIST eeb2c7ddf0d302fba4bfc6e97eac9624-libbase-1.1.6.zip 427800 BLAKE2B d3ac085a3 DIST f94d9870737518e3b597f9265f4e9803-libserializer-1.1.6.zip 211919 BLAKE2B 2c72493e44d3ad1714d294fb7baaa85d33fef2eb4ce75bf507b65f78f1d9d399bb5eb72cee188a8abc4b234eb2845a26755791fb3ac104ffe6e55013ab41ca8b SHA512 c1a15ebbfe817ec79d4b3f1c97d096bf8511737d7d35d97302856ccfb3de14a1cd16bd31000415d9ab24bbd9ef770d37855cee4b819ff0e8fca2f2766920a114 DIST libcmis-0.5.2.tar.xz 484404 BLAKE2B 7de242393c28fc8289bb598b34e704eb2affaaa8b9e470e10044dbfd3812391f29e1421df8d7ac3869955698ddbc9575feebcfbac27bb074a60ccc0527dca1c3 SHA512 295ab15115e75b1f6074f17d3538afe0de9b2b77ab454f5c63cb05e8df11886d82942fbf21ba01486052e3f6c75b0636b99d8e660cd3472dc4b87c31d3cd557b DIST libreoffice-7.3.5.2-patchset-01.tar.xz 12700 BLAKE2B 353f6552d31616dfeb32287173bbd70366045ec437c8735e701bff357032f5ef2358920c5d8495142551116999b034db6611a72536edf14fe13ea9cace3a931c SHA512 dbd8b4b494159845efbe9ad76d5822188b9868aff8ef488793f4e2b0f2f0290942322651e8b53dd71db81cba559e3510732801d0c643cb2af9526cb1e1837891 -DIST libreoffice-7.3.6.2.tar.xz 256616324 BLAKE2B 52456e529ae2898101824882f124a5b039a1dfb98fd77dfceef39a41a3af871123c56b83a73d0aaf92e1cea57f35af442ca0a17814a1374538a9495ac601cee0 SHA512 8f61e9c09b344cf120bc6f9463344b28644e52738360ddeb1a29d9d2294d24132b070902a089531869e11487f5a7153fc4752e6636af7ef57269d23c8187ec86 +DIST libreoffice-7.3.7.2.tar.xz 256653492 BLAKE2B aa3e096ba46d6e23b0e6439a435a6d75fdc9da309885a28d96dc5a4fc05d854a8e4f633d9f4d623af18f6a80ca036409fb26b9a9843fb9a18144468b58ef5ad4 SHA512 f7b6279f5ef9f5ad8290d2bdf4fd54f8df7775a21094ba762dbd9299effab31d4f2c6dff9f4b3d9c5673596931df1d16b195474b547007bfc9a396c47e5e181c DIST libreoffice-branding-gentoo-0.8.tar.xz 151568 BLAKE2B f03c7ddeb53c5ca3fd23401679601fcf2c4037ba17be4eb7b784c7ce7ebb71a24b8ab4aac8b7da8c6b1f14dd23bc1294ba85ff4f70ad271fb4ee3c5372e10883 SHA512 785031a699b1d1895ce4b50ffc3ddf645f3a0ef9acdf37facfd18cf75db9484cb8f53a50abb63d6006ead76a80b6ff5aa99661063245ebb84bd64013d713de7f -DIST libreoffice-help-7.3.6.2.tar.xz 112209384 BLAKE2B 629a9dae6464adb33ed4494df8cbf59305a686b0bab21d55e3c139b87c5e3eee3e77ef1f22be84973d6e51a1ffb74aa74fd7f91b82223b2e3cc6d3bc900e7305 SHA512 7a98e8d3b146638bdb608d86b617bb45ff2649957ad9391aadfbb32fb18a4c8d15675bd24076dbb2b635569bfdab988f7cac461cfe04e53b3febfb2aa35d6189 +DIST libreoffice-help-7.3.7.2.tar.xz 112210852 BLAKE2B 3a3148d6ff9c743c97c0371290b3264f8e9eb8eb5aba3176b2e88f296abc2856f364866ba6ebb9f6364b5c98255c8593d23e3d54db6bcc27eecde53ac9a1b393 SHA512 c223ee49626e36b11a86c077001efc27ca2df9aa10ddb068e04c8ab8a0ea1942ca71b97c2f7379bf856ba7d12a5ca94f2fd8d8058703e2276af3595b75049030 DIST skia-m97-a7230803d64ae9d44f4e1282444801119a3ae967.tar.xz 11826600 BLAKE2B 2985ba0318fd72ac216fda33c6961eaa8ee649d2a850eb736accbd91fbc9cee7dc4e5752b2696a35204770a188412e2ecd0cc128cec324c682f9bc35e68358b3 SHA512 fbf5cfef66991565dbad928091a4e795a5b5b79a1e062a98ab9135b9972827de703c449507957294e7471c422c2e2ed239d6df61ffb9b9581a9ca3d848687a76 diff --git a/app-office/libreoffice/files/libreoffice-7.2.6.2-poppler-22.03.0.patch b/app-office/libreoffice/files/libreoffice-7.2.6.2-poppler-22.03.0.patch deleted file mode 100644 index be4a399..0000000 --- a/app-office/libreoffice/files/libreoffice-7.2.6.2-poppler-22.03.0.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 001ec0e10616a3a55fa7898bb68c983e94b7ce66 Mon Sep 17 00:00:00 2001 -From: foutrelis -Date: Wed, 2 Mar 2022 12:58:09 +0000 -Subject: [PATCH] upgpkg: libreoffice-fresh 7.3.0-7: poppler 22.03.0 rebuild - -diff --git a/sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx b/sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx -index ad6320139..e5f6d9c68 100644 ---- a/sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx -+++ b/sdext/source/pdfimport/xpdfwrapper/wrapper_gpl.cxx -@@ -138,6 +138,15 @@ int main(int argc, char **argv) - _setmode( _fileno( g_binary_out ), _O_BINARY ); - #endif - -+#if POPPLER_CHECK_VERSION(22, 3, 0) -+ PDFDoc aDoc( std::make_unique(pFileName), -+ GooString(pOwnerPasswordStr), -+ GooString(pUserPasswordStr) ); -+ -+ PDFDoc aErrDoc( std::make_unique(pErrFileName), -+ GooString(pOwnerPasswordStr), -+ GooString(pUserPasswordStr) ); -+#else - PDFDoc aDoc( pFileName, - pOwnerPasswordStr, - pUserPasswordStr ); -@@ -145,6 +154,7 @@ int main(int argc, char **argv) - PDFDoc aErrDoc( pErrFileName, - pOwnerPasswordStr, - pUserPasswordStr ); -+#endif - - // Check various permissions for aDoc. - PDFDoc &rDoc = aDoc.isOk()? aDoc: aErrDoc; diff --git a/app-office/libreoffice/files/libreoffice-7.3.3.2-Add-missing-nSize-set-for-Poppler-22.04.0.patch b/app-office/libreoffice/files/libreoffice-7.3.3.2-Add-missing-nSize-set-for-Poppler-22.04.0.patch deleted file mode 100644 index 22de747..0000000 --- a/app-office/libreoffice/files/libreoffice-7.3.3.2-Add-missing-nSize-set-for-Poppler-22.04.0.patch +++ /dev/null @@ -1,31 +0,0 @@ -https://bugs.gentoo.org/843311 - -From: Sam James -Date: Sun, 8 May 2022 21:22:49 +0000 -Subject: [PATCH] Add missing nSize set for Poppler 22.04.0 - -Thanks-to: Stephan Hartmann ---- a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx -+++ b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx -@@ -478,6 +478,10 @@ int PDFOutDev::parseFont( long long nNewId, GfxFont* gfxFont, const GfxState* st - char* pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef(), &nSize ); - #else - std::optional> pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef() ); -+ if( pBuf ) -+ { -+ nSize = pBuf->size(); -+ } - #endif - if( pBuf ) - { -@@ -502,6 +506,10 @@ void PDFOutDev::writeFontFile( GfxFont* gfxFont ) const - char* pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef(), &nSize ); - #else - std::optional> pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef() ); -+ if( pBuf ) -+ { -+ nSize = pBuf->size(); -+ } - #endif - if( !pBuf ) - return; diff --git a/app-office/libreoffice/files/libreoffice-7.3.3.2-Import-FreeBSD-patch-for-Poppler-22.04.0-build.patch b/app-office/libreoffice/files/libreoffice-7.3.3.2-Import-FreeBSD-patch-for-Poppler-22.04.0-build.patch deleted file mode 100644 index 39cb13b..0000000 --- a/app-office/libreoffice/files/libreoffice-7.3.3.2-Import-FreeBSD-patch-for-Poppler-22.04.0-build.patch +++ /dev/null @@ -1,78 +0,0 @@ -https://bugs.gentoo.org/843311 -https://cgit.freebsd.org/ports/commit/?id=d9b5ef800dbd0366eae81b03bfa89689ec73c6f7 - -(sam: adapt version check to 22.4.0) - -From: Sam James -Date: Sun, 8 May 2022 21:20:25 +0000 -Subject: [PATCH 1/2] Import FreeBSD patch for Poppler 22.04.0 build - ---- a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx -+++ b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx -@@ -474,11 +474,17 @@ int PDFOutDev::parseFont( long long nNewId, GfxFont* gfxFont, const GfxState* st - { - // TODO(P3): Unfortunately, need to read stream twice, since - // we must write byte count to stdout before -+#if !POPPLER_CHECK_VERSION(22, 4, 0) - char* pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef(), &nSize ); -+#else -+ std::optional> pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef() ); -+#endif - if( pBuf ) - { - aNewFont.isEmbedded = true; -+#if !POPPLER_CHECK_VERSION(22, 4, 0) - gfree(pBuf); -+#endif - } - } - -@@ -492,21 +498,32 @@ void PDFOutDev::writeFontFile( GfxFont* gfxFont ) const - return; - - int nSize = 0; -- char* pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef(), &nSize ); -+#if !POPPLER_CHECK_VERSION(22, 4, 0) -+ char* pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef(), &nSize ); -+#else -+ std::optional> pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef() ); -+#endif - if( !pBuf ) - return; - - // ---sync point--- see SYNC STREAMS above - fflush(stdout); -- -+#if !POPPLER_CHECK_VERSION(22, 4, 0) - if( fwrite(pBuf, sizeof(char), nSize, g_binary_out) != static_cast(nSize) ) -+#else -+ if( fwrite(reinterpret_cast(pBuf.value().data()), sizeof(char), nSize, g_binary_out) != static_cast(nSize) ) -+#endif - { -- gfree(pBuf); -+#if !POPPLER_CHECK_VERSION(22, 4, 0) -+ gfree(pBuf); -+#endif - exit(1); // error - } - // ---sync point--- see SYNC STREAMS above - fflush(g_binary_out); -- gfree(pBuf); -+#if !POPPLER_CHECK_VERSION(22, 4, 0) -+ gfree(pBuf); -+#endif - } - - #if POPPLER_CHECK_VERSION(0, 83, 0) -@@ -759,7 +776,11 @@ void PDFOutDev::updateFont(GfxState *state) - { - assert(state); - -+#if !POPPLER_CHECK_VERSION(22, 4, 0) - GfxFont *gfxFont = state->getFont(); -+#else -+ GfxFont *gfxFont = state->getFont().get(); -+#endif - if( !gfxFont ) - return; - diff --git a/app-office/libreoffice/files/libreoffice-7.3.6.2-riscv64.patch b/app-office/libreoffice/files/libreoffice-7.3.6.2-riscv64.patch deleted file mode 100644 index 0937fbe..0000000 --- a/app-office/libreoffice/files/libreoffice-7.3.6.2-riscv64.patch +++ /dev/null @@ -1,1964 +0,0 @@ -Subject: [PATCH] libreoffice-riscv64 - -https://gerrit.libreoffice.org/c/core/+/137445 - ---- - bridges/Library_cpp_uno.mk | 9 + - .../cpp_uno/gcc3_linux_riscv64/call.hxx | 35 + - .../source/cpp_uno/gcc3_linux_riscv64/call.s | 72 ++ - .../cpp_uno/gcc3_linux_riscv64/cpp2uno.cxx | 723 ++++++++++++++++++ - .../cpp_uno/gcc3_linux_riscv64/except.cxx | 297 +++++++ - .../cpp_uno/gcc3_linux_riscv64/share.hxx | 89 +++ - .../cpp_uno/gcc3_linux_riscv64/uno2cpp.cxx | 595 ++++++++++++++ - configure.ac | 10 +- - jvmfwk/inc/vendorbase.hxx | 2 + - solenv/gbuild/platform/LINUX_RISCV64_GCC.mk | 15 + - 10 files changed, 1845 insertions(+), 2 deletions(-) - create mode 100644 bridges/source/cpp_uno/gcc3_linux_riscv64/call.hxx - create mode 100644 bridges/source/cpp_uno/gcc3_linux_riscv64/call.s - create mode 100644 bridges/source/cpp_uno/gcc3_linux_riscv64/cpp2uno.cxx - create mode 100644 bridges/source/cpp_uno/gcc3_linux_riscv64/except.cxx - create mode 100644 bridges/source/cpp_uno/gcc3_linux_riscv64/share.hxx - create mode 100644 bridges/source/cpp_uno/gcc3_linux_riscv64/uno2cpp.cxx - create mode 100644 solenv/gbuild/platform/LINUX_RISCV64_GCC.mk - -diff --git a/bridges/Library_cpp_uno.mk b/bridges/Library_cpp_uno.mk -index a76d2b8..ce27a7e 100644 ---- a/bridges/Library_cpp_uno.mk -+++ b/bridges/Library_cpp_uno.mk -@@ -120,6 +120,15 @@ bridge_noopt_objects := cpp2uno uno2cpp - bridge_exception_objects := except - endif - -+else ifeq ($(CPUNAME),RISCV64) -+ -+ifneq ($(filter LINUX,$(OS)),) -+bridges_SELECTED_BRIDGE := gcc3_linux_riscv64 -+bridge_asm_objects := call -+bridge_noopt_objects := cpp2uno uno2cpp -+bridge_exception_objects := except -+endif -+ - else ifeq ($(CPUNAME),POWERPC) - - ifneq ($(filter DRAGONFLY FREEBSD LINUX NETBSD OPENBSD,$(OS)),) -diff --git a/bridges/source/cpp_uno/gcc3_linux_riscv64/call.hxx b/bridges/source/cpp_uno/gcc3_linux_riscv64/call.hxx -new file mode 100644 -index 0000000..dc84d56 ---- /dev/null -+++ b/bridges/source/cpp_uno/gcc3_linux_riscv64/call.hxx -@@ -0,0 +1,35 @@ -+/* -*- 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/. -+ * -+ * This file incorporates work covered by the following license notice: -+ * -+ * Licensed to the Apache Software Foundation (ASF) under one or more -+ * contributor license agreements. See the NOTICE file distributed -+ * with this work for additional information regarding copyright -+ * ownership. The ASF licenses this file to you under the Apache -+ * License, Version 2.0 (the "License"); you may not use this file -+ * except in compliance with the License. You may obtain a copy of -+ * the License at http://www.apache.org/licenses/LICENSE-2.0 . -+ */ -+ -+#pragma once -+ -+#include -+ -+#include -+ -+namespace { -+ -+ extern "C" typelib_TypeClass cpp_vtable_call( -+ sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset, -+ void ** gpreg, void ** fpreg, void ** ovrflw, -+ sal_uInt64 * pRegisterReturn /* space for register return */ ); -+ -+} -+ -+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/bridges/source/cpp_uno/gcc3_linux_riscv64/call.s b/bridges/source/cpp_uno/gcc3_linux_riscv64/call.s -new file mode 100644 -index 0000000..2bddfc1 ---- /dev/null -+++ b/bridges/source/cpp_uno/gcc3_linux_riscv64/call.s -@@ -0,0 +1,72 @@ -+/* -+ * This file is part of the LibreOffice project. -+ * -+ * This Source Code Form is subject to the terms of the Mozilla Public -+ * License, v. 2.0. If a copy of the MPL was not distributed with this -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. -+ * -+ * This file incorporates work covered by the following license notice: -+ * -+ * Licensed to the Apache Software Foundation (ASF) under one or more -+ * contributor license agreements. See the NOTICE file distributed -+ * with this work for additional information regarding copyright -+ * ownership. The ASF licenses this file to you under the Apache -+ * License, Version 2.0 (the "License"); you may not use this file -+ * except in compliance with the License. You may obtain a copy of -+ * the License at http://www.apache.org/licenses/LICENSE-2.0 . -+ */ -+// https://cgit.freedesktop.org/libreoffice/core/tree/bridges/source/cpp_uno/gcc3_linux_mips64/call.s -+ -+ .text -+ .align 2 -+ .global privateSnippetExecutor -+ .hidden privateSnippetExecutor -+ .type privateSnippetExecutor, %function -+privateSnippetExecutor: -+ .cfi_startproc -+ addi sp,sp,-160 -+ .cfi_def_cfa_offset 160 -+ sd ra,152(sp) -+ .cfi_offset 1, -8 -+ fsd fa0,80(sp) -+ fsd fa1,88(sp) -+ fsd fa2,96(sp) -+ fsd fa3,104(sp) -+ fsd fa4,112(sp) -+ fsd fa5,120(sp) -+ fsd fa6,128(sp) -+ fsd fa7,136(sp) -+ sd a0,16(sp) -+ sd a1,24(sp) -+ sd a2,32(sp) -+ sd a3,40(sp) -+ sd a4,48(sp) -+ sd a5,56(sp) -+ sd a6,64(sp) -+ sd a7,72(sp) -+ // a0 = functionIndex -+ // a1 = vtableOffset -+ // a2 = gpreg -+ // a3 = fpreg -+ // a4 = overflw -+ // a5 = pRegisterReturn -+ add a0,t4,zero -+ add a1,t5,zero -+ addi a2,sp,16 -+ addi a3,sp,80 -+ addi a4,sp,160 -+ add a5,sp,zero -+ // jump to cpp_vtable_call -+ jalr ra,t6,0 -+ ld a0,0(sp) -+ ld a1,8(sp) -+ fld fa0,0(sp) -+ fld fa1,8(sp) -+ ld ra,152(sp) -+ .cfi_restore 1 -+ addi sp,sp,160 -+ .cfi_def_cfa_offset 0 -+ jalr zero,ra,0 -+ .cfi_endproc -+ .size privateSnippetExecutor, .-privateSnippetExecutor -+ .section .note.GNU-stack, "", @progbits -\ No newline at end of file -diff --git a/bridges/source/cpp_uno/gcc3_linux_riscv64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_riscv64/cpp2uno.cxx -new file mode 100644 -index 0000000..4ee41ab ---- /dev/null -+++ b/bridges/source/cpp_uno/gcc3_linux_riscv64/cpp2uno.cxx -@@ -0,0 +1,723 @@ -+/* -*- 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/. -+ * -+ * This file incorporates work covered by the following license notice: -+ * -+ * Licensed to the Apache Software Foundation (ASF) under one or more -+ * contributor license agreements. See the NOTICE file distributed -+ * with this work for additional information regarding copyright -+ * ownership. The ASF licenses this file to you under the Apache -+ * License, Version 2.0 (the "License"); you may not use this 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 -+#include -+#include -+#include -+#include -+#include "bridge.hxx" -+#include "cppinterfaceproxy.hxx" -+#include "types.hxx" -+#include "vtablefactory.hxx" -+#include "call.hxx" -+#include "share.hxx" -+ -+#include -+#include -+ -+using namespace com::sun::star::uno; -+ -+//#define BRDEBUG -+ -+#ifdef BRDEBUG -+#include -+#include -+using namespace ::std; -+using namespace ::osl; -+using namespace ::rtl; -+#endif -+ -+namespace CPPU_CURRENT_NAMESPACE -+{ -+ bool is_complex_struct(const typelib_TypeDescription * type) -+ { -+ const typelib_CompoundTypeDescription * p -+ = reinterpret_cast< const typelib_CompoundTypeDescription * >(type); -+ for (sal_Int32 i = 0; i < p->nMembers; ++i) -+ { -+ if (p->ppTypeRefs[i]->eTypeClass == typelib_TypeClass_STRUCT || -+ p->ppTypeRefs[i]->eTypeClass == typelib_TypeClass_EXCEPTION) -+ { -+ typelib_TypeDescription * t = 0; -+ TYPELIB_DANGER_GET(&t, p->ppTypeRefs[i]); -+ bool b = is_complex_struct(t); -+ TYPELIB_DANGER_RELEASE(t); -+ if (b) { -+ return true; -+ } -+ } -+ else if (!bridges::cpp_uno::shared::isSimpleType(p->ppTypeRefs[i]->eTypeClass)) -+ return true; -+ } -+ if (p->pBaseTypeDescription != 0) -+ return is_complex_struct(&p->pBaseTypeDescription->aBase); -+ return false; -+ } -+ -+ bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef ) -+ { -+ if (bridges::cpp_uno::shared::isSimpleType(pTypeRef)) -+ return false; -+ else if (pTypeRef->eTypeClass == typelib_TypeClass_STRUCT || -+ pTypeRef->eTypeClass == typelib_TypeClass_EXCEPTION) -+ { -+ typelib_TypeDescription * pTypeDescr = 0; -+ TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef ); -+ -+ //A Composite Type not larger than 16 bytes is returned in up to two GPRs -+ bool bRet = pTypeDescr->nSize > 16 || is_complex_struct(pTypeDescr); -+ -+ TYPELIB_DANGER_RELEASE( pTypeDescr ); -+ return bRet; -+ } -+ return true; -+ } -+} -+ -+namespace -+{ -+ -+ static typelib_TypeClass cpp2uno_call( -+ bridges::cpp_uno::shared::CppInterfaceProxy * pThis, -+ const typelib_TypeDescription * pMemberTypeDescr, -+ typelib_TypeDescriptionReference * pReturnTypeRef, // 0 indicates void return -+ sal_Int32 nParams, typelib_MethodParameter * pParams, -+ void ** gpreg, void ** fpreg, void ** ovrflw, -+ sal_uInt64 * pRegisterReturn /* space for register return */ ) -+ { -+ /* Most MIPS ABIs view the arguments as a struct, of which the -+ first N words go in registers and the rest go on the stack. If I < N, the -+ With word might go in With integer argument register or the With -+ floating-point one. For these ABIs, we only need to remember the number -+ of words passed so far. We are interested only in n64 ABI,so it is the -+ case. -+ */ -+ unsigned int nREG = 0; -+ -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:begin\n"); -+#endif -+ // return -+ typelib_TypeDescription * pReturnTypeDescr = 0; -+ if (pReturnTypeRef) -+ TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef ); -+ -+ void * pUnoReturn = 0; -+ void * pCppReturn = 0; // complex return ptr: if != 0 && != pUnoReturn, reconversion need -+ -+ if (pReturnTypeDescr) -+ { -+ if (CPPU_CURRENT_NAMESPACE::return_in_hidden_param( pReturnTypeRef ) ) -+ { -+ pCppReturn = gpreg[nREG]; // complex return via ptr (pCppReturn) -+ nREG++; -+ -+ pUnoReturn = ( bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr ) -+ ? alloca( pReturnTypeDescr->nSize ) -+ : pCppReturn); // direct way -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:complexreturn\n"); -+#endif -+ } -+ else -+ { -+ pUnoReturn = pRegisterReturn; // direct way for simple types -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:simplereturn\n"); -+#endif -+ } -+ } -+ -+ // pop this -+ nREG++; -+ -+ // stack space -+ static_assert(sizeof(void *) == sizeof(sal_Int64), "### unexpected size!"); -+ // parameters -+ void ** pUnoArgs = (void **)alloca( 4 * sizeof(void *) * nParams ); -+ void ** pCppArgs = pUnoArgs + nParams; -+ // indices of values this have to be converted (interface conversion cpp<=>uno) -+ sal_Int32 * pTempIndices = (sal_Int32 *)(pUnoArgs + (2 * nParams)); -+ // type descriptions for reconversions -+ typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pUnoArgs + (3 * nParams)); -+ -+ sal_Int32 nTempIndices = 0; -+ -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:nParams=%d\n", nParams); -+#endif -+ for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos ) -+ { -+ const typelib_MethodParameter & rParam = pParams[nPos]; -+ -+ typelib_TypeDescription * pParamTypeDescr = 0; -+ TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef ); -+ -+ if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) // value -+ { -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:Param %u, type %u\n", nPos, pParamTypeDescr->eTypeClass); -+#endif -+ switch (pParamTypeDescr->eTypeClass) -+ { -+ case typelib_TypeClass_FLOAT: -+ case typelib_TypeClass_DOUBLE: -+ if (nREG < MAX_FP_REGS) { -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:fpr=%p\n", fpreg[nREG]); -+#endif -+ pCppArgs[nPos] = &(fpreg[nREG]); -+ pUnoArgs[nPos] = &(fpreg[nREG]); -+ } else { -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:fpr=%p\n", ovrflw[nREG - MAX_FP_REGS]); -+#endif -+ pCppArgs[nPos] = &(ovrflw[nREG - MAX_FP_REGS]); -+ pUnoArgs[nPos] = &(ovrflw[nREG - MAX_FP_REGS]); -+ } -+ nREG++; -+ break; -+ -+ -+ default: -+ if (nREG < MAX_GP_REGS) { -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:gpr=%p\n", gpreg[nREG]); -+#endif -+ pCppArgs[nPos] = &(gpreg[nREG]); -+ pUnoArgs[nPos] = &(gpreg[nREG]); -+ } else { -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:gpr=%p\n", ovrflw[nREG - MAX_GP_REGS]); -+#endif -+ pCppArgs[nPos] = &(ovrflw[nREG - MAX_GP_REGS]); -+ pUnoArgs[nPos] = &(ovrflw[nREG - MAX_GP_REGS]); -+ } -+ nREG++; -+ break; -+ -+ } -+ // no longer needed -+ TYPELIB_DANGER_RELEASE( pParamTypeDescr ); -+ } -+ else // ptr to complex value | ref -+ { -+#ifdef BRDEBUG -+ fprintf(stdout,"cpp2uno_call:ptr|ref\n"); -+#endif -+ void *pCppStack; -+ if (nREG < MAX_GP_REGS) { -+ pCppArgs[nPos] = pCppStack = gpreg[nREG]; -+ } else { -+ pCppArgs[nPos] = pCppStack = ovrflw[nREG - MAX_GP_REGS]; -+ } -+ nREG++; -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:pCppStack=%p\n", pCppStack); -+#endif -+ -+ if (! rParam.bIn) // is pure out -+ { -+ // uno out is unconstructed mem! -+ pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ); -+ pTempIndices[nTempIndices] = nPos; -+ // will be released at reconversion -+ ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr; -+ } -+ // is in/inout -+ else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr )) -+ { -+ uno_copyAndConvertData( pUnoArgs[nPos] = alloca( pParamTypeDescr->nSize ), -+ pCppStack, pParamTypeDescr, -+ pThis->getBridge()->getCpp2Uno() ); -+ pTempIndices[nTempIndices] = nPos; // has to be reconverted -+ // will be released at reconversion -+ ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr; -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:related to interface,%p,%d,pUnoargs[%d]=%p\n", -+ pCppStack, pParamTypeDescr->nSize, nPos, pUnoArgs[nPos]); -+#endif -+ } -+ else // direct way -+ { -+ pUnoArgs[nPos] = pCppStack; -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call:direct,pUnoArgs[%d]=%p\n", nPos, pUnoArgs[nPos]); -+#endif -+ // no longer needed -+ TYPELIB_DANGER_RELEASE( pParamTypeDescr ); -+ } -+ } -+ } -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call2,%p,unoargs=%p\n", pThis->getUnoI()->pDispatcher, pUnoArgs); -+#endif -+ -+ // ExceptionHolder -+ uno_Any aUnoExc; // Any will be constructed by callee -+ uno_Any * pUnoExc = &aUnoExc; -+ -+ // invoke uno dispatch call -+ (*pThis->getUnoI()->pDispatcher)( pThis->getUnoI(), pMemberTypeDescr, pUnoReturn, pUnoArgs, &pUnoExc ); -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp2uno_call2,after dispatch\n"); -+#endif -+ -+ // in case an exception occurred... -+ if (pUnoExc) -+ { -+ fflush(stdout); -+ // destruct temporary in/inout params -+ for ( ; nTempIndices--; ) -+ { -+ sal_Int32 nIndex = pTempIndices[nTempIndices]; -+ -+ if (pParams[nIndex].bIn) // is in/inout => was constructed -+ uno_destructData( pUnoArgs[nIndex], ppTempParamTypeDescr[nTempIndices], 0 ); -+ TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndices] ); -+ } -+ if (pReturnTypeDescr) -+ TYPELIB_DANGER_RELEASE( pReturnTypeDescr ); -+ -+ CPPU_CURRENT_NAMESPACE::raiseException( &aUnoExc, pThis->getBridge()->getUno2Cpp() ); -+ // has to destruct the any -+ // is here for dummy -+ return typelib_TypeClass_VOID; -+ } -+ else // else no exception occurred... -+ { -+ // temporary params -+ for ( ; nTempIndices--; ) -+ { -+ sal_Int32 nIndex = pTempIndices[nTempIndices]; -+ typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndices]; -+ -+ if (pParams[nIndex].bOut) // inout/out -+ { -+ // convert and assign -+ uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release ); -+ uno_copyAndConvertData( pCppArgs[nIndex], pUnoArgs[nIndex], pParamTypeDescr, -+ pThis->getBridge()->getUno2Cpp() ); -+ } -+ // destroy temp uno param -+ uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 ); -+ -+ TYPELIB_DANGER_RELEASE( pParamTypeDescr ); -+ } -+ // return -+ if (pCppReturn) // has complex return -+ { -+ if (pUnoReturn != pCppReturn) // needs reconversion -+ { -+ uno_copyAndConvertData( pCppReturn, pUnoReturn, pReturnTypeDescr, -+ pThis->getBridge()->getUno2Cpp() ); -+ // destroy temp uno return -+ uno_destructData( pUnoReturn, pReturnTypeDescr, 0 ); -+ } -+ // complex return ptr is set to return reg -+ *(void **)pRegisterReturn = pCppReturn; -+ } -+ if (pReturnTypeDescr) -+ { -+ typelib_TypeClass eRet = (typelib_TypeClass)pReturnTypeDescr->eTypeClass; -+ TYPELIB_DANGER_RELEASE( pReturnTypeDescr ); -+ return eRet; -+ } -+ else -+ return typelib_TypeClass_VOID; -+ } -+ } -+ -+ -+ /** -+ * is called on incoming vtable calls -+ * (called by asm snippets) -+ */ -+ typelib_TypeClass cpp_vtable_call( -+ sal_Int32 nFunctionIndex, -+ sal_Int32 nVtableOffset, -+ void ** gpreg, void ** fpreg, void ** ovrflw, -+ sal_uInt64 * pRegisterReturn /* space for register return */ ) -+ { -+ static_assert( sizeof(sal_Int64)==sizeof(void *), "### unexpected!" ); -+ -+#ifdef BRDEBUG -+ fprintf(stdout, "in cpp_vtable_call nFunctionIndex is %d\n", nFunctionIndex); -+ fprintf(stdout, "in cpp_vtable_call nVtableOffset is %d\n", nVtableOffset); -+ fprintf(stdout, "in cpp_vtable_call gp=%p, fp=%p, ov=%p\n", gpreg, fpreg, ovrflw); -+#endif -+ -+ // gpreg: [ret *], this, [other gpr params] -+ // fpreg: [fpr params] -+ // ovrflw: [gpr or fpr params (properly aligned)] -+ void * pThis; -+ if (nFunctionIndex & 0x80000000 ) -+ { -+ nFunctionIndex &= 0x7fffffff; -+ pThis = gpreg[1]; -+ } -+ else -+ { -+ pThis = gpreg[0]; -+ } -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp_vtable_call, pThis=%p, nFunctionIndex=%d, nVtableOffset=%d\n", -+ pThis, nFunctionIndex, nVtableOffset); -+#endif -+ -+ pThis = static_cast< char * >(pThis) - nVtableOffset; -+ bridges::cpp_uno::shared::CppInterfaceProxy * pCppI = -+ bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy( pThis ); -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp_vtable_call, pCppI=%p\n", pCppI); -+#endif -+ -+ typelib_InterfaceTypeDescription * pTypeDescr = pCppI->getTypeDescr(); -+ -+ if (nFunctionIndex >= pTypeDescr->nMapFunctionIndexToMemberIndex) -+ { -+ SAL_WARN( -+ "bridges", -+ "illegal " << OUString::unacquired(&pTypeDescr->aBase.pTypeName) -+ << " vtable index " << nFunctionIndex << "/" -+ << pTypeDescr->nMapFunctionIndexToMemberIndex); -+ throw RuntimeException( -+ ("illegal " + OUString::unacquired(&pTypeDescr->aBase.pTypeName) -+ + " vtable index " + OUString::number(nFunctionIndex) + "/" -+ + OUString::number(pTypeDescr->nMapFunctionIndexToMemberIndex)), -+ (XInterface *)pThis); -+ } -+ -+ // determine called method -+ sal_Int32 nMemberPos = pTypeDescr->pMapFunctionIndexToMemberIndex[nFunctionIndex]; -+ assert(nMemberPos < pTypeDescr->nAllMembers); -+ -+ TypeDescription aMemberDescr( pTypeDescr->ppAllMembers[nMemberPos] ); -+ -+#ifdef BRDEBUG -+ //OString cstr( OUStringToOString( aMemberDescr.get()->pTypeName, RTL_TEXTENCODING_ASCII_US ) ); -+ //fprintf(stdout, "calling %s, nFunctionIndex=%d\n", cstr.getStr(), nFunctionIndex ); -+#endif -+ typelib_TypeClass eRet; -+ switch (aMemberDescr.get()->eTypeClass) -+ { -+ case typelib_TypeClass_INTERFACE_ATTRIBUTE: -+ { -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp_vtable_call interface attribute\n"); -+#endif -+ typelib_TypeDescriptionReference *pAttrTypeRef = -+ reinterpret_cast( aMemberDescr.get() )->pAttributeTypeRef; -+ -+ if (pTypeDescr->pMapMemberIndexToFunctionIndex[nMemberPos] == nFunctionIndex) -+ { -+ // is GET method -+ eRet = cpp2uno_call( pCppI, aMemberDescr.get(), pAttrTypeRef, -+ 0, 0, // no params -+ gpreg, fpreg, ovrflw, pRegisterReturn ); -+ } -+ else -+ { -+ // is SET method -+ typelib_MethodParameter aParam; -+ aParam.pTypeRef = pAttrTypeRef; -+ aParam.bIn = sal_True; -+ aParam.bOut = sal_False; -+ -+ eRet = cpp2uno_call( pCppI, aMemberDescr.get(), -+ 0, // indicates void return -+ 1, &aParam, -+ gpreg, fpreg, ovrflw, pRegisterReturn ); -+ } -+ break; -+ } -+ case typelib_TypeClass_INTERFACE_METHOD: -+ { -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp_vtable_call interface method\n"); -+#endif -+ // is METHOD -+ switch (nFunctionIndex) -+ { -+ case 1: // acquire() -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp_vtable_call method acquire\n"); -+#endif -+ pCppI->acquireProxy(); // non virtual call! -+ eRet = typelib_TypeClass_VOID; -+ break; -+ case 2: // release() -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp_vtable_call method release\n"); -+#endif -+ pCppI->releaseProxy(); // non virtual call! -+ eRet = typelib_TypeClass_VOID; -+ break; -+ case 0: // queryInterface() opt -+ { -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp_vtable_call method query interface opt\n"); -+#endif -+ typelib_TypeDescription * pTD = 0; -+ TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( gpreg[2] )->getTypeLibType() ); -+ if (pTD) -+ { -+ XInterface * pInterface = 0; -+ (*pCppI->getBridge()->getCppEnv()->getRegisteredInterface) -+ ( pCppI->getBridge()->getCppEnv(), -+ (void **)&pInterface, -+ pCppI->getOid().pData, -+ reinterpret_cast( pTD ) ); -+ -+ if (pInterface) -+ { -+ ::uno_any_construct( reinterpret_cast< uno_Any * >( gpreg[0] ), -+ &pInterface, pTD, cpp_acquire ); -+ -+ pInterface->release(); -+ TYPELIB_DANGER_RELEASE( pTD ); -+ -+ reinterpret_cast( pRegisterReturn )[0] = gpreg[0]; -+ eRet = typelib_TypeClass_ANY; -+ break; -+ } -+ TYPELIB_DANGER_RELEASE( pTD ); -+ } -+ } // else perform queryInterface() -+ default: -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp_vtable_call method query interface\n"); -+#endif -+ typelib_InterfaceMethodTypeDescription *pMethodTD = -+ reinterpret_cast( aMemberDescr.get() ); -+ -+ eRet = cpp2uno_call( pCppI, aMemberDescr.get(), -+ pMethodTD->pReturnTypeRef, -+ pMethodTD->nParams, -+ pMethodTD->pParams, -+ gpreg, fpreg, ovrflw, pRegisterReturn ); -+ } -+ break; -+ } -+ default: -+ { -+#ifdef BRDEBUG -+ fprintf(stdout, "cpp_vtable_call no member\n"); -+#endif -+ throw RuntimeException( "no member description found!", (XInterface *)pThis ); -+ } -+ } -+ -+ return eRet; -+ } -+ -+ extern "C" void privateSnippetExecutor( ... ); -+ -+ int const codeSnippetSize = 0x6c; -+ -+ unsigned char * codeSnippet( unsigned char * code, -+ sal_Int32 functionIndex, sal_Int32 vtableOffset, -+ bool bHasHiddenParam ) -+ { -+#ifdef BRDEBUG -+ fprintf(stdout,"in codeSnippet functionIndex is %d\n", functionIndex); -+ fprintf(stdout,"in codeSnippet vtableOffset is %d\n", vtableOffset); -+ fprintf(stdout,"in codeSnippet privateSnippetExecutor is %lx\n", (unsigned long)privateSnippetExecutor); -+ fprintf(stdout,"in codeSnippet cpp_vtable_call is %lx\n", (unsigned long)cpp_vtable_call); -+ -+ fflush(stdout); -+#endif -+ -+ if ( bHasHiddenParam ) -+ functionIndex |= 0x80000000; -+ -+ unsigned int * p = (unsigned int *) code; -+ -+ assert((((unsigned long)code) & 0x3) == 0 ); //aligned to 4 otherwise a mistake -+ -+ /* generate this code */ -+ /* -+ # load functionIndex to t4 -+ 00000eb7 lui t4,0x0 -+ 000eee93 ori t4,t4,0x0 -+ # load privateSnippetExecutor to t0 -+ 000002b7 lui t0,0x0 -+ 02429293 slli t0,t0,36 -+ 00000337 lui t1,0x0 -+ 01431313 slli t1,t1,20 -+ 0062e2b3 or t0,t0,t1 -+ 00000337 lui t1,0x0 -+ 00431313 slli t1,t1,4 -+ 0062e2b3 or t0,t0,t1 -+ 00000337 lui t1,0x0 -+ 00c35313 srli t1,t1,12 -+ 0062e2b3 or t0,t0,t1 -+ # load cpp_vtable_call to t6 -+ 00000fb7 lui t6,0x0 -+ 024f9f93 slli t6,t6,36 -+ 00000337 lui t1,0x0 -+ 01431313 slli t1,t1,20 -+ 006fefb3 or t6,t6,t1 -+ 00000337 lui t1,0x0 -+ 00431313 slli t1,t1,4 -+ 006fefb3 or t6,t6,t1 -+ 00000337 lui t1,0x0 -+ 00c35313 srli t1,t1,12 -+ 006fefb3 or t6,t6,t1 -+ # load vtableOffset to t5 -+ 00000f37 lui t5,0x0 -+ 000f6f13 ori t5,t5,0x0 -+ # jump to privateSnippetExecutor -+ 00028067 jalr zero,t0,0x0 -+ */ -+ -+ * p++ = 0x00000eb7 | ((functionIndex) & 0xfffff000); -+ * p++ = 0x000eee93 | ((functionIndex << 20 ) & 0xfff00000); -+ -+ // load privateSnippetExecutor to t0 -+ unsigned long functionEntry = ((unsigned long)privateSnippetExecutor); -+ * p++ = 0x000002b7 | ((functionEntry >> 36) & 0x000000000ffff000); -+ * p++ = 0x02429293; -+ * p++ = 0x00000337 | ((functionEntry >> 20) & 0x000000000ffff000); -+ * p++ = 0x01431313; -+ * p++ = 0x0062e2b3; -+ * p++ = 0x00000337 | ((functionEntry >> 4) & 0x000000000ffff000); -+ * p++ = 0x00431313; -+ * p++ = 0x0062e2b3; -+ * p++ = 0x00000337 | ((functionEntry << 12) & 0x000000000ffff000); -+ * p++ = 0x00c35313; -+ * p++ = 0x0062e2b3; -+ // load cpp_vtable_call to t6 -+ functionEntry = (unsigned long) cpp_vtable_call; -+ * p++ = 0x00000fb7 | ((functionEntry >> 36) & 0x000000000ffff000); -+ * p++ = 0x024f9f93; -+ * p++ = 0x00000337 | ((functionEntry >> 20) & 0x000000000ffff000); -+ * p++ = 0x01431313; -+ * p++ = 0x006fefb3; -+ * p++ = 0x00000337 | ((functionEntry >> 4) & 0x000000000ffff000); -+ * p++ = 0x00431313; -+ * p++ = 0x006fefb3; -+ * p++ = 0x00000337 | ((functionEntry << 12) & 0x000000000ffff000); -+ * p++ = 0x00c35313; -+ * p++ = 0x006fefb3; -+ // load vtableOffset to t5 -+ * p++ = 0x00000f37 | ((vtableOffset) & 0xfffff000); -+ * p++ = 0x000f6f13 | ((vtableOffset << 20 ) & 0xfff00000); -+ // jump to privateSnippetExecutor -+ * p++ = 0x00028067; -+ return (code + codeSnippetSize); -+ -+ } -+ -+} -+ -+ -+void bridges::cpp_uno::shared::VtableFactory::flushCode(unsigned char const *bptr, unsigned char const *eptr) -+{ -+ asm volatile( -+ "fence"::: -+ ); -+} -+ -+struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; }; -+ -+bridges::cpp_uno::shared::VtableFactory::Slot * -+bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block) -+{ -+ return static_cast< Slot * >(block) + 2; -+} -+ -+ -+std::size_t bridges::cpp_uno::shared::VtableFactory::getBlockSize( -+ sal_Int32 slotCount) -+{ -+ return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize; -+} -+ -+bridges::cpp_uno::shared::VtableFactory::Slot * -+bridges::cpp_uno::shared::VtableFactory::initializeBlock( -+ void * block, sal_Int32 slotCount, sal_Int32, -+ typelib_InterfaceTypeDescription *) -+{ -+ Slot * slots = mapBlockToVtable(block); -+ slots[-2].fn = 0; //null -+ slots[-1].fn = 0; //destructor -+ return slots + slotCount; -+} -+ -+unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( -+ Slot ** slots, unsigned char * code, sal_PtrDiff writetoexecdiff, -+ typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset, -+ sal_Int32 functionCount, sal_Int32 vtableOffset) -+{ -+ (*slots) -= functionCount; -+ Slot * s = *slots; -+ -+#ifdef BRDEBUG -+ fprintf(stdout, "in addLocalFunctions functionOffset is %d\n", functionOffset); -+ fprintf(stdout, "in addLocalFunctions vtableOffset is %d\n", vtableOffset); -+ fprintf(stdout, "nMembers=%d\n", type->nMembers); -+ fflush(stdout); -+#endif -+ -+ for (sal_Int32 i = 0; i < type->nMembers; ++i) { -+ typelib_TypeDescription * member = 0; -+ TYPELIB_DANGER_GET(&member, type->ppMembers[i]); -+ assert(member != 0); -+ switch (member->eTypeClass) { -+ case typelib_TypeClass_INTERFACE_ATTRIBUTE: -+ // Getter: -+ (s++)->fn = code + writetoexecdiff; -+ code = codeSnippet( -+ code, functionOffset++, vtableOffset, -+ CPPU_CURRENT_NAMESPACE::return_in_hidden_param( -+ reinterpret_cast< -+ typelib_InterfaceAttributeTypeDescription * >( -+ member)->pAttributeTypeRef)); -+ -+ // Setter: -+ if (!reinterpret_cast< -+ typelib_InterfaceAttributeTypeDescription * >( -+ member)->bReadOnly) -+ { -+ (s++)->fn = code + writetoexecdiff; -+ code = codeSnippet(code, functionOffset++, vtableOffset, false); -+ } -+ break; -+ -+ case typelib_TypeClass_INTERFACE_METHOD: -+ (s++)->fn = code + writetoexecdiff; -+ code = codeSnippet( -+ code, functionOffset++, vtableOffset, -+ CPPU_CURRENT_NAMESPACE::return_in_hidden_param( -+ reinterpret_cast< -+ typelib_InterfaceMethodTypeDescription * >( -+ member)->pReturnTypeRef)); -+ break; -+ -+ default: -+ assert(false); -+ break; -+ } -+ TYPELIB_DANGER_RELEASE(member); -+ } -+ return code; -+} -+ -+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/bridges/source/cpp_uno/gcc3_linux_riscv64/except.cxx b/bridges/source/cpp_uno/gcc3_linux_riscv64/except.cxx -new file mode 100644 -index 0000000..e37e5d8 ---- /dev/null -+++ b/bridges/source/cpp_uno/gcc3_linux_riscv64/except.cxx -@@ -0,0 +1,297 @@ -+/* -*- 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/. -+ * -+ * This file incorporates work covered by the following license notice: -+ * -+ * Licensed to the Apache Software Foundation (ASF) under one or more -+ * contributor license agreements. See the NOTICE file distributed -+ * with this work for additional information regarding copyright -+ * ownership. The ASF licenses this file to you under the Apache -+ * License, Version 2.0 (the "License"); you may not use this 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 -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include -+#include "share.hxx" -+ -+using namespace ::std; -+using namespace ::osl; -+using namespace ::com::sun::star::uno; -+using namespace ::__cxxabiv1; -+ -+//#define BRIDGES_DEBUG -+ -+namespace CPPU_CURRENT_NAMESPACE -+{ -+ -+void dummy_can_throw_anything( char const * ) -+{ -+} -+ -+static OUString toUNOname( char const * p ) -+{ -+#if defined BRIDGES_DEBUG -+ char const * start = p; -+#endif -+ -+ // example: N3com3sun4star4lang24IllegalArgumentExceptionE -+ -+ OUStringBuffer buf( 64 ); -+ assert( 'N' == *p ); -+ ++p; // skip N -+ -+ while ('E' != *p) -+ { -+ // read chars count -+ long n = (*p++ - '0'); -+ while ('0' <= *p && '9' >= *p) -+ { -+ n *= 10; -+ n += (*p++ - '0'); -+ } -+ buf.appendAscii( p, n ); -+ p += n; -+ if ('E' != *p) -+ buf.append( '.' ); -+ } -+ -+#if defined BRIDGES_DEBUG -+ OUString ret( buf.makeStringAndClear() ); -+ OString c_ret( OUStringToOString( ret, RTL_TEXTENCODING_ASCII_US ) ); -+ fprintf( stderr, "> toUNOname(): %s => %s\n", start, c_ret.getStr() ); -+ return ret; -+#else -+ return buf.makeStringAndClear(); -+#endif -+} -+ -+class RTTI -+{ -+ typedef std::unordered_map< OUString, type_info * > t_rtti_map; -+ -+ Mutex m_mutex; -+ t_rtti_map m_rttis; -+ t_rtti_map m_generatedRttis; -+ -+ void * m_hApp; -+ -+public: -+ RTTI(); -+ ~RTTI(); -+ -+ type_info * getRTTI( typelib_CompoundTypeDescription * ); -+}; -+ -+RTTI::RTTI() -+ : m_hApp( dlopen( 0, RTLD_LAZY ) ) -+{ -+} -+ -+RTTI::~RTTI() -+{ -+ dlclose( m_hApp ); -+} -+ -+ -+type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) -+{ -+ type_info * rtti; -+ -+ OUString const & unoName = *(OUString const *)&pTypeDescr->aBase.pTypeName; -+ -+ MutexGuard guard( m_mutex ); -+ t_rtti_map::const_iterator iRttiFind( m_rttis.find( unoName ) ); -+ if (iRttiFind == m_rttis.end()) -+ { -+ // RTTI symbol -+ OStringBuffer buf( 64 ); -+ buf.append( "_ZTIN" ); -+ sal_Int32 index = 0; -+ do -+ { -+ OUString token( unoName.getToken( 0, '.', index ) ); -+ buf.append( token.getLength() ); -+ OString c_token( OUStringToOString( token, RTL_TEXTENCODING_ASCII_US ) ); -+ buf.append( c_token ); -+ } -+ while (index >= 0); -+ buf.append( 'E' ); -+ -+ OString symName( buf.makeStringAndClear() ); -+ rtti = (type_info *)dlsym( m_hApp, symName.getStr() ); -+ -+ if (rtti) -+ { -+ pair< t_rtti_map::iterator, bool > insertion( -+ m_rttis.insert( t_rtti_map::value_type( unoName, rtti ) ) ); -+ assert(insertion.second && "### inserting new rtti failed?!"); -+ } -+ else -+ { -+ // try to lookup the symbol in the generated rtti map -+ t_rtti_map::const_iterator iFind( m_generatedRttis.find( unoName ) ); -+ if (iFind == m_generatedRttis.end()) -+ { -+ // we must generate it ! -+ // symbol and rtti-name is nearly identical, -+ // the symbol is prefixed with _ZTI -+ char const * rttiName = symName.getStr() +4; -+#if defined BRIDGES_DEBUG -+ fprintf( stderr,"generated rtti for %s\n", rttiName ); -+#endif -+ if (pTypeDescr->pBaseTypeDescription) -+ { -+ // ensure availability of base -+ type_info * base_rtti = getRTTI( -+ (typelib_CompoundTypeDescription *)pTypeDescr->pBaseTypeDescription ); -+ rtti = new __si_class_type_info( -+ strdup( rttiName ), (__class_type_info *)base_rtti ); -+ } -+ else -+ { -+ // this class has no base class -+ rtti = new __class_type_info( strdup( rttiName ) ); -+ } -+ -+ pair< t_rtti_map::iterator, bool > insertion( -+ m_generatedRttis.insert( t_rtti_map::value_type( unoName, rtti ) ) ); -+ assert(insertion.second && "### inserting new generated rtti failed?!"); -+ } -+ else // taking already generated rtti -+ { -+ rtti = iFind->second; -+ } -+ } -+ } -+ else -+ { -+ rtti = iRttiFind->second; -+ } -+ -+ return rtti; -+} -+ -+ -+static void deleteException( void * pExc ) -+{ -+ fprintf( stderr, "in deleteException: pExc = %p\n",pExc ); -+ __cxa_exception const * header = ((__cxa_exception const *)pExc - 1); -+ typelib_TypeDescription * pTD = 0; -+ OUString unoName( toUNOname( header->exceptionType->name() ) ); -+ ::typelib_typedescription_getByName( &pTD, unoName.pData ); -+ assert(pTD && "### unknown exception type! leaving out destruction => leaking!!!"); -+ if (pTD) -+ { -+ ::uno_destructData( pExc, pTD, cpp_release ); -+ ::typelib_typedescription_release( pTD ); -+ } -+} -+ -+ -+ -+//extern "C" { -+// void __cxa_throw(void* ex, void* info, void (*dest)(void*)) { ::abort(); } -+//} -+ -+ -+void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ) -+{ -+#if defined BRIDGES_DEBUG -+ OString cstr( -+ OUStringToOString( -+ OUString::unacquired( &pUnoExc->pType->pTypeName ), -+ RTL_TEXTENCODING_ASCII_US ) ); -+ fprintf( stderr, "> uno exception occurred: %s\n", cstr.getStr() ); -+#endif -+ void * pCppExc; -+ type_info * rtti; -+ -+ { -+ // construct cpp exception object -+ typelib_TypeDescription * pTypeDescr = 0; -+ TYPELIB_DANGER_GET( &pTypeDescr, pUnoExc->pType ); -+ assert(pTypeDescr); -+ if (! pTypeDescr) -+ { -+ throw RuntimeException( -+ OUString("cannot get typedescription for type ") + -+ OUString::unacquired( &pUnoExc->pType->pTypeName ) ); -+ } -+ -+ pCppExc = __cxa_allocate_exception( pTypeDescr->nSize ); -+ ::uno_copyAndConvertData( pCppExc, pUnoExc->pData, pTypeDescr, pUno2Cpp ); -+ -+ // destruct uno exception -+ ::uno_any_destruct( pUnoExc, 0 ); -+ // avoiding locked counts -+ static RTTI rtti_data; -+ rtti = (type_info*)rtti_data.getRTTI((typelib_CompoundTypeDescription*)pTypeDescr); -+ TYPELIB_DANGER_RELEASE( pTypeDescr ); -+ assert(rtti && "### no rtti for throwing exception!"); -+ if (! rtti) -+ { -+ throw RuntimeException( -+ OUString("no rtti for type ") + -+ OUString::unacquired( &pUnoExc->pType->pTypeName ) ); -+ } -+ } -+ __cxa_throw( pCppExc, rtti, deleteException ); -+} -+ -+void fillUnoException(uno_Any * pUnoExc, uno_Mapping * pCpp2Uno) -+{ -+ __cxa_exception * header = __cxa_get_globals()->caughtExceptions; -+ if (! header) -+ { -+ RuntimeException aRE( "no exception header!" ); -+ Type const & rType = cppu::UnoType::get(); -+ uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno ); -+ SAL_WARN("bridges", aRE.Message); -+ return; -+ } -+ -+ std::type_info *exceptionType = __cxa_current_exception_type(); -+ -+ typelib_TypeDescription * pExcTypeDescr = 0; -+ OUString unoName( toUNOname( exceptionType->name() ) ); -+#if defined BRIDGES_DEBUG -+ OString cstr_unoName( OUStringToOString( unoName, RTL_TEXTENCODING_ASCII_US ) ); -+ fprintf( stderr, "> c++ exception occurred: %s\n", cstr_unoName.getStr() ); -+#endif -+ typelib_typedescription_getByName( &pExcTypeDescr, unoName.pData ); -+ if (0 == pExcTypeDescr) -+ { -+ RuntimeException aRE( OUString("exception type not found: ") + unoName ); -+ Type const & rType = cppu::UnoType::get(); -+ uno_type_any_constructAndConvert( pUnoExc, &aRE, rType.getTypeLibType(), pCpp2Uno ); -+ SAL_WARN("bridges", aRE.Message); -+ } -+ else -+ { -+ // construct uno exception any -+ uno_any_constructAndConvert( pUnoExc, header->adjustedPtr, pExcTypeDescr, pCpp2Uno ); -+ typelib_typedescription_release( pExcTypeDescr ); -+ } -+} -+ -+} -+ -+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/bridges/source/cpp_uno/gcc3_linux_riscv64/share.hxx b/bridges/source/cpp_uno/gcc3_linux_riscv64/share.hxx -new file mode 100644 -index 0000000..ee2235e ---- /dev/null -+++ b/bridges/source/cpp_uno/gcc3_linux_riscv64/share.hxx -@@ -0,0 +1,89 @@ -+/* -*- 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/. -+ * -+ * This file incorporates work covered by the following license notice: -+ * -+ * Licensed to the Apache Software Foundation (ASF) under one or more -+ * contributor license agreements. See the NOTICE file distributed -+ * with this work for additional information regarding copyright -+ * ownership. The ASF licenses this file to you under the Apache -+ * License, Version 2.0 (the "License"); you may not use this file -+ * except in compliance with the License. You may obtain a copy of -+ * the License at http://www.apache.org/licenses/LICENSE-2.0 . -+ */ -+#pragma once -+ -+#include "uno/mapping.h" -+ -+#include -+#include -+#include -+ -+#define MAX_GP_REGS (8) -+#define MAX_FP_REGS (8) -+ -+namespace CPPU_CURRENT_NAMESPACE -+{ -+ -+ void dummy_can_throw_anything( char const * ); -+ -+ -+// ----- following decl from libstdc++-v3/libsupc++/unwind-cxx.h and unwind.h -+ -+struct _Unwind_Exception -+{ -+ unsigned exception_class __attribute__((__mode__(__DI__))); -+ void * exception_cleanup; -+ unsigned private_1 __attribute__((__mode__(__word__))); -+ unsigned private_2 __attribute__((__mode__(__word__))); -+} __attribute__((__aligned__)); -+ -+struct __cxa_exception -+{ -+ std::type_info *exceptionType; -+ void (*exceptionDestructor)(void *); -+ -+ void (*unexpectedHandler)(); // std::unexpected_handler dropped from C++17 -+ std::terminate_handler terminateHandler; -+ -+ __cxa_exception *nextException; -+ -+ int handlerCount; -+ -+ int handlerSwitchValue; -+ const unsigned char *actionRecord; -+ const unsigned char *languageSpecificData; -+ void *catchTemp; -+ void *adjustedPtr; -+ -+ _Unwind_Exception unwindHeader; -+}; -+ -+extern "C" void *__cxa_allocate_exception( -+ std::size_t thrown_size ) throw(); -+extern "C" void __cxa_throw ( -+ void *thrown_exception, std::type_info *tinfo, void (*dest) (void *) ) __attribute__((noreturn)); -+ -+struct __cxa_eh_globals -+{ -+ __cxa_exception *caughtExceptions; -+ unsigned int uncaughtExceptions; -+}; -+ -+extern "C" __cxa_eh_globals *__cxa_get_globals () throw(); -+extern "C" std::type_info *__cxa_current_exception_type() throw(); -+ -+void raiseException( -+ uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ); -+ -+void fillUnoException(uno_Any *, uno_Mapping * pCpp2Uno); -+ -+bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef ); -+} -+ -+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/bridges/source/cpp_uno/gcc3_linux_riscv64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_riscv64/uno2cpp.cxx -new file mode 100644 -index 0000000..cae7507 ---- /dev/null -+++ b/bridges/source/cpp_uno/gcc3_linux_riscv64/uno2cpp.cxx -@@ -0,0 +1,595 @@ -+/* -*- 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/. -+ * -+ * This file incorporates work covered by the following license notice: -+ * -+ * Licensed to the Apache Software Foundation (ASF) under one or more -+ * contributor license agreements. See the NOTICE file distributed -+ * with this work for additional information regarding copyright -+ * ownership. The ASF licenses this file to you under the Apache -+ * License, Version 2.0 (the "License"); you may not use this 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 -+ -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "bridge.hxx" -+#include "types.hxx" -+#include "unointerfaceproxy.hxx" -+#include "vtables.hxx" -+ -+#include "share.hxx" -+ -+//#define BRDEBUG -+#ifdef BRDEBUG -+#include -+#endif -+ -+#define INSERT_FLOAT_DOUBLE( pSV, nr, pFPR, pDS ) \ -+ if ( nr < MAX_FP_REGS ) \ -+ pFPR[nr++] = *reinterpret_cast( pSV ); \ -+ else \ -+ *pDS++ = *reinterpret_cast( pSV ); // verbatim! -+ -+#define INSERT_INT64( pSV, nr, pGPR, pDS ) \ -+ if ( nr < MAX_GP_REGS ) \ -+ pGPR[nr++] = *reinterpret_cast( pSV ); \ -+ else \ -+ *pDS++ = *reinterpret_cast( pSV ); -+ -+#define INSERT_INT32( pSV, nr, pGPR, pDS ) \ -+ if ( nr < MAX_GP_REGS ) \ -+ pGPR[nr++] = *reinterpret_cast( pSV ); \ -+ else \ -+ *pDS++ = *reinterpret_cast( pSV ); -+ -+#define INSERT_INT16( pSV, nr, pGPR, pDS ) \ -+ if ( nr < MAX_GP_REGS ) \ -+ pGPR[nr++] = *reinterpret_cast( pSV ); \ -+ else \ -+ *pDS++ = *reinterpret_cast( pSV ); -+ -+#define INSERT_UINT16( pSV, nr, pGPR, pDS ) \ -+ if ( nr < MAX_GP_REGS ) \ -+ pGPR[nr++] = *reinterpret_cast( pSV ); \ -+ else \ -+ *pDS++ = *reinterpret_cast( pSV ); -+ -+#define INSERT_INT8( pSV, nr, pGPR, pDS ) \ -+ if ( nr < MAX_GP_REGS ) \ -+ pGPR[nr++] = *reinterpret_cast( pSV ); \ -+ else \ -+ *pDS++ = *reinterpret_cast( pSV ); -+ -+using namespace ::com::sun::star::uno; -+ -+namespace -+{ -+ -+ bool isReturnInFPR(const typelib_TypeDescription * pTypeDescr, sal_uInt32 & nSize) -+ { -+ const typelib_CompoundTypeDescription *p = -+ reinterpret_cast( pTypeDescr ); -+ -+ for (sal_Int32 i = 0; i < p->nMembers; ++i) -+ { -+ typelib_TypeDescriptionReference *pTypeInStruct = p->ppTypeRefs[ i ]; -+ -+ switch (pTypeInStruct->eTypeClass) -+ { -+ case typelib_TypeClass_STRUCT: -+ case typelib_TypeClass_EXCEPTION: -+ { -+ typelib_TypeDescription * t = 0; -+ TYPELIB_DANGER_GET(&t, pTypeInStruct); -+ bool isFPR = isReturnInFPR(t, nSize); -+ TYPELIB_DANGER_RELEASE(t); -+ if (!isFPR) -+ return false; -+ } -+ break; -+ case typelib_TypeClass_FLOAT: -+ case typelib_TypeClass_DOUBLE: -+ if (nSize >= 16) -+ return false; -+ nSize += 8; -+ break; -+ default: -+ return false; -+ } -+ } -+ return true; -+ } -+ -+ void fillReturn(const typelib_TypeDescription * pTypeDescr, -+ sal_Int64 * gret, double * fret, void * pRegisterReturn) -+ { -+ sal_uInt32 nSize = 0; -+ if (isReturnInFPR(pTypeDescr, nSize)) -+ { -+ reinterpret_cast( pRegisterReturn )[0] = fret[0]; -+ reinterpret_cast( pRegisterReturn )[1] = fret[1]; -+ } -+ else -+ { -+ reinterpret_cast( pRegisterReturn )[0] = gret[0]; -+ reinterpret_cast( pRegisterReturn )[1] = gret[1]; -+ } -+ } -+ -+ static void callVirtualMethod( -+ void * pAdjustedThisPtr, -+ sal_Int32 nVtableIndex, -+ void * pRegisterReturn, -+ typelib_TypeDescriptionReference * pReturnTypeRef, -+ bool bSimpleReturn, -+ sal_uInt64 *pStack, -+ sal_uInt32 nStack, -+ sal_uInt64 *pGPR, -+ double *pFPR, -+ sal_uInt32 nREG) -+ { -+ // Should not happen, but... -+ static_assert(MAX_GP_REGS == MAX_FP_REGS, "must be the same size"); -+ if ( nREG > MAX_GP_REGS ) -+ nREG = MAX_GP_REGS; -+ -+ // Get pointer to method -+ sal_uInt64 pMethod = *((sal_uInt64 *)pAdjustedThisPtr); -+ pMethod += 8 * nVtableIndex; -+ void *mfunc = (void *) *((sal_uInt64 *)pMethod); -+#ifdef BRDEBUG -+ fprintf(stdout, "calling function %p\n", mfunc); -+#endif -+ -+ // Load parameters to stack, if necessary -+ sal_uInt64* pCallStack = NULL; -+ if ( nStack ) -+ { -+ // 16-bytes aligned -+ sal_uInt32 nStackBytes = ( ( nStack + 1 ) >> 1 ) * 16; -+ pCallStack = (sal_uInt64 *) __builtin_alloca( nStackBytes ); -+ std::memcpy( pCallStack, pStack, nStackBytes ); -+ } -+ -+ sal_Int64 gret[2]; -+ double fret[2]; -+ asm volatile ( -+ //".set push \n\t" -+ //".set riscv64 \n\t" -+ // Fill the general purpose registers -+ "ld a0, 0(%[gpr]) \n\t" -+ "ld a1, 8(%[gpr]) \n\t" -+ "ld a2, 16(%[gpr]) \n\t" -+ "ld a3, 24(%[gpr]) \n\t" -+ "ld a4, 32(%[gpr]) \n\t" -+ "ld a5, 40(%[gpr]) \n\t" -+ "ld a6, 48(%[gpr]) \n\t" -+ "ld a7, 56(%[gpr]) \n\t" -+ // Fill the floating pointer registers -+ "fld fa0, 0(%[fpr]) \n\t" -+ "fld fa1, 8(%[fpr]) \n\t" -+ "fld fa2, 16(%[fpr]) \n\t" -+ "fld fa3, 24(%[fpr]) \n\t" -+ "fld fa4, 32(%[fpr]) \n\t" -+ "fld fa5, 40(%[fpr]) \n\t" -+ "fld fa6, 48(%[fpr]) \n\t" -+ "fld fa7, 56(%[fpr]) \n\t" -+ // Perform the call -+ "jalr ra,%[mfunc],0 \n\t" -+ // Fill the return values -+ "add %[gret1], a0,zero \n\t" -+ "add %[gret2], a1,zero \n\t" -+ "fcvt.d.l ft7,zero \n\t" -+ "fadd.d %[fret1], fa0,ft7 \n\t" -+ "fadd.d %[fret2], fa1,ft7 \n\t" -+ //".set pop \n\t" -+ :[gret1]"=r"(gret[0]), [gret2]"=r"(gret[1]), -+ [fret1]"=f"(fret[0]), [fret2]"=f"(fret[1]) -+ :[gpr]"r"(pGPR), [fpr]"r"(pFPR), [mfunc]"r"(mfunc), -+ [stack]"m"(pCallStack) // dummy input to prevent the compiler from optimizing the alloca out -+ :"a0", "a1", "a2", "a3", "a4", "a5", "a6","a7", -+ "ra", -+ "fa0", "fa1", "fa2", "fa3", "fa4", "fa5", "fa6","fa7", "memory", -+ "ft7" -+ ); -+ -+ switch (pReturnTypeRef->eTypeClass) -+ { -+ case typelib_TypeClass_HYPER: -+ case typelib_TypeClass_UNSIGNED_HYPER: -+ case typelib_TypeClass_LONG: -+ case typelib_TypeClass_UNSIGNED_LONG: -+ case typelib_TypeClass_ENUM: -+ case typelib_TypeClass_CHAR: -+ case typelib_TypeClass_SHORT: -+ case typelib_TypeClass_UNSIGNED_SHORT: -+ case typelib_TypeClass_BOOLEAN: -+ case typelib_TypeClass_BYTE: -+ *reinterpret_cast( pRegisterReturn ) = gret[0]; -+ break; -+ case typelib_TypeClass_FLOAT: -+ case typelib_TypeClass_DOUBLE: -+ *reinterpret_cast( pRegisterReturn ) = fret[0]; -+ break; -+ case typelib_TypeClass_STRUCT: -+ case typelib_TypeClass_EXCEPTION: -+ { -+ sal_Int32 const nRetSize = pReturnTypeRef->pType->nSize; -+ if (bSimpleReturn && nRetSize <= 16 && nRetSize > 0) -+ { -+ typelib_TypeDescription * pTypeDescr = 0; -+ TYPELIB_DANGER_GET( &pTypeDescr, pReturnTypeRef ); -+ fillReturn(pTypeDescr, gret, fret, pRegisterReturn); -+ TYPELIB_DANGER_RELEASE( pTypeDescr ); -+ } -+ break; -+ } -+ default: -+#ifdef BRDEBUG -+ fprintf(stdout,"unhandled return type %u\n", pReturnTypeRef->eTypeClass); -+#endif -+ break; -+ } -+ } -+ -+ -+ static void cpp_call( -+ bridges::cpp_uno::shared::UnoInterfaceProxy * pThis, -+ bridges::cpp_uno::shared::VtableSlot aVtableSlot, -+ typelib_TypeDescriptionReference * pReturnTypeRef, -+ sal_Int32 nParams, typelib_MethodParameter * pParams, -+ void * pUnoReturn, void * pUnoArgs[], uno_Any ** ppUnoExc ) -+ { -+ // max space for: [complex ret ptr], values|ptr ... -+ sal_uInt64 *pStack = (sal_uInt64 *)__builtin_alloca( ((nParams+3) * sizeof(sal_Int64)) ); -+ sal_uInt64 *pStackStart = pStack; -+ -+ sal_uInt64 pGPR[MAX_GP_REGS]; -+ double pFPR[MAX_FP_REGS]; -+ sal_uInt32 nREG = 0; -+ -+#ifdef BRDEBUG -+ fprintf(stdout, "in cpp_call\n"); -+#endif -+ -+ // return -+ typelib_TypeDescription * pReturnTypeDescr = 0; -+ TYPELIB_DANGER_GET( &pReturnTypeDescr, pReturnTypeRef ); -+ assert(pReturnTypeDescr); -+ -+ void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion -+ -+ bool bSimpleReturn = true; -+ if (pReturnTypeDescr) -+ { -+ if ( CPPU_CURRENT_NAMESPACE::return_in_hidden_param( pReturnTypeRef ) ) -+ { -+ bSimpleReturn = false; -+ // complex return via ptr -+ pCppReturn = bridges::cpp_uno::shared::relatesToInterfaceType( pReturnTypeDescr )? -+ __builtin_alloca( pReturnTypeDescr->nSize ) : pUnoReturn; -+ INSERT_INT64( &pCppReturn, nREG, pGPR, pStack ); -+ } -+ else -+ { -+ pCppReturn = pUnoReturn; // direct way for simple types -+ } -+ } -+ -+ // push this -+ void* pAdjustedThisPtr = reinterpret_cast< void **>( pThis->getCppI() ) + aVtableSlot.offset; -+ INSERT_INT64( &pAdjustedThisPtr, nREG, pGPR, pStack ); -+ -+ // args -+ void ** pCppArgs = (void **)alloca( 3 * sizeof(void *) * nParams ); -+ // indices of values this have to be converted (interface conversion cpp<=>uno) -+ sal_Int32 * pTempIndices = (sal_Int32 *)(pCppArgs + nParams); -+ // type descriptions for reconversions -+ typelib_TypeDescription ** ppTempParamTypeDescr = (typelib_TypeDescription **)(pCppArgs + (2 * nParams)); -+ -+ sal_Int32 nTempIndices = 0; -+ -+ for ( sal_Int32 nPos = 0; nPos < nParams; ++nPos ) -+ { -+ const typelib_MethodParameter & rParam = pParams[nPos]; -+ typelib_TypeDescription * pParamTypeDescr = 0; -+ TYPELIB_DANGER_GET( &pParamTypeDescr, rParam.pTypeRef ); -+ -+ if (!rParam.bOut && bridges::cpp_uno::shared::isSimpleType( pParamTypeDescr )) -+ { -+ uno_copyAndConvertData( pCppArgs[nPos] = alloca( 8 ), pUnoArgs[nPos], pParamTypeDescr, -+ pThis->getBridge()->getUno2Cpp() ); -+ -+ switch (pParamTypeDescr->eTypeClass) -+ { -+ case typelib_TypeClass_LONG: -+ case typelib_TypeClass_UNSIGNED_LONG: -+ INSERT_INT64( pCppArgs[nPos], nREG, pGPR, pStack ); -+ break; -+ case typelib_TypeClass_ENUM: -+ INSERT_INT32( pCppArgs[nPos], nREG, pGPR, pStack ); -+ break; -+ case typelib_TypeClass_CHAR: -+ case typelib_TypeClass_SHORT: -+ INSERT_INT16( pCppArgs[nPos], nREG, pGPR, pStack ); -+ break; -+ case typelib_TypeClass_UNSIGNED_SHORT: -+ INSERT_UINT16( pCppArgs[nPos], nREG, pGPR, pStack ); -+ break; -+ case typelib_TypeClass_BOOLEAN: -+ case typelib_TypeClass_BYTE: -+ INSERT_INT8( pCppArgs[nPos], nREG, pGPR, pStack ); -+ break; -+ case typelib_TypeClass_FLOAT: -+ case typelib_TypeClass_DOUBLE: -+ INSERT_FLOAT_DOUBLE( pCppArgs[nPos], nREG, pFPR, pStack ); -+ break; -+ case typelib_TypeClass_HYPER: -+ case typelib_TypeClass_UNSIGNED_HYPER: -+ INSERT_INT64( pCppArgs[nPos], nREG, pGPR, pStack ); -+ break; -+ default: -+ break; -+ } -+ -+ // no longer needed -+ TYPELIB_DANGER_RELEASE( pParamTypeDescr ); -+ } -+ else // ptr to complex value | ref -+ { -+ if (! rParam.bIn) // is pure out -+ { -+ // cpp out is constructed mem, uno out is not! -+ uno_constructData( -+ pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ), -+ pParamTypeDescr ); -+ pTempIndices[nTempIndices] = nPos; // default constructed for cpp call -+ // will be released at reconversion -+ ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr; -+ } -+ // is in/inout -+ else if (bridges::cpp_uno::shared::relatesToInterfaceType( pParamTypeDescr )) -+ { -+ uno_copyAndConvertData( -+ pCppArgs[nPos] = alloca( pParamTypeDescr->nSize ), -+ pUnoArgs[nPos], pParamTypeDescr, pThis->getBridge()->getUno2Cpp() ); -+ -+ pTempIndices[nTempIndices] = nPos; // has to be reconverted -+ // will be released at reconversion -+ ppTempParamTypeDescr[nTempIndices++] = pParamTypeDescr; -+ } -+ else // direct way -+ { -+ pCppArgs[nPos] = pUnoArgs[nPos]; -+ // no longer needed -+ TYPELIB_DANGER_RELEASE( pParamTypeDescr ); -+ } -+ INSERT_INT64( &(pCppArgs[nPos]), nREG, pGPR, pStack ); -+ } -+ } -+ -+ try -+ { -+ try { -+ callVirtualMethod( -+ pAdjustedThisPtr, aVtableSlot.index, -+ pCppReturn, pReturnTypeRef, bSimpleReturn, -+ pStackStart, ( pStack - pStackStart ), -+ pGPR, pFPR, nREG); -+ } catch (css::uno::Exception &) { -+ throw; -+ } catch (std::exception & e) { -+ throw css::uno::RuntimeException( -+ "C++ code threw " + o3tl::runtimeToOUString(typeid(e).name()) + ": " -+ + o3tl::runtimeToOUString(e.what())); -+ } catch (...) { -+ throw css::uno::RuntimeException("C++ code threw unknown exception"); -+ } -+ // NO exception occurred... -+ *ppUnoExc = 0; -+ -+ // reconvert temporary params -+ for ( ; nTempIndices--; ) -+ { -+ sal_Int32 nIndex = pTempIndices[nTempIndices]; -+ typelib_TypeDescription * pParamTypeDescr = ppTempParamTypeDescr[nTempIndices]; -+ -+ if (pParams[nIndex].bIn) -+ { -+ if (pParams[nIndex].bOut) // inout -+ { -+ uno_destructData( pUnoArgs[nIndex], pParamTypeDescr, 0 ); // destroy uno value -+ uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr, -+ pThis->getBridge()->getCpp2Uno() ); -+ } -+ } -+ else // pure out -+ { -+ uno_copyAndConvertData( pUnoArgs[nIndex], pCppArgs[nIndex], pParamTypeDescr, -+ pThis->getBridge()->getCpp2Uno() ); -+ } -+ // destroy temp cpp param => cpp: every param was constructed -+ uno_destructData( pCppArgs[nIndex], pParamTypeDescr, cpp_release ); -+ -+ TYPELIB_DANGER_RELEASE( pParamTypeDescr ); -+ } -+ // return value -+ if (pCppReturn && pUnoReturn != pCppReturn) -+ { -+ uno_copyAndConvertData( pUnoReturn, pCppReturn, pReturnTypeDescr, -+ pThis->getBridge()->getCpp2Uno() ); -+ uno_destructData( pCppReturn, pReturnTypeDescr, cpp_release ); -+ } -+ } -+ catch (...) -+ { -+ // fill uno exception -+ CPPU_CURRENT_NAMESPACE::fillUnoException(*ppUnoExc, pThis->getBridge()->getCpp2Uno()); -+ -+ // temporary params -+ for ( ; nTempIndices--; ) -+ { -+ sal_Int32 nIndex = pTempIndices[nTempIndices]; -+ // destroy temp cpp param => cpp: every param was constructed -+ uno_destructData( pCppArgs[nIndex], ppTempParamTypeDescr[nTempIndices], cpp_release ); -+ TYPELIB_DANGER_RELEASE( ppTempParamTypeDescr[nTempIndices] ); -+ } -+ // return type -+ if (pReturnTypeDescr) -+ TYPELIB_DANGER_RELEASE( pReturnTypeDescr ); -+ } -+ } -+ -+} -+ -+ -+namespace bridges::cpp_uno::shared { -+ -+void unoInterfaceProxyDispatch( -+ uno_Interface * pUnoI, const typelib_TypeDescription * pMemberDescr, -+ void * pReturn, void * pArgs[], uno_Any ** ppException ) -+{ -+ // is my surrogate -+ bridges::cpp_uno::shared::UnoInterfaceProxy * pThis -+ = static_cast< bridges::cpp_uno::shared::UnoInterfaceProxy *> (pUnoI); -+ //typelib_InterfaceTypeDescription * pTypeDescr = pThis->pTypeDescr; -+ -+#ifdef BRDEBUG -+ fprintf(stdout, "in dispatch\n"); -+#endif -+ -+ switch (pMemberDescr->eTypeClass) -+ { -+ case typelib_TypeClass_INTERFACE_ATTRIBUTE: -+ { -+ -+ VtableSlot aVtableSlot( -+ getVtableSlot( -+ reinterpret_cast< -+ typelib_InterfaceAttributeTypeDescription const * >( -+ pMemberDescr))); -+ -+ if (pReturn) -+ { -+ // dependent dispatch -+ cpp_call( -+ pThis, aVtableSlot, -+ ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef, -+ 0, 0, // no params -+ pReturn, pArgs, ppException ); -+ } -+ else -+ { -+ // is SET -+ typelib_MethodParameter aParam; -+ aParam.pTypeRef = -+ ((typelib_InterfaceAttributeTypeDescription *)pMemberDescr)->pAttributeTypeRef; -+ aParam.bIn = sal_True; -+ aParam.bOut = sal_False; -+ -+ typelib_TypeDescriptionReference * pReturnTypeRef = 0; -+ OUString aVoidName("void"); -+ typelib_typedescriptionreference_new( -+ &pReturnTypeRef, typelib_TypeClass_VOID, aVoidName.pData ); -+ -+ // dependent dispatch -+ aVtableSlot.index += 1; //get then set method -+ cpp_call( -+ pThis, aVtableSlot, -+ pReturnTypeRef, -+ 1, &aParam, -+ pReturn, pArgs, ppException ); -+ -+ typelib_typedescriptionreference_release( pReturnTypeRef ); -+ } -+ -+ break; -+ } -+ case typelib_TypeClass_INTERFACE_METHOD: -+ { -+ -+ VtableSlot aVtableSlot( -+ getVtableSlot( -+ reinterpret_cast< -+ typelib_InterfaceMethodTypeDescription const * >( -+ pMemberDescr))); -+ switch (aVtableSlot.index) -+ { -+ // standard calls -+ case 1: // acquire uno interface -+ (*pUnoI->acquire)( pUnoI ); -+ *ppException = 0; -+ break; -+ case 2: // release uno interface -+ (*pUnoI->release)( pUnoI ); -+ *ppException = 0; -+ break; -+ case 0: // queryInterface() opt -+ { -+ typelib_TypeDescription * pTD = 0; -+ TYPELIB_DANGER_GET( &pTD, reinterpret_cast< Type * >( pArgs[0] )->getTypeLibType() ); -+ if (pTD) -+ { -+ uno_Interface * pInterface = 0; -+ (*pThis->pBridge->getUnoEnv()->getRegisteredInterface)(pThis->pBridge->getUnoEnv(), -+ (void **)&pInterface, pThis->oid.pData, -+ (typelib_InterfaceTypeDescription *)pTD ); -+ -+ if (pInterface) -+ { -+ ::uno_any_construct( -+ reinterpret_cast< uno_Any * >( pReturn ), -+ &pInterface, pTD, 0 ); -+ (*pInterface->release)( pInterface ); -+ TYPELIB_DANGER_RELEASE( pTD ); -+ *ppException = 0; -+ break; -+ } -+ TYPELIB_DANGER_RELEASE( pTD ); -+ } -+ } // else perform queryInterface() -+ default: -+ // dependent dispatch -+ cpp_call( -+ pThis, aVtableSlot, -+ ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pReturnTypeRef, -+ ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->nParams, -+ ((typelib_InterfaceMethodTypeDescription *)pMemberDescr)->pParams, -+ pReturn, pArgs, ppException ); -+ } -+ break; -+ } -+ default: -+ { -+ ::com::sun::star::uno::RuntimeException aExc( -+ "illegal member type description!", -+ ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >() ); -+ -+ Type const & rExcType = cppu::UnoType::get(); -+ // binary identical null reference -+ ::uno_type_any_construct( *ppException, &aExc, rExcType.getTypeLibType(), 0 ); -+ } -+ } -+} -+ -+} -+ -+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/configure.ac b/configure.ac -index 8c868fa..5fbd4fc 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -5085,6 +5085,12 @@ linux-gnu*|linux-musl*) - EPM_FLAGS="-a mipsel" - PLATFORMID=linux_mips_el - ;; -+ riscv64) -+ CPUNAME=RISCV64 -+ RTL_ARCH=RISCV64 -+ EPM_FLAGS="-a riscv64" -+ PLATFORMID=linux_riscv64 -+ ;; - m68k) - CPUNAME=M68K - RTL_ARCH=M68K -@@ -8411,7 +8417,7 @@ if test "$ENABLE_JAVA" != ""; then - JAVAINTERPRETER=`win_short_path_for_make "$JAVAINTERPRETER"` - elif test "$cross_compiling" != "yes"; then - case $CPUNAME in -- AARCH64|AXP|X86_64|HPPA|IA64|POWERPC64|S390X|SPARC64|GODSON64) -+ AARCH64|AXP|X86_64|HPPA|IA64|POWERPC64|S390X|SPARC64|GODSON64|RISCV64) - if test -f "$JAVAINTERPRETER" -a "`$JAVAINTERPRETER -version 2>&1 | $GREP -i 64-bit`" = "" >/dev/null; then - AC_MSG_WARN([You are building 64-bit binaries but the JDK $JAVAINTERPRETER is 32-bit]) - AC_MSG_ERROR([You should pass the --with-jdk-home option pointing to a 64-bit JDK]) -@@ -12830,7 +12836,7 @@ AC_SUBST(RHINO_JAR) - # platforms there. - supports_multilib= - case "$host_cpu" in --x86_64 | powerpc64 | powerpc64le | s390x | aarch64 | mips64 | mips64el | loongarch64) -+x86_64 | powerpc64 | powerpc64le | s390x | aarch64 | mips64 | mips64el | loongarch64 | riscv64) - if test "$SAL_TYPES_SIZEOFLONG" = "8"; then - supports_multilib="yes" - fi -diff --git a/jvmfwk/inc/vendorbase.hxx b/jvmfwk/inc/vendorbase.hxx -index c0008c5..de4647b 100644 ---- a/jvmfwk/inc/vendorbase.hxx -+++ b/jvmfwk/inc/vendorbase.hxx -@@ -59,6 +59,8 @@ OpenJDK at least, but probably not true for Lemotes JDK */ - #else - #define JFW_PLUGIN_ARCH "mips64el" - #endif -+#elif defined RISCV64 -+#define JFW_PLUGIN_ARCH "riscv64" - #elif defined S390X - #define JFW_PLUGIN_ARCH "s390x" - #elif defined S390 -diff --git a/solenv/gbuild/platform/LINUX_RISCV64_GCC.mk b/solenv/gbuild/platform/LINUX_RISCV64_GCC.mk -new file mode 100644 -index 0000000..9e00710 ---- /dev/null -+++ b/solenv/gbuild/platform/LINUX_RISCV64_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: --- -2.37.2 - diff --git a/app-office/libreoffice/libreoffice-7.3.6.2.ebuild b/app-office/libreoffice/libreoffice-7.3.6.2.ebuild deleted file mode 100644 index 2582c1b..0000000 --- a/app-office/libreoffice/libreoffice-7.3.6.2.ebuild +++ /dev/null @@ -1,661 +0,0 @@ -# Copyright 1999-2022 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -PYTHON_COMPAT=( python3_{8..11} ) -PYTHON_REQ_USE="threads(+),xml(+)" - -MY_PV="${PV/_alpha/.alpha}" -MY_PV="${MY_PV/_beta/.beta}" -# experimental ; release ; old -# Usually the tarballs are moved a lot so this should make everyone happy. -DEV_URI=" - https://dev-builds.libreoffice.org/pre-releases/src - https://download.documentfoundation.org/libreoffice/src/${MY_PV:0:5}/ - https://downloadarchive.documentfoundation.org/libreoffice/old/${MY_PV}/src -" -ADDONS_URI="https://dev-www.libreoffice.org/src/" - -BRANDING="${PN}-branding-gentoo-0.8.tar.xz" -PATCHSET="${PN}-7.3.5.2-patchset-01.tar.xz" - -[[ ${MY_PV} == *9999* ]] && inherit git-r3 -inherit autotools bash-completion-r1 check-reqs flag-o-matic java-pkg-opt-2 multiprocessing python-single-r1 qmake-utils toolchain-funcs xdg-utils - -DESCRIPTION="A full office productivity suite" -HOMEPAGE="https://www.libreoffice.org" -SRC_URI="branding? ( https://dev.gentoo.org/~dilfridge/distfiles/${BRANDING} )" -[[ -n ${PATCHSET} ]] && SRC_URI+=" https://dev.gentoo.org/~xen0n/distfiles/app-office/libreoffice/${PATCHSET}" - -# Split modules following git/tarballs; Core MUST be first! -# Help is used for the image generator -# Only release has the tarballs -if [[ ${MY_PV} != *9999* ]]; then - for i in ${DEV_URI}; do - SRC_URI+=" ${i}/${PN}-${MY_PV}.tar.xz" - SRC_URI+=" ${i}/${PN}-help-${MY_PV}.tar.xz" - done - unset i -fi -unset DEV_URI - -# Really required addons -# These are bundles that can't be removed for now due to huge patchsets. -# If you want them gone, patches are welcome. -ADDONS_SRC=( - # broken against latest upstream release, too many patches on top: - # https://github.com/tdf/libcmis/pull/43 - "${ADDONS_URI}/libcmis-0.5.2.tar.xz" - # not packaged in Gentoo, https://www.netlib.org/fp/dtoa.c - "${ADDONS_URI}/dtoa-20180411.tgz" - # not packaged in Gentoo, https://skia.org/ - "${ADDONS_URI}/skia-m97-a7230803d64ae9d44f4e1282444801119a3ae967.tar.xz" - "base? ( - ${ADDONS_URI}/commons-logging-1.2-src.tar.gz - ${ADDONS_URI}/ba2930200c9f019c2d93a8c88c651a0f-flow-engine-0.9.4.zip - ${ADDONS_URI}/d8bd5eed178db6e2b18eeed243f85aa8-flute-1.1.6.zip - ${ADDONS_URI}/eeb2c7ddf0d302fba4bfc6e97eac9624-libbase-1.1.6.zip - ${ADDONS_URI}/3bdf40c0d199af31923e900d082ca2dd-libfonts-1.1.6.zip - ${ADDONS_URI}/3404ab6b1792ae5f16bbd603bd1e1d03-libformula-1.1.7.zip - ${ADDONS_URI}/db60e4fde8dd6d6807523deb71ee34dc-liblayout-0.2.10.zip - ${ADDONS_URI}/97b2d4dba862397f446b217e2b623e71-libloader-1.1.6.zip - ${ADDONS_URI}/8ce2fcd72becf06c41f7201d15373ed9-librepository-1.1.6.zip - ${ADDONS_URI}/f94d9870737518e3b597f9265f4e9803-libserializer-1.1.6.zip - ${ADDONS_URI}/ace6ab49184e329db254e454a010f56d-libxml-1.1.7.zip - ${ADDONS_URI}/39bb3fcea1514f1369fcfc87542390fd-sacjava-1.3.zip - )" - "java? ( ${ADDONS_URI}/17410483b5b5f267aa18b7e00b65e6e0-hsqldb_1_8_0.zip )" - # no release for 8 years, should we package it? - "libreoffice_extensions_wiki-publisher? ( ${ADDONS_URI}/a7983f859eafb2677d7ff386a023bc40-xsltml_2.1.2.zip )" - # Does not build with 1.6 rhino at all - "libreoffice_extensions_scripting-javascript? ( ${ADDONS_URI}/798b2ffdc8bcfe7bca2cf92b62caf685-rhino1_5R5.zip )" - # requirement of rhino - "libreoffice_extensions_scripting-javascript? ( ${ADDONS_URI}/35c94d2df8893241173de1d16b6034c0-swingExSrc.zip )" - # not packageable - "odk? ( http://download.go-oo.org/extern/185d60944ea767075d27247c3162b3bc-unowinreg.dll )" -) -SRC_URI+=" ${ADDONS_SRC[*]}" - -unset ADDONS_URI -unset ADDONS_SRC - -# Extensions that need extra work: -LO_EXTS="nlpsolver scripting-beanshell scripting-javascript wiki-publisher" - -IUSE="accessibility base bluetooth +branding clang coinmp +cups custom-cflags +dbus debug eds firebird -googledrive gstreamer +gtk kde ldap +mariadb odk pdfimport postgres test vulkan -$(printf 'libreoffice_extensions_%s ' ${LO_EXTS})" - -REQUIRED_USE="${PYTHON_REQUIRED_USE} - base? ( firebird java ) - bluetooth? ( dbus ) - gtk? ( dbus ) - libreoffice_extensions_nlpsolver? ( java ) - libreoffice_extensions_scripting-beanshell? ( java ) - libreoffice_extensions_scripting-javascript? ( java ) - libreoffice_extensions_wiki-publisher? ( java ) -" - -RESTRICT="!test? ( test )" - -LICENSE="|| ( LGPL-3 MPL-1.1 )" -SLOT="0" - -[[ ${MY_PV} == *9999* ]] || \ -KEYWORDS="amd64 ~arm ~arm64 ~loong ~ppc64 x86 ~amd64-linux" - -COMMON_DEPEND="${PYTHON_DEPS} - app-arch/unzip - app-arch/zip - app-crypt/gpgme:=[cxx] - app-text/hunspell:= - >=app-text/libabw-0.1.0 - >=app-text/libebook-0.1 - app-text/libepubgen - >=app-text/libetonyek-0.1 - app-text/libexttextcat - app-text/liblangtag - >=app-text/libmspub-0.1.0 - >=app-text/libmwaw-0.3.1 - >=app-text/libnumbertext-1.0.6 - >=app-text/libodfgen-0.1.0 - app-text/libqxp - app-text/libstaroffice - app-text/libwpd:0.10[tools] - app-text/libwpg:0.3 - >=app-text/libwps-0.4 - app-text/mythes - dev-cpp/abseil-cpp:= - >=dev-cpp/clucene-2.3.3.4-r2 - >=dev-cpp/libcmis-0.5.2 - dev-db/unixODBC - dev-lang/perl - dev-libs/boost:=[nls] - dev-libs/expat - dev-libs/hyphen - dev-libs/icu:= - dev-libs/libassuan - dev-libs/libgpg-error - >=dev-libs/liborcus-0.17.2:0/0.17 - dev-libs/librevenge - dev-libs/libxml2 - dev-libs/libxslt - dev-libs/nspr - dev-libs/nss - >=dev-libs/redland-1.0.16 - >=dev-libs/xmlsec-1.2.28[nss] - >=games-engines/box2d-2.4.1:0 - media-gfx/fontforge - media-gfx/graphite2 - media-libs/fontconfig - >=media-libs/freetype-2.11.0-r1:2 - >=media-libs/harfbuzz-0.9.42:=[graphite,icu] - media-libs/lcms:2 - >=media-libs/libcdr-0.1.0 - >=media-libs/libepoxy-1.3.1[X] - >=media-libs/libfreehand-0.1.0 - media-libs/libjpeg-turbo:= - media-libs/libpagemaker - >=media-libs/libpng-1.4:0= - >=media-libs/libvisio-0.1.0 - media-libs/libzmf - media-libs/openjpeg:= - media-libs/zxing-cpp:= - >=net-libs/neon-0.31.1:= - net-misc/curl - sci-mathematics/lpsolve - sys-libs/zlib - virtual/opengl - x11-libs/cairo[X] - x11-libs/libXinerama - x11-libs/libXrandr - x11-libs/libXrender - accessibility? ( - $(python_gen_cond_dep 'dev-python/lxml[${PYTHON_USEDEP}]') - ) - bluetooth? ( - dev-libs/glib:2 - net-wireless/bluez - ) - coinmp? ( sci-libs/coinor-mp ) - cups? ( net-print/cups ) - dbus? ( sys-apps/dbus[X] ) - eds? ( - dev-libs/glib:2 - gnome-base/dconf - gnome-extra/evolution-data-server - ) - firebird? ( >=dev-db/firebird-3.0.2.32703.0-r1[server] ) - gstreamer? ( - media-libs/gstreamer:1.0 - media-libs/gst-plugins-base:1.0 - ) - gtk? ( - dev-libs/glib:2 - dev-libs/gobject-introspection - gnome-base/dconf - media-libs/mesa[egl(+)] - x11-libs/gtk+:3[X] - x11-libs/pango - ) - kde? ( - dev-qt/qtcore:5 - dev-qt/qtgui:5 - dev-qt/qtwidgets:5 - dev-qt/qtx11extras:5 - kde-frameworks/kconfig:5 - kde-frameworks/kcoreaddons:5 - kde-frameworks/ki18n:5 - kde-frameworks/kio:5 - kde-frameworks/kwindowsystem:5 - ) - ldap? ( net-nds/openldap:= ) - libreoffice_extensions_scripting-beanshell? ( dev-java/bsh ) - libreoffice_extensions_scripting-javascript? ( >=dev-java/rhino-1.7.14:1.6 ) - mariadb? ( dev-db/mariadb-connector-c:= ) - !mariadb? ( dev-db/mysql-connector-c:= ) - pdfimport? ( >=app-text/poppler-22.06:=[cxx] ) - postgres? ( >=dev-db/postgresql-9.0:*[kerberos] ) -" -# FIXME: cppunit should be moved to test conditional -# after everything upstream is under gbuild -# as dmake execute tests right away -# tests apparently also need google-carlito-fonts (not packaged) -DEPEND="${COMMON_DEPEND} - >=dev-libs/libatomic_ops-7.2d - dev-perl/Archive-Zip - >=dev-util/cppunit-1.14.0 - >=dev-util/gperf-3.1 - dev-util/mdds:1/2.0 - media-libs/glm - sys-devel/ucpp - x11-base/xorg-proto - x11-libs/libXt - x11-libs/libXtst - java? ( - dev-java/ant-core - >=virtual/jdk-11 - ) - test? ( - app-crypt/gnupg - dev-util/cppunit - media-fonts/dejavu - media-fonts/liberation-fonts - ) -" -RDEPEND="${COMMON_DEPEND} - acct-group/libreoffice - acct-user/libreoffice - !app-office/libreoffice-bin - !app-office/libreoffice-bin-debug - media-fonts/liberation-fonts - || ( x11-misc/xdg-utils kde-plasma/kde-cli-tools ) - java? ( >=virtual/jre-11 ) - kde? ( kde-frameworks/breeze-icons:* ) -" -BDEPEND=" - dev-util/intltool - sys-apps/which - sys-devel/bison - sys-devel/flex - sys-devel/gettext - virtual/pkgconfig - clang? ( - || ( - ( sys-devel/clang:15 - sys-devel/llvm:15 - =sys-devel/lld-15* ) - ( sys-devel/clang:14 - sys-devel/llvm:14 - =sys-devel/lld-14* ) - ( sys-devel/clang:13 - sys-devel/llvm:13 - =sys-devel/lld-13* ) - ) - ) - odk? ( >=app-doc/doxygen-1.8.4 ) -" -if [[ ${MY_PV} != *9999* ]] && [[ ${PV} != *_* ]]; then - PDEPEND="=app-office/libreoffice-l10n-$(ver_cut 1-2)*" -else - # Translations are not reliable on live ebuilds - # rather force people to use english only. - PDEPEND="!app-office/libreoffice-l10n" -fi - -PATCHES=( - "${WORKDIR}"/${PATCHSET/.tar.xz/} - - # not upstreamable stuff - "${FILESDIR}/${PN}-5.3.4.2-kioclient5.patch" - "${FILESDIR}/${PN}-6.1-nomancompress.patch" - "${FILESDIR}/${PN}-7.2.0.4-qt5detect.patch" - - # 7.4 branch - "${FILESDIR}/${PN}-7.3.5.2-gpgme-1.18.0.patch" - - # pending upstream - "${FILESDIR}/${PN}-7.3.5.2-poppler-22.09.0.patch" - - # riscv64 port - "${FILESDIR}/${PN}-7.3.6.2-riscv64.patch" -) - -S="${WORKDIR}/${PN}-${MY_PV}" - -_check_reqs() { - CHECKREQS_MEMORY="512M" - if is-flagq "-g*" && ! is-flagq "-g*0" ; then - CHECKREQS_DISK_BUILD="22G" - else - CHECKREQS_DISK_BUILD="6G" - fi - check-reqs_$1 -} - -pkg_pretend() { - use base || - ewarn "If you plan to use Base application you must enable USE base." - use java || - ewarn "Without USE java, several wizards are not going to be available." - - [[ ${MERGE_TYPE} != binary ]] && _check_reqs pkg_pretend -} - -pkg_setup() { - java-pkg-opt-2_pkg_setup - python-single-r1_pkg_setup - xdg_environment_reset - - [[ ${MERGE_TYPE} != binary ]] && _check_reqs pkg_setup -} - -src_unpack() { - default - - if [[ ${MY_PV} = *9999* ]]; then - local base_uri branch mypv - base_uri="https://anongit.freedesktop.org/git" - branch="master" - mypv=${MY_PV/.9999} - [[ ${mypv} != ${MY_PV} ]] && branch="${PN}-${mypv/./-}" - git-r3_fetch "${base_uri}/${PN}/core" "refs/heads/${branch}" - git-r3_checkout "${base_uri}/${PN}/core" - LOCOREGIT_VERSION=${EGIT_VERSION} - - git-r3_fetch "${base_uri}/${PN}/help" "refs/heads/master" - git-r3_checkout "${base_uri}/${PN}/help" "helpcontent2" # doesn't match on help - fi -} - -src_prepare() { - default - - # sandbox violations on many systems, we don't need it. Bug #646406 - sed -i \ - -e "/KF5_CONFIG/s/kf5-config/no/" \ - configure.ac || die "Failed to disable kf5-config" - - AT_M4DIR="m4" eautoreconf - # hack in the autogen.sh - touch autogen.lastrun - - # sed in the tests - sed -i \ - -e "s#all : build unitcheck#all : build#g" \ - solenv/gbuild/Module.mk || die - sed -i \ - -e "s#check: dev-install subsequentcheck#check: unitcheck slowcheck dev-install subsequentcheck#g" \ - -e "s#Makefile.gbuild all slowcheck#Makefile.gbuild all#g" \ - Makefile.in || die - - sed -i \ - -e "s,/usr/share/bash-completion/completions,$(get_bashcompdir)," \ - -e "s,\$INSTALLDIRNAME.sh,${PN}," \ - bin/distro-install-desktop-integration || die - - if use branding; then - # hack... - mv -v "${WORKDIR}/branding-intro.png" "icon-themes/colibre/brand/intro.png" || die - fi - - # Don't list pdfimport support in desktop when built with none, bug # 605464 - if ! use pdfimport; then - sed -i \ - -e ":MimeType: s:application/pdf;::" \ - -e ":Keywords: s:pdf;::" \ - sysui/desktop/menus/draw.desktop || die - fi -} - -src_configure() { - # Set up Google API keys, see https://www.chromium.org/developers/how-tos/api-keys - # Note: these are for Gentoo use ONLY. For your own distribution, please get - # your own set of keys. Feel free to contact chromium@gentoo.org for more info. - local google_default_client_id="329227923882.apps.googleusercontent.com" - local google_default_client_secret="vgKG0NNv7GoDpbtoFNLxCUXu" - - # Show flags set at the beginning - einfo "Preset CFLAGS: ${CFLAGS}" - einfo "Preset LDFLAGS: ${LDFLAGS}" - - if use clang ; then - # Force clang - einfo "Enforcing the use of clang due to USE=clang ..." - AR=llvm-ar - CC=${CHOST}-clang - CXX=${CHOST}-clang++ - NM=llvm-nm - RANLIB=llvm-ranlib - LDFLAGS+=" -fuse-ld=lld" - else - # Force gcc - einfo "Enforcing the use of gcc due to USE=-clang ..." - AR=gcc-ar - CC=${CHOST}-gcc - CXX=${CHOST}-g++ - NM=gcc-nm - RANLIB=gcc-ranlib - - # Apparently the Clang flags get used even for GCC builds sometimes. - # bug #838115 - sed -i -e "s/-flto=thin/-flto/" solenv/gbuild/platform/com_GCC_defs.mk || die - fi - - if use custom-cflags ; then - elog "USE=custom-cflags has been selected. You are on your own to make sure that" - elog "the build succeeds. Good luck!" - else - strip-flags - fi - - export LO_CLANG_CC=${CC} - export LO_CLANG_CXX=${CXX} - - # Show flags set at the end - einfo " Used CFLAGS: ${CFLAGS}" - einfo " Used LDFLAGS: ${LDFLAGS}" - - # Ensure we use correct toolchain - tc-export CC CXX LD AR NM OBJDUMP RANLIB PKG_CONFIG - - if use vulkan && ! use clang ; then - ewarn "Building skia with gcc may lead to performance issues. Disable vulkan or enable clang." - fi - - # optimization flags - export GMAKE_OPTIONS="${MAKEOPTS}" - # System python enablement: - export PYTHON_CFLAGS=$(python_get_CFLAGS) - export PYTHON_LIBS=$(python_get_LIBS) - - use kde && export QT5DIR="$(qt5_get_bindir)/.." - - local gentoo_buildid="Gentoo official package" - if [[ -n ${LOCOREGIT_VERSION} ]]; then - gentoo_buildid+=" (from git: ${LOCOREGIT_VERSION})" - fi - - # system headers/libs/...: enforce using system packages - # --disable-breakpad: requires not-yet-in-tree dev-utils/breakpad - # --enable-cairo: ensure that cairo is always required - # --enable-*-link: link to the library rather than just dlopen on runtime - # --enable-release-build: build the libreoffice as release - # --disable-fetch-external: prevent dowloading during compile phase - # --enable-extension-integration: enable any extension integration support - # --without-{fonts,myspell-dicts,ppsd}: prevent install of sys pkgs - # --disable-report-builder: too much java packages pulled in without pkgs - # --without-system-sane: just sane.h header that is used for scan in writer, - # not linked or anything else, worthless to depend on - # --disable-pdfium: not yet packaged - local myeconfargs=( - --with-system-dicts - --with-system-epoxy - --with-system-headers - --with-system-jars - --with-system-libs - --enable-build-opensymbol - --enable-cairo-canvas - --enable-largefile - --enable-mergelibs - --enable-python=system - --enable-randr - --enable-release-build - --disable-breakpad - --disable-bundle-mariadb - --disable-ccache - --disable-epm - --disable-fetch-external - --disable-gtk3-kde5 - --disable-online-update - --disable-openssl - --disable-pdfium - --disable-qt6 - --with-extra-buildid="${gentoo_buildid}" - --enable-extension-integration - --with-external-dict-dir="${EPREFIX}/usr/share/myspell" - --with-external-hyph-dir="${EPREFIX}/usr/share/myspell" - --with-external-thes-dir="${EPREFIX}/usr/share/myspell" - --with-external-tar="${DISTDIR}" - --with-lang="" - --with-parallelism=$(makeopts_jobs) - --with-system-abseil - --with-system-openjpeg - --with-system-ucpp - --with-tls=nss - --with-vendor="Gentoo Foundation" - --with-webdav="neon" - --with-x - --without-fonts - --without-myspell-dicts - --with-help="html" - --without-helppack-integration - --with-system-gpgmepp - --without-system-jfreereport - --without-system-libcmis - --without-system-sane - $(use_enable base report-builder) - $(use_enable bluetooth sdremote-bluetooth) - $(use_enable coinmp) - $(use_enable cups) - $(use_enable dbus) - $(use_enable debug) - $(use_enable eds evolution2) - $(use_enable firebird firebird-sdbc) - $(use_enable gstreamer gstreamer-1-0) - $(use_enable gtk gtk3) - $(use_enable kde kf5) - $(use_enable kde qt5) - $(use_enable ldap) - $(use_enable odk) - $(use_enable pdfimport) - $(use_enable postgres postgresql-sdbc) - $(use_enable vulkan skia) - $(use_with accessibility lxml) - $(use_with coinmp system-coinmp) - $(use_with googledrive gdrive-client-id ${google_default_client_id}) - $(use_with googledrive gdrive-client-secret ${google_default_client_secret}) - $(use_with java) - $(use_with odk doxygen) - ) - - if use eds || use gtk; then - myeconfargs+=( --enable-dconf --enable-gio ) - else - myeconfargs+=( --disable-dconf --disable-gio ) - fi - - # libreoffice extensions handling - for lo_xt in ${LO_EXTS}; do - if [[ "${lo_xt}" == "scripting-beanshell" || "${lo_xt}" == "scripting-javascript" ]]; then - myeconfargs+=( $(use_enable libreoffice_extensions_${lo_xt} ${lo_xt}) ) - else - myeconfargs+=( $(use_enable libreoffice_extensions_${lo_xt} ext-${lo_xt}) ) - fi - done - - if use java; then - # hsqldb: system one is too new - myeconfargs+=( - --without-junit - --without-system-hsqldb - --with-ant-home="${ANT_HOME}" - --with-jdk-home="${JAVA_HOME}" - ) - - use libreoffice_extensions_scripting-beanshell && \ - myeconfargs+=( --with-beanshell-jar=$(java-pkg_getjar bsh bsh.jar) ) - - use libreoffice_extensions_scripting-javascript && \ - myeconfargs+=( --with-rhino-jar=$(java-pkg_getjar rhino-1.6 rhino.jar) ) - fi - - is-flagq "-flto*" && myeconfargs+=( --enable-lto ) - - MARIADBCONFIG="$(type -p $(usex mariadb mariadb mysql)_config)" \ - econf "${myeconfargs[@]}" -} - -src_compile() { - # more and more LO stuff tries to use OpenGL, including tests during build - # bug 501508, bug 540624, bug 545974 and probably more - addpredict /dev/dri - addpredict /dev/ati - addpredict /dev/nvidiactl - - default -} - -src_test() { - emake unitcheck - emake slowcheck -} - -src_install() { - emake DESTDIR="${D}" distro-pack-install -o build -o check - - # bug 593514 - if use gtk; then - dosym libreoffice/program/liblibreofficekitgtk.so \ - /usr/$(get_libdir)/liblibreofficekitgtk.so - fi - - # bash completion aliases - bashcomp_alias \ - libreoffice \ - unopkg loimpress lobase localc lodraw lomath lowriter lofromtemplate loweb loffice - - if use branding; then - insinto /usr/$(get_libdir)/${PN}/program - newins "${WORKDIR}/branding-sofficerc" sofficerc - dodir /etc/env.d - echo "CONFIG_PROTECT=/usr/$(get_libdir)/${PN}/program/sofficerc" > "${ED}"/etc/env.d/99${PN} || die - fi - - # bug 703474 - insinto /usr/include - doins -r include/LibreOfficeKit - - local lodir=/usr/$(get_libdir)/libreoffice - # patching this would break tests - cat <<-EOF > "${T}"/uno.py -import sys, os -sys.path.append('${EPREFIX}${lodir}/program') -os.putenv('URE_BOOTSTRAP', 'vnd.sun.star.pathname:${EPREFIX}${lodir}/program/fundamentalrc') -EOF - sed -e "/^import sys/d" -e "/^import os/d" \ - -i "${D}"${lodir}/program/uno.py || die "cleanup dupl imports failed" - cat "${D}"${lodir}/program/uno.py >> "${T}"/uno.py || die - cp "${T}"/uno.py "${D}"${lodir}/program/uno.py || die - - # more system pyuno mess - sed -e "/sOffice = \"\" # lets hope for the best/s:\"\":\"${EPREFIX}${lodir}/program\":" \ - -i "${D}"${lodir}/program/officehelper.py || die - - python_optimize "${D}"${lodir}/program - # link python bridge in site-packages, bug 667802 - local py pyc loprogdir=/usr/$(get_libdir)/libreoffice/program - for py in uno.py unohelper.py officehelper.py; do - dosym -r ${loprogdir}/${py} $(python_get_sitedir)/${py} - while IFS="" read -d $'\0' -r pyc; do - pyc=${pyc//*\/} - dosym -r ${loprogdir}/__pycache__/${pyc} $(python_get_sitedir)/__pycache__/${pyc} - done < <(find "${D}"${lodir}/program -type f -name ${py/.py/*.pyc} -print0) - done - - newinitd "${FILESDIR}/libreoffice.initd" libreoffice - newconfd "${FILESDIR}/libreoffice.confd" libreoffice -} - -pkg_postinst() { - xdg_icon_cache_update - xdg_desktop_database_update - xdg_mimeinfo_database_update -} - -pkg_postrm() { - xdg_icon_cache_update - xdg_desktop_database_update - xdg_mimeinfo_database_update -} diff --git a/app-office/libreoffice/libreoffice-7.3.7.2.ebuild b/app-office/libreoffice/libreoffice-7.3.7.2.ebuild new file mode 100644 index 0000000..5d536f2 --- /dev/null +++ b/app-office/libreoffice/libreoffice-7.3.7.2.ebuild @@ -0,0 +1,655 @@ +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +PYTHON_COMPAT=( python3_{8..11} ) +PYTHON_REQ_USE="threads(+),xml(+)" + +MY_PV="${PV/_alpha/.alpha}" +MY_PV="${MY_PV/_beta/.beta}" +# experimental ; release ; old +# Usually the tarballs are moved a lot so this should make everyone happy. +DEV_URI=" + https://dev-builds.libreoffice.org/pre-releases/src + https://download.documentfoundation.org/libreoffice/src/${MY_PV:0:5}/ + https://downloadarchive.documentfoundation.org/libreoffice/old/${MY_PV}/src +" +ADDONS_URI="https://dev-www.libreoffice.org/src/" + +BRANDING="${PN}-branding-gentoo-0.8.tar.xz" +PATCHSET="${PN}-7.3.5.2-patchset-01.tar.xz" + +[[ ${MY_PV} == *9999* ]] && inherit git-r3 +inherit autotools bash-completion-r1 check-reqs flag-o-matic java-pkg-opt-2 multiprocessing python-single-r1 qmake-utils toolchain-funcs xdg-utils + +DESCRIPTION="A full office productivity suite" +HOMEPAGE="https://www.libreoffice.org" +SRC_URI="branding? ( https://dev.gentoo.org/~dilfridge/distfiles/${BRANDING} )" +[[ -n ${PATCHSET} ]] && SRC_URI+=" https://dev.gentoo.org/~xen0n/distfiles/app-office/libreoffice/${PATCHSET}" + +# Split modules following git/tarballs; Core MUST be first! +# Help is used for the image generator +# Only release has the tarballs +if [[ ${MY_PV} != *9999* ]]; then + for i in ${DEV_URI}; do + SRC_URI+=" ${i}/${PN}-${MY_PV}.tar.xz" + SRC_URI+=" ${i}/${PN}-help-${MY_PV}.tar.xz" + done + unset i +fi +unset DEV_URI + +# Really required addons +# These are bundles that can't be removed for now due to huge patchsets. +# If you want them gone, patches are welcome. +ADDONS_SRC=( + # broken against latest upstream release, too many patches on top: + # https://github.com/tdf/libcmis/pull/43 + "${ADDONS_URI}/libcmis-0.5.2.tar.xz" + # not packaged in Gentoo, https://www.netlib.org/fp/dtoa.c + "${ADDONS_URI}/dtoa-20180411.tgz" + # not packaged in Gentoo, https://skia.org/ + "${ADDONS_URI}/skia-m97-a7230803d64ae9d44f4e1282444801119a3ae967.tar.xz" + "base? ( + ${ADDONS_URI}/commons-logging-1.2-src.tar.gz + ${ADDONS_URI}/ba2930200c9f019c2d93a8c88c651a0f-flow-engine-0.9.4.zip + ${ADDONS_URI}/d8bd5eed178db6e2b18eeed243f85aa8-flute-1.1.6.zip + ${ADDONS_URI}/eeb2c7ddf0d302fba4bfc6e97eac9624-libbase-1.1.6.zip + ${ADDONS_URI}/3bdf40c0d199af31923e900d082ca2dd-libfonts-1.1.6.zip + ${ADDONS_URI}/3404ab6b1792ae5f16bbd603bd1e1d03-libformula-1.1.7.zip + ${ADDONS_URI}/db60e4fde8dd6d6807523deb71ee34dc-liblayout-0.2.10.zip + ${ADDONS_URI}/97b2d4dba862397f446b217e2b623e71-libloader-1.1.6.zip + ${ADDONS_URI}/8ce2fcd72becf06c41f7201d15373ed9-librepository-1.1.6.zip + ${ADDONS_URI}/f94d9870737518e3b597f9265f4e9803-libserializer-1.1.6.zip + ${ADDONS_URI}/ace6ab49184e329db254e454a010f56d-libxml-1.1.7.zip + ${ADDONS_URI}/39bb3fcea1514f1369fcfc87542390fd-sacjava-1.3.zip + )" + "java? ( ${ADDONS_URI}/17410483b5b5f267aa18b7e00b65e6e0-hsqldb_1_8_0.zip )" + # no release for 8 years, should we package it? + "libreoffice_extensions_wiki-publisher? ( ${ADDONS_URI}/a7983f859eafb2677d7ff386a023bc40-xsltml_2.1.2.zip )" + # Does not build with 1.6 rhino at all + "libreoffice_extensions_scripting-javascript? ( ${ADDONS_URI}/798b2ffdc8bcfe7bca2cf92b62caf685-rhino1_5R5.zip )" + # requirement of rhino + "libreoffice_extensions_scripting-javascript? ( ${ADDONS_URI}/35c94d2df8893241173de1d16b6034c0-swingExSrc.zip )" + # not packageable + "odk? ( http://download.go-oo.org/extern/185d60944ea767075d27247c3162b3bc-unowinreg.dll )" +) +SRC_URI+=" ${ADDONS_SRC[*]}" + +unset ADDONS_URI +unset ADDONS_SRC + +# Extensions that need extra work: +LO_EXTS="nlpsolver scripting-beanshell scripting-javascript wiki-publisher" + +IUSE="accessibility base bluetooth +branding clang coinmp +cups custom-cflags +dbus debug eds firebird +googledrive gstreamer +gtk kde ldap +mariadb odk pdfimport postgres test vulkan +$(printf 'libreoffice_extensions_%s ' ${LO_EXTS})" + +REQUIRED_USE="${PYTHON_REQUIRED_USE} + base? ( firebird java ) + bluetooth? ( dbus ) + gtk? ( dbus ) + libreoffice_extensions_nlpsolver? ( java ) + libreoffice_extensions_scripting-beanshell? ( java ) + libreoffice_extensions_scripting-javascript? ( java ) + libreoffice_extensions_wiki-publisher? ( java ) +" + +RESTRICT="!test? ( test )" + +LICENSE="|| ( LGPL-3 MPL-1.1 )" +SLOT="0" + +[[ ${MY_PV} == *9999* ]] || \ +KEYWORDS="amd64 ~arm arm64 ~loong ~ppc64 ~x86 ~amd64-linux" + +COMMON_DEPEND="${PYTHON_DEPS} + app-arch/unzip + app-arch/zip + app-crypt/gpgme:=[cxx] + app-text/hunspell:= + >=app-text/libabw-0.1.0 + >=app-text/libebook-0.1 + app-text/libepubgen + >=app-text/libetonyek-0.1 + app-text/libexttextcat + app-text/liblangtag + >=app-text/libmspub-0.1.0 + >=app-text/libmwaw-0.3.1 + >=app-text/libnumbertext-1.0.6 + >=app-text/libodfgen-0.1.0 + app-text/libqxp + app-text/libstaroffice + app-text/libwpd:0.10[tools] + app-text/libwpg:0.3 + >=app-text/libwps-0.4 + app-text/mythes + dev-cpp/abseil-cpp:= + >=dev-cpp/clucene-2.3.3.4-r2 + >=dev-cpp/libcmis-0.5.2 + dev-db/unixODBC + dev-lang/perl + dev-libs/boost:=[nls] + dev-libs/expat + dev-libs/hyphen + dev-libs/icu:= + dev-libs/libassuan + dev-libs/libgpg-error + >=dev-libs/liborcus-0.17.2:0/0.17 + dev-libs/librevenge + dev-libs/libxml2 + dev-libs/libxslt + dev-libs/nspr + dev-libs/nss + >=dev-libs/redland-1.0.16 + >=dev-libs/xmlsec-1.2.28[nss] + >=games-engines/box2d-2.4.1:0 + media-gfx/fontforge + media-gfx/graphite2 + media-libs/fontconfig + >=media-libs/freetype-2.11.0-r1:2 + >=media-libs/harfbuzz-0.9.42:=[graphite,icu] + media-libs/lcms:2 + >=media-libs/libcdr-0.1.0 + >=media-libs/libepoxy-1.3.1[X] + >=media-libs/libfreehand-0.1.0 + media-libs/libjpeg-turbo:= + media-libs/libpagemaker + >=media-libs/libpng-1.4:0= + >=media-libs/libvisio-0.1.0 + media-libs/libzmf + media-libs/openjpeg:= + media-libs/zxing-cpp:= + >=net-libs/neon-0.31.1:= + net-misc/curl + sci-mathematics/lpsolve + sys-libs/zlib + virtual/opengl + x11-libs/cairo[X] + x11-libs/libXinerama + x11-libs/libXrandr + x11-libs/libXrender + accessibility? ( + $(python_gen_cond_dep 'dev-python/lxml[${PYTHON_USEDEP}]') + ) + bluetooth? ( + dev-libs/glib:2 + net-wireless/bluez + ) + coinmp? ( sci-libs/coinor-mp ) + cups? ( net-print/cups ) + dbus? ( sys-apps/dbus[X] ) + eds? ( + dev-libs/glib:2 + gnome-base/dconf + gnome-extra/evolution-data-server + ) + firebird? ( >=dev-db/firebird-3.0.2.32703.0-r1[server] ) + gstreamer? ( + media-libs/gstreamer:1.0 + media-libs/gst-plugins-base:1.0 + ) + gtk? ( + dev-libs/glib:2 + dev-libs/gobject-introspection + gnome-base/dconf + media-libs/mesa[egl(+)] + x11-libs/gtk+:3[X] + x11-libs/pango + ) + kde? ( + dev-qt/qtcore:5 + dev-qt/qtgui:5 + dev-qt/qtwidgets:5 + dev-qt/qtx11extras:5 + kde-frameworks/kconfig:5 + kde-frameworks/kcoreaddons:5 + kde-frameworks/ki18n:5 + kde-frameworks/kio:5 + kde-frameworks/kwindowsystem:5 + ) + ldap? ( net-nds/openldap:= ) + libreoffice_extensions_scripting-beanshell? ( dev-java/bsh ) + libreoffice_extensions_scripting-javascript? ( >=dev-java/rhino-1.7.14:1.6 ) + mariadb? ( dev-db/mariadb-connector-c:= ) + !mariadb? ( dev-db/mysql-connector-c:= ) + pdfimport? ( >=app-text/poppler-22.06:=[cxx] ) + postgres? ( >=dev-db/postgresql-9.0:*[kerberos] ) +" +# FIXME: cppunit should be moved to test conditional +# after everything upstream is under gbuild +# as dmake execute tests right away +# tests apparently also need google-carlito-fonts (not packaged) +DEPEND="${COMMON_DEPEND} + >=dev-libs/libatomic_ops-7.2d + dev-perl/Archive-Zip + >=dev-util/cppunit-1.14.0 + >=dev-util/gperf-3.1 + dev-util/mdds:1/2.0 + media-libs/glm + sys-devel/ucpp + x11-base/xorg-proto + x11-libs/libXt + x11-libs/libXtst + java? ( + dev-java/ant-core + >=virtual/jdk-11 + ) + test? ( + app-crypt/gnupg + dev-util/cppunit + media-fonts/dejavu + media-fonts/liberation-fonts + ) +" +RDEPEND="${COMMON_DEPEND} + acct-group/libreoffice + acct-user/libreoffice + !app-office/libreoffice-bin + !app-office/libreoffice-bin-debug + media-fonts/liberation-fonts + || ( x11-misc/xdg-utils kde-plasma/kde-cli-tools ) + java? ( >=virtual/jre-11 ) + kde? ( kde-frameworks/breeze-icons:* ) +" +BDEPEND=" + dev-util/intltool + sys-apps/which + sys-devel/bison + sys-devel/flex + sys-devel/gettext + virtual/pkgconfig + clang? ( + || ( + ( sys-devel/clang:15 + sys-devel/llvm:15 + =sys-devel/lld-15* ) + ( sys-devel/clang:14 + sys-devel/llvm:14 + =sys-devel/lld-14* ) + ( sys-devel/clang:13 + sys-devel/llvm:13 + =sys-devel/lld-13* ) + ) + ) + odk? ( >=app-doc/doxygen-1.8.4 ) +" +if [[ ${MY_PV} != *9999* ]] && [[ ${PV} != *_* ]]; then + PDEPEND="=app-office/libreoffice-l10n-$(ver_cut 1-2)*" +else + # Translations are not reliable on live ebuilds + # rather force people to use english only. + PDEPEND="!app-office/libreoffice-l10n" +fi + +PATCHES=( + "${WORKDIR}"/${PATCHSET/.tar.xz/} + + # not upstreamable stuff + "${FILESDIR}/${PN}-5.3.4.2-kioclient5.patch" + "${FILESDIR}/${PN}-6.1-nomancompress.patch" + "${FILESDIR}/${PN}-7.2.0.4-qt5detect.patch" + + # 7.4 branch + "${FILESDIR}/${PN}-7.3.5.2-gpgme-1.18.0.patch" +) + +S="${WORKDIR}/${PN}-${MY_PV}" + +_check_reqs() { + CHECKREQS_MEMORY="512M" + if is-flagq "-g*" && ! is-flagq "-g*0" ; then + CHECKREQS_DISK_BUILD="22G" + else + CHECKREQS_DISK_BUILD="6G" + fi + check-reqs_$1 +} + +pkg_pretend() { + use base || + ewarn "If you plan to use Base application you must enable USE base." + use java || + ewarn "Without USE java, several wizards are not going to be available." + + [[ ${MERGE_TYPE} != binary ]] && _check_reqs pkg_pretend +} + +pkg_setup() { + java-pkg-opt-2_pkg_setup + python-single-r1_pkg_setup + xdg_environment_reset + + [[ ${MERGE_TYPE} != binary ]] && _check_reqs pkg_setup +} + +src_unpack() { + default + + if [[ ${MY_PV} = *9999* ]]; then + local base_uri branch mypv + base_uri="https://anongit.freedesktop.org/git" + branch="master" + mypv=${MY_PV/.9999} + [[ ${mypv} != ${MY_PV} ]] && branch="${PN}-${mypv/./-}" + git-r3_fetch "${base_uri}/${PN}/core" "refs/heads/${branch}" + git-r3_checkout "${base_uri}/${PN}/core" + LOCOREGIT_VERSION=${EGIT_VERSION} + + git-r3_fetch "${base_uri}/${PN}/help" "refs/heads/master" + git-r3_checkout "${base_uri}/${PN}/help" "helpcontent2" # doesn't match on help + fi +} + +src_prepare() { + default + + # sandbox violations on many systems, we don't need it. Bug #646406 + sed -i \ + -e "/KF5_CONFIG/s/kf5-config/no/" \ + configure.ac || die "Failed to disable kf5-config" + + AT_M4DIR="m4" eautoreconf + # hack in the autogen.sh + touch autogen.lastrun + + # sed in the tests + sed -i \ + -e "s#all : build unitcheck#all : build#g" \ + solenv/gbuild/Module.mk || die + sed -i \ + -e "s#check: dev-install subsequentcheck#check: unitcheck slowcheck dev-install subsequentcheck#g" \ + -e "s#Makefile.gbuild all slowcheck#Makefile.gbuild all#g" \ + Makefile.in || die + + sed -i \ + -e "s,/usr/share/bash-completion/completions,$(get_bashcompdir)," \ + -e "s,\$INSTALLDIRNAME.sh,${PN}," \ + bin/distro-install-desktop-integration || die + + if use branding; then + # hack... + mv -v "${WORKDIR}/branding-intro.png" "icon-themes/colibre/brand/intro.png" || die + fi + + # Don't list pdfimport support in desktop when built with none, bug # 605464 + if ! use pdfimport; then + sed -i \ + -e ":MimeType: s:application/pdf;::" \ + -e ":Keywords: s:pdf;::" \ + sysui/desktop/menus/draw.desktop || die + fi +} + +src_configure() { + # Set up Google API keys, see https://www.chromium.org/developers/how-tos/api-keys + # Note: these are for Gentoo use ONLY. For your own distribution, please get + # your own set of keys. Feel free to contact chromium@gentoo.org for more info. + local google_default_client_id="329227923882.apps.googleusercontent.com" + local google_default_client_secret="vgKG0NNv7GoDpbtoFNLxCUXu" + + # Show flags set at the beginning + einfo "Preset CFLAGS: ${CFLAGS}" + einfo "Preset LDFLAGS: ${LDFLAGS}" + + if use clang ; then + # Force clang + einfo "Enforcing the use of clang due to USE=clang ..." + AR=llvm-ar + CC=${CHOST}-clang + CXX=${CHOST}-clang++ + NM=llvm-nm + RANLIB=llvm-ranlib + LDFLAGS+=" -fuse-ld=lld" + else + # Force gcc + einfo "Enforcing the use of gcc due to USE=-clang ..." + AR=gcc-ar + CC=${CHOST}-gcc + CXX=${CHOST}-g++ + NM=gcc-nm + RANLIB=gcc-ranlib + + # Apparently the Clang flags get used even for GCC builds sometimes. + # bug #838115 + sed -i -e "s/-flto=thin/-flto/" solenv/gbuild/platform/com_GCC_defs.mk || die + fi + + if use custom-cflags ; then + elog "USE=custom-cflags has been selected. You are on your own to make sure that" + elog "the build succeeds. Good luck!" + else + strip-flags + fi + + export LO_CLANG_CC=${CC} + export LO_CLANG_CXX=${CXX} + + # Show flags set at the end + einfo " Used CFLAGS: ${CFLAGS}" + einfo " Used LDFLAGS: ${LDFLAGS}" + + # Ensure we use correct toolchain + tc-export CC CXX LD AR NM OBJDUMP RANLIB PKG_CONFIG + + if use vulkan && ! use clang ; then + ewarn "Building skia with gcc may lead to performance issues. Disable vulkan or enable clang." + fi + + # optimization flags + export GMAKE_OPTIONS="${MAKEOPTS}" + # System python enablement: + export PYTHON_CFLAGS=$(python_get_CFLAGS) + export PYTHON_LIBS=$(python_get_LIBS) + + use kde && export QT5DIR="$(qt5_get_bindir)/.." + + local gentoo_buildid="Gentoo official package" + if [[ -n ${LOCOREGIT_VERSION} ]]; then + gentoo_buildid+=" (from git: ${LOCOREGIT_VERSION})" + fi + + # system headers/libs/...: enforce using system packages + # --disable-breakpad: requires not-yet-in-tree dev-utils/breakpad + # --enable-cairo: ensure that cairo is always required + # --enable-*-link: link to the library rather than just dlopen on runtime + # --enable-release-build: build the libreoffice as release + # --disable-fetch-external: prevent dowloading during compile phase + # --enable-extension-integration: enable any extension integration support + # --without-{fonts,myspell-dicts,ppsd}: prevent install of sys pkgs + # --disable-report-builder: too much java packages pulled in without pkgs + # --without-system-sane: just sane.h header that is used for scan in writer, + # not linked or anything else, worthless to depend on + # --disable-pdfium: not yet packaged + local myeconfargs=( + --with-system-dicts + --with-system-epoxy + --with-system-headers + --with-system-jars + --with-system-libs + --enable-build-opensymbol + --enable-cairo-canvas + --enable-largefile + --enable-mergelibs + --enable-python=system + --enable-randr + --enable-release-build + --disable-breakpad + --disable-bundle-mariadb + --disable-ccache + --disable-epm + --disable-fetch-external + --disable-gtk3-kde5 + --disable-online-update + --disable-openssl + --disable-pdfium + --disable-qt6 + --with-extra-buildid="${gentoo_buildid}" + --enable-extension-integration + --with-external-dict-dir="${EPREFIX}/usr/share/myspell" + --with-external-hyph-dir="${EPREFIX}/usr/share/myspell" + --with-external-thes-dir="${EPREFIX}/usr/share/myspell" + --with-external-tar="${DISTDIR}" + --with-lang="" + --with-parallelism=$(makeopts_jobs) + --with-system-abseil + --with-system-openjpeg + --with-system-ucpp + --with-tls=nss + --with-vendor="Gentoo Foundation" + --with-webdav="neon" + --with-x + --without-fonts + --without-myspell-dicts + --with-help="html" + --without-helppack-integration + --with-system-gpgmepp + --without-system-jfreereport + --without-system-libcmis + --without-system-sane + $(use_enable base report-builder) + $(use_enable bluetooth sdremote-bluetooth) + $(use_enable coinmp) + $(use_enable cups) + $(use_enable dbus) + $(use_enable debug) + $(use_enable eds evolution2) + $(use_enable firebird firebird-sdbc) + $(use_enable gstreamer gstreamer-1-0) + $(use_enable gtk gtk3) + $(use_enable kde kf5) + $(use_enable kde qt5) + $(use_enable ldap) + $(use_enable odk) + $(use_enable pdfimport) + $(use_enable postgres postgresql-sdbc) + $(use_enable vulkan skia) + $(use_with accessibility lxml) + $(use_with coinmp system-coinmp) + $(use_with googledrive gdrive-client-id ${google_default_client_id}) + $(use_with googledrive gdrive-client-secret ${google_default_client_secret}) + $(use_with java) + $(use_with odk doxygen) + ) + + if use eds || use gtk; then + myeconfargs+=( --enable-dconf --enable-gio ) + else + myeconfargs+=( --disable-dconf --disable-gio ) + fi + + # libreoffice extensions handling + for lo_xt in ${LO_EXTS}; do + if [[ "${lo_xt}" == "scripting-beanshell" || "${lo_xt}" == "scripting-javascript" ]]; then + myeconfargs+=( $(use_enable libreoffice_extensions_${lo_xt} ${lo_xt}) ) + else + myeconfargs+=( $(use_enable libreoffice_extensions_${lo_xt} ext-${lo_xt}) ) + fi + done + + if use java; then + # hsqldb: system one is too new + myeconfargs+=( + --without-junit + --without-system-hsqldb + --with-ant-home="${ANT_HOME}" + --with-jdk-home="${JAVA_HOME}" + ) + + use libreoffice_extensions_scripting-beanshell && \ + myeconfargs+=( --with-beanshell-jar=$(java-pkg_getjar bsh bsh.jar) ) + + use libreoffice_extensions_scripting-javascript && \ + myeconfargs+=( --with-rhino-jar=$(java-pkg_getjar rhino-1.6 rhino.jar) ) + fi + + is-flagq "-flto*" && myeconfargs+=( --enable-lto ) + + MARIADBCONFIG="$(type -p $(usex mariadb mariadb mysql)_config)" \ + econf "${myeconfargs[@]}" +} + +src_compile() { + # more and more LO stuff tries to use OpenGL, including tests during build + # bug 501508, bug 540624, bug 545974 and probably more + addpredict /dev/dri + addpredict /dev/ati + addpredict /dev/nvidiactl + + default +} + +src_test() { + emake unitcheck + emake slowcheck +} + +src_install() { + emake DESTDIR="${D}" distro-pack-install -o build -o check + + # bug 593514 + if use gtk; then + dosym libreoffice/program/liblibreofficekitgtk.so \ + /usr/$(get_libdir)/liblibreofficekitgtk.so + fi + + # bash completion aliases + bashcomp_alias \ + libreoffice \ + unopkg loimpress lobase localc lodraw lomath lowriter lofromtemplate loweb loffice + + if use branding; then + insinto /usr/$(get_libdir)/${PN}/program + newins "${WORKDIR}/branding-sofficerc" sofficerc + dodir /etc/env.d + echo "CONFIG_PROTECT=/usr/$(get_libdir)/${PN}/program/sofficerc" > "${ED}"/etc/env.d/99${PN} || die + fi + + # bug 703474 + insinto /usr/include + doins -r include/LibreOfficeKit + + local lodir=/usr/$(get_libdir)/libreoffice + # patching this would break tests + cat <<-EOF > "${T}"/uno.py +import sys, os +sys.path.append('${EPREFIX}${lodir}/program') +os.putenv('URE_BOOTSTRAP', 'vnd.sun.star.pathname:${EPREFIX}${lodir}/program/fundamentalrc') +EOF + sed -e "/^import sys/d" -e "/^import os/d" \ + -i "${D}"${lodir}/program/uno.py || die "cleanup dupl imports failed" + cat "${D}"${lodir}/program/uno.py >> "${T}"/uno.py || die + cp "${T}"/uno.py "${D}"${lodir}/program/uno.py || die + + # more system pyuno mess + sed -e "/sOffice = \"\" # lets hope for the best/s:\"\":\"${EPREFIX}${lodir}/program\":" \ + -i "${D}"${lodir}/program/officehelper.py || die + + python_optimize "${D}"${lodir}/program + # link python bridge in site-packages, bug 667802 + local py pyc loprogdir=/usr/$(get_libdir)/libreoffice/program + for py in uno.py unohelper.py officehelper.py; do + dosym -r ${loprogdir}/${py} $(python_get_sitedir)/${py} + while IFS="" read -d $'\0' -r pyc; do + pyc=${pyc//*\/} + dosym -r ${loprogdir}/__pycache__/${pyc} $(python_get_sitedir)/__pycache__/${pyc} + done < <(find "${D}"${lodir}/program -type f -name ${py/.py/*.pyc} -print0) + done + + newinitd "${FILESDIR}/libreoffice.initd" libreoffice + newconfd "${FILESDIR}/libreoffice.confd" libreoffice +} + +pkg_postinst() { + xdg_icon_cache_update + xdg_desktop_database_update + xdg_mimeinfo_database_update +} + +pkg_postrm() { + xdg_icon_cache_update + xdg_desktop_database_update + xdg_mimeinfo_database_update +} -- cgit v1.2.3-65-gdbad