From 7094bd1e201cf5ec5790594767374ee9dd6147ec Mon Sep 17 00:00:00 2001 From: darealshinji Date: Mon, 18 Feb 2019 17:18:18 +0100 Subject: [PATCH] Add configure option to enable portable builds on Linux --- Makefile.inc.in | 2 +- configure.ac | 46 ++++++++++++++++++++++++++++++++-------- libaegisub/unix/path.cpp | 40 +++++++++++++++++++++++++++++++++- src/Makefile | 1 + src/aegisublocale.cpp | 3 +++ 5 files changed, 81 insertions(+), 11 deletions(-) diff --git a/Makefile.inc.in b/Makefile.inc.in index 7a994bb8b..3404a13a2 100644 --- a/Makefile.inc.in +++ b/Makefile.inc.in @@ -57,7 +57,7 @@ P_LOCALE = @localedir@ P_APPDATA = @P_APPDATA@ P_DESKTOP = @P_DESKTOP@ P_ICON = @P_ICON@ -P_DATA = $(P_DATAROOT)/aegisub/ +P_DATA = @P_DATA@ ############### # LIBRARY FLAGS diff --git a/configure.ac b/configure.ac index 98542ea11..44a3860d4 100644 --- a/configure.ac +++ b/configure.ac @@ -50,9 +50,10 @@ AC_SUBST(AEGISUB_COMMAND) AC_DEFINE_UNQUOTED([AEGISUB_COMMAND], ["${AEGISUB_COMMAND}"], [Name of the Aegisub executable]) # Name of gettext catalog. -AEGISUB_CATALOG="aegisub" -AC_SUBST(AEGISUB_CATALOG) -AC_DEFINE_UNQUOTED([AEGISUB_CATALOG], ["${AEGISUB_CATALOG}"], [Name of the Aegisub gettext catalog]) +# See '--enable-appimage' +#AEGISUB_CATALOG="aegisub" +#AC_SUBST(AEGISUB_CATALOG) +#AC_DEFINE_UNQUOTED([AEGISUB_CATALOG], ["${AEGISUB_CATALOG}"], [Name of the Aegisub gettext catalog]) # Handle location of appdata files: https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#spec-component-location AC_ARG_WITH(appdata-dir, @@ -566,6 +567,32 @@ AC_SUBST(DEFAULT_PLAYER_AUDIO) # Set some friendly strings if some of the above aren't detected. DEFAULT_PLAYER_AUDIO=${DEFAULT_PLAYER_AUDIO:-NONE} +################ +# AppImage build +################ +# If enabled, localization and automation data is obtained from the binary's +# path and never from the system's root. It will also install files that +# Aegisub will lookup next to the binary, so be careful with "make install". +AC_ARG_ENABLE(appimage, + AS_HELP_STRING([--enable-appimage], + [Enable certain relocation settings useful for building AppImages or generic portable builds [no]])) + +P_DATA="$datarootdir/aegisub" +AEGISUB_CATALOG="aegisub" + +AS_IF([test x$enable_appimage = xyes], [ + AC_DEFINE([APPIMAGE_BUILD], [], [Define to enable AppImage compatible relocations]) + P_DATA="$bindir" + localedir="$bindir/locale" + # use a different catalog name + AEGISUB_CATALOG="aegisub-appimage" +]) + +enable_appimage=${enable_appimage:-no} +AC_SUBST(P_DATA) +AC_SUBST(AEGISUB_CATALOG) +AC_DEFINE_UNQUOTED([AEGISUB_CATALOG], ["${AEGISUB_CATALOG}"], [Name of the Aegisub gettext catalog]) + ############### # Misc settings ############### @@ -614,12 +641,13 @@ AC_MSG_RESULT([ Configure settings Install prefix: $prefix Revision: $BUILD_GIT_VERSION_STRING - Debug $enable_debug - CFLAGS $CFLAGS - CXXFLAGS $CXXFLAGS - CPPFLAGS $CPPFLAGS - LDFLAGS $LDFLAGS - LIBS $LIBS + Debug: $enable_debug + AppImage: $enable_appimage + CFLAGS: $CFLAGS + CXXFLAGS: $CXXFLAGS + CPPFLAGS: $CPPFLAGS + LDFLAGS: $LDFLAGS + LIBS: $LIBS Default Settings Audio Player: $DEFAULT_PLAYER_AUDIO diff --git a/libaegisub/unix/path.cpp b/libaegisub/unix/path.cpp index 0541e0dbe..8fa14cd19 100644 --- a/libaegisub/unix/path.cpp +++ b/libaegisub/unix/path.cpp @@ -22,6 +22,12 @@ #include #include +#ifndef __APPLE__ +#include +#include +#include +#endif + namespace { #ifndef __APPLE__ std::string home_dir() { @@ -35,7 +41,30 @@ std::string home_dir() { throw agi::EnvironmentError("Could not get home directory. Make sure HOME is set."); } + +#ifdef APPIMAGE_BUILD +std::string exe_dir() { + char *exe, *dir; + std::string data = ""; + +#ifdef __FreeBSD__ + exe = realpath("/proc/self/file", NULL); +#else + exe = realpath("/proc/self/exe", NULL); #endif + + if (!exe) return ""; + + if ((dir = dirname(exe)) && strlen(dir) > 0) { + data = dir; + } + + free(exe); + + return data; +} +#endif /* APPIMAGE_BUILD */ +#endif /* !__APPLE__ */ } namespace agi { @@ -44,14 +73,23 @@ void Path::FillPlatformSpecificPaths() { agi::fs::path home = home_dir(); SetToken("?user", home/".aegisub"); SetToken("?local", home/".aegisub"); + +#ifdef APPIMAGE_BUILD + agi::fs::path data = exe_dir(); + if (data == "") data = home/".aegisub"; + SetToken("?data", data); + SetToken("?dictionary", Decode("?data/dictionaries")); +#else SetToken("?data", P_DATA); SetToken("?dictionary", "/usr/share/hunspell"); +#endif + #else agi::fs::path app_support = agi::util::GetApplicationSupportDirectory(); SetToken("?user", app_support/"Aegisub"); SetToken("?local", app_support/"Aegisub"); SetToken("?data", agi::util::GetBundleSharedSupportDirectory()); - SetToken("?dictionary", agi::util::GetBundleSharedSupportDirectory() + "/dictionaries"); + SetToken("?dictionary", Decode("?data/dictionaries")); #endif SetToken("?temp", boost::filesystem::temp_directory_path()); } diff --git a/src/Makefile b/src/Makefile index 38a809c06..6dbe99f52 100644 --- a/src/Makefile +++ b/src/Makefile @@ -202,6 +202,7 @@ $(d)auto4_lua.o_FLAGS := $(CFLAGS_LUA) $(d)auto4_lua_assfile.o_FLAGS := $(CFLAGS_LUA) $(d)auto4_lua_dialog.o_FLAGS := $(CFLAGS_LUA) $(d)auto4_lua_progresssink.o_FLAGS := $(CFLAGS_LUA) +$(d)aegisublocale.o_FLAGS := -DP_LOCALE=\"$(P_LOCALE)\" $(src_OBJ): $(d)libresrc/bitmap.h $(d)libresrc/default_config.h diff --git a/src/aegisublocale.cpp b/src/aegisublocale.cpp index de8df7296..cc5f4e10d 100644 --- a/src/aegisublocale.cpp +++ b/src/aegisublocale.cpp @@ -55,6 +55,9 @@ wxTranslations *AegisubLocale::GetTranslations() { if (!translations) { wxTranslations::Set(translations = new wxTranslations); wxFileTranslationsLoader::AddCatalogLookupPathPrefix(config::path->Decode("?data/locale/").wstring()); +#if !defined(_WIN32) && !defined(__APPLE__) && !defined(APPIMAGE_BUILD) + wxFileTranslationsLoader::AddCatalogLookupPathPrefix(P_LOCALE); +#endif } return translations; }