464 lines
15 KiB
Makefile
464 lines
15 KiB
Makefile
# Rules
|
||
# =====
|
||
#
|
||
# make test - Run all tests but performance tests
|
||
# make test_performance - Run performance tests
|
||
# make doc - Generate DocC documentation
|
||
# make clean - Remove build artifacts
|
||
# make distclean - Restore repository to a pristine state
|
||
|
||
default: test
|
||
smokeTest: test_framework_GRDBiOS_maxTarget test_framework_GRDBiOS_minTarget test_framework_SQLCipher3 test_framework_SQLCipher4Encrypted test_framework_GRDBCustomSQLiteiOS_maxTarget test_SPM
|
||
|
||
# =====
|
||
# Tools
|
||
|
||
GIT := $(shell command -v git)
|
||
POD := $(shell command -v pod)
|
||
XCRUN := $(shell command -v xcrun)
|
||
XCODEBUILD := set -o pipefail && $(shell command -v xcodebuild)
|
||
|
||
ifdef TOOLCHAIN
|
||
# If TOOLCHAIN is specified, add xcodebuild parameter
|
||
XCODEBUILD += -toolchain $(TOOLCHAIN)
|
||
|
||
# If TOOLCHAIN is specified, get the location of the toolchain’s SWIFT
|
||
TOOLCHAINSWIFT = $(shell $(XCRUN) --toolchain '$(TOOLCHAIN)' --find swift 2> /dev/null)
|
||
ifdef TOOLCHAINSWIFT
|
||
# Update the SWIFT path to the toolchain’s SWIFT
|
||
SWIFT = $(TOOLCHAINSWIFT)
|
||
else
|
||
@echo Cannot find `swift` for specified toolchain.
|
||
@exit 1
|
||
endif
|
||
else
|
||
# If TOOLCHAIN is not specified, use standard Swift
|
||
SWIFT = $(shell $(XCRUN) --find swift 2> /dev/null)
|
||
endif
|
||
|
||
# =====
|
||
# Configuration
|
||
|
||
DOCS_PATH = Documentation/Reference
|
||
|
||
TEST_ACTIONS = clean build build-for-testing test-without-building
|
||
|
||
OTHER_SWIFT_FLAGS = '$$(inherited) -D SQLITE_ENABLE_FTS5 -D SQLITE_ENABLE_PREUPDATE_HOOK' # -Xfrontend -warn-concurrency -Xfrontend -enable-actor-data-race-checks'
|
||
GCC_PREPROCESSOR_DEFINITIONS = '$$(inherited) GRDB_SQLITE_ENABLE_PREUPDATE_HOOK=1'
|
||
|
||
# Extract min and max destinations from the available devices
|
||
MIN_IOS_DESTINATION := $(shell xcrun simctl list -j devices available | Scripts/destination.rb | grep iPhone | grep -v ^13\.7 | sort -n | head -1 | cut -wf 3 | sed 's/\(.*\)/"platform=iOS Simulator,id=\1"/')
|
||
MAX_IOS_DESTINATION := $(shell xcrun simctl list -j devices available | Scripts/destination.rb | grep iPhone | grep -v ^13\.7 | sort -rn | head -1 | cut -wf 3 | sed 's/\(.*\)/"platform=iOS Simulator,id=\1"/')
|
||
MIN_TVOS_DESTINATION := $(shell xcrun simctl list -j devices available | Scripts/destination.rb | grep tvOS | sort -n | head -1 | cut -wf 3 | sed 's/\(.*\)/"platform=tvOS Simulator,id=\1"/')
|
||
MAX_TVOS_DESTINATION := $(shell xcrun simctl list -j devices available | Scripts/destination.rb | grep tvOS | sort -rn | head -1 | cut -wf 3 | sed 's/\(.*\)/"platform=tvOS Simulator,id=\1"/')
|
||
|
||
# If xcbeautify or xcpretty is available, use it for xcodebuild output, except in CI.
|
||
XCPRETTY =
|
||
ifeq ($(CI),true)
|
||
else
|
||
XCBEAUTIFY_PATH := $(shell command -v xcbeautify 2> /dev/null)
|
||
XCPRETTY_PATH := $(shell command -v xcpretty 2> /dev/null)
|
||
ifdef XCBEAUTIFY_PATH
|
||
XCPRETTY = | xcbeautify
|
||
else ifdef XCPRETTY_PATH
|
||
XCPRETTY = | xcpretty -c
|
||
endif
|
||
endif
|
||
|
||
# =====
|
||
# Tests
|
||
|
||
test: test_framework test_archive test_install test_demo_apps
|
||
|
||
test_framework: test_framework_darwin
|
||
test_framework_darwin: test_framework_GRDB test_framework_GRDBCustom test_framework_SQLCipher test_SPM
|
||
test_framework_GRDB: test_framework_GRDBOSX test_framework_GRDBiOS test_framework_GRDBtvOS
|
||
test_framework_GRDBCustom: test_framework_GRDBCustomSQLiteOSX test_framework_GRDBCustomSQLiteiOS
|
||
test_framework_SQLCipher: test_framework_SQLCipher3 test_framework_SQLCipher3Encrypted test_framework_SQLCipher4 test_framework_SQLCipher4Encrypted
|
||
test_archive: test_universal_xcframework
|
||
test_install: test_install_manual test_install_SPM test_install_customSQLite test_install_GRDB_CocoaPods
|
||
test_CocoaPodsLint: test_CocoaPodsLint_GRDB
|
||
test_demo_apps: test_GRDBDemoiOS test_GRDBCombineDemo test_GRDBAsyncDemo
|
||
|
||
test_framework_GRDBOSX:
|
||
$(XCODEBUILD) \
|
||
-project GRDB.xcodeproj \
|
||
-scheme GRDB \
|
||
-destination "platform=macOS" \
|
||
OTHER_SWIFT_FLAGS=$(OTHER_SWIFT_FLAGS) \
|
||
GCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS) \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_framework_GRDBiOS: test_framework_GRDBiOS_maxTarget test_framework_GRDBiOS_minTarget
|
||
|
||
test_framework_GRDBiOS_maxTarget:
|
||
$(XCODEBUILD) \
|
||
-project GRDB.xcodeproj \
|
||
-scheme GRDB \
|
||
-destination $(MAX_IOS_DESTINATION) \
|
||
OTHER_SWIFT_FLAGS=$(OTHER_SWIFT_FLAGS) \
|
||
GCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS) \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_framework_GRDBiOS_minTarget:
|
||
$(XCODEBUILD) \
|
||
-project GRDB.xcodeproj \
|
||
-scheme GRDB \
|
||
-destination $(MIN_IOS_DESTINATION) \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_framework_GRDBtvOS: test_framework_GRDBtvOS_maxTarget test_framework_GRDBtvOS_minTarget
|
||
|
||
test_framework_GRDBtvOS_maxTarget:
|
||
$(XCODEBUILD) \
|
||
-project GRDB.xcodeproj \
|
||
-scheme GRDB \
|
||
-destination $(MAX_TVOS_DESTINATION) \
|
||
OTHER_SWIFT_FLAGS=$(OTHER_SWIFT_FLAGS) \
|
||
GCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS) \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_framework_GRDBtvOS_minTarget:
|
||
$(XCODEBUILD) \
|
||
-project GRDB.xcodeproj \
|
||
-scheme GRDB \
|
||
-destination $(MIN_TVOS_DESTINATION) \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_framework_GRDBCustomSQLiteOSX: SQLiteCustom
|
||
$(XCODEBUILD) \
|
||
-project GRDBCustom.xcodeproj \
|
||
-scheme GRDBCustom \
|
||
-destination "platform=macOS" \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_framework_GRDBCustomSQLiteiOS: test_framework_GRDBCustomSQLiteiOS_maxTarget test_framework_GRDBCustomSQLiteiOS_minTarget
|
||
|
||
test_framework_GRDBCustomSQLiteiOS_maxTarget: SQLiteCustom
|
||
$(XCODEBUILD) \
|
||
-project GRDBCustom.xcodeproj \
|
||
-scheme GRDBCustom \
|
||
-destination $(MAX_IOS_DESTINATION) \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_framework_GRDBCustomSQLiteiOS_minTarget: SQLiteCustom
|
||
$(XCODEBUILD) \
|
||
-project GRDBCustom.xcodeproj \
|
||
-scheme GRDBCustom \
|
||
-destination $(MIN_IOS_DESTINATION) \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_framework_SQLCipher3:
|
||
ifdef POD
|
||
cd Tests/CocoaPods/SQLCipher3 && \
|
||
$(POD) install && \
|
||
$(XCODEBUILD) \
|
||
-workspace GRDBTests.xcworkspace \
|
||
-scheme GRDBTests \
|
||
build-for-testing test-without-building \
|
||
$(XCPRETTY)
|
||
else
|
||
@echo CocoaPods must be installed for test_framework_SQLCipher3
|
||
@exit 1
|
||
endif
|
||
|
||
test_framework_SQLCipher3Encrypted:
|
||
ifdef POD
|
||
cd Tests/CocoaPods/SQLCipher3 && \
|
||
$(POD) install && \
|
||
$(XCODEBUILD) \
|
||
-workspace GRDBTests.xcworkspace \
|
||
-scheme GRDBEncryptedTests \
|
||
build-for-testing test-without-building \
|
||
$(XCPRETTY)
|
||
else
|
||
@echo CocoaPods must be installed for test_framework_SQLCipher3Encrypted
|
||
@exit 1
|
||
endif
|
||
|
||
test_framework_SQLCipher4:
|
||
ifdef POD
|
||
cd Tests/CocoaPods/SQLCipher4 && \
|
||
$(POD) install && \
|
||
$(XCODEBUILD) \
|
||
-workspace GRDBTests.xcworkspace \
|
||
-scheme GRDBTests \
|
||
build-for-testing test-without-building \
|
||
$(XCPRETTY)
|
||
else
|
||
@echo CocoaPods must be installed for test_framework_SQLCipher4
|
||
@exit 1
|
||
endif
|
||
|
||
test_framework_SQLCipher4Encrypted:
|
||
ifdef POD
|
||
cd Tests/CocoaPods/SQLCipher4 && \
|
||
$(POD) install && \
|
||
$(XCODEBUILD) \
|
||
-workspace GRDBTests.xcworkspace \
|
||
-scheme GRDBEncryptedTests \
|
||
build-for-testing test-without-building \
|
||
$(XCPRETTY)
|
||
else
|
||
@echo CocoaPods must be installed for test_framework_SQLCipher4Encrypted
|
||
@exit 1
|
||
endif
|
||
|
||
test_SPM:
|
||
# Add sanitizers when available: https://twitter.com/simjp/status/929140877540278272
|
||
$(SWIFT) package clean
|
||
$(SWIFT) build
|
||
$(SWIFT) build -c release
|
||
set -o pipefail && $(SWIFT) test --parallel
|
||
|
||
test_universal_xcframework:
|
||
rm -rf Tests/products
|
||
mkdir Tests/products
|
||
$(XCODEBUILD) archive \
|
||
-project GRDB.xcodeproj \
|
||
-scheme GRDB \
|
||
-destination "generic/platform=iOS" \
|
||
OTHER_SWIFT_FLAGS=$(OTHER_SWIFT_FLAGS) \
|
||
GCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS) \
|
||
-archivePath "$(PWD)/Tests/products/GRDB-iOS.xcarchive" \
|
||
SKIP_INSTALL=NO \
|
||
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
|
||
$(XCODEBUILD) archive \
|
||
-project GRDB.xcodeproj \
|
||
-scheme GRDB \
|
||
-destination "generic/platform=iOS Simulator" \
|
||
OTHER_SWIFT_FLAGS=$(OTHER_SWIFT_FLAGS) \
|
||
GCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS) \
|
||
-archivePath "$(PWD)/Tests/products/GRDB-iOS_Simulator.xcarchive" \
|
||
SKIP_INSTALL=NO \
|
||
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
|
||
$(XCODEBUILD) archive \
|
||
-project GRDB.xcodeproj \
|
||
-scheme GRDB \
|
||
-destination "generic/platform=macOS" \
|
||
OTHER_SWIFT_FLAGS=$(OTHER_SWIFT_FLAGS) \
|
||
GCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS) \
|
||
-archivePath "$(PWD)/Tests/products/GRDB-macOS.xcarchive" \
|
||
SKIP_INSTALL=NO \
|
||
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
|
||
$(XCODEBUILD) archive \
|
||
-project GRDB.xcodeproj \
|
||
-scheme GRDB \
|
||
-destination "generic/platform=macOS,variant=Mac Catalyst" \
|
||
OTHER_SWIFT_FLAGS=$(OTHER_SWIFT_FLAGS) \
|
||
GCC_PREPROCESSOR_DEFINITIONS=$(GCC_PREPROCESSOR_DEFINITIONS) \
|
||
-archivePath "$(PWD)/Tests/products/GRDB-Mac_Catalyst.xcarchive" \
|
||
SKIP_INSTALL=NO \
|
||
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
|
||
$(XCODEBUILD) -create-xcframework \
|
||
-archive '$(PWD)/Tests/products/GRDB-iOS.xcarchive' -framework GRDB.framework \
|
||
-archive '$(PWD)/Tests/products/GRDB-iOS_Simulator.xcarchive' -framework GRDB.framework \
|
||
-archive '$(PWD)/Tests/products/GRDB-macOS.xcarchive' -framework GRDB.framework \
|
||
-archive '$(PWD)/Tests/products/GRDB-Mac_Catalyst.xcarchive' -framework GRDB.framework \
|
||
-output '$(PWD)/Tests/products/GRDB.xcframework'
|
||
|
||
test_install_manual:
|
||
$(XCODEBUILD) \
|
||
-project Documentation/DemoApps/GRDBDemoiOS/GRDBDemoiOS.xcodeproj \
|
||
-scheme GRDBDemoiOS \
|
||
-configuration Release \
|
||
-destination $(MAX_IOS_DESTINATION) \
|
||
clean build \
|
||
$(XCPRETTY)
|
||
|
||
test_install_SPM: test_install_SPM_Package test_install_SPM_Project test_install_SPM_Dynamic_Project test_install_SPM_macos_release test_install_SPM_ios_release
|
||
|
||
test_install_SPM_Package:
|
||
cd Tests/SPM/PlainPackage && \
|
||
$(SWIFT) build && \
|
||
./.build/debug/SPM
|
||
|
||
test_install_SPM_Project:
|
||
$(XCODEBUILD) \
|
||
-project Tests/SPM/PlainProject/Plain.xcodeproj \
|
||
-scheme Plain \
|
||
-destination "platform=macOS" \
|
||
-configuration Release \
|
||
clean build \
|
||
$(XCPRETTY)
|
||
|
||
test_install_SPM_Dynamic_Project:
|
||
$(XCODEBUILD) \
|
||
-project Tests/SPM/ios-dynamic/ios-dynamic.xcodeproj \
|
||
-scheme ios-dynamic \
|
||
-destination $(MAX_IOS_DESTINATION) \
|
||
-configuration Release \
|
||
clean build \
|
||
$(XCPRETTY)
|
||
|
||
test_install_SPM_macos_release:
|
||
$(XCODEBUILD) \
|
||
-project Tests/SPM/macos/macos.xcodeproj \
|
||
-scheme macos \
|
||
-destination "platform=macOS" \
|
||
-configuration Release \
|
||
clean build \
|
||
$(XCPRETTY)
|
||
|
||
test_install_SPM_ios_release:
|
||
$(XCODEBUILD) \
|
||
-project Tests/SPM/ios/ios.xcodeproj \
|
||
-scheme ios \
|
||
-destination $(MAX_IOS_DESTINATION) \
|
||
-configuration Release \
|
||
clean build \
|
||
$(XCPRETTY)
|
||
|
||
test_install_customSQLite: SQLiteCustom
|
||
$(XCODEBUILD) \
|
||
-project Tests/CustomSQLite/CustomSQLite.xcodeproj \
|
||
-scheme CustomSQLite \
|
||
-destination "platform=macOS" \
|
||
-configuration Release \
|
||
clean build \
|
||
$(XCPRETTY)
|
||
|
||
test_install_GRDB_CocoaPods: test_install_GRDB_CocoaPods_framework test_install_GRDB_CocoaPods_static
|
||
|
||
test_install_GRDB_CocoaPods_framework:
|
||
ifdef POD
|
||
cd Tests/CocoaPods/GRDBiOS-framework && \
|
||
$(POD) install && \
|
||
$(XCODEBUILD) \
|
||
-workspace iOS.xcworkspace \
|
||
-scheme iOS \
|
||
-configuration Release \
|
||
-destination $(MAX_IOS_DESTINATION) \
|
||
clean build \
|
||
$(XCPRETTY)
|
||
else
|
||
@echo CocoaPods must be installed for test_install_GRDB_CocoaPods
|
||
@exit 1
|
||
endif
|
||
|
||
test_install_GRDB_CocoaPods_static:
|
||
ifdef POD
|
||
cd Tests/CocoaPods/GRDBiOS-static && \
|
||
$(POD) install && \
|
||
$(XCODEBUILD) \
|
||
-workspace iOS.xcworkspace \
|
||
-scheme iOS \
|
||
-configuration Release \
|
||
-destination $(MAX_IOS_DESTINATION) \
|
||
clean build \
|
||
$(XCPRETTY)
|
||
else
|
||
@echo CocoaPods must be installed for test_install_GRDB_CocoaPods
|
||
@exit 1
|
||
endif
|
||
|
||
test_CocoaPodsLint_GRDB:
|
||
ifdef POD
|
||
$(POD) lib lint GRDB.swift.podspec --allow-warnings
|
||
else
|
||
@echo CocoaPods must be installed for test_CocoaPodsLint_GRDB
|
||
@exit 1
|
||
endif
|
||
|
||
test_GRDBDemoiOS:
|
||
$(XCODEBUILD) \
|
||
-project Documentation/DemoApps/GRDBDemoiOS/GRDBDemoiOS.xcodeproj \
|
||
-scheme GRDBDemoiOS \
|
||
-destination $(MAX_IOS_DESTINATION) \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_GRDBCombineDemo:
|
||
$(XCODEBUILD) \
|
||
-project Documentation/DemoApps/GRDBCombineDemo/GRDBCombineDemo.xcodeproj \
|
||
-scheme GRDBCombineDemo \
|
||
-destination $(MAX_IOS_DESTINATION) \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_GRDBAsyncDemo:
|
||
$(XCODEBUILD) \
|
||
-project Documentation/DemoApps/GRDBAsyncDemo/GRDBAsyncDemo.xcodeproj \
|
||
-scheme GRDBAsyncDemo \
|
||
-destination $(MAX_IOS_DESTINATION) \
|
||
$(TEST_ACTIONS) \
|
||
$(XCPRETTY)
|
||
|
||
test_performance:
|
||
$(XCODEBUILD) \
|
||
-project Tests/Performance/GRDBPerformance/GRDBPerformance.xcodeproj \
|
||
-scheme GRDBOSXPerformanceComparisonTests \
|
||
-destination "platform=macOS" \
|
||
build-for-testing test-without-building
|
||
|
||
# Target that setups SQLite custom builds with extra compilation options.
|
||
SQLiteCustom: SQLiteCustom/src/sqlite3.h
|
||
echo '/* Makefile generated */' > SQLiteCustom/GRDBCustomSQLite-USER.h
|
||
echo '#define SQLITE_ENABLE_PREUPDATE_HOOK' >> SQLiteCustom/GRDBCustomSQLite-USER.h
|
||
echo '#define SQLITE_ENABLE_FTS5' >> SQLiteCustom/GRDBCustomSQLite-USER.h
|
||
echo '#define SQLITE_ENABLE_SNAPSHOT' >> SQLiteCustom/GRDBCustomSQLite-USER.h
|
||
echo '// Makefile generated' > SQLiteCustom/GRDBCustomSQLite-USER.xcconfig
|
||
echo 'CUSTOM_OTHER_SWIFT_FLAGS = -D SQLITE_ENABLE_PREUPDATE_HOOK -D SQLITE_ENABLE_FTS5 -D SQLITE_ENABLE_SNAPSHOT' >> SQLiteCustom/GRDBCustomSQLite-USER.xcconfig
|
||
echo '// Makefile generated' > SQLiteCustom/src/SQLiteLib-USER.xcconfig
|
||
echo 'CUSTOM_SQLLIBRARY_CFLAGS = -DSQLITE_ENABLE_PREUPDATE_HOOK -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_SNAPSHOT' >> SQLiteCustom/src/SQLiteLib-USER.xcconfig
|
||
|
||
# Makes sure the SQLiteCustom/src submodule has been downloaded
|
||
SQLiteCustom/src/sqlite3.h:
|
||
$(GIT) submodule update --init SQLiteCustom/src
|
||
|
||
|
||
# Documentation
|
||
# =============
|
||
|
||
doc-localhost:
|
||
# Generates documentation in ~/Sites/GRDB
|
||
# See https://discussions.apple.com/docs/DOC-3083 for Apache setup on the mac
|
||
mkdir -p ~/Sites/GRDB
|
||
SPI_BUILDER=1 $(SWIFT) package \
|
||
--allow-writing-to-directory ~/Sites/GRDB \
|
||
generate-documentation \
|
||
--output-path ~/Sites/GRDB \
|
||
--target GRDB \
|
||
--disable-indexing \
|
||
--transform-for-static-hosting \
|
||
--hosting-base-path "~$(USER)/GRDB"
|
||
open "http://localhost/~$(USER)/GRDB/documentation/grdb/"
|
||
|
||
doc:
|
||
# https://apple.github.io/swift-docc-plugin/documentation/swiftdoccplugin/publishing-to-github-pages/
|
||
rm -rf $(DOCS_PATH)
|
||
mkdir -p $(DOCS_PATH)
|
||
SPI_BUILDER=1 $(SWIFT) package \
|
||
--allow-writing-to-directory $(DOCS_PATH) \
|
||
generate-documentation \
|
||
--output-path $(DOCS_PATH) \
|
||
--target GRDB \
|
||
--disable-indexing \
|
||
--transform-for-static-hosting \
|
||
--hosting-base-path GRDB.swift/docs/6.3
|
||
|
||
|
||
# Cleanup
|
||
# =======
|
||
|
||
distclean:
|
||
$(GIT) reset --hard
|
||
$(GIT) clean -dffx .
|
||
rm -rf SQLiteCustom/src && $(GIT) checkout -- SQLiteCustom/src
|
||
|
||
clean:
|
||
$(SWIFT) package reset
|
||
cd Tests/SPM && $(SWIFT) package reset
|
||
rm -rf $(DOCS_PATH)
|
||
find . -name Package.resolved | xargs rm -f
|
||
|
||
.PHONY: distclean clean doc test smokeTest SQLiteCustom
|