199 lines
7.1 KiB
Makefile
199 lines
7.1 KiB
Makefile
############################# INSTRUCTIONS #############################
|
|
#
|
|
# to compile, run:
|
|
# make
|
|
#
|
|
# to compile using Mono (version 6.4 or greater) instead of .NET 6, run:
|
|
# make RUNTIME=mono
|
|
#
|
|
# to compile using system libraries for native dependencies, run:
|
|
# make [RUNTIME=net6] TARGETPLATFORM=unix-generic
|
|
#
|
|
# to remove the files created by compiling, run:
|
|
# make clean
|
|
#
|
|
# to set the mods version, run:
|
|
# make version [VERSION="custom-version"]
|
|
#
|
|
# to check lua scripts for syntax errors, run:
|
|
# make check-scripts
|
|
#
|
|
# to check the engine and your mod dlls for StyleCop violations, run:
|
|
# make [RUNTIME=net6] check
|
|
#
|
|
# to check your mod yaml for errors, run:
|
|
# make [RUNTIME=net6] test
|
|
#
|
|
# the following are internal sdk helpers that are not intended to be run directly:
|
|
# make check-variables
|
|
# make check-sdk-scripts
|
|
# make check-packaging-scripts
|
|
|
|
.PHONY: check-sdk-scripts check-packaging-scripts check-variables engine all clean version check-scripts check test
|
|
.DEFAULT_GOAL := all
|
|
|
|
PYTHON = $(shell command -v python3 2> /dev/null)
|
|
ifeq ($(PYTHON),)
|
|
PYTHON = $(shell command -v python 2> /dev/null)
|
|
endif
|
|
ifeq ($(PYTHON),)
|
|
$(error "The OpenRA mod SDK requires python.")
|
|
endif
|
|
|
|
VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
|
|
MOD_ID = $(shell cat user.config mod.config 2> /dev/null | awk -F= '/MOD_ID/ { print $$2; exit }')
|
|
ENGINE_DIRECTORY = $(shell cat user.config mod.config 2> /dev/null | awk -F= '/ENGINE_DIRECTORY/ { print $$2; exit }')
|
|
MOD_SEARCH_PATHS = "$(shell $(PYTHON) -c "import os; print(os.path.realpath('.'))")/mods,./mods"
|
|
|
|
MANIFEST_PATH = "mods/$(MOD_ID)/mod.yaml"
|
|
HAS_LUAC = $(shell command -v luac 2> /dev/null)
|
|
LUA_FILES = $(shell find mods/*/maps/* -iname '*.lua' 2> /dev/null)
|
|
MOD_SOLUTION_FILES = $(shell find . -maxdepth 1 -iname '*.sln' 2> /dev/null)
|
|
|
|
MSBUILD = msbuild -verbosity:m -nologo
|
|
DOTNET = dotnet
|
|
|
|
RUNTIME ?= net6
|
|
CONFIGURATION ?= Release
|
|
DOTNET_RID = $(shell ${DOTNET} --info | grep RID: | cut -w -f3)
|
|
ARCH_X64 = $(shell echo ${DOTNET_RID} | grep x64)
|
|
|
|
ifndef TARGETPLATFORM
|
|
UNAME_S := $(shell uname -s)
|
|
UNAME_M := $(shell uname -m)
|
|
ifeq ($(UNAME_S),Darwin)
|
|
ifeq ($(ARCH_X64),)
|
|
TARGETPLATFORM = osx-arm64
|
|
else
|
|
TARGETPLATFORM = osx-x64
|
|
endif
|
|
else
|
|
ifeq ($(UNAME_M),x86_64)
|
|
TARGETPLATFORM = linux-x64
|
|
else
|
|
ifeq ($(UNAME_M),aarch64)
|
|
TARGETPLATFORM = linux-arm64
|
|
else
|
|
TARGETPLATFORM = unix-generic
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
check-sdk-scripts:
|
|
@awk '/\r$$/ { exit(1); }' mod.config || (printf "Invalid mod.config format: file must be saved using unix-style (CR, not CRLF) line endings.\n"; exit 1)
|
|
@if [ ! -x "fetch-engine.sh" ] || [ ! -x "launch-dedicated.sh" ] || [ ! -x "launch-game.sh" ] || [ ! -x "utility.sh" ]; then \
|
|
echo "Required SDK scripts are not executable:"; \
|
|
if [ ! -x "fetch-engine.sh" ]; then \
|
|
echo " fetch-engine.sh"; \
|
|
fi; \
|
|
if [ ! -x "launch-dedicated.sh" ]; then \
|
|
echo " launch-dedicated.sh"; \
|
|
fi; \
|
|
if [ ! -x "launch-game.sh" ]; then \
|
|
echo " launch-game.sh"; \
|
|
fi; \
|
|
if [ ! -x "utility.sh" ]; then \
|
|
echo " utility.sh"; \
|
|
fi; \
|
|
echo "Repair their permissions and try again."; \
|
|
echo "If you are using git you can repair these permissions by running"; \
|
|
echo " git update-index --chmod=+x *.sh"; \
|
|
echo "and commiting the changed files to your repository."; \
|
|
exit 1; \
|
|
fi
|
|
|
|
check-packaging-scripts:
|
|
@if [ ! -x "packaging/package-all.sh" ] || [ ! -x "packaging/linux/buildpackage.sh" ] || [ ! -x "packaging/macos/buildpackage.sh" ] || [ ! -x "packaging/windows/buildpackage.sh" ]; then \
|
|
echo "Required SDK scripts are not executable:"; \
|
|
if [ ! -x "packaging/package-all.sh" ]; then \
|
|
echo " packaging/package-all.sh"; \
|
|
fi; \
|
|
if [ ! -x "packaging/linux/buildpackage.sh" ]; then \
|
|
echo " packaging/linux/buildpackage.sh"; \
|
|
fi; \
|
|
if [ ! -x "packaging/macos/buildpackage.sh" ]; then \
|
|
echo " packaging/macos/buildpackage.sh"; \
|
|
fi; \
|
|
if [ ! -x "packaging/windows/buildpackage.sh" ]; then \
|
|
echo " packaging/windows/buildpackage.sh"; \
|
|
fi; \
|
|
echo "Repair their permissions and try again."; \
|
|
echo "If you are using git you can repair these permissions by running"; \
|
|
echo " git update-index --chmod=+x *.sh"; \
|
|
echo "in the directories containing the affected files"; \
|
|
echo "and commiting the changed files to your repository."; \
|
|
exit 1; \
|
|
fi
|
|
|
|
check-variables:
|
|
@if [ -z "$(MOD_ID)" ] || [ -z "$(ENGINE_DIRECTORY)" ]; then \
|
|
echo "Required mod.config variables are missing:"; \
|
|
if [ -z "$(MOD_ID)" ]; then \
|
|
echo " MOD_ID"; \
|
|
fi; \
|
|
if [ -z "$(ENGINE_DIRECTORY)" ]; then \
|
|
echo " ENGINE_DIRECTORY"; \
|
|
fi; \
|
|
echo "Repair your mod.config (or user.config) and try again."; \
|
|
exit 1; \
|
|
fi
|
|
|
|
engine: check-variables check-sdk-scripts
|
|
@./fetch-engine.sh || (printf "Unable to continue without engine files\n"; exit 1)
|
|
@cd $(ENGINE_DIRECTORY) && make RUNTIME=$(RUNTIME) TARGETPLATFORM=$(TARGETPLATFORM) all
|
|
|
|
all: engine
|
|
ifeq ($(RUNTIME), mono)
|
|
@command -v $(MSBUILD) >/dev/null || (echo "OpenRA requires the '$(MSBUILD)' tool provided by Mono >= 6.4."; exit 1)
|
|
ifneq ("$(MOD_SOLUTION_FILES)","")
|
|
@find . -maxdepth 1 -name '*.sln' -exec $(MSBUILD) -t:Build -restore -p:Configuration=${CONFIGURATION} -p:TargetPlatform=$(TARGETPLATFORM) -p:Mono=true \;
|
|
endif
|
|
else
|
|
@find . -maxdepth 1 -name '*.sln' -exec $(DOTNET) build -c ${CONFIGURATION} -p:TargetPlatform=$(TARGETPLATFORM) \;
|
|
endif
|
|
|
|
clean: engine
|
|
ifneq ("$(MOD_SOLUTION_FILES)","")
|
|
ifeq ($(RUNTIME), mono)
|
|
@find . -maxdepth 1 -name '*.sln' -exec $(MSBUILD) -t:clean \;
|
|
else
|
|
@find . -maxdepth 1 -name '*.sln' -exec $(DOTNET) clean \;
|
|
endif
|
|
endif
|
|
@cd $(ENGINE_DIRECTORY) && make clean
|
|
|
|
version: check-variables
|
|
@sh -c '. $(ENGINE_DIRECTORY)/packaging/functions.sh; set_mod_version $(VERSION) $(MANIFEST_PATH)'
|
|
@printf "Version changed to $(VERSION).\n"
|
|
|
|
check-scripts: check-variables
|
|
ifeq ("$(HAS_LUAC)","")
|
|
@printf "'luac' not found.\n" && exit 1
|
|
endif
|
|
@echo
|
|
@echo "Checking for Lua syntax errors..."
|
|
ifneq ("$(LUA_FILES)","")
|
|
@luac -p $(LUA_FILES)
|
|
endif
|
|
|
|
check: engine
|
|
ifneq ("$(MOD_SOLUTION_FILES)","")
|
|
@echo "Compiling in Debug mode..."
|
|
ifeq ($(RUNTIME), mono)
|
|
# Enabling EnforceCodeStyleInBuild and GenerateDocumentationFile as a workaround for some code style rules (in particular IDE0005) being bugged and not reporting warnings/errors otherwise.
|
|
@$(MSBUILD) -t:build -restore -p:Configuration=Debug -warnaserror -p:TargetPlatform=$(TARGETPLATFORM) -p:Mono=true -p:EnforceCodeStyleInBuild=true -p:GenerateDocumentationFile=true
|
|
else
|
|
# Enabling EnforceCodeStyleInBuild and GenerateDocumentationFile as a workaround for some code style rules (in particular IDE0005) being bugged and not reporting warnings/errors otherwise.
|
|
@$(DOTNET) build -c Debug -nologo -warnaserror -p:TargetPlatform=$(TARGETPLATFORM) -p:EnforceCodeStyleInBuild=true -p:GenerateDocumentationFile=true
|
|
endif
|
|
endif
|
|
@echo "Checking for explicit interface violations..."
|
|
@./utility.sh --check-explicit-interfaces
|
|
@echo "Checking for incorrect conditional trait interface overrides..."
|
|
@./utility.sh --check-conditional-trait-interface-overrides
|
|
|
|
test: all
|
|
@echo "Testing $(MOD_ID) mod MiniYAML..."
|
|
@./utility.sh --check-yaml
|