From 580aaca2c52f09c62f4dbeede1b86df4ff3190e5 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Mon, 28 Dec 2020 15:04:51 -0800 Subject: [PATCH] go.mod: dependencies inside local deps/ folder * Simplify building Doodle by cloning outside dependencies (like go/render and go/ui) into the deps/ folder, to assist with Flatpak building the app from source easily. --- .gitignore | 2 +- Makefile | 1 - bootstrap.py | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 2 deletions(-) create mode 100755 bootstrap.py diff --git a/.gitignore b/.gitignore index aea3f71..932e2b5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ pkg/bindata/bindata.go +deps/ fonts/ maps/ bin/ @@ -16,4 +17,3 @@ docker/fedora screenshot-*.png map-*.json pkg/wallpaper/*.png - diff --git a/Makefile b/Makefile index 90161d9..e33d921 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,6 @@ setup: clean # `make build` to build the binary. .PHONY: build build: - gofmt -w . go build $(LDFLAGS) -i -o bin/doodle cmd/doodle/main.go go build $(LDFLAGS) -i -o bin/doodad cmd/doodad/main.go diff --git a/bootstrap.py b/bootstrap.py new file mode 100755 index 0000000..764343a --- /dev/null +++ b/bootstrap.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python + +""" +Full setup, from scratch to distribution, of Project: Doodle. + +Run this script from an empty working directory. All git repos will be cloned +here (or updated if already existing) and the app will be fully built including +fonts, default levels and doodads, sound effects and music for your current +system. Useful to quickly bootstrap a build on weird operating systems like +macOS or Linux on ARM (Pinephone). + +First ensure that your SSH key is authorized on git.kirsle.net to download +the repos easily. This script will also handle installing the SDL2 dependencies +on Fedora, Debian and macOS type systems. +""" + +import sys +import os +import os.path +import subprocess +import pathlib + +# Git repositories. +repos = { + "git@git.kirsle.net:apps/doodle": "doodle", + "git@git.kirsle.net:apps/doodle-masters": "masters", + "git@git.kirsle.net:apps/doodle-vendor": "vendor", + "git@git.kirsle.net:apps/doodle-rtp": "rtp", + "git@git.kirsle.net:go/render": "render", + "git@git.kirsle.net:go/ui": "ui", + "git@git.kirsle.net:go/audio": "audio", +} +repos_github = { + # GitHub mirrors of the above. + "git@github.com:kirsle/render": "render", + "git@github.com:kirsle/ui": "ui", + "git@github.com:kirsle/audio": "audio", + # TODO: the rest +} + +# Software dependencies. +dep_fedora = ["golang", "SDL2-devel", "SDL2_ttf-devel", "SDL2_mixer-devel"] +dep_debian = ["golang", "libsdl2-dev", "libsdl2-ttf-dev", "libsdl2-mixer-dev"] +dep_macos = ["golang", "sdl2", "sdl2_ttf", "sdl2_mixer", "pkg-config"] + + +# Absolute path to current working directory. +ROOT = pathlib.Path().absolute() + + +def main(): + print( + "Project: Doodle Full Installer\n" + "Current working directory: {root}\n" + "Ensure your SSH keys are set up on git.kirsle.net to easily clone repos." + .format(root=ROOT) + ) + input("Press Enter to begin.") + install_deps() + clone_repos() + patch_gomod() + copy_assets() + install_doodad() + build() + + +def install_deps(): + """Install system dependencies.""" + if shell("which rpm") == 0 and shell("which dnf") == 0: + # Fedora-like. + if shell("rpm -q {}".format(' '.join(dep_fedora))) != 0: + must_shell("sudo dnf install {}".format(' '.join(dep_fedora))) + elif shell("which apt") == 0: + # Debian-like. + if shell("dpkg-query -l {}".format(' '.join(dep_debian))) != 0: + must_shell("sudo apt update && sudo apt install {}".format(' '.join(dep_debian))) + elif shell("which brew") == 0: + # MacOS + must_shell("brew install {}".format(' '.join(dep_macos))) + else: + print("Warning: didn't detect your package manager to install SDL2 and other dependencies") + + # Get the bindata command. + shell("go get -u git.kirsle.net/go/bindata/...") + + + +def clone_repos(): + """Clone or update all the git repos""" + if not os.path.isdir("./deps"): + os.mkdir("./deps") + os.chdir("./deps") + for url, name in repos.items(): + if os.path.isdir(name): + os.chdir(name) + must_shell("git pull --ff-only") + os.chdir("..") + else: + must_shell("git clone {} {}".format(url, name)) + os.chdir("..") # back to doodle root + + +def patch_gomod(): + """Patch the doodle/go.mod to use local paths to other repos.""" + if shell("grep -e 'replace git.kirsle.net' go.mod") != 0: + with open("go.mod", "a") as fh: + fh.write( + "\n\nreplace git.kirsle.net/go/render => {root}/deps/render\n" + "replace git.kirsle.net/go/ui => {root}/deps/ui\n" + "replace git.kirsle.net/go/audio => {root}/deps/audio\n" + .format(root=ROOT) + ) + + +def copy_assets(): + """Copy assets from other repos into doodle.""" + if not os.path.isdir("assets/fonts"): + shell("cp -rv deps/vendor/fonts assets/fonts") + if not os.path.isdir("assets/levels"): + shell("cp -rv deps/masters/levels assets/levels") + if not os.path.isdir("rtp"): + shell("mkdir -p rtp && cp -rv deps/rtp/* rtp/") + + +def install_doodad(): + """Install the doodad CLI tool from the doodle repo.""" + must_shell("make bindata-dev") + must_shell("go install git.kirsle.net/apps/doodle/cmd/doodad") + + +def build(): + """Build the game.""" + must_shell("make dist") + + +def shell(cmd): + """Echo and run a shell command""" + print("$ ", cmd) + return subprocess.call(cmd, shell=True) + + +def must_shell(cmd): + """Run a shell command which MUST succeed.""" + assert shell(cmd) == 0 + + +if __name__ == "__main__": + main()