Iceshrimp.NET/Makefile
Laura Hausmann 1200bcbba5
[make] Compile database model in release builds
Ideally we'd want to do this during publish, however due to upstream issues with the MSBuild task, this will suffice for now.

Reduces startup time by ~500ms.
2024-11-18 19:02:43 +01:00

129 lines
5.1 KiB
Makefile

.DEFAULT_GOAL = help
WORKLOAD_PROJECT = Iceshrimp.Frontend
BUILD_PROJECT = Iceshrimp.Backend
CONFIGURATION = Release
DOTNET_CMD = dotnet
VERBOSE = false
DEP_VULN_WERROR = false
AOT = false
VIPS = false
BUNDLE_NATIVE = false
RELEASE_TARGETS = linux-glibc-amd64 linux-glibc-arm64 linux-musl-amd64 linux-musl-arm64
ifeq (${VERBOSE},false)
TL_ENV = MSBUILDTERMINALLOGGER=true
else
TL_ENV = MSBUILDTERMINALLOGGER=false
endif
PUBLISH_CMD = ${TL_ENV} ${DOTNET_CMD} publish ${BUILD_PROJECT} -c ${CONFIGURATION} -noLogo
BUILD_CMD = ${TL_ENV} ${DOTNET_CMD} build -noLogo
TEST_CMD = ${TL_ENV} ${DOTNET_CMD} test --no-build --nologo
BUILD_FLAGS = -p:EnableLibVips=${VIPS} -p:BundleNativeDeps=${BUNDLE_NATIVE} -p:DependencyVulnsAsError=${DEP_VULN_WERROR}
PUBLISH_FLAGS = -p:EnableAOT=${AOT} -p:DeterministicSourcePaths=true -p:ContinuousIntegrationBuild=true ${BUILD_FLAGS}
PUBLISH_FLAGS_EXT = ${PUBLISH_RIDARG} -o publish/${TARGETRID} ${PUBLISH_FLAGS}
RELEASE_FLAGS = -r ${TARGETRID} -o release/${TARGETPLATFORM} ${PUBLISH_FLAGS}
TARGETRID = $(TARGETPLATFORM:linux-glibc-%=linux-%)
PUBLISH_RIDARG = $(if $(TARGETRID),-r $(TARGETRID),)
ARCHIVE_TGTNAME = $(patsubst linux-glibc-%,linux-%-glibc,$(patsubst linux-musl-%,linux-%-musl,$(TARGETPLATFORM)))
ARCHIVE_BASENAME = iceshrimp.net
ARCHIVE_VERSION = unknown
ARCHIVE_DIRNAME = ${ARCHIVE_BASENAME}-${ARCHIVE_VERSION}-${ARCHIVE_TGTNAME}
ARCHIVE_FILENAME = ${ARCHIVE_DIRNAME}.tar.zst
ARTIFACT_DIR = artifacts
ARTIFACT_CMD = tar caf ${ARTIFACT_DIR}/${ARCHIVE_FILENAME} --transform 's,^release/${TARGETPLATFORM},${ARCHIVE_DIRNAME},' release/${TARGETPLATFORM}
.PHONY : --release-pre --release-post --workload-restore --release-% artifact-% publish build test publish-aot release-artifacts help
--release-pre:
@echo 'Compiling database model...'
@dotnet tool install -g dotnet-ef > /dev/null
@dotnet dotnet ef -p Iceshrimp.Backend dbcontext optimize -o Core/Database/Model --suffix '.g' > /dev/null
@echo 'Building release artifacts for targets: ${RELEASE_TARGETS}'
@echo 'This will take a while.'
@echo
@rm -rf release artifacts
--release-post:
@echo 'Finished building release artifacts.'
--workload-restore:
@if ! dotnet workload list | grep -q '^wasm-tools\s'; then echo "Missing wasm-tools workload. Please run \`dotnet workload install wasm-tools\` before running this target."; exit 1; fi
--release-%: TARGETPLATFORM=$*
--release-%:
@echo 'Building for release with flags: ${RELEASE_FLAGS}'
@${PUBLISH_CMD} ${RELEASE_FLAGS}
--artifact-%: TARGETPLATFORM=$*
--artifact-%:
@echo -n 'Generating artifact ${ARCHIVE_FILENAME}...'
@mkdir -p ${ARTIFACT_DIR}
@${ARTIFACT_CMD}
@echo " Done!"
@echo
publish:
@echo 'Building for publish with flags: ${strip ${PUBLISH_FLAGS_EXT}}'
@${PUBLISH_CMD} ${PUBLISH_FLAGS_EXT}
build:
@echo 'Building with flags: ${BUILD_FLAGS}'
@${BUILD_CMD} ${BUILD_FLAGS}
test: build
@echo
@${TEST_CMD}
clean:
@git clean -xfd -e '*.DotSettings.user' -e '/.idea/**' -e 'configuration*.ini' -e '.gitignore' -e '/.vs/**'
cleanall:
@git clean -xfd
publish-aot: AOT=true
publish-aot: --workload-restore publish
release-artifacts: AOT=true
release-artifacts: VIPS=true
release-artifacts: BUNDLE_NATIVE=true
release-artifacts: --release-pre $(foreach tgt,$(RELEASE_TARGETS),--release-$(tgt) --artifact-$(tgt)) --release-post
help:
@echo '-- Makefile --'
@echo 'Targets:'
@echo ' test - runs all available unit tests'
@echo ' build - compiles the application (for development)'
@echo ' clean - removes all build-related files from the working tree'
@echo ' cleanall - removes all untracked files from the working tree'
@echo ' publish - compiles the application (for production)'
@echo ' publish-aot - equivalent to `make AOT=true publish`'
@echo ' release-artifacts - generates release artifacts for all supported architectures'
@echo
@echo 'Common build arguments:'
@echo ' AOT=<boolean>'
@echo ' Enables AOT compilation for the WASM frontend, trading increased compile time'
@echo ' for increased frontend performance. This option is only effective during publish.'
@echo ' VIPS=<boolean>'
@echo ' Enables LibVips support, either requires the system to have libvips installed,'
@echo ' or BUNDLE_NATIVE to be set.'
@echo ' BUNDLE_NATIVE=<boolean>'
@echo ' Bundles native dependencies in the output directory'
@echo ' TARGETRID=<rid>'
@echo ' Sets the target runtime identifier. This option is only effective during publish.'
@echo 'Miscellaneous build arguments:'
@echo ' VERBOSE=<boolean>'
@echo ' Disables beautified build output'
@echo ' DOTNET_CMD=<path>'
@echo ' Path to the `dotnet` binary to call'
@echo ' CONFIGURATION=<Release|Debug>'
@echo ' Configuration to build in, defaults to `Release`.'
@echo
@echo 'For example, if you want to run target `build` with VIPS enabled: `make VIPS=true build`'
@echo 'For production deployments, you likely want to call `make publish-aot`.'