0
0
mirror of https://github.com/tursodatabase/libsql.git synced 2024-12-15 14:29:44 +00:00
Pekka Enberg c8902c3bf6
libsql-sys: Disable SQLCipher support (#1141)
The SQLCipher cipher does not work with frame injection:

https://github.com/tursodatabase/libsql/issues/1122

Therefore, disable the cipher for now and switch default to "aes256cbc".
2024-03-06 08:55:19 +00:00

449 lines
15 KiB
CMake

cmake_minimum_required(VERSION 3.18.0.0)
project(sqlite3mc)
# Helper macro
macro(_Enable_MT _target)
target_compile_options(${_target} PRIVATE
$<$<CONFIG:Release>:/MT>$<$<CONFIG:Debug>:/MTd>
)
endmacro()
set(_SQLITE3MC_REQUIRE_ZLIB OFF)
OPTION(SQLITE3MC_STATIC_RUNTIME_LINK "Link the c++ runtime statically" OFF)
OPTION(SQLITE3MC_STATIC "Build SQLITE3MC as a static library" OFF)
OPTION(SQLITE3MC_BUILD_SHELL "Builds the SQLITE3MC Shell" ON)
OPTION(SQLITE3MC_WITH_ICU "Builds SQLITE3MC with the ICU library. Will use the FindICU function to locate the library. (https://cmake.org/cmake/help/latest/module/FindICU.html)" OFF)
OPTION(SQLITE_ENABLE_DEBUG "Enable SQLite debugging" OFF)
OPTION(SQLITE_SOUNDEX "Enable the soundex() SQL function" ON)
OPTION(SQLITE_ENABLE_COLUMN_METADATA "Enable convenient access to meta-data about tables and queries" ON)
OPTION(SQLITE_SECURE_DELETE "Enable secure delete to overwrite deleted content with zeros" ON)
OPTION(SQLITE_ENABLE_FTS3 "Enable version 3 of the full-text search engine" ON)
OPTION(SQLITE_ENABLE_FTS3_PARENTHESIS "Support operators AND and NOT and nested parenthesis" ON)
OPTION(SQLITE_ENABLE_FTS4 "Enable version 4 of the full-text search engine" ON)
OPTION(SQLITE_ENABLE_FTS5 "Enable version 5 of the full-text search engine" ON)
OPTION(SQLITE_ENABLE_CARRAY "Enable extension 'carray'" ON)
OPTION(SQLITE_ENABLE_CSV "Enable extension 'csv'" ON)
OPTION(SQLITE_ENABLE_EXTFUNC "Enable extension 'extfunc'" ON)
OPTION(SQLITE_ENABLE_GEOPOLY "Enable extension 'geopoly'" ON)
OPTION(SQLITE_ENABLE_JSON1 "Enable extension 'json1'" ON)
OPTION(SQLITE_ENABLE_RTREE "Enable extension 'rtree'" ON)
OPTION(SQLITE_ENABLE_UUID "Enable extension 'uuid'" ON)
OPTION(SQLITE_USE_URI "Enable the URI filename process logic" ON)
OPTION(SQLITE_USER_AUTHENTICATION "Enable extension 'user authentication'" ON)
OPTION(SQLITE_ENABLE_PREUPDATE_HOOK "Enable preupdate hooks" OFF)
OPTION(SQLITE_ENABLE_SESSION "Enable session extension" OFF)
OPTION(SQLITE_SHELL_IS_UTF8 "Shell command line arguments in UTF-8 encoding" ON)
# Options for library only
OPTION(SQLITE_ENABLE_FILEIO "Enable extension 'fileio'" ON)
OPTION(SQLITE_ENABLE_REGEXP "Enable extension 'regexp'" ON)
OPTION(SQLITE_ENABLE_SERIES "Enable extension 'series'" ON)
OPTION(SQLITE_ENABLE_SHA3 "Enable extension 'sha3'" ON)
# Options for shell only (compatibility with official SQLite shell)
OPTION(SQLITE_ENABLE_EXPLAIN_COMMENTS "Insert comment text into the output of EXPLAIN (shell only)" ON)
OPTION(SQLITE_ENABLE_DBPAGE_VTAB "Enable the SQLITE_DBPAGE virtual table (shell only)" ON)
OPTION(SQLITE_ENABLE_DBSTAT_VTAB "Enable the dbstat virtual table (shell only)" ON)
OPTION(SQLITE_ENABLE_STMTVTAB "Enable the SQLITE_STMT virtual table (shell only)" ON)
OPTION(SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION "Suppress 'unknown function' errors when running an EXPLAIN or EXPLAIN QUERY PLAN (shell only)" ON)
# Embedded Compression
OPTION(SQLITE3MC_USE_MINIZ "Use builtin ZLIB replacement" OFF)
# Compression/Options that require ZLIB
OPTION(SQLITE_ENABLE_COMPRESS "Enable extension 'compress'" OFF)
OPTION(SQLITE_ENABLE_SQLAR "Enable extension 'sqlar'" OFF)
OPTION(SQLITE_ENABLE_ZIPFILE "Enable extension 'zipfile'" OFF)
# Legacy Encryption Extensions
OPTION(SQLITE3MC_USE_SQLEET_LEGACY "Use sqleet legacy mode as default" OFF)
OPTION(SQLITE3MC_USE_SQLCIPHER_LEGACY "Use sqlcipher legacy mode as default" OFF)
# Additional memory security (filling freed memory allocations with zeros or random data)
OPTION(SQLITE3MC_SECURE_MEMORY "Enable pragma to secure freed memory" OFF)
OPTION(SQLITE3MC_USE_RANDOM_FILL_MEMORY "Fill freed memory with random data" OFF)
# Omit AES hardware support
OPTION(SQLITE3MC_OMIT_AES_HARDWARE_SUPPORT "Omit AES hardware support" OFF)
# Enable Wasm runtime
OPTION(LIBSQL_ENABLE_WASM_RUNTIME "Enable libSQL Wasm runtime" OFF)
# TCL
#OPTION(SQLITE_ENABLE_TCL "Enable TCL interface" OFF)
set(SQLITE_MAX_ATTACHED "10" CACHE STRING "Max number of attached files (must be in the range 0..125)")
set(SQLITE_DQS "0" CACHE STRING "Allow double-quoted string literals")
set_property(CACHE SQLITE_DQS PROPERTY STRINGS 0 1 2 3)
set(SQLITE_THREADSAFE 1 CACHE STRING "Set threading mode (0 = single-threaded, 1 = serialized, 2 = multi-threaded)")
set_property(CACHE SQLITE_THREADSAFE PROPERTY STRINGS 0 1 2)
set(CODEC_TYPE CHACHA20 CACHE STRING "Set default codec type")
set_property(CACHE CODEC_TYPE PROPERTY STRINGS AES128 AES256 CHACHA20 SQLCIPHER RC4 ASCON128)
if(SQLITE_ENABLE_COMPRESS OR SQLITE_ENABLE_SQLAR OR SQLITE_ENABLE_ZIPFILE)
if(NOT SQLITE3MC_USE_MINIZ)
set(_SQLITE3MC_REQUIRE_ZLIB ON)
endif()
endif()
# Setup the options
set(SQLITE3MC_BASE_DEFINITIONS
$<$<BOOL:${SQLITE_SHELL_IS_UTF8}>:SQLITE_SHELL_IS_UTF8=1>
CODEC_TYPE=CODEC_TYPE_${CODEC_TYPE}
SQLITE_DQS=${SQLITE_DQS}
SQLITE_MAX_ATTACHED=${SQLITE_MAX_ATTACHED}
$<$<BOOL:${SQLITE_USER_AUTHENTICATION}>:SQLITE_USER_AUTHENTICATION=1>
$<$<BOOL:${SQLITE_ENABLE_DEBUG}>:SQLITE_ENABLE_DEBUG=1>
SQLITE_THREADSAFE=${SQLITE_THREADSAFE}
$<$<BOOL:${SQLITE_SOUNDEX}>:SQLITE_SOUNDEX=1>
$<$<BOOL:${SQLITE_ENABLE_COLUMN_METADATA}>:SQLITE_ENABLE_COLUMN_METADATA=1>
$<$<BOOL:${SQLITE_SECURE_DELETE}>:SQLITE_SECURE_DELETE=1>
$<$<BOOL:${SQLITE_ENABLE_FTS3}>:SQLITE_ENABLE_FTS3=1>
$<$<BOOL:${SQLITE_ENABLE_FTS3_PARENTHESIS}>:SQLITE_ENABLE_FTS3_PARENTHESIS=1>
$<$<BOOL:${SQLITE_ENABLE_FTS4}>:SQLITE_ENABLE_FTS4=1>
$<$<BOOL:${SQLITE_ENABLE_FTS5}>:SQLITE_ENABLE_FTS5=1>
$<$<BOOL:${SQLITE_ENABLE_JSON1}>:SQLITE_ENABLE_JSON1=1>
$<$<BOOL:${SQLITE_ENABLE_RTREE}>:SQLITE_ENABLE_RTREE=1>
$<$<BOOL:${SQLITE_ENABLE_GEOPOLY}>:SQLITE_ENABLE_GEOPOLY=1>
$<$<BOOL:${SQLITE_ENABLE_EXTFUNC}>:SQLITE_ENABLE_EXTFUNC=1>
$<$<BOOL:${SQLITE_ENABLE_CARRAY}>:SQLITE_ENABLE_CARRAY=1>
$<$<BOOL:${SQLITE_ENABLE_UUID}>:SQLITE_ENABLE_UUID=1>
SQLITE_TEMP_STORE=2
$<$<BOOL:${SQLITE_USE_URI}>:SQLITE_USE_URI=1>
$<$<BOOL:${SQLITE_USER_AUTHENTICATION}>:SQLITE_USER_AUTHENTICATION=1>
$<$<BOOL:${SQLITE_ENABLE_PREUPDATE_HOOK}>:SQLITE_ENABLE_PREUPDATE_HOOK=1>
$<$<BOOL:${SQLITE_ENABLE_SESSION}>:SQLITE_ENABLE_SESSION=1>
$<$<BOOL:${SQLITE3MC_USE_MINIZ}>:SQLITE3MC_USE_MINIZ=1>
$<$<BOOL:${SQLITE3MC_OMIT_AES_HARDWARE_SUPPORT}>:SQLITE3MC_OMIT_AES_HARDWARE_SUPPORT=1>
$<$<BOOL:${LIBSQL_ENABLE_WASM_RUNTIME}>:LIBSQL_ENABLE_WASM_RUNTIME=1>
LIBSQL_EXTRA_PRAGMAS=1
LIBSQL_CUSTOM_PAGER_CODEC=1
SQLITE_ENABLE_DBSTAT_VTAB=1
SQLITE_ENABLE_DBPAGE_VTAB=1
SQLITE_ENABLE_STMTVTAB=1
SQLITE_DEFAULT_FOREIGN_KEYS=1
HAVE_CIPHER_AES_128_CBC=0
HAVE_CIPHER_AES_256_CBC=1
HAVE_CIPHER_CHACHA20=0
HAVE_CIPHER_SQLCIPHER=0
HAVE_CIPHER_RC4=0
HAVE_CIPHER_ASCON128=0
# $<$<BOOL:${SQLITE_USE_TCL}>:SQLITE_USE_TCL=1>
)
set(SQLITE3MC_LIBONLY_DEFINITIONS
$<$<BOOL:${SQLITE_ENABLE_FILEIO}>:SQLITE_ENABLE_FILEIO=1>
$<$<BOOL:${SQLITE_ENABLE_REGEXP}>:SQLITE_ENABLE_REGEXP=1>
$<$<BOOL:${SQLITE_ENABLE_SERIES}>:SQLITE_ENABLE_SERIES=1>
$<$<BOOL:${SQLITE_ENABLE_SHA3}>:SQLITE_ENABLE_SHA3=1>
)
set(SQLITE3MC_ZLIB_DEFINITIONS
)
set(SQLITE3MC_SHELL_DEFINITIONS
$<$<BOOL:${SQLITE_SHELL_IS_UTF8}>:SQLITE_SHELL_IS_UTF8=1>
$<$<BOOL:${SQLITE_ENABLE_EXPLAIN_COMMENTS}>:SQLITE_ENABLE_EXPLAIN_COMMENTS=1>
$<$<BOOL:${SQLITE_ENABLE_DBPAGE_VTAB}>:SQLITE_ENABLE_DBPAGE_VTAB=1>
$<$<BOOL:${SQLITE_ENABLE_DBSTAT_VTAB}>:SQLITE_ENABLE_DBSTAT_VTAB=1>
$<$<BOOL:${SQLITE_ENABLE_STMTVTAB}>:SQLITE_ENABLE_STMTVTAB=1>
$<$<BOOL:${SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION}>:SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION=1>
)
if(SQLITE3MC_USE_SQLEET_LEGACY)
set(SQLITE3MC_BASE_DEFINITIONS
${SQLITE3MC_BASE_DEFINITIONS}
SQLITE3MC_USE_SQLEET_LEGACY=1
)
endif()
if(SQLITE3MC_USE_SQLCIPHER_LEGACY)
if(NOT DEFINED SQLCIPHER_VERSION_DEFAULT)
set(SQLCIPHER_VERSION_DEFAULT "4")
endif()
set(SQLITE3MC_BASE_DEFINITIONS
${SQLITE3MC_BASE_DEFINITIONS}
SQLITE3MC_USE_SQLCIPHER_LEGACY=1
SQLCIPHER_VERSION_DEFAULT=${SQLCIPHER_VERSION_DEFAULT}
)
endif()
if(SQLITE3MC_SECURE_MEMORY)
set(SQLITE3MC_BASE_DEFINITIONS
${SQLITE3MC_BASE_DEFINITIONS}
SQLITE3MC_SECURE_MEMORY=1
)
endif()
if(SQLITE3MC_USE_RANDOM_FILL_MEMORY)
set(SQLITE3MC_BASE_DEFINITIONS
${SQLITE3MC_BASE_DEFINITIONS}
SQLITE3MC_USE_RANDOM_FILL_MEMORY=1
)
endif()
if(SQLITE3MC_USE_MINIZ OR _SQLITE3MC_REQUIRE_ZLIB)
if(_SQLITE3MC_REQUIRE_ZLIB)
# Use ZLIB_ROOT to specify the location to look
find_package(ZLIB)
if(NOT ZLIB_FOUND)
message( FATAL_ERROR "One of the flags specified requires zlib. Zlib is not found. Try specifying the ZLIB_ROOT environment variable.")
endif()
endif()
if(SQLITE3MC_USE_MINIZ OR ZLIB_FOUND)
set(SQLITE3MC_BASE_DEFINITIONS
${SQLITE3MC_BASE_DEFINITIONS}
$<$<BOOL:${SQLITE_ENABLE_COMPRESS}>:SQLITE_ENABLE_COMPRESS=1>
)
set(SQLITE3MC_ZLIB_DEFINITIONS
${SQLITE3MC_ZLIB_DEFINITIONS}
$<$<BOOL:${SQLITE_ENABLE_SQLAR}>:SQLITE_ENABLE_SQLAR=1>
$<$<BOOL:${SQLITE_ENABLE_ZIPFILE}>:SQLITE_ENABLE_ZIPFILE=1>
)
set(SQLITE3MC_SHELL_DEFINITIONS
${SQLITE3MC_SHELL_DEFINITIONS}
SQLITE_HAVE_ZLIB=1
)
endif()
endif()
if(SQLITE3MC_WITH_ICU)
find_package(ICU REQUIRED COMPONENTS data i18n io uc)
if(ICU_FOUND)
set(SQLITE3MC_ICU_DEFINITIONS
SQLITE_ENABLE_ICU=1
)
else()
message( FATAL_ERROR "ICU not found.")
endif()
endif()
# Only generate Debug and Release configuration types.
set(CMAKE_CONFIGURATION_TYPES Debug Release)
set(SQLITE3MC_PUBLIC_HEADERS
src/sqlite3.h
src/sqlite3ext.h
src/sqlite3mc.h
src/sqlite3mc_version.h
src/sqlite3mc_vfs.h
src/sqlite3userauth.h
)
set(SQLITE3MC_BASE_SRCS
src/sqlite3mc.c
src/cipher_common.h
src/cipher_config.h
src/fastpbkdf2.h
src/mystdint.h
src/rijndael.h
src/sha1.h
src/sha2.h
src/test_windirent.h
${SQLITE3MC_PUBLIC_HEADERS}
)
set(SQLITE3MC_DLLRES_SRCS
src/sqlite3mc.rc
)
set(SQLITE3MC_SHELL_SRCS
src/shell.c
src/sqlite3mc.c
src/sqlite3mc_shell.rc
)
set(SQLITE3MC_INCLUDEDIRS
src
)
set(SQLITE3MC_LINK_LIBRARIES )
set(SQLITE3MC_DLL_DEFINITIONS )
set(SQLITE3MC_SHELL_SYSTEM_LINKS )
if(MSVC)
set(SQLITE3MC_DLL_DEFINITIONS
_USRDLL
)
endif()
if (CMAKE_SYSTEM_NAME STREQUAL "Linux"
OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
# Do not set `-maes -msee4.2` when we are on arm which doesn't support
# this instruction set.
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64"
OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -maes")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -maes")
endif()
set(SQLITE3MC_LINK_LIBRARIES
pthread
dl
m
)
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
list(APPEND SQLITE3MC_LINK_LIBRARIES "-framework Security")
endif()
set(SHARED_LIB_EXPORT_DEFINITION "__attribute__((visibility(\"default\")))")
else()
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -maes")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -maes")
endif()
set(SHARED_LIB_EXPORT_DEFINITION "__declspec(dllexport)")
endif()
if (CMAKE_C_COMPILER_ID STREQUAL "Clang")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -maes -Wno-error=incompatible-function-pointer-types")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 -maes")
endif()
set(_LIB_DIFINITIONS
_LIB
)
set(_DEFAULT_DEFINITIONS
_CRT_SECURE_NO_WARNINGS
_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_WARNINGS
_CRT_NONSTDC_NO_DEPRECATE
_UNICODE
UNICODE
)
set(SQLITE3MC_SHELL_TARGET "sqlite3mc_shell")
if(SQLITE3MC_STATIC)
set(SQLITE3MC_LINK "STATIC")
set(SQLITE3MC_TARGET "sqlite3mc_static")
else()
set(SQLITE3MC_LINK "SHARED")
set(SQLITE3MC_TARGET "sqlite3mc")
list(APPEND SQLITE3MC_BASE_SRCS ${SQLITE3MC_DLLRES_SRCS})
endif()
# Lib Project
add_library(${SQLITE3MC_TARGET} ${SQLITE3MC_LINK}
${SQLITE3MC_BASE_SRCS}
)
target_include_directories(${SQLITE3MC_TARGET} PRIVATE
${SQLITE3MC_INCLUDEDIRS}
)
target_compile_definitions(${SQLITE3MC_TARGET} PRIVATE
${_LIB_DIFINITIONS}
${_DEFAULT_DEFINITIONS}
${SQLITE3MC_BASE_DEFINITIONS}
${SQLITE3MC_LIBONLY_DEFINITIONS}
${SQLITE3MC_ZLIB_DEFINITIONS}
)
target_link_libraries(${SQLITE3MC_TARGET} PRIVATE
${SQLITE3MC_LINK_LIBRARIES}
)
if(NOT SQLITE3MC_STATIC)
target_compile_definitions(${SQLITE3MC_TARGET} PRIVATE
SQLITE_API=${SHARED_LIB_EXPORT_DEFINITION}
)
endif()
if(ZLIB_FOUND)
target_include_directories(${SQLITE3MC_TARGET} PRIVATE
${ZLIB_INCLUDE_DIRS}
)
target_link_libraries(${SQLITE3MC_TARGET} PRIVATE
${ZLIB_LIBRARIES}
)
message(${ZLIB_LIBRARIES})
endif()
if(SQLITE3MC_WITH_ICU)
target_compile_definitions(${SQLITE3MC_TARGET} PRIVATE
${SQLITE3MC_ICU_DEFINITIONS}
)
target_include_directories(${SQLITE3MC_TARGET} PRIVATE
${ICU_INCLUDE_DIRS}
)
target_link_libraries(${SQLITE3MC_TARGET} PRIVATE
${ICU_LIBRARIES}
)
message("Will build ${SQLITE3MC_TARGET} with ICU")
endif()
if(SQLITE3MC_STATIC_RUNTIME_LINK)
message("Will build ${SQLITE3MC_TARGET} with static runtime link")
_Enable_MT(${SQLITE3MC_TARGET})
endif()
message("Will build ${SQLITE3MC_TARGET} as ${SQLITE3MC_LINK}")
set_target_properties(${SQLITE3MC_TARGET} PROPERTIES PUBLIC_HEADER "${SQLITE3MC_PUBLIC_HEADERS}")
INSTALL(TARGETS ${SQLITE3MC_TARGET}
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
PUBLIC_HEADER DESTINATION include/${CMAKE_PROJECT_NAME}
RUNTIME DESTINATION bin
)
# Shell Executable project
if(SQLITE3MC_BUILD_SHELL)
add_executable(${SQLITE3MC_SHELL_TARGET}
${SQLITE3MC_SHELL_SRCS}
)
target_include_directories(${SQLITE3MC_SHELL_TARGET} PRIVATE
${SQLITE3MC_INCLUDEDIRS}
)
target_compile_definitions(${SQLITE3MC_SHELL_TARGET} PRIVATE
${_DEFAULT_DEFINITIONS}
${SQLITE3MC_BASE_DEFINITIONS}
${SQLITE3MC_SHELL_DEFINITIONS}
)
target_link_libraries(${SQLITE3MC_SHELL_TARGET} PRIVATE
${SQLITE3MC_SHELL_SYSTEM_LINKS}
${SQLITE3MC_LINK_LIBRARIES}
)
if(ZLIB_FOUND)
target_include_directories(${SQLITE3MC_SHELL_TARGET} PRIVATE
${ZLIB_INCLUDE_DIRS}
)
target_link_libraries(${SQLITE3MC_SHELL_TARGET} PRIVATE
${ZLIB_LIBRARIES}
)
endif()
if(SQLITE3MC_WITH_ICU)
target_compile_definitions(${SQLITE3MC_SHELL_TARGET} PRIVATE
${SQLITE3MC_ICU_DEFINITIONS}
)
target_include_directories(${SQLITE3MC_SHELL_TARGET} PRIVATE
${ICU_INCLUDE_DIRS}
)
target_link_libraries(${SQLITE3MC_SHELL_TARGET} PRIVATE
${ICU_LIBRARIES}
)
message("Will build ${SQLITE3MC_SHELL_TARGET} with ICU")
endif()
if(SQLITE3MC_RUNTIME_LINK)
message("Will build ${SQLITE3MC_SHELL_TARGET} with static runtime")
_Enable_MT(${SQLIT3MC_SHELL_TARGET})
endif()
message("Will build ${SQLITE3MC_SHELL_TARGET}")
INSTALL(TARGETS ${SQLITE3MC_SHELL_TARGET}
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
PUBLIC_HEADER DESTINATION include/${CMAKE_PROJECT_NAME}
RUNTIME DESTINATION bin
)
endif()