Search code examples
pythoncsqlitesqlcipher

Unable to build sqlcipher3 on Windows


after building sqlcipher, copied sqlite3.c and sqlite3.h in the root folder, I'm trying to build sqlcipher3 (on Windows 10, Python 3.9.0):

C:\dev\py\sqlcipher3# setup.py build_static build
running build_static
Builds a C extension using a sqlcipher amalgamation
building 'sqlcipher3._sqlite3' extension
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29333\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME="sqlcipher3.dbapi2" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS4=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_SOUNDEX=1 -DSQLITE_USE_URI=1 -DSQLITE_TEMP_STORE=2 -DSQLITE_MAX_VARIABLE_NUMBER=250000 -DSQLITE_DEFAULT_PAGE_SIZE=4096 -DSQLITE_DEFAULT_CACHE_SIZE=-8000 -Dinline=__inline -I. -IC:\OpenSSL-Win64\include -IC:\Python\include -IC:\Python\include -IC:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29333\include -IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um -IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt -IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared -IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um -IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt -IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt /Tc.\sqlite3.c /Fobuild\temp.win-amd64-3.9\Release.\sqlite3.obj
sqlite3.c
.\sqlite3.c(24335): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29333\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -DMODULE_NAME="sqlcipher3.dbapi2" -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS4=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_LOAD_EXTENSION=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 -DSQLITE_HAS_CODEC=1 -DSQLITE_SOUNDEX=1 -DSQLITE_USE_URI=1 -DSQLITE_TEMP_STORE=2 -DSQLITE_MAX_VARIABLE_NUMBER=250000 -DSQLITE_DEFAULT_PAGE_SIZE=4096 -DSQLITE_DEFAULT_CACHE_SIZE=-8000 -Dinline=__inline -I. -IC:\OpenSSL-Win64\include -IC:\Python\include -IC:\Python\include -IC:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29333\include -IC:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\include\um -IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt -IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared -IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um -IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt -IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt /Tcsrc\blob.c /Fobuild\temp.win-amd64-3.9\Release\src\blob.obj
blob.c
src\blob.c(178): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(359): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(386): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(408): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(421): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(421): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(439): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(439): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(508): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(536): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(550): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(550): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(574): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(574): warning C4244: 'function': conversion from 'Py_ssize_t' to 'int', possible loss of data
src\blob.c(638): error C2017: illegal escape sequence
src\blob.c(638): error C2224: left of '.Blob' must have struct/union type
src\blob.c(638): error C2001: newline in constant
src\blob.c(638): error C2059: syntax error: 'string'
error: command 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29333\bin\HostX86\x64\cl.exe' failed with exit code 2

Here the lines in Blob.c (line 638 is MODULE_NAME ".Blob",):

PyTypeObject pysqlite_BlobType = {
        PyVarObject_HEAD_INIT(NULL, 0)
        MODULE_NAME ".Blob",
        .tp_basicsize = sizeof(pysqlite_Blob),
        .tp_dealloc = (destructor)pysqlite_blob_dealloc,
        .tp_as_sequence = &blob_sequence_methods,
        .tp_as_mapping = &blob_mapping_methods,
        .tp_flags = Py_TPFLAGS_DEFAULT,
        .tp_weaklistoffset = offsetof(pysqlite_Blob, in_weakreflist),
        .tp_methods = blob_methods,
};

Can someone help me to proceed? Thank you


Solution

  • I just had the same issue today, with pretty much exactly the same setup. I needed to do two modifications in order to successfully compile sqlcipher3:

    1. The content of the MODULE_NAME precompiler definition is set in line 38 of setup.py. The function quote_argument, which is called here, differentiates between Windows and other platforms. On Windows, the quote character is escaped with a backslash. At least for MSVC2019, this seems to be incorrect. To fix it, just remove the Windows-specific stuff on line 35.

    2. The library names of OpenSSL have changed in version 1.1.0. If you are using a newer version, you might have to change the library name from libeay32.lib to libcrypto.lib or whatever the library is called on your system (in line 132). In addition, you might have to set the environment variable OPENSSL_CONF, to help the build script to find OpenSSL on your system.

    With these two small modifications, the build process worked fine.