@ -3,6 +3,19 @@
MAKEFLAGS += --warn-undefined-variables
MAKEFLAGS += --warn-undefined-variables
MAKEFLAGS += --no-builtin-rules
MAKEFLAGS += --no-builtin-rules
## [36;1m== Tilde Friends makefile build. == [m
##
## This is a list of all supported build targets.
##
## Note: Consider passing -j$(nproc) or adding it to your $MAKEFLAGS to build
## in parallel (faster).
##
## Useful variables to override:
## [35mCC [m Compiler.
## [35mAS [m Assembler.
## [35mLD [m Linker.
## [35mANDROID_SDK [m Path to the Android SDK.
VERSION_CODE := 30
VERSION_CODE := 30
VERSION_NUMBER := 0.0.25-wip
VERSION_NUMBER := 0.0.25-wip
VERSION_NAME := This program kills fascists.
VERSION_NAME := This program kills fascists.
@ -747,11 +760,28 @@ $(IOS_TARGETS) $(IOSSIM_TARGETS): LDFLAGS += \
-framework UIKit \
-framework UIKit \
-framework WebKit
-framework WebKit
unix : debug release
##
win : windebug winrelease
## Common targets:
all : $( BUILD_TYPES )
##
debug : ## Build a debug executable for the current platform.
release : ## Build a release executable for the current platform.
all : $( BUILD_TYPES ) ## Build all targets that appear possible to build on this machine.
unix : debug release ## Build all UNIX targets.
win : windebug winrelease ## Build all Windows targets.
.PHONY : all win unix
.PHONY : all win unix
##
## Windows targets:
##
windebug : ## Build a debug win32 executable.
winrelease : ## Build a release win32 executable.
##
## MacOS targets:
##
macosdebug : ## Build a MacOS debug executable.
macosrelease : ## Build a MacOS release executable.
ALL_APP_OBJS := \
ALL_APP_OBJS := \
$( APP_OBJS) \
$( APP_OBJS) \
$( ARES_OBJS) \
$( ARES_OBJS) \
@ -807,7 +837,18 @@ src/android/AndroidManifest.xml : $(firstword $(MAKEFILE_LIST))
-e 's/android:targetSdkVersion="[[:digit:]]*"/android:targetSdkVersion="$(ANDROID_TARGET_SDK_VERSION)"/' \
-e 's/android:targetSdkVersion="[[:digit:]]*"/android:targetSdkVersion="$(ANDROID_TARGET_SDK_VERSION)"/' \
$@
$@
# Android support.
##
## Android targets:
##
androiddebug : ## Build a debug 64-bit ARM Android APK.
androidrelease : ## Build a release 64-bit ARM Android APK.
androiddebug-armv7a : ## Build a debug 32-bit ARM Android APK.
androidrelease-armv7a : ## Build a release 32-bit ARM Android APK.
androiddebug-x86 : ## Build a debug x86 Android APK.
androidrelease-x86 : ## Build a release x86 Android APK.
androiddebug-x86_64 : ## Build a debug x86_64 Android APK.
androidrelease-x86_64 : ## Build a release x86_64 Android APK.
out/res/layout_activity_main.xml.flat : src /android /res /layout /activity_main .xml
out/res/layout_activity_main.xml.flat : src /android /res /layout /activity_main .xml
@mkdir -p $( dir $@ )
@mkdir -p $( dir $@ )
@echo " [aapt2] $@ "
@echo " [aapt2] $@ "
@ -914,7 +955,7 @@ out/TildeFriends.aab: out/apk/classes.dex $(filter-out %debug%, $(ANDROID_TARGET
@java -jar $( BUNDLETOOL) build-bundle --overwrite --config= src/android/BundleConfig.json --modules= out/aab/base.zip --output= $@
@java -jar $( BUNDLETOOL) build-bundle --overwrite --config= src/android/BundleConfig.json --modules= out/aab/base.zip --output= $@
@jarsigner -keystore .keys/android.jks $@ androidKey -storepass android
@jarsigner -keystore .keys/android.jks $@ androidKey -storepass android
aab : out /TildeFriends .aab
aab : out /TildeFriends .aab ## Build an Android App Bundle.
.PHONY : aab
.PHONY : aab
out/TildeFriends.apks : out /TildeFriends .aab $( BUNDLETOOL )
out/TildeFriends.apks : out /TildeFriends .aab $( BUNDLETOOL )
@ -981,20 +1022,32 @@ out/%.zopfli.apk: out/%.apk
$( ANDROID_BUILD_TOOLS) /zipalign -f -z 4 $< $@ .zopfli
$( ANDROID_BUILD_TOOLS) /zipalign -f -z 4 $< $@ .zopfli
@$( ANDROID_BUILD_TOOLS) /apksigner sign --ks .keys/android.jks --ks-key-alias androidKey --ks-pass pass:android --key-pass pass:android --min-sdk-version $( ANDROID_MIN_SDK_VERSION) --out $@ $@ .zopfli
@$( ANDROID_BUILD_TOOLS) /apksigner sign --ks .keys/android.jks --ks-key-alias androidKey --ks-pass pass:android --key-pass pass:android --min-sdk-version $( ANDROID_MIN_SDK_VERSION) --out $@ $@ .zopfli
release-apk : out /TildeFriends -arm -release .zopfli .apk out /TildeFriends -x 86-release .zopfli .apk
release-apk : out /TildeFriends -arm -release .zopfli .apk out /TildeFriends -x 86-release .zopfli .apk ## Build an Android release APK.
.PHONY : release -apk
.PHONY : release -apk
apkgo : out /TildeFriends -arm -debug .apk
fdroid : out /apk /TildeFriends -release .fdroid .unsigned .apk ## Build Android APK for distribution on F-Droid.
.PHONY : fdroid
apkgo : out /TildeFriends -arm -debug .apk ## Build, install, and run a debug Android APK.
@adb install -r $<
@adb install -r $<
@adb shell am start com.unprompted.tildefriends/.TildeFriendsActivity
@adb shell am start com.unprompted.tildefriends/.TildeFriendsActivity
.PHONY : apkgo
.PHONY : apkgo
releaseapkgo : out /TildeFriends -arm -release .apk
releaseapkgo : out /TildeFriends -arm -release .apk ## Build, install, and run a release Android APK.
@adb install -r $<
@adb install -r $<
@adb shell am start com.unprompted.tildefriends/.TildeFriendsActivity
@adb shell am start com.unprompted.tildefriends/.TildeFriendsActivity
.PHONY : releaseapkgo
.PHONY : releaseapkgo
# iOS Support
apklog : ## Display Android log output.
@adb logcat *:S tildefriends
.PHONY : apklog
##
## iPhoneOS targets:
##
iosdebug : ## Build a debug iPhoneOS executable.
iosrelease : ## Build a release iPhoneOS executable.
out/%.app/Info.plist : src /ios /Info .plist
out/%.app/Info.plist : src /ios /Info .plist
@mkdir -p $( dir $@ )
@mkdir -p $( dir $@ )
@cp -v $< $@
@cp -v $< $@
@ -1031,39 +1084,23 @@ out/%/tildefriends.standalone.exe: out/%/tildefriends.exe out/data.zip
@cat $< out/data.zip > $@
@cat $< out/data.zip > $@
@chmod +x $@
@chmod +x $@
iossimdebug-app : out /tildefriends -iossimdebug .app /tildefriends
iossimdebug-app : out /tildefriends -iossimdebug .app /tildefriends ## Build a debug iOS Simulator .app directory.
iossimrelease-app : out /tildefriends -iossimrelease .app /tildefriends
iossimrelease-app : out /tildefriends -iossimrelease .app /tildefriends ## Build a release iOS Simulator .app directory.
iosdebug-app : out /tildefriends -iosdebug .app /tildefriends
iosdebug-app : out /tildefriends -iosdebug .app /tildefriends ## Build a debug iOS .app directory.
iosrelease-app : out /tildefriends -iosrelease .app /tildefriends
iosrelease-app : out /tildefriends -iosrelease .app /tildefriends ## Build a release iOS .app directory.
iosdebug-ipa : out /tildefriends -debug .ipa
iosdebug-ipa : out /tildefriends -debug .ipa ## Build a debug iOS .ipa.
iosrelease-ipa : out /tildefriends -release .ipa
iosrelease-ipa : out /tildefriends -release .ipa ## Build a release iOS .ipa.
.PHONY : iossimdebug -app iossimrelease -app iosdebug -app iosrelease -app
.PHONY : iossimdebug -app iossimrelease -app iosdebug -app iosrelease -app
ios%go : out /tildefriends -ios %.app /tildefriends
ios%go : out /tildefriends -ios %.app /tildefriends
ideviceinstaller -i $( realpath $( dir $<) )
ideviceinstaller -i $( realpath $( dir $<) )
iossimdebuggo : out /tildefriends -iossimdebug .app /tildefriends
iossimdebuggo : out /tildefriends -iossimdebug .app /tildefriends ## Build, install, and run an iOS debug build.
xcrun simctl install booted out/tildefriends-iossimdebug.app/
xcrun simctl install booted out/tildefriends-iossimdebug.app/
xcrun simctl launch booted com.unprompted.tildefriends
xcrun simctl launch booted com.unprompted.tildefriends
.PHONY : iossimdebuggo
.PHONY : iossimdebuggo
apklog :
@adb logcat *:S tildefriends
.PHONY : apklog
fetchdeps :
@echo "[fetch] sqlite"
@test -f out/deps/sqlite.zip && test " $$ (cat out/deps/sqlite.txt 2>/dev/null) " = $( SQLITE_URL) || ( mkdir -p out/deps/ && curl -q $( SQLITE_URL) -o out/deps/sqlite.zip)
@test -d deps/sqlite/ && test " $$ (cat out/deps/sqlite.txt 2>/dev/null) " = $( SQLITE_URL) || ( mkdir -p deps/sqlite/ && unzip -qDjo -d deps/sqlite/ out/deps/sqlite.zip)
@echo -n $( SQLITE_URL) > out/deps/sqlite.txt
@echo "[fetch] prettier"
@test -f deps/prettier/standalone.mjs || curl -q --create-dirs -O --output-dir deps/prettier/ https://cdn.jsdelivr.net/npm/prettier@3.2.5/standalone.mjs
@test -f deps/prettier/html.mjs || curl -q --create-dirs -O --output-dir deps/prettier/ https://cdn.jsdelivr.net/npm/prettier@3.2.5/plugins/html.mjs
@test -f deps/prettier/babel.mjs || curl -q --create-dirs -O --output-dir deps/prettier/ https://cdn.jsdelivr.net/npm/prettier@3.2.5/plugins/babel.mjs
@test -f deps/prettier/estree.mjs || curl -q --create-dirs -O --output-dir deps/prettier/ https://cdn.jsdelivr.net/npm/prettier@3.2.5/plugins/estree.mjs
.PHONY : fetchdeps
ANDROID_DEPS := deps/openssl/android/arm64-v8a/usr/local/lib/libssl.a
ANDROID_DEPS := deps/openssl/android/arm64-v8a/usr/local/lib/libssl.a
$(ANDROID_DEPS) :
$(ANDROID_DEPS) :
+@ANDROID_NDK_ROOT= $( ANDROID_NDK) tools/ssl-android
+@ANDROID_NDK_ROOT= $( ANDROID_NDK) tools/ssl-android
@ -1083,6 +1120,10 @@ $(IOS_DEPS):
$(filter $(BUILD_DIR)/ios%,$(APP_OBJS)) : | $( IOS_DEPS )
$(filter $(BUILD_DIR)/ios%,$(APP_OBJS)) : | $( IOS_DEPS )
e n d i f
e n d i f
##
## Linux package targets:
##
out/tildefriends-x86_64.AppImage : out /release /tildefriends out /data .zip
out/tildefriends-x86_64.AppImage : out /release /tildefriends out /data .zip
@echo " [appimage] $$ @ "
@echo " [appimage] $$ @ "
@rm -rf out/tildefriends.AppDir
@rm -rf out/tildefriends.AppDir
@ -1102,19 +1143,36 @@ out/tildefriends-x86_64.AppImage: out/release/tildefriends out/data.zip
@cd out; ./appimagetool --appimage-extract; cd ..
@cd out; ./appimagetool --appimage-extract; cd ..
@cd out; unset SOURCE_DATE_EPOCH; PATH = $$ PATH:squashfs-root/usr/bin ARCH = x86_64 squashfs-root/usr/bin/appimagetool -u 'zsync|https://dev.tildefriends.net/releases/tildefriends-x86_64.AppImage.zsync' tildefriends.AppDir tildefriends-x86_64.AppImage; cd ..
@cd out; unset SOURCE_DATE_EPOCH; PATH = $$ PATH:squashfs-root/usr/bin ARCH = x86_64 squashfs-root/usr/bin/appimagetool -u 'zsync|https://dev.tildefriends.net/releases/tildefriends-x86_64.AppImage.zsync' tildefriends.AppDir tildefriends-x86_64.AppImage; cd ..
appimage : out /tildefriends -x 86_ 64.AppImage
appimage : out /tildefriends -x 86_ 64.AppImage ## Build an AppImage.
.PHONY : appimage
.PHONY : appimage
flatpak : out /
flatpak : out / ## Build a flatpak.
flatpak-builder --force-clean --user --install-deps-from= flathub --install --repo= out/flatpak-repo out/flatpak src/com.unprompted.tildefriends.yml
flatpak-builder --force-clean --user --install-deps-from= flathub --install --repo= out/flatpak-repo out/flatpak src/com.unprompted.tildefriends.yml
flatpak build-bundle out/flatpak-repo out/tildefriends.flatpak com.unprompted.tildefriends
flatpak build-bundle out/flatpak-repo out/tildefriends.flatpak com.unprompted.tildefriends
.PHONY : flatpak
.PHONY : flatpak
clean :
##
rm -rf $( BUILD_DIR)
## Targets for release management:
.PHONY : clean
##
tarball :
fetchdeps : ## Update various external sources that live in the tree that can't be pulled in as git submodules.
@echo "[fetch] sqlite"
@test -f out/deps/sqlite.zip && test " $$ (cat out/deps/sqlite.txt 2>/dev/null) " = $( SQLITE_URL) || ( mkdir -p out/deps/ && curl -q $( SQLITE_URL) -o out/deps/sqlite.zip)
@test -d deps/sqlite/ && test " $$ (cat out/deps/sqlite.txt 2>/dev/null) " = $( SQLITE_URL) || ( mkdir -p deps/sqlite/ && unzip -qDjo -d deps/sqlite/ out/deps/sqlite.zip)
@echo -n $( SQLITE_URL) > out/deps/sqlite.txt
@echo "[fetch] prettier"
@test -f deps/prettier/standalone.mjs || curl -q --create-dirs -O --output-dir deps/prettier/ https://cdn.jsdelivr.net/npm/prettier@3.2.5/standalone.mjs
@test -f deps/prettier/html.mjs || curl -q --create-dirs -O --output-dir deps/prettier/ https://cdn.jsdelivr.net/npm/prettier@3.2.5/plugins/html.mjs
@test -f deps/prettier/babel.mjs || curl -q --create-dirs -O --output-dir deps/prettier/ https://cdn.jsdelivr.net/npm/prettier@3.2.5/plugins/babel.mjs
@test -f deps/prettier/estree.mjs || curl -q --create-dirs -O --output-dir deps/prettier/ https://cdn.jsdelivr.net/npm/prettier@3.2.5/plugins/estree.mjs
.PHONY : fetchdeps
shots : ## Copy generated screenshots from `tildefriends test -t=auto` into place in the metadata/ directory.
@echo [ shots] $( wildcard out/screenshot*.png)
@cp -f out/screenshot*.png metadata/en-US/images/phoneScreenshots/
.PHONY : shots
tarball : ## Build an all-inclusive source tarball (.tar.xz).
@echo [ archive] out/tildefriends-$( VERSION_NUMBER) .tar.xz
@echo [ archive] out/tildefriends-$( VERSION_NUMBER) .tar.xz
@rm -rf out/tildefriends-$( VERSION_NUMBER)
@rm -rf out/tildefriends-$( VERSION_NUMBER)
@mkdir -p out/tildefriends-$( VERSION_NUMBER)
@mkdir -p out/tildefriends-$( VERSION_NUMBER)
@ -1139,6 +1197,7 @@ tarball:
tildefriends-$( VERSION_NUMBER)
tildefriends-$( VERSION_NUMBER)
.PHONY : tarball
.PHONY : tarball
dist : ## Build versions of all distributables for release.
dist : release -apk iosrelease -ipa aab $( if $ ( HAVE_WIN ) , out /winrelease /tildefriends .standalone .exe ) out /TildeFriends -release .fdroid .apk appimage tarball
dist : release -apk iosrelease -ipa aab $( if $ ( HAVE_WIN ) , out /winrelease /tildefriends .standalone .exe ) out /TildeFriends -release .fdroid .apk appimage tarball
@mkdir -p dist/
@mkdir -p dist/
@echo " [cp] tildefriends- $( VERSION_NUMBER) .tar.xz "
@echo " [cp] tildefriends- $( VERSION_NUMBER) .tar.xz "
@ -1159,29 +1218,43 @@ dist: release-apk iosrelease-ipa aab $(if $(HAVE_WIN), out/winrelease/tildefrien
@cp out/tildefriends-x86_64.AppImage dist/TildeFriends-x86_64-$( VERSION_NUMBER) .AppImage
@cp out/tildefriends-x86_64.AppImage dist/TildeFriends-x86_64-$( VERSION_NUMBER) .AppImage
.PHONY : dist
.PHONY : dist
dist-test : dist
dist-test : dist ## Exercise some built distributable files, making sure they work as intended.
@tar -xf tildefriends-$( VERSION_NUMBER) .tar.xz
@tar -xf tildefriends-$( VERSION_NUMBER) .tar.xz
@$( MAKE) -C tildefriends-$( VERSION_NUMBER) / debug release
@$( MAKE) -C tildefriends-$( VERSION_NUMBER) / debug release
@docker build tildefriends-$( VERSION_NUMBER) /
@docker build tildefriends-$( VERSION_NUMBER) /
@rm -rf tildefriends-$( VERSION_NUMBER)
@rm -rf tildefriends-$( VERSION_NUMBER)
.PHONY : dist -test
.PHONY : dist -test
format :
##
## Targets for tidying up:
##
format : ## Standardize formatting of C source.
@clang-format -i $( wildcard src/*.c src/*.h src/*.m)
@clang-format -i $( wildcard src/*.c src/*.h src/*.m)
.PHONY : format
.PHONY : format
prettier :
prettier : ## Standardize formatting of JavaScript and Markdown source.
@npm run prettier
@npm run prettier
.PHONY : prettier
.PHONY : prettier
docs :
clean : ## Clean all generated files from the out/ directory.
rm -rf $( BUILD_DIR)
.PHONY : clean
##
## Documentation:
##
help : ## Display this help message.
@gawk -vG= $$ ( tput setaf 2) -vR= $$ ( tput sgr0) ' \
match( $$ 0, " ^(([^#:]*[^ :]) *:)?([^#]*)##([^#].+|) $$ " ,a) { \
if ( a[ 2] != "" ) { printf " make %s%-22s%s %s\n" , G, a[ 2] , R, a[ 4] ; next } \
if ( a[ 3] = = "" ) { print a[ 4] ; next } \
printf "\n%-36s %s\n" ,"" ,a[ 4] \
} ' $( filter-out %.d,$( MAKEFILE_LIST) )
@echo "" # Blank line.
.PHONY : help
.DEFAULT_GOAL := help
docs : ## Build HTML docs.
@doxygen
@doxygen
.PHONY : docs
.PHONY : docs
fdroid : out /apk /TildeFriends -release .fdroid .unsigned .apk
.PHONY : fdroid
shots :
@echo [ shots] $( wildcard out/screenshot*.png)
@cp -f out/screenshot*.png metadata/en-US/images/phoneScreenshots/
.PHONY : shots