Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(common): added a flag to opt out of bundling sqlite3 for windows apps #5680

Merged
merged 17 commits into from
Nov 25, 2024
Merged
7 changes: 4 additions & 3 deletions packages/common/amplify_db_common/example/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

127 changes: 67 additions & 60 deletions packages/common/amplify_db_common/windows/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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 "$<$<NOT:$<CONFIG:Debug>>:-O2>" "/w")
target_include_directories(sqlite3 PRIVATE "${sqlite3_SOURCE_DIR}")
target_compile_options(sqlite3 PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-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
"$<TARGET_FILE:sqlite3_amplify_db_common>"
"$<TARGET_FILE:sqlite3>"
PARENT_SCOPE
)
Loading