diff --git a/GNUmakefile b/GNUmakefile index 10cd13bf8..a0d3956aa 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -3,6 +3,19 @@ MAKEFLAGS += --warn-undefined-variables MAKEFLAGS += --no-builtin-rules +## == Tilde Friends makefile build. == +## +## 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: +## CC Compiler. +## AS Assembler. +## LD Linker. +## ANDROID_SDK Path to the Android SDK. + VERSION_CODE := 30 VERSION_NUMBER := 0.0.25-wip VERSION_NAME := This program kills fascists. @@ -747,11 +760,28 @@ $(IOS_TARGETS) $(IOSSIM_TARGETS): LDFLAGS += \ -framework UIKit \ -framework WebKit -unix: debug release -win: windebug winrelease -all: $(BUILD_TYPES) +## +## Common targets: +## +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 +## +## 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 := \ $(APP_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)"/' \ $@ -# 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 @mkdir -p $(dir $@) @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=$@ @jarsigner -keystore .keys/android.jks $@ androidKey -storepass android -aab: out/TildeFriends.aab +aab: out/TildeFriends.aab ## Build an Android App Bundle. .PHONY: aab 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)/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-x86-release.zopfli.apk +release-apk: out/TildeFriends-arm-release.zopfli.apk out/TildeFriends-x86-release.zopfli.apk ## Build an Android 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 shell am start com.unprompted.tildefriends/.TildeFriendsActivity .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 shell am start com.unprompted.tildefriends/.TildeFriendsActivity .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 @mkdir -p $(dir $@) @cp -v $< $@ @@ -1031,39 +1084,23 @@ out/%/tildefriends.standalone.exe: out/%/tildefriends.exe out/data.zip @cat $< out/data.zip > $@ @chmod +x $@ -iossimdebug-app: out/tildefriends-iossimdebug.app/tildefriends -iossimrelease-app: out/tildefriends-iossimrelease.app/tildefriends -iosdebug-app: out/tildefriends-iosdebug.app/tildefriends -iosrelease-app: out/tildefriends-iosrelease.app/tildefriends +iossimdebug-app: out/tildefriends-iossimdebug.app/tildefriends ## Build a debug iOS Simulator .app directory. +iossimrelease-app: out/tildefriends-iossimrelease.app/tildefriends ## Build a release iOS Simulator .app directory. +iosdebug-app: out/tildefriends-iosdebug.app/tildefriends ## Build a debug iOS .app directory. +iosrelease-app: out/tildefriends-iosrelease.app/tildefriends ## Build a release iOS .app directory. -iosdebug-ipa: out/tildefriends-debug.ipa -iosrelease-ipa: out/tildefriends-release.ipa +iosdebug-ipa: out/tildefriends-debug.ipa ## Build a debug iOS .ipa. +iosrelease-ipa: out/tildefriends-release.ipa ## Build a release iOS .ipa. .PHONY: iossimdebug-app iossimrelease-app iosdebug-app iosrelease-app ios%go: out/tildefriends-ios%.app/tildefriends 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 launch booted com.unprompted.tildefriends .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): +@ANDROID_NDK_ROOT=$(ANDROID_NDK) tools/ssl-android @@ -1083,6 +1120,10 @@ $(IOS_DEPS): $(filter $(BUILD_DIR)/ios%,$(APP_OBJS)): | $(IOS_DEPS) endif +## +## Linux package targets: +## + out/tildefriends-x86_64.AppImage: out/release/tildefriends out/data.zip @echo "[appimage] $$@" @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; 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-x86_64.AppImage +appimage: out/tildefriends-x86_64.AppImage ## Build an 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 build-bundle out/flatpak-repo out/tildefriends.flatpak com.unprompted.tildefriends .PHONY: flatpak -clean: - rm -rf $(BUILD_DIR) -.PHONY: clean +## +## Targets for release management: +## -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 @rm -rf out/tildefriends-$(VERSION_NUMBER) @mkdir -p out/tildefriends-$(VERSION_NUMBER) @@ -1139,6 +1197,7 @@ tarball: tildefriends-$(VERSION_NUMBER) .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 @mkdir -p dist/ @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 .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 @$(MAKE) -C tildefriends-$(VERSION_NUMBER)/ debug release @docker build tildefriends-$(VERSION_NUMBER)/ @rm -rf tildefriends-$(VERSION_NUMBER) .PHONY: dist-test -format: +## +## Targets for tidying up: +## + +format: ## Standardize formatting of C source. @clang-format -i $(wildcard src/*.c src/*.h src/*.m) .PHONY: format -prettier: +prettier: ## Standardize formatting of JavaScript and Markdown source. @npm run 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 .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 diff --git a/README.md b/README.md index dec6ad61f..9991e9e55 100644 --- a/README.md +++ b/README.md @@ -37,11 +37,10 @@ The `.tar.xz` source releases are all-inclusive. 1. On Linux only, system OpenSSL libraries (`libssl-dev`, in debian-speak) are assumed to be available. -2. To build, run `make debug` or `make release`. An executable will be - generated in a subdirectory of `out/`. +2. Run `make` with no arguments to see available build targets and options. + `make debug` is a good place to start. 3. It's possible to build for Android, iOS, and Windows on Linux, if you have - the right dependencies in the right places. `make windebug winrelease -iosdebug-ipa iosrelease-ipa release-apk`. + the right dependencies in the right places. 4. To build in docker, `docker build .`. 5. `make format` will normalize formatting to the coding standard.