Skip to content

Commit

Permalink
fix(common): added a flag to opt out of bundling sqlite3 for windows …
Browse files Browse the repository at this point in the history
…apps (#5680)
  • Loading branch information
Equartey authored Nov 25, 2024
1 parent 2ee74bb commit bc314f6
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 63 deletions.
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
)

0 comments on commit bc314f6

Please sign in to comment.