commit ac0d8f6920b529023277a565c73b78ce3a2c463e Author: Miku AuahDark Date: Sat Jun 26 03:08:58 2021 +0800 Please test diff --git a/AppRun.c b/AppRun.c new file mode 100644 index 0000000..c8b6484 --- /dev/null +++ b/AppRun.c @@ -0,0 +1,236 @@ +/************************************************************************** + +Copyright (c) 2004-18 Simon Peter +Portions Copyright (c) 2010 RazZziel + +All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +**************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define die(...) \ + do { \ + fprintf(stderr, "Error: " __VA_ARGS__); \ + exit(1); \ + } while(0); +#define SET_NEW_ENV(str,len,fmt,...) \ + format = fmt; \ + length = strlen(format) + (len); \ + char *str = calloc(length, sizeof(char)); \ + snprintf(str, length, format, __VA_ARGS__); \ + putenv(str); +#define MAX(a,b) (a > b ? a : b) +#define bool int +#define false 0 +#define true -1 + +#define LINE_SIZE 255 + +int filter(const struct dirent *dir) { + char *p = (char*) &dir->d_name; + p = strrchr(p, '.'); + return p && !strcmp(p, ".desktop"); +} + +int main(int argc, char *argv[]) { + char *appdir = dirname(realpath("/proc/self/exe", NULL)); + if (!appdir) + die("Could not access /proc/self/exe\n"); + + int ret; + struct dirent **namelist; + ret = scandir(appdir, &namelist, filter, NULL); + + if (ret == 0) { + die("No .desktop files found\n"); + } else if(ret == -1) { + die("Could not scan directory %s\n", appdir); + } + + /* Extract executable from .desktop file */ + char *desktop_file = calloc(LINE_SIZE, sizeof(char)); + snprintf(desktop_file, LINE_SIZE, "%s/%s", appdir, namelist[0]->d_name); + FILE *f = fopen(desktop_file, "r"); + char *line = malloc(LINE_SIZE); + size_t n = LINE_SIZE; + + do { + if (getline(&line, &n, f) == -1) + die("Executable not found, make sure there is a line starting with 'Exec='\n"); + } while(strncmp(line, "Exec=", 5)); + fclose(f); + char *exe = line+5; + + // parse arguments + bool in_quotes = 0; + for (n = 0; n < LINE_SIZE; n++) { + if (!line[n]) // end of string + break; + else if (line[n] == 10 || line[n] == 13) { + line[n] = '\0'; + line[n+1] = '\0'; + line[n+2] = '\0'; + break; + } else if (line[n] == '"') { + in_quotes = !in_quotes; + } else if (line[n] == ' ' && !in_quotes) + line[n] = '\0'; + } + + // count arguments + char* arg = exe; + int argcount = 0; + while ((arg += (strlen(arg)+1)) && *arg) + argcount += 1; + + // merge args + char* outargptrs[argcount + argc + 1]; + outargptrs[0] = exe; + int outargindex = 1; + arg = exe; + int argc_ = argc - 1; // argv[0] is the filename + char** argv_ = argv + 1; + while ((arg += (strlen(arg)+1)) && *arg) { + if (arg[0] == '%' || (arg[0] == '"' && arg[1] == '%')) { // handle desktop file field codes + char code = arg[arg[0] == '%' ? 1 : 2]; + switch(code) { + case 'f': + case 'u': + if (argc_ > 0) { + outargptrs[outargindex++] = *argv_++; + argc_--; + } + break; + case 'F': + case 'U': + while (argc_ > 0) { + outargptrs[outargindex++] = *argv_++; + argc_--; + } + break; + case 'i': + case 'c': + case 'k': + fprintf(stderr, "WARNING: Desktop file field code %%%c is not currently supported\n", code); + break; + default: + fprintf(stderr, "WARNING: Invalid desktop file field code %%%c\n", code); + break; + } + } else { + outargptrs[outargindex++] = arg; + } + } + while (argc_ > 0) { + outargptrs[outargindex++] = *argv_++; + argc_--; + } + outargptrs[outargindex] = '\0'; // trailing null argument required by execvp() + + // change directory + size_t appdir_s = strlen(appdir); + char *usr_in_appdir = malloc(appdir_s + 5); + /* + snprintf(usr_in_appdir, appdir_s + 5, "%s/usr", appdir); + ret = chdir(usr_in_appdir); + if (ret != 0) + die("Could not cd into %s\n", usr_in_appdir); + */ + + // set environment variables + char *old_env; + size_t length; + const char *format; + + /* https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHOME */ + SET_NEW_ENV(new_pythonhome, appdir_s, "PYTHONHOME=%s/", appdir); + + old_env = getenv("PATH") ?: ""; + SET_NEW_ENV(new_path, appdir_s + strlen(old_env), "PATH=%s/bin/:%s", appdir, old_env); + + old_env = getenv("LD_LIBRARY_PATH") ?: ""; + SET_NEW_ENV(new_ld_library_path, appdir_s + strlen(old_env), "LD_LIBRARY_PATH=%s/lib/:%s", appdir, old_env); + + old_env = getenv("PYTHONPATH") ?: ""; + SET_NEW_ENV(new_pythonpath, appdir_s + strlen(old_env), "PYTHONPATH=%s/share/pyshared/:%s", appdir, old_env); + + old_env = getenv("XDG_DATA_DIRS") ?: "/usr/local/share/:/usr/share/"; + SET_NEW_ENV(new_xdg_data_dirs, appdir_s + strlen(old_env), "XDG_DATA_DIRS=%s/share/:%s", appdir, old_env); + + old_env = getenv("PERLLIB") ?: ""; + SET_NEW_ENV(new_perllib, appdir_s*2 + strlen(old_env), "PERLLIB=%s/share/perl5/:%s/lib/perl5/:%s", appdir, appdir, old_env); + + /* http://askubuntu.com/questions/251712/how-can-i-install-a-gsettings-schema-without-root-privileges */ + old_env = getenv("GSETTINGS_SCHEMA_DIR") ?: ""; + SET_NEW_ENV(new_gsettings_schema_dir, appdir_s + strlen(old_env), "GSETTINGS_SCHEMA_DIR=%s/share/glib-2.0/schemas/:%s", appdir, old_env); + + old_env = getenv("QT_PLUGIN_PATH") ?: ""; + SET_NEW_ENV(new_qt_plugin_path, appdir_s*10 + strlen(old_env), "QT_PLUGIN_PATH=%s/lib/qt4/plugins/:%s/lib/i386-linux-gnu/qt4/plugins/:%s/lib/x86_64-linux-gnu/qt4/plugins/:%s/lib32/qt4/plugins/:%s/lib64/qt4/plugins/:%s/lib/qt5/plugins/:%s/lib/i386-linux-gnu/qt5/plugins/:%s/lib/x86_64-linux-gnu/qt5/plugins/:%s/lib32/qt5/plugins/:%s/lib64/qt5/plugins/:%s", appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, appdir, old_env); + + SET_NEW_ENV(new_gspath, appdir_s + strlen(old_env), "GST_PLUGIN_SYSTEM_PATH=%s/lib/gstreamer:%s", appdir, old_env); + SET_NEW_ENV(new_gspath1, appdir_s + strlen(old_env), "GST_PLUGIN_SYSTEM_PATH_1_0=%s/lib/gstreamer-1.0:%s", appdir, old_env); + + /* Otherwise may get errors because Python cannot write __pycache__ bytecode cache */ + putenv("PYTHONDONTWRITEBYTECODE=1"); + + /* Lua-specific stuff by MikuAuahDark */ + old_env = getenv("LUA_PATH"); + if (old_env) { + SET_NEW_ENV(new_lua_path, appdir_s*2 + strlen(old_env), "LUA_PATH=%s;%s/share/luajit-2.1.0-beta3/?.lua;%s/share/lua/5.1/?.lua;;", old_env, appdir, appdir); + } else { + SET_NEW_ENV(new_lua_path, appdir_s*2, "LUA_PATH=%s/share/luajit-2.1.0-beta3/?.lua;%s/share/lua/5.1/?.lua;;", appdir, appdir); + } + + old_env = getenv("LUA_CPATH"); + if (old_env) { + SET_NEW_ENV(new_lua_cpath, appdir_s + strlen(old_env), "LUA_CPATH=%s;=%s/lib/lua/5.1/?.so;;", old_env, appdir); + } else { + SET_NEW_ENV(new_lua_cpath, appdir_s, "LUA_CPATH=%s/lib/lua/5.1/?.so;;", appdir); + } + + /* Run */ + ret = execvp(exe, outargptrs); + + int error = errno; + + if (ret == -1) + die("Error executing '%s': %s\n", exe, strerror(error)); + + free(line); + free(desktop_file); + free(usr_in_appdir); + free(new_pythonhome); + free(new_path); + free(new_ld_library_path); + free(new_pythonpath); + free(new_xdg_data_dirs); + free(new_perllib); + free(new_gsettings_schema_dir); + free(new_qt_plugin_path); + return 0; +} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1c21d89 --- /dev/null +++ b/Makefile @@ -0,0 +1,325 @@ +# Makefile script to generate AppImage for LOVE + +# Number of processor to use when compiling +NUMBER_OF_PROCESSORS := $(shell nproc) + +# CMake URL +CMAKE_URL := https://github.com/Kitware/CMake/releases/download/v3.20.2/cmake-3.20.2-linux-x86_64.sh + +# Project branches (for git-based projects) +LOVE_BRANCH := master +SDL2_BRANCH := release-2.0.14 +LUAJIT_BRANCH := v2.1 +OPENAL_BRANCH := 1.21.1 +BROTLI_BRANCH := v1.0.9 +ZLIB_BRANCH := v1.2.11 + +# Project versions (for downloadable tars) +LIBOGG_VERSION := 1.3.4 +LIBVORBIS_VERSION := 1.3.7 +LIBTHEORA_VERSION := 1.2.0alpha1 +LIBPNG_VERSION := 1.6.37 +FT_VERSION := 2.10.4 +BZIP2_VERSION := 1.0.8 +MPG123_VERSION := 1.27.2 +LIBMODPLUG_VERSION := 0.8.8.5 + +# Output AppImage +APPIMAGE_OUTPUT := love-$(LOVE_BRANCH).AppImage + +# No need to change anything beyond this line +override INSTALLPREFIX := $(CURDIR)/installdir + +override CMAKE_PREFIX := $(CURDIR)/cmake +CMAKE := $(CMAKE_PREFIX)/bin/cmake +override CMAKE_OPTS := -DCMAKE_INSTALL_RPATH='$$ORIGIN/../lib' -DCMAKE_INSTALL_PREFIX=$(INSTALLPREFIX) +override CONFIGURE := LDFLAGS="-Wl,-rpath,'\$$\$$ORIGIN/../lib' $(LDFLAGS)" ../configure --prefix=$(INSTALLPREFIX) + +# CMake setup +cmake_install.sh: + curl -Lo cmake_install.sh $(CMAKE_URL) + chmod u+x cmake_install.sh + +$(CMAKE): cmake_install.sh + mkdir cmake + bash cmake_install.sh --prefix=$(CMAKE_PREFIX) --skip-license + touch $(CMAKE) + +# AppImageTool +appimagetool: + curl -Lo appimagetool https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage + chmod u+x appimagetool + +# SDL2 +override SDL2_PATH := SDL2-$(SDL2_BRANCH) + +$(SDL2_PATH)/configure: + git clone --depth 1 -b $(SDL2_BRANCH) https://github.com/libsdl-org/SDL $(SDL2_PATH) + +$(SDL2_PATH)/build/Makefile: $(SDL2_PATH)/configure + mkdir -p $(SDL2_PATH)/build + cd $(SDL2_PATH)/build && $(CONFIGURE) --disable-video-wayland + +installdir/lib/libSDL2.so: $(SDL2_PATH)/build/Makefile + cd $(SDL2_PATH)/build && $(MAKE) install -j$(NUMBER_OF_PROCESSORS) + strip installdir/lib/libSDL2.so + +# libogg +override LIBOGG_FILE := libogg-$(LIBOGG_VERSION) + +$(LIBOGG_FILE).tar.gz: + curl -Lo $(LIBOGG_FILE).tar.gz http://downloads.xiph.org/releases/ogg/$(LIBOGG_FILE).tar.gz + +$(LIBOGG_FILE)/configure: $(LIBOGG_FILE).tar.gz + tar xzf $(LIBOGG_FILE).tar.gz + touch $(LIBOGG_FILE)/configure + +$(LIBOGG_FILE)/build/Makefile: $(LIBOGG_FILE)/configure + mkdir -p $(LIBOGG_FILE)/build + cd $(LIBOGG_FILE)/build && $(CONFIGURE) + +installdir/lib/libogg.so: $(LIBOGG_FILE)/build/Makefile + cd $(LIBOGG_FILE)/build && $(MAKE) install -j$(NUMBER_OF_PROCESSORS) + strip installdir/lib/libogg.so + +# libvorbis +override LIBVORBIS_FILE := libvorbis-$(LIBVORBIS_VERSION) + +$(LIBVORBIS_FILE).tar.gz: + curl -Lo $(LIBVORBIS_FILE).tar.gz http://downloads.xiph.org/releases/vorbis/$(LIBVORBIS_FILE).tar.gz + +$(LIBVORBIS_FILE)/configure: $(LIBVORBIS_FILE).tar.gz + tar xzf $(LIBVORBIS_FILE).tar.gz + touch $(LIBVORBIS_FILE)/configure + +$(LIBVORBIS_FILE)/build/Makefile: $(LIBVORBIS_FILE)/configure installdir/lib/libogg.so + mkdir -p $(LIBVORBIS_FILE)/build + cd $(LIBVORBIS_FILE)/build && $(CONFIGURE) + +installdir/lib/libvorbis.so: $(LIBVORBIS_FILE)/build/Makefile + cd $(LIBVORBIS_FILE)/build && $(MAKE) install -j$(NUMBER_OF_PROCESSORS) + strip installdir/lib/libvorbis.so + strip installdir/lib/libvorbisfile.so + strip installdir/lib/libvorbisenc.so + +# libtheora +override LIBTHEORA_FILE := libtheora-$(LIBTHEORA_VERSION) + +$(LIBTHEORA_FILE).tar.gz: + curl -Lo $(LIBTHEORA_FILE).tar.gz http://downloads.xiph.org/releases/theora/$(LIBTHEORA_FILE).tar.gz + +$(LIBTHEORA_FILE)/configure: $(LIBTHEORA_FILE).tar.gz + tar xzf $(LIBTHEORA_FILE).tar.gz + touch $(LIBTHEORA_FILE)/configure + +$(LIBTHEORA_FILE)/build/Makefile: $(LIBTHEORA_FILE)/configure installdir/lib/libogg.so + mkdir -p $(LIBTHEORA_FILE)/build + cd $(LIBTHEORA_FILE)/build && $(CONFIGURE) --with-ogg=$(INSTALLPREFIX) --with-vorbis=$(INSTALLPREFIX) --disable-examples --disable-encode + +installdir/lib/libtheora.so: $(LIBTHEORA_FILE)/build/Makefile + cd $(LIBTHEORA_FILE)/build && $(MAKE) install -j$(NUMBER_OF_PROCESSORS) + strip installdir/lib/libtheora.so + strip installdir/lib/libtheoradec.so + strip installdir/lib/libtheoraenc.so + +# zlib +override ZLIB_PATH := zlib-$(ZLIB_BRANCH) + +$(ZLIB_PATH)/configure: + git clone --depth 1 -b $(ZLIB_BRANCH) https://github.com/madler/zlib $(ZLIB_PATH) + +$(ZLIB_PATH)/build/Makefile: $(ZLIB_PATH)/configure + mkdir -p $(ZLIB_PATH)/build + cd $(ZLIB_PATH)/build && $(CONFIGURE) + +installdir/lib/libz.so: $(ZLIB_PATH)/build/Makefile + cd $(ZLIB_PATH)/build && make install -j$(NUMBER_OF_PROCESSORS) + strip installdir/lib/libz.so + +# libpng +override LIBPNG_FILE := libpng-$(LIBPNG_VERSION) + +$(LIBPNG_FILE).tar.gz: + curl -Lo $(LIBPNG_FILE).tar.gz http://prdownloads.sourceforge.net/libpng/$(LIBPNG_FILE).tar.gz?download + +$(LIBPNG_FILE)/configure: $(LIBPNG_FILE).tar.gz + tar xzf $(LIBPNG_FILE).tar.gz + touch $(LIBPNG_FILE)/configure + +$(LIBPNG_FILE)/build/Makefile: $(LIBPNG_FILE)/configure installdir/lib/libz.so + mkdir -p $(LIBPNG_FILE)/build + cd $(LIBPNG_FILE)/build && $(CONFIGURE) + +installdir/lib/libpng16.so: $(LIBPNG_FILE)/build/Makefile + cd $(LIBPNG_FILE)/build && $(MAKE) install -j$(NUMBER_OF_PROCESSORS) + strip installdir/lib/libpng16.so + +# Brotli +override BROTLI_PATH := brotli-$(BROTLI_BRANCH) + +$(BROTLI_PATH)/CMakeLists.txt: + git clone --depth 1 -b $(BROTLI_BRANCH) https://github.com/google/brotli $(BROTLI_PATH) + +$(BROTLI_PATH)/build/CMakeCache.txt: $(CMAKE) $(BROTLI_PATH)/CMakeLists.txt + $(CMAKE) -B$(BROTLI_PATH)/build -H$(BROTLI_PATH) $(CMAKE_OPTS) + +installdir/lib/libbrotlidec.so: $(BROTLI_PATH)/build/CMakeCache.txt + $(CMAKE) --build $(BROTLI_PATH)/build --target install -j$(NUMBER_OF_PROCESSORS) + strip installdir/lib/libbrotlicommon.so + strip installdir/lib/libbrotlidec.so + strip installdir/lib/libbrotlienc.so + +# OpenAL-soft +override OPENAL_PATH := openal-soft-$(OPENAL_BRANCH) + +$(OPENAL_PATH)/CMakeLists.txt: + git clone --depth 1 -b $(OPENAL_BRANCH) https://github.com/kcat/openal-soft $(OPENAL_PATH) + +$(OPENAL_PATH)/build/CMakeCache.txt: $(CMAKE) $(OPENAL_PATH)/CMakeLists.txt + $(CMAKE) -B$(OPENAL_PATH)/build -H$(OPENAL_PATH) $(CMAKE_OPTS) -DALSOFT_EXAMPLES=0 -DALSOFT_BACKEND_SNDIO=0 + +installdir/lib/libopenal.so: $(OPENAL_PATH)/build/CMakeCache.txt + $(CMAKE) --build $(OPENAL_PATH)/build --target install -j$(NUMBER_OF_PROCESSORS) + strip installdir/lib/libopenal.so + +# BZip2 +override BZIP2_FILE := bzip2-$(BZIP2_VERSION) + +$(BZIP2_FILE).tar.gz: + curl -Lo $(BZIP2_FILE).tar.gz https://sourceware.org/pub/bzip2/$(BZIP2_FILE).tar.gz + +bzip2makefile.patch: + curl -Lo bzip2makefile.patch https://github.com/MikuAuahDark/test-love-linux-compilation/raw/master/bzip2makefile.patch + +$(BZIP2_FILE)/Makefile.unpatched: $(BZIP2_FILE).tar.gz + tar xzf $(BZIP2_FILE).tar.gz + mv $(BZIP2_FILE)/Makefile $(BZIP2_FILE)/Makefile.unpatched + touch $(BZIP2_FILE)/Makefile.unpatched + +$(BZIP2_FILE)/Makefile: $(BZIP2_FILE)/Makefile.unpatched bzip2makefile.patch + patch -o $(BZIP2_FILE)/Makefile $(BZIP2_FILE)/Makefile.unpatched bzip2makefile.patch + +installdir/bzip2installed.txt: $(BZIP2_FILE)/Makefile + cd $(BZIP2_FILE) && LDFLAGS="-Wl,-rpath,'\$$\$$ORIGIN/../lib'" PREFIX=$(INSTALLPREFIX) make install -j$(NUMBER_OF_PROCESSORS) + touch installdir/bzip2installed.txt + +# FreeType +override FT_FILE := freetype-$(FT_VERSION) + +$(FT_FILE).tar.gz: + curl -Lo $(FT_FILE).tar.gz https://download.savannah.gnu.org/releases/freetype/$(FT_FILE).tar.gz + +$(FT_FILE)/configure: $(FT_FILE).tar.gz + tar xzf $(FT_FILE).tar.gz + touch $(FT_FILE)/configure + +$(FT_FILE)/build/Makefile: $(FT_FILE)/configure installdir/bzip2installed.txt installdir/lib/libpng16.so installdir/lib/libz.so installdir/lib/libbrotlidec.so + mkdir -p $(FT_FILE)/build + cd $(FT_FILE)/build && CFLAGS="-I$(INSTALLPREFIX)/include" LDFLAGS="-Wl,-rpath,'\$$\$$ORIGIN/../lib' -L$(INSTALLPREFIX)/lib -Wl,--no-undefined" PKG_CONFIG_PATH=$(INSTALLPREFIX)/lib/pkgconfig ../configure --prefix=$(INSTALLPREFIX) + +installdir/lib/libfreetype.so: $(FT_FILE)/build/Makefile + cd $(FT_FILE)/build && make install -j$(NUMBER_OF_PROCESSORS) + strip installdir/lib/libfreetype.so + +# Mpg123 +override MPG123_FILE := mpg123-$(MPG123_VERSION) + +$(MPG123_FILE).tar.bz2: + curl -Lo $(MPG123_FILE).tar.bz2 https://www.mpg123.de/download/$(MPG123_FILE).tar.bz2 + +$(MPG123_FILE)/configure: $(MPG123_FILE).tar.bz2 + tar xf $(MPG123_FILE).tar.bz2 + touch $(MPG123_FILE)/configure + +$(MPG123_FILE)/builddir/Makefile: $(MPG123_FILE)/configure + mkdir -p $(MPG123_FILE)/builddir + cd $(MPG123_FILE)/builddir && $(CONFIGURE) + +installdir/lib/libmpg123.so: $(MPG123_FILE)/builddir/Makefile + cd $(MPG123_FILE)/builddir && make install -j$(NUMBER_OF_PROCESSORS) + strip installdir/lib/libmpg123.so + +# libmodplug +override LIBMODPLUG_FILE := libmodplug-$(LIBMODPLUG_VERSION) + +$(LIBMODPLUG_FILE).tar.gz: + curl -Lo $(LIBMODPLUG_FILE).tar.gz http://sourceforge.net/projects/modplug-xmms/files/libmodplug/$(LIBMODPLUG_VERSION)/$(LIBMODPLUG_FILE).tar.gz/download + +$(LIBMODPLUG_FILE)/configure: $(LIBMODPLUG_FILE).tar.gz + tar xzf $(LIBMODPLUG_FILE).tar.gz + touch $(LIBMODPLUG_FILE)/configure + +$(LIBMODPLUG_FILE)/build/Makefile: $(LIBMODPLUG_FILE)/configure + mkdir -p $(LIBMODPLUG_FILE)/build + cd $(LIBMODPLUG_FILE)/build && $(CONFIGURE) + +installdir/lib/libmodplug.so: $(LIBMODPLUG_FILE)/build/Makefile + cd $(LIBMODPLUG_FILE)/build && make install -j$(NUMBER_OF_PROCESSORS) + +# LuaJIT +override LUAJIT_PATH := LuaJIT-$(LUAJIT_BRANCH) + +$(LUAJIT_PATH)/Makefile: + git clone --depth 1 -b $(LUAJIT_BRANCH) https://github.com/LuaJIT/LuaJIT $(LUAJIT_PATH) + +installdir/lib/libluajit-5.1.so: $(LUAJIT_PATH)/Makefile + cd $(LUAJIT_PATH) && LDFLAGS="-Wl,-rpath,'\$$\$$ORIGIN/../lib'" make amalg -j$(NUMBER_OF_PROCESSORS) PREFIX=/usr + cd $(LUAJIT_PATH) && make install PREFIX=$(INSTALLPREFIX) + cd $(LUAJIT_PATH) && make clean + strip installdir/lib/libluajit-5.1.so + strip installdir/bin/luaji* + +# LOVE +override LOVE_PATH := love-$(LOVE_BRANCH) + +$(LOVE_PATH)/CMakeLists.txt: + git clone --depth 1 -b $(LOVE_BRANCH) https://github.com/love2d/love $(LOVE_PATH) + +$(LOVE_PATH)/configure: $(LOVE_PATH)/CMakeLists.txt installdir/lib/libluajit-5.1.so installdir/lib/libmodplug.so installdir/lib/libmpg123.so installdir/lib/libfreetype.so installdir/lib/libopenal.so installdir/lib/libz.so installdir/lib/libtheora.so installdir/lib/libvorbis.so installdir/lib/libogg.so installdir/lib/libSDL2.so + cd $(LOVE_PATH) && bash platform/unix/genmodules + cp $(LOVE_PATH)/platform/unix/configure.ac $(LOVE_PATH) && cp $(LOVE_PATH)/platform/unix/Makefile.am $(LOVE_PATH) + cd $(LOVE_PATH) && autoheader + cd $(LOVE_PATH) && libtoolize --force + cd $(LOVE_PATH) && aclocal -I $(INSTALLPREFIX)/share/aclocal + cd $(LOVE_PATH) && autoconf -I$(INSTALLPREFIX) + cd $(LOVE_PATH) && automake -a + +$(LOVE_PATH)/build/Makefile: $(LOVE_PATH)/configure + mkdir -p $(LOVE_PATH)/build + cd $(LOVE_PATH)/build && CFLAGS="-I$(INSTALLPREFIX)/include" PKG_CONFIG_PATH=$(INSTALLPREFIX)/lib/pkgconfig LDFLAGS="-Wl,-rpath,'\$$\$$ORIGIN/../lib' -L$(INSTALLPREFIX)/lib" ../configure --prefix=$(INSTALLPREFIX) + +installdir/bin/love: $(LOVE_PATH)/build/Makefile + cd $(LOVE_PATH)/build && make install -j$(NUMBER_OF_PROCESSORS) + strip installdir/bin/love + -strip installdir/lib/liblove* + +installdir/AppRun: AppRun.c installdir/bin/love + $(CC) -o installdir/AppRun AppRun.c + strip installdir/AppRun + +installdir/love.desktop: $(LOVE_PATH)/platform/unix/love.desktop.in + cat $(LOVE_PATH)/platform/unix/love.desktop.in | sed 's/@bindir@\///' > installdir/love.desktop + +installdir/love.svg: $(LOVE_PATH)/platform/unix/love.svg + cp $(LOVE_PATH)/platform/unix/love.svg installdir/love.svg + +$(APPIMAGE_OUTPUT): installdir/AppRun installdir/love.desktop installdir/love.svg appimagetool + cp -r installdir installdir2 + -rm -rf installdir2/share/man + -rm -rf installdir2/share/doc + -rm -rf installdir2/share/openal + -rm -rf installdir2/lib/mpg123 + -rm -rf installdir2/lib/cmake + -rm -rf installdir2/lib/pkgconfig + -rm -rf installdir2/lib/*.a + -rm -rf installdir2/lib/*.la + -rm -rf installdir2/lib/*.la + -rm -rf installdir2/include + -rm -rf installdir2/man + -find installdir2/bin -type l -exec rm -rf {} + + -find installdir2/bin ! -name 'luajit*' ! -name 'love' -type f -exec rm -f {} + + -strip installdir2/lib/* + ./appimagetool installdir2 love-master.AppImage + rm -rf installdir2 + +.DEFAULT_GOAL := $(APPIMAGE_OUTPUT) diff --git a/README.md b/README.md new file mode 100644 index 0000000..6e1e2ba --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +love-appimage-source +===== + +Creates LOVE AppImage by compiling every single dependency from source. + +Build +----- + +Run `make`. `love-master.AppImage` (by default) will be generated. See the Makefile script for various tweakable variables. + +License +----- + +Public domain will do, except AppRun.c which is modified based on AppImage's default AppRun.c diff --git a/bzip2makefile.patch b/bzip2makefile.patch new file mode 100644 index 0000000..7b31a5c --- /dev/null +++ b/bzip2makefile.patch @@ -0,0 +1,10 @@ +21d20 +< LDFLAGS= +24c23 +< CFLAGS=-Wall -Winline -O2 -g $(BIGFILES) +--- +> CFLAGS=-fPIC -Wall -Winline -O2 -g $(BIGFILES) +27c26 +< PREFIX=/usr/local +--- +> PREFIX?=/usr/local