diff --git a/packages/common/amplify_db_common/example/pubspec.yaml b/packages/common/amplify_db_common/example/pubspec.yaml index aee1e97d19..a5b6ab272c 100644 --- a/packages/common/amplify_db_common/example/pubspec.yaml +++ b/packages/common/amplify_db_common/example/pubspec.yaml @@ -11,10 +11,11 @@ dependencies: drift: ">=2.18.0 <2.19.0" flutter: sdk: flutter - # Unused in example app, rather included to validate - # windows app will build when there is a downstream dependency on sqlite3 + # Included to validate windows app will build when there is a downstream + # dependency on sqlite3. Also requires the USE_CUSTOM_SQLITE3=ON flag set + # in the consuming App's CMakeLists.txt # https://github.com/aws-amplify/amplify-flutter/issues/5477 - sqlite3: ">=2.0.0 <2.4.7" + # powersync: 1.4.2 dev_dependencies: amplify_lints: ^2.0.0 diff --git a/packages/common/amplify_db_common/example/windows/CMakeLists.txt b/packages/common/amplify_db_common/example/windows/CMakeLists.txt index 188b7ea59c..ff569a0c62 100644 --- a/packages/common/amplify_db_common/example/windows/CMakeLists.txt +++ b/packages/common/amplify_db_common/example/windows/CMakeLists.txt @@ -6,6 +6,9 @@ project(amplify_db_common_example LANGUAGES CXX) # the on-disk name of your application. set(BINARY_NAME "amplify_db_common_example") +# Example for having SQLITE3 not bundled at build time due to another dep exposing it globally +# set(USE_CUSTOM_SQLITE3 ON) + # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. cmake_policy(SET CMP0063 NEW) diff --git a/packages/common/amplify_db_common/windows/CMakeLists.txt b/packages/common/amplify_db_common/windows/CMakeLists.txt index b9788c4158..e03a0f84d4 100644 --- a/packages/common/amplify_db_common/windows/CMakeLists.txt +++ b/packages/common/amplify_db_common/windows/CMakeLists.txt @@ -16,14 +16,15 @@ add_library(${PLUGIN_NAME} SHARED "amplify_db_common_plugin.cpp" ) -# ## +### # Below here, keep in sync with: https://github.com/simolus3/sqlite3.dart/blob/main/sqlite3_flutter_libs/windows/CMakeLists.txt -# ## +### # Essentially, the idea of this build script is to compile a sqlite3.dll -# and make Fluter bundle that with the final app. +# and make Flutter bundle that with the final app. # It looks like we can't avoid building a sqlite3_flutter_libs.dll too, # but that's not on me. + apply_standard_settings(${PLUGIN_NAME}) set_target_properties(${PLUGIN_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden) @@ -32,71 +33,77 @@ target_include_directories(${PLUGIN_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include") target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin) -include(FetchContent) - -# Only add the sqlite3 library if it hasn't been defined already. -if(NOT TARGET sqlite3) - if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") - # cmake 3.24.0 added the `DOWNLOAD_EXTRACT_TIMESTAMP` and prints an ugly warning when - # the default is used, so override it to the recommended behavior. - # We can't really ask users to use a cmake that recent, so there's this if here. - FetchContent_Declare( - sqlite3 - URL https://sqlite.org/2023/sqlite-autoconf-3430000.tar.gz - DOWNLOAD_EXTRACT_TIMESTAMP NEW - ) - else() - FetchContent_Declare( - sqlite3 - URL https://sqlite.org/2023/sqlite-autoconf-3430000.tar.gz - ) - endif() +# Option to allow users to opt out of the internal sqlite3 definition +option(USE_CUSTOM_SQLITE3 "Disable internal sqlite3 definition to allow downstream dependencies to define their own" OFF) - FetchContent_MakeAvailable(sqlite3) +if (NOT USE_CUSTOM_SQLITE3) + # Include and define sqlite3 if not already defined + if (NOT TARGET sqlite3) + include(FetchContent) + if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") + # cmake 3.24.0 added the `DOWNLOAD_EXTRACT_TIMESTAMP` and prints an ugly warning when + # the default is used, so override it to the recommended behavior. + # We can't really ask users to use a cmake that recent, so there's this if here. + FetchContent_Declare( + sqlite3 + URL https://sqlite.org/2023/sqlite-autoconf-3430000.tar.gz + DOWNLOAD_EXTRACT_TIMESTAMP NEW + ) + else() + FetchContent_Declare( + sqlite3 + URL https://sqlite.org/2023/sqlite-autoconf-3430000.tar.gz + ) + endif() + FetchContent_MakeAvailable(sqlite3) - # Define the sqlite3 library only if it wasn't already defined. - add_library(sqlite3 SHARED "sqlite3_flutter.c") + add_library(sqlite3 SHARED "sqlite3_flutter.c") - target_include_directories(sqlite3 PRIVATE "${sqlite3_SOURCE_DIR}") - target_compile_options(sqlite3 PRIVATE "$<$>:-O2>" "/w") + target_include_directories(sqlite3 PRIVATE "${sqlite3_SOURCE_DIR}") + target_compile_options(sqlite3 PRIVATE "$<$>:-O2>" "/w") - # Note: Keep in sync with https://github.com/simolus3/sqlite-native-libraries/blob/master/sqlite3-native-library/cpp/CMakeLists.txt - target_compile_definitions(sqlite3 PRIVATE - SQLITE_ENABLE_FTS5 - SQLITE_ENABLE_RTREE - SQLITE_DQS=0 - SQLITE_DEFAULT_MEMSTATUS=0 - SQLITE_TEMP_STORE=2 - SQLITE_MAX_EXPR_DEPTH=0 - SQLITE_OMIT_AUTHORIZATION - SQLITE_OMIT_DECLTYPE - SQLITE_OMIT_DEPRECATED - SQLITE_OMIT_GET_TABLE - SQLITE_OMIT_LOAD_EXTENSION - SQLITE_OMIT_PROGRESS_CALLBACK - SQLITE_OMIT_SHARED_CACHE - SQLITE_OMIT_TCL_VARIABLE - SQLITE_OMIT_TRACE - SQLITE_USE_ALLOCA - SQLITE_UNTESTABLE - SQLITE_HAVE_ISNAN - SQLITE_HAVE_LOCALTIME_R - SQLITE_HAVE_LOCALTIME_S - ) + # Note: Keep in sync with https://github.com/simolus3/sqlite-native-libraries/blob/master/sqlite3-native-library/cpp/CMakeLists.txt + target_compile_definitions(sqlite3 PRIVATE + SQLITE_ENABLE_FTS5 + SQLITE_ENABLE_RTREE + SQLITE_DQS=0 + SQLITE_DEFAULT_MEMSTATUS=0 + SQLITE_TEMP_STORE=2 + SQLITE_MAX_EXPR_DEPTH=0 + SQLITE_OMIT_AUTHORIZATION + SQLITE_OMIT_DECLTYPE + SQLITE_OMIT_DEPRECATED + SQLITE_OMIT_GET_TABLE + SQLITE_OMIT_LOAD_EXTENSION + SQLITE_OMIT_PROGRESS_CALLBACK + SQLITE_OMIT_SHARED_CACHE + SQLITE_OMIT_TCL_VARIABLE + SQLITE_OMIT_TRACE + SQLITE_USE_ALLOCA + SQLITE_UNTESTABLE + SQLITE_HAVE_ISNAN + SQLITE_HAVE_LOCALTIME_R + SQLITE_HAVE_LOCALTIME_S + ) + else() + # Add recovery suggestion when a duplicate sqlite3 dependency is detected + message(FATAL_ERROR + "The sqlite3 target already exists, causing a conflict. This issue may occur if another dependency also defines a sqlite3 target. - # Create an alias for this version of sqlite3. - add_library(sqlite3_amplify_db_common ALIAS sqlite3) -else() - # If sqlite3 already exists, create an alias for amplify plugin to avoid duplication. - add_library(sqlite3_amplify_db_common ALIAS sqlite3) + Recovery suggestions: + Set the 'USE_CUSTOM_SQLITE3' option to ON within YOUR CMakeList.txt to disable the internal sqlite3 definition: + set(USE_CUSTOM_SQLITE3 ON)" + ) + endif() endif() -target_link_libraries(${PLUGIN_NAME} PRIVATE sqlite3_amplify_db_common) - -add_dependencies(${PLUGIN_NAME} sqlite3_amplify_db_common) +# Ensure sqlite3 actually gets built +if (NOT USE_CUSTOM_SQLITE3) + add_dependencies(${PLUGIN_NAME} sqlite3) +endif() -# List of absolute paths to libraries that should be bundled with the plugin. +# List of absolute paths to libraries that should be bundled with the plugin set(amplify_db_common_bundled_libraries - "$" + "$" PARENT_SCOPE )