Add configure option to enable portable builds on Linux

This commit is contained in:
darealshinji 2019-02-18 17:18:18 +01:00 committed by Thomas Goyne
parent 565b7cb86e
commit 7094bd1e20
5 changed files with 81 additions and 11 deletions

View File

@ -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

View File

@ -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

View File

@ -22,6 +22,12 @@
#include <boost/filesystem/operations.hpp>
#include <pwd.h>
#ifndef __APPLE__
#include <fstream>
#include <stdlib.h>
#include <libgen.h>
#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());
}

View File

@ -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

View File

@ -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;
}