소스 검색

Please test

Miku AuahDark 4 년 전
커밋
ac0d8f6920
4개의 변경된 파일585개의 추가작업 그리고 0개의 파일을 삭제
  1. 236 0
      AppRun.c
  2. 325 0
      Makefile
  3. 14 0
      README.md
  4. 10 0
      bzip2makefile.patch

+ 236 - 0
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 <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <libgen.h>
+#include <dirent.h>
+#include <string.h>
+#include <errno.h>
+
+#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;
+}

+ 325 - 0
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)

+ 14 - 0
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

+ 10 - 0
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