diff --git a/external/python3/ExternalPackage_python3.mk b/external/python3/ExternalPackage_python3.mk
index 056cd5973513..5653aa89857b 100644
--- a/external/python3/ExternalPackage_python3.mk
+++ b/external/python3/ExternalPackage_python3.mk
@@ -22,6 +22,7 @@ endif
$(eval $(call gb_ExternalPackage_add_file,python3,$(LIBO_BIN_FOLDER)/python-core-$(PYTHON_VERSION)/bin/python.exe,PCbuild/$(python_arch_subdir)python$(if $(MSVC_USE_DEBUG_RUNTIME),_d).exe))
$(eval $(call gb_ExternalPackage_add_file,python3,$(LIBO_BIN_FOLDER)/python$(PYTHON_VERSION_MAJOR)$(PYTHON_VERSION_MINOR)$(if $(MSVC_USE_DEBUG_RUNTIME),_d).dll,PCbuild/$(python_arch_subdir)python$(PYTHON_VERSION_MAJOR)$(PYTHON_VERSION_MINOR)$(if $(MSVC_USE_DEBUG_RUNTIME),_d).dll))
+$(eval $(call gb_ExternalPackage_add_files,python3,$(LIBO_BIN_FOLDER)/python-core-$(PYTHON_VERSION)/lib,PCbuild/$(python_arch_subdir)sqlite3$(if $(MSVC_USE_DEBUG_RUNTIME),_d).dll))
ifeq ($(MSVC_USE_DEBUG_RUNTIME),)
$(eval $(call gb_ExternalPackage_add_file,python3,$(LIBO_BIN_FOLDER)/python$(PYTHON_VERSION_MAJOR).dll,PCbuild/$(python_arch_subdir)python$(PYTHON_VERSION_MAJOR).dll))
endif
@@ -36,6 +37,7 @@ python3_EXTENSION_MODULES= \
PCbuild/$(python_arch_subdir)_overlapped$(if $(MSVC_USE_DEBUG_RUNTIME),_d).pyd \
PCbuild/$(python_arch_subdir)_queue$(if $(MSVC_USE_DEBUG_RUNTIME),_d).pyd \
PCbuild/$(python_arch_subdir)_socket$(if $(MSVC_USE_DEBUG_RUNTIME),_d).pyd \
+ PCbuild/$(python_arch_subdir)_sqlite3$(if $(MSVC_USE_DEBUG_RUNTIME),_d).pyd \
PCbuild/$(python_arch_subdir)_ssl$(if $(MSVC_USE_DEBUG_RUNTIME),_d).pyd \
PCbuild/$(python_arch_subdir)_uuid$(if $(MSVC_USE_DEBUG_RUNTIME),_d).pyd \
PCbuild/$(python_arch_subdir)_zoneinfo$(if $(MSVC_USE_DEBUG_RUNTIME),_d).pyd \
@@ -117,6 +119,7 @@ python3_EXTENSION_MODULES= \
Modules/_sha2.$(python3_EXTENSION_MODULE_SUFFIX).so \
Modules/_sha3.$(python3_EXTENSION_MODULE_SUFFIX).so \
Modules/_socket.$(python3_EXTENSION_MODULE_SUFFIX).so \
+ Modules/_sqlite3.$(python3_EXTENSION_MODULE_SUFFIX).so \
Modules/spwd.$(python3_EXTENSION_MODULE_SUFFIX).so \
$(if $(ENABLE_OPENSSL), \
Modules/_ssl.$(python3_EXTENSION_MODULE_SUFFIX).so \
@@ -173,7 +176,7 @@ endif
# packages not shipped:
-# dbm, sqlite3 - need some database stuff
+# dbm - need some database stuff
# curses - need curses to build the C module
# idlelib, tkinter, turtledemo - need Tk to build the C module
# test - probably unnecessary? was explicitly removed #i116738#
@@ -1726,6 +1729,13 @@ $(eval $(call gb_ExternalPackage_add_unpacked_files,python3,$(LIBO_BIN_FOLDER)/p
Lib/site-packages/README.txt \
))
+$(eval $(call gb_ExternalPackage_add_unpacked_files,python3,$(LIBO_BIN_FOLDER)/python-core-$(PYTHON_VERSION)/lib/sqlite3,\
+ Lib/sqlite3/__init__.py \
+ Lib/sqlite3/__main__.py \
+ Lib/sqlite3/dbapi2.py \
+ Lib/sqlite3/dump.py \
+))
+
$(eval $(call gb_ExternalPackage_add_unpacked_files,python3,$(LIBO_BIN_FOLDER)/python-core-$(PYTHON_VERSION)/lib/tomllib,\
Lib/tomllib/__init__.py \
Lib/tomllib/_parser.py \
diff --git a/external/python3/ExternalProject_python3.mk b/external/python3/ExternalProject_python3.mk
index af49f9bdd081..30a8cdcbd7ba 100644
--- a/external/python3/ExternalProject_python3.mk
+++ b/external/python3/ExternalProject_python3.mk
@@ -14,6 +14,7 @@ $(eval $(call gb_ExternalProject_use_externals,python3,\
expat \
$(if $(filter WNT LINUX,$(OS)),libffi) \
openssl \
+ $(if $(ENABLE_SQLITE3),sqlite3) \
zlib \
))
@@ -42,6 +43,7 @@ $(call gb_ExternalProject_get_state_target,python3,build) :
/p:opensslIncludeDir=$(gb_UnpackedTarball_workdir)/openssl/include \
/p:opensslOutDir=$(gb_UnpackedTarball_workdir)/openssl \
/p:zlibDir=$(gb_UnpackedTarball_workdir)/zlib \
+ /p:sqlite3Dir=$(gb_UnpackedTarball_workdir)/sqlite3 \
/p:libffiOutDir=$(gb_UnpackedTarball_workdir)/libffi/$(HOST_PLATFORM)/.libs \
/p:libffiIncludeDir=$(gb_UnpackedTarball_workdir)/libffi/$(HOST_PLATFORM)/include \
/maxcpucount \
@@ -112,6 +114,7 @@ $(call gb_ExternalProject_get_state_target,python3,build) :
$(if $(filter -fsanitize=undefined,$(CC)),-fno-sanitize=function) \
$(if $(SYSTEM_BZIP2),,-I$(gb_UnpackedTarball_workdir)/bzip2) \
$(if $(SYSTEM_EXPAT),,-I$(gb_UnpackedTarball_workdir)/expat/lib) \
+ $(if $(SYSTEM_SQLITE3),,-I$(gb_UnpackedTarball_workdir)/sqlite3) \
$(if $(SYSBASE), -I$(SYSBASE)/usr/include) \
)" \
$(if $(python3_cflags),CFLAGS='$(python3_cflags)') \
@@ -121,6 +124,7 @@ $(call gb_ExternalProject_get_state_target,python3,build) :
$(if $(SYSTEM_BZIP2),,-L$(gb_UnpackedTarball_workdir)/bzip2) \
$(if $(SYSTEM_EXPAT),,-L$(gb_StaticLibrary_WORKDIR)) \
$(if $(SYSTEM_ZLIB),,-L$(gb_StaticLibrary_WORKDIR)) \
+ $(if $(SYSTEM_SQLITE3),,-L$(gb_StaticLibrary_WORKDIR)) \
$(if $(SYSBASE), -L$(SYSBASE)/usr/lib) \
$(gb_LTOFLAGS) \
)" \
@@ -203,7 +207,6 @@ $(call gb_ExternalProject_get_state_target,python3,executables) : $(call gb_Exte
$(call gb_ExternalProject_get_state_target,python3,removeunnecessarystuff) : $(call gb_ExternalProject_get_state_target,python3,build)
$(call gb_Output_announce,python3 - remove the stuff we don't need to ship,build,CUS,5)
rm -r $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/dbm
- rm -r $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/sqlite3
rm -r $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/curses
rm -r $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/idlelib
rm -r $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/tkinter
@@ -211,7 +214,6 @@ $(call gb_ExternalProject_get_state_target,python3,removeunnecessarystuff) : $(c
rm -r $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/test
# Then the binary libraries
rm $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/lib-dynload/_dbm.$(python3_EXTENSION_MODULE_SUFFIX).so
- rm $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/lib-dynload/_sqlite3.$(python3_EXTENSION_MODULE_SUFFIX).so
rm $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/lib-dynload/_curses.$(python3_EXTENSION_MODULE_SUFFIX).so
rm $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/lib-dynload/_curses_panel.$(python3_EXTENSION_MODULE_SUFFIX).so
rm $(python3_fw_prefix)/lib/python$(PYTHON_VERSION_MAJOR).$(PYTHON_VERSION_MINOR)/lib-dynload/_test*.$(python3_EXTENSION_MODULE_SUFFIX).so
diff --git a/external/python3/UnpackedTarball_python3.mk b/external/python3/UnpackedTarball_python3.mk
index a34c4c58fdcc..e47088eb256b 100644
--- a/external/python3/UnpackedTarball_python3.mk
+++ b/external/python3/UnpackedTarball_python3.mk
@@ -42,6 +42,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,python3,\
external/python3/ubsan.patch.0 \
external/python3/init-sys-streams-cant-initialize-stdin.patch.0 \
external/python3/setuptools.patch.1 \
+ external/python3/sqlite3.patch.1 \
))
ifneq ($(filter DRAGONFLY FREEBSD LINUX NETBSD OPENBSD SOLARIS,$(OS)),)
diff --git a/external/python3/generateExternalPackage.py b/external/python3/generateExternalPackage.py
index afa4aab0610e..18fe5af3e10b 100755
--- a/external/python3/generateExternalPackage.py
+++ b/external/python3/generateExternalPackage.py
@@ -10,7 +10,7 @@ from os import path, walk
if __name__ == '__main__':
- ignoredPackages = ["dbm", "curses", "test", "tkinter", "turtledemo", "sqlite3", "idlelib"]
+ ignoredPackages = ["dbm", "curses", "test", "tkinter", "turtledemo", "idlelib"]
coreDir = path.dirname(path.dirname(path.dirname(path.abspath(__file__))))
pythonDir = path.join(coreDir, "workdir/UnpackedTarball/python3")
diff --git a/external/python3/python-3.5.4-msvc-disable.patch.1 b/external/python3/python-3.5.4-msvc-disable.patch.1
index 74a96f8800e3..81aca78fbea1 100644
--- a/external/python3/python-3.5.4-msvc-disable.patch.1
+++ b/external/python3/python-3.5.4-msvc-disable.patch.1
@@ -36,16 +36,7 @@ diff -ru python3.orig/PCbuild/pcbuild.sln python3/PCbuild/pcbuild.sln
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "winsound", "winsound.vcxproj", "{28B5D777-DDF2-4B6B-B34F-31D938813856}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_decimal", "_decimal.vcxproj", "{0E9791DB-593A-465F-98BC-681011311617}"
-@@ -73,8 +63,6 @@
- EndProject
- Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_socket", "_socket.vcxproj", "{86937F53-C189-40EF-8CE8-8759D8E7D480}"
- EndProject
--Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_sqlite3", "_sqlite3.vcxproj", "{13CECB97-4119-4316-9D42-8534019A5A44}"
--EndProject
- Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_ssl", "_ssl.vcxproj", "{C6E20F84-3247-4AD6-B051-B073268F73BA}"
- EndProject
- Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testcapi", "_testcapi.vcxproj", "{6901D91C-6E48-4BB7-9FEC-700C8131DF1D}"
-@@ -85,22 +73,14 @@
+@@ -75,20 +75,14 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_testimportmultiple", "_testimportmultiple.vcxproj", "{36D0C52C-DF4E-45D0-8BC7-E294C3ABC781}"
EndProject
@@ -63,11 +54,9 @@ diff -ru python3.orig/PCbuild/pcbuild.sln python3/PCbuild/pcbuild.sln
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_hashlib", "_hashlib.vcxproj", "{447F05A8-F581-4CAC-A466-5AC7936E207E}"
-EndProject
--Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite3", "sqlite3.vcxproj", "{A1A295E5-463C-437F-81CA-1F32367685DA}"
--EndProject
- Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_multiprocessing", "_multiprocessing.vcxproj", "{9E48B300-37D1-11DD-8C41-005056C00008}"
+ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sqlite3", "sqlite3.vcxproj", "{A1A295E5-463C-437F-81CA-1F32367685DA}"
EndProject
- Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python3dll", "python3dll.vcxproj", "{885D4898-D08D-4091-9C40-C700CFE3FC5A}"
+ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_multiprocessing", "_multiprocessing.vcxproj", "{9E48B300-37D1-11DD-8C41-005056C00008}"
@@ -139,8 +119,6 @@
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "_queue", "_queue.vcxproj", "{78D80A15-BD8C-44E2-B49E-1F05B0A0A687}"
diff --git a/external/python3/sqlite3.patch.1 b/external/python3/sqlite3.patch.1
new file mode 100644
index 000000000000..22a987924efc
--- /dev/null
+++ b/external/python3/sqlite3.patch.1
@@ -0,0 +1,11 @@
+--- python3/PCbuild/sqlite3.vcxproj 2025-10-28 12:15:59.386769096 +0100
++++ python3/PCbuild/sqlite3.vcxproj 2025-10-28 12:21:58.905090639 +0100
+@@ -88,7 +88,7 @@
+
+
+ <_ProjectFileVersion>10.0.30319.1
+- <_SqliteVersion>$([System.Text.RegularExpressions.Regex]::Match(`$(sqlite3Dir)`, `((\d+)\.(\d+)\.(\d+)\.(\d+))\\?$`).Groups)
++ <_SqliteVersion>$([System.Text.RegularExpressions.Regex]::Match(`0.0.0.0`, `((\d+)\.(\d+)\.(\d+)\.(\d+))\\?$`).Groups)
+ $(_SqliteVersion.Split(`;`)[1])
+ $(_SqliteVersion.Split(`;`)[2])
+ $(_SqliteVersion.Split(`;`)[3])
diff --git a/pyuno/Module_pyuno.mk b/pyuno/Module_pyuno.mk
index 7cf679bafdc6..c5cf0371050e 100644
--- a/pyuno/Module_pyuno.mk
+++ b/pyuno/Module_pyuno.mk
@@ -49,6 +49,7 @@ $(eval $(call gb_Module_add_check_targets,pyuno, \
PythonTest_pyuno_pytests_testbz2 \
PythonTest_pyuno_pytests_testpip \
PythonTest_pyuno_pytests_testsetuptools \
+ PythonTest_pyuno_pytests_testsqlite3 \
PythonTest_pyuno_pytests_testvenv \
))
diff --git a/pyuno/PythonTest_pyuno_pytests_testsqlite3.mk b/pyuno/PythonTest_pyuno_pytests_testsqlite3.mk
new file mode 100644
index 000000000000..6a1ed36c5621
--- /dev/null
+++ b/pyuno/PythonTest_pyuno_pytests_testsqlite3.mk
@@ -0,0 +1,16 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+$(eval $(call gb_PythonTest_PythonTest,pyuno_pytests_testsqlite3))
+
+$(eval $(call gb_PythonTest_add_modules,pyuno_pytests_testsqlite3,$(SRCDIR)/pyuno/qa/pytests,\
+ testsqlite3 \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/pyuno/qa/pytests/testsqlite3.py b/pyuno/qa/pytests/testsqlite3.py
new file mode 100644
index 000000000000..bf515d351f02
--- /dev/null
+++ b/pyuno/qa/pytests/testsqlite3.py
@@ -0,0 +1,14 @@
+import os
+import unittest
+
+# I want to ensure that import sqlite3 works on all platforms
+class SQLITE3Test(unittest.TestCase):
+ def test_sqlite3_import(self):
+ import sqlite3
+
+ # use imported sqlite3 module for pyflakes
+ with open(os.devnull, "w") as devnull:
+ print(str(sqlite3), file=devnull)
+
+if __name__ == '__main__':
+ unittest.main()