diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index af38e2db..088c0c67 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -325,34 +325,29 @@ jobs: strip craftos - name: Build AppImage run: | - mkdir icons - unzip resources/linux-icons.zip -d icons - mkdir AppDir - curl -sLo AppDir/AppRun https://github.com/AppImage/AppImageKit/releases/download/13/AppRun-x86_64 - chmod a+x AppDir/AppRun if [[ $GITHUB_REF =~ luajit ]]; then + mkdir AppDir icons + unzip resources/linux-icons.zip -d icons install -D -m 0644 icons/CraftOS-PC.desktop AppDir/cc.craftos-pc.CraftOS-PC-Accelerated.desktop install -D -m 0644 icons/CraftOS-PC.desktop AppDir/usr/share/applications/CraftOS-PC-Accelerated.desktop install -D -m 0644 icons/1024.png AppDir/craftos-luajit.png install -D -m 0755 craftos AppDir/usr/bin/craftos-luajit install -D -m 0755 craftos2-luajit/src/libluajit.so AppDir/usr/lib/libluajit.so install -D -m 0644 resources/appdata.xml AppDir/usr/share/metainfo/cc.craftos-pc.CraftOS-PC-Accelerated.appdata.xml + # this gets all libraries required recursively (?) + ldd ./craftos | grep -o '/lib/[^ ]*\.so[^ :]*' | grep -Ev 'libstdc\+\+|libm\.|libgcc|libc\.|libX|libx|libpulse|libdbus|libsystemd|libreadline|libpthread|libdl|librt|libbsd|libnsl|libresolv' | sort | uniq | tee /dev/stderr | xargs -I {} cp -Lp {} AppDir/usr/lib + cp -Lp /lib/x86_64-linux-gnu/libX11.so.6 AppDir/usr/lib + mkdir -p AppDir/usr/lib/ssl + cp -Lp /etc/ssl/certs/ca-certificates.crt AppDir/usr/lib/ssl/cert.pem + lua -e 'local file = assert(io.open("AppDir/usr/lib/libcrypto.so.1.1", "rb")) local data = file:read("*a") file:close() file = assert(io.open("AppDir/usr/lib/libcrypto.so.1.1", "wb")) file:write(data:gsub("/usr(/lib/ssl[^\0]*\0)", ".%1\0\0\0")) file:close()' else - install -D -m 0644 icons/CraftOS-PC.desktop AppDir/cc.craftos-pc.CraftOS-PC.desktop - install -D -m 0644 icons/CraftOS-PC.desktop AppDir/usr/share/applications/CraftOS-PC.desktop - install -D -m 0644 icons/1024.png AppDir/craftos.png - install -D -m 0755 craftos AppDir/usr/bin/craftos - install -D -m 0755 craftos2-lua/src/liblua.so AppDir/usr/lib/libcraftos2-lua.so - install -D -m 0644 resources/appdata.xml AppDir/usr/share/metainfo/cc.craftos-pc.CraftOS-PC.appdata.xml + make AppDir fi + curl -sLo AppDir/AppRun https://github.com/AppImage/AppImageKit/releases/download/13/AppRun-x86_64 + chmod a+x AppDir/AppRun + mkdir -p AppDir/usr/share/craftos cp -Rp /usr/local/share/craftos/rom /usr/local/share/craftos/debug /usr/local/share/craftos/bios.lua /usr/local/share/craftos/hdfont.bmp AppDir/usr/share/craftos/ - # this gets all libraries required recursively (?) - ldd ./craftos | grep -o '/lib/[^ ]*\.so[^ :]*' | grep -Ev 'libstdc\+\+|libm\.|libgcc|libc\.|libX|libx|libpulse|libdbus|libsystemd|libreadline|libpthread|libdl|librt|libbsd|libnsl|libresolv' | sort | uniq | tee /dev/stderr | xargs -I {} cp -Lp {} AppDir/usr/lib - cp -Lp /lib/x86_64-linux-gnu/libX11.so.6 AppDir/usr/lib - mkdir -p AppDir/usr/lib/ssl - cp -Lp /etc/ssl/certs/ca-certificates.crt AppDir/usr/lib/ssl/cert.pem - lua -e 'local file = assert(io.open("AppDir/usr/lib/libcrypto.so.1.1", "rb")) local data = file:read("*a") file:close() file = assert(io.open("AppDir/usr/lib/libcrypto.so.1.1", "wb")) file:write(data:gsub("/usr(/lib/ssl[^\0]*\0)", ".%1\0\0\0")) file:close()' appimagetool -s AppDir CraftOS-PC.x86_64.AppImage - name: Upload AppImage uses: shogo82148/actions-upload-release-asset@v1.6.3 diff --git a/Makefile.in b/Makefile.in index 8de9c097..6a951a66 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,3 +1,4 @@ +MAKEFLAGS+=--warn-undefined-variables CC=@CC@ CXX=@CXX@ CFLAGS=@CFLAGS@ @@ -7,8 +8,16 @@ LDFLAGS=@LDFLAGS@ LIBEXT=.so ifndef OS ifeq (@OUT_TARGET@, craftos) +ifeq ($(shell uname), Linux) +EXTRA_PLATFORM_INSTALL_TARGETS=install-linux fixup-liblua-path +endif +endif +endif +ifndef OS +ifeq (@OUT_TARGET@, craftos) ifeq ($(shell uname), Darwin) LIBEXT=.dylib +EXTRA_PLATFORM_INSTALL_TARGETS=install-darwin endif endif endif @@ -21,11 +30,22 @@ LIBEXT=.dylib endif endif endif +INSTALL_TARGETS?=install-bin install-liblua $(EXTRA_PLATFORM_INSTALL_TARGETS) PREFIX?=@prefix@ prefix=$(PREFIX) -DESTDIR?=@exec_prefix@ +exec_prefix=@exec_prefix@ +ifdef DESTDIR +$(if $(findstring /bin,$(DESTDIR)), \ + $(warning "The DESTDIR variable was significantly changed. Please set BINDIR if you would like to change where binaries will be installed.")) +endif +BINDIR=@bindir@ +SHAREDIR=@datarootdir@ +INCLUDEDIR=@includedir@ +LIBDIR=@libdir@ +MACAPPDIR=$(DESTDIR)/$(PREFIX)/Applications +LIBLUA_NAME=libcraftos2-liblua ifneq (/usr,$(PREFIX)) -CPPFLAGS:=$(CPPFLAGS) -DCUSTOM_ROM_DIR=\"$(PREFIX)/share/craftos\" +CPPFLAGS:=$(CPPFLAGS) -DCUSTOM_ROM_DIR=\"$(SHAREDIR)/craftos\" endif SDIR=@srcdir@/src IDIR=@srcdir@/api @@ -126,6 +146,21 @@ $(ODIR)/apis_%_handle.o: $(SDIR)/apis/handles/%_handle.cpp $(SDIR)/apis/handles/ echo " [CXX] $@" $(CXX) -o $@ -c $(CPPFLAGS) $(CXXFLAGS) $(CFLAGS) $< +AppDir: craftos + mkdir AppDir + $(MAKE) DESTDIR=AppDir $(INSTALL_TARGETS) extra-install-appstream + cp resources/linux-icons/1024.png AppDir/craftos.png + # Vendor SSL certificates (needed for network requests to work properly?) + # XXX: Might not be necessary since https://github.com/AppImage/appimagetool/pull/32 + mkdir -p AppDir/usr/lib/ssl + cp -Lp /etc/ssl/certs/ca-certificates.crt AppDir/usr/lib/ssl/cert.pem + # Vendor libraries + # this gets all libraries required recursively (?) + ldd ./craftos | grep -o '/lib/[^ ]*\.so[^ :]*' | grep -Ev 'libstdc\+\+|libm\.|libgcc|libc\.|libX|libx|libpulse|libdbus|libsystemd|libreadline|libpthread|libdl|librt|libbsd|libnsl|libresolv' | sort | uniq | tee /dev/stderr | xargs -I {} cp -Lp {} AppDir/usr/lib + cp -Lp /lib/x86_64-linux-gnu/libX11.so.6 AppDir/usr/lib + # XXX: patch libcrypto + lua -e 'local file = assert(io.open("AppDir/usr/lib/libcrypto.so.1.1", "rb")) local data = file:read("*a") file:close() file = assert(io.open("AppDir/usr/lib/libcrypto.so.1.1", "wb")) file:write(data:gsub("/usr(/lib/ssl[^\0]*\0)", ".%1\0\0\0")) file:close()' + mac-plugin: echo " [LD] ccemux.bundle" $(CXX) -std=c++17 -bundle -fpic -o ccemux.bundle examples/ccemux.cpp craftos2-lua/src/liblua$(LIBEXT) -lSDL2 -Icraftos2-lua/include -Iapi @@ -140,15 +175,112 @@ clean: $(ODIR) rebuild: clean craftos -install: craftos - echo " [CP] $(DESTDIR)/craftos" - cp craftos $(DESTDIR)/craftos +fixup-liblua-path: craftos $(filter linux-plugin,$(MAKECMDGOALS)) + echo " [FIXUP] craftos" + patchelf --replace-needed craftos2-lua/src/liblua.so "$(LIBLUA_NAME)$(LIBEXT)" craftos + if [ -f ccemux$(LIBEXT) ]; then \ + echo " [FIXUP] ccemux$(LIBEXT)"; \ + patchelf --replace-needed "craftos2-lua/src/liblua$(LIBEXT)" "$(LIBLUA_NAME)$(LIBEXT)" "ccemux$(LIBEXT)"; \ + fi + +install-darwin: macapp + cp -r CraftOS-PC.app $(DESTDIR)$(MACAPPDIR) + +install-linux: + echo " [MKDIR] $(DESTDIR)$(SHAREDIR)/applications" + mkdir -p "$(DESTDIR)$(SHAREDIR)/applications" + echo " [CP] resources/CraftOS-PC.desktop" + cp resources/CraftOS-PC.desktop "$(DESTDIR)$(SHAREDIR)/applications" + + for dimension in 16 24 32 48 64 96 128 256 1024; do \ + icondir="$(DESTDIR)$(SHAREDIR)/icons/hicolor/$${dimension}x$${dimension}/apps"; \ + echo " [MKDIR] $${icondir}"; \ + mkdir -p "$${icondir}"; \ + echo " [CP] resources/linux-icons/$${dimension}.png"; \ + cp "resources/linux-icons/$${dimension}.png" "$${icondir}/craftos.png"; \ + done + + +install-bin: craftos $(filter fixup-liblua-path,$(MAKECMDGOALS)) + echo " [MKDIR] $(DESTDIR)$(BINDIR)" + mkdir -p "$(DESTDIR)$(BINDIR)" + echo " [CP] craftos" + cp craftos "$(DESTDIR)$(BINDIR)/craftos" + + +# craftos2-lua does have a ``make install`` rule, but it installs a lot of +# files that conflict with a standard Lua installation. +install-liblua: craftos2-lua/src/liblua$(LIBEXT) + echo " [MKDIR] $(DESTDIR)$(LIBDIR)" + mkdir "$(DESTDIR)$(LIBDIR)" + echo " [CP] craftos2-lua/src/liblua$(LIBEXT)" + cp craftos2-lua/src/liblua$(LIBEXT) $(DESTDIR)$(LIBDIR)/$(LIBLUA_NAME)$(LIBEXT) + +install: $(INSTALL_TARGETS) + +# Not installed by default, since some distributions (e.g. Fedora/RHEL) expect +# headers to be packaged seperately. +extra-install-headers: + echo " [MKDIR] $(DESTDIR)$(INCLUDEDIR)" + mkdir -p "$(DESTDIR)$(INCLUDEDIR)" + echo " [CP] api" + cp -R api "$(DESTDIR)$(INCLUDEDIR)/CraftOS-PC" + echo " [CP] craftos2-lua/include" + cp -R craftos2-lua/include/* "$(DESTDIR)$(INCLUDEDIR)/CraftOS-PC" + +# Not installed by default, since this is not always wanted. +extra-install-linux-plugin: linux-plugin fixup-liblua-path + echo " [MKDIR] $(DESTDIR)$(SHAREDIR)/craftos/plugins" + mkdir -p "$(DESTDIR)$(SHAREDIR)/craftos/plugins" + echo " [CP] ccemux$(LIBEXT)" + cp "ccemux$(LIBEXT)" "$(DESTDIR)$(SHAREDIR)/craftos/plugins" + +# Not installed by default, since this is not always wanted. +extra-install-apport: + echo " [MKDIR] $(DESTDIR)$(SHAREDIR)/apport/package-hooks" + mkdir -p "$(DESTDIR)$(SHAREDIR)/apport/package-hooks" + echo " [CP] resources/apport/apport_hook.py" + cp resources/apport/apport_hook.py $(DESTDIR)$(SHAREDIR)/apport/package-hooks/craftos-pc.py + cp resources/apport/apport_hook.py $(DESTDIR)$(SHAREDIR)/apport/package-hooks/source_craftos-pc.py + echo " [MKDIR] $(DESTDIR)$(SYSCONFDIR)/apport/crashdb.conf.d" + mkdir -p "$(DESTDIR)$(SYSCONFDIR)/apport/crashdb.conf.d" + echo " [CP] resources/apport/apport_crashdb.conf" + cp resources/apport/apport_crashdb.conf $(DESTDIR)$(SYSCONFDIR)/apport/crashdb.conf.d/craftos_pc-crashdb.conf + +# Not installed by default, since this is not always wanted. +extra-install-appstream: + echo " [MKDIR] $(DESTDIR)$(SHAREDIR)/metainfo" + mkdir -p "$(DESTDIR)$(SHAREDIR)/metainfo" + echo " [CP] resources/appdata.xml" + cp resources/appdata.xml $(DESTDIR)$(SHAREDIR)/metainfo/cc.craftos-pc.CraftOS-PC.appdata.xml + echo " [MKDIR] $(DESTDIR)$(SHAREDIR)/applications" + mkdir -p "$(DESTDIR)$(SHAREDIR)/applications" + # XXX: Should we be installing the .desktop file into the AppStream-friendly location by default? + echo " [CP] resources/CraftOS-PC.desktop" + cp resources/CraftOS-PC.desktop "$(DESTDIR)$(SHAREDIR)/applications/cc.craftos-pc.CraftOS-PC.desktop" uninstall: - echo " [RM] $(DESTDIR)/craftos" - rm $(DESTDIR)/craftos + echo " [RM] $(DESTDIR)$(BINDIR)/craftos" + rm -f "$(DESTDIR)$(BINDIR)/craftos" + echo " [RM] $(DESTDIR)$(SHAREDIR)/applications/CraftOS-PC.desktop" + rm -f "$(DESTDIR)$(SHAREDIR)/applications/CraftOS-PC.desktop" + echo ' [RM] $(DESTDIR)$(SHAREDIR)/icons/hicolor/*/apps/craftos.png' + rm -f "$(DESTDIR)$(SHAREDIR)/icons/hicolor/*/apps/craftos.png" + echo ' [RM] $(DESTDIR)$(LIBDIR)/$(LIBLUA_NAME)$(LIBEXT)' + rm -f "$(DESTDIR)$(LIBDIR)/$(LIBLUA_NAME)$(LIBEXT)" + echo ' [RM] $(DESTDIR)$(INCLUDEDIR)/CraftOS-PC' + rm -rf "$(DESTDIR)$(INCLUDEDIR)/CraftOS-PC" + echo ' [RM] $(DESTDIR)$(MACAPPDIR)/CraftOS-PC.app' + rm -rf "$(DESTDIR)$(MACAPPDIR)/CraftOS-PC.app" + echo ' [RM] $(DESTDIR)$(SYSCONFDIR)/apport/crashdb.conf.d/craftos_pc-crashdb.conf' + rm -f "$(DESTDIR)$(SYSCONFDIR)/apport/crashdb.conf.d/craftos_pc-crashdb.conf" + echo ' [RM] $(DESTDIR)$(SHAREDIR)/apport/package-hooks/source_craftos-pc.py' + rm -f "$(DESTDIR)$(SHAREDIR)/apport/package-hooks/source_craftos-pc.py" + echo ' [RM] $(DESTDIR)$(SHAREDIR)/apport/package-hooks/craftos-pc.py' + rm -f "$(DESTDIR)$(SHAREDIR)/apport/package-hooks/craftos-pc.py" test: craftos ./craftos --headless --script $(shell pwd)/resources/CraftOSTest.lua -d "$(shell mktemp -d)" -.SILENT: \ No newline at end of file +.PHONY: all macapp clean rebuild install install-bin install-headers install-liblua install-linux install-darwin extra-install-linux-plugin extra-install-apport extra-install-appstream uninstall test +.SILENT: diff --git a/resources/CraftOS-PC.desktop b/resources/CraftOS-PC.desktop new file mode 100644 index 00000000..725465a5 --- /dev/null +++ b/resources/CraftOS-PC.desktop @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2019-2024 JackMacWindows +# +# SPDX-License-Identifier: MIT + +[Desktop Entry] +Version=1.0 +Name=CraftOS-PC +GenericName=Advanced ComputerCraft emulator +Exec=craftos +Icon=craftos +StartupWMClass=craftos +Terminal=false +Type=Application +Categories=Utility;Development; +Keywords=craftos;computercraft;emulator; diff --git a/resources/apport/apport_crashdb.conf b/resources/apport/apport_crashdb.conf new file mode 100644 index 00000000..36f9aa71 --- /dev/null +++ b/resources/apport/apport_crashdb.conf @@ -0,0 +1,9 @@ +# SPDX-FileCopyrightText: 2019-2024 JackMacWindows +# +# SPDX-License-Identifier: MIT + +craftos_pc = { + 'impl': 'launchpad', + 'project': 'craftos-pc', + 'bug_pattern_base': None, +} diff --git a/resources/apport/apport_hook.py b/resources/apport/apport_hook.py new file mode 100644 index 00000000..37ef8be5 --- /dev/null +++ b/resources/apport/apport_hook.py @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2019-2024 JackMacWindows +# +# SPDX-License-Identifier: MIT + +from apport.hookutils import * +import apport.packaging + +def add_info(report, ui): + if not apport.packaging.is_distro_package(report['Package'].split()[0]): + report['CrashDB'] = 'craftos_pc' diff --git a/resources/linux-icons.zip b/resources/linux-icons.zip deleted file mode 100644 index 05ae67f3..00000000 Binary files a/resources/linux-icons.zip and /dev/null differ diff --git a/resources/linux-icons/1024.png b/resources/linux-icons/1024.png new file mode 100644 index 00000000..38449b8e Binary files /dev/null and b/resources/linux-icons/1024.png differ diff --git a/resources/linux-icons/128.png b/resources/linux-icons/128.png new file mode 100644 index 00000000..169fa9ee Binary files /dev/null and b/resources/linux-icons/128.png differ diff --git a/resources/linux-icons/16.png b/resources/linux-icons/16.png new file mode 100644 index 00000000..ded80fbc Binary files /dev/null and b/resources/linux-icons/16.png differ diff --git a/resources/linux-icons/24.png b/resources/linux-icons/24.png new file mode 100644 index 00000000..45fafbd7 Binary files /dev/null and b/resources/linux-icons/24.png differ diff --git a/resources/linux-icons/256.png b/resources/linux-icons/256.png new file mode 100644 index 00000000..f933078e Binary files /dev/null and b/resources/linux-icons/256.png differ diff --git a/resources/linux-icons/32.png b/resources/linux-icons/32.png new file mode 100644 index 00000000..6d7b810e Binary files /dev/null and b/resources/linux-icons/32.png differ diff --git a/resources/linux-icons/48.png b/resources/linux-icons/48.png new file mode 100644 index 00000000..b0cdd2b2 Binary files /dev/null and b/resources/linux-icons/48.png differ diff --git a/resources/linux-icons/64.png b/resources/linux-icons/64.png new file mode 100644 index 00000000..4d46518a Binary files /dev/null and b/resources/linux-icons/64.png differ diff --git a/resources/linux-icons/96.png b/resources/linux-icons/96.png new file mode 100644 index 00000000..5a3855c3 Binary files /dev/null and b/resources/linux-icons/96.png differ