diff --git a/ci/AppImage.sh b/ci/AppImage.sh index da5e41766..1bb067b1e 100644 --- a/ci/AppImage.sh +++ b/ci/AppImage.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright 2019 Adriaan de Groot +# Copyright 2019 Adriaan de Groot # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -56,7 +56,11 @@ # The build process for AppImage proceeds in a directory build-AppImage # that is created in the current directory. # -# TODO: Conda / Python support doesn't work yet. +# The resulting AppImage has XDG_* enabled, and appends the in-image +# directories to the current environment. You can set XDG_* in the +# current environment to use other configurations and data, e.g. the +# data in the current live environment. Or leave it unset, to try +# Calamares with only the configuration contained in the AppImage. # ### END USAGE @@ -207,10 +211,13 @@ mv "$IMAGE_DIR/usr/bin/calamares" "$IMAGE_DIR/usr/bin/calamares.bin" cat > "$IMAGE_DIR/usr/bin/calamares" <<"EOF" #! /bin/sh # -# Calamares proxy-script -export XDG_DATA_DIRS="$APPDIR/usr/share/calamares:" -export XDG_CONFIG_DIRS="$APPDIR/etc/calamares:$D/usr/share:" -export PYTHONPATH=$APPDIR/usr/lib: +# Calamares proxy-script. Runs Calamares with XDG support enabled, +# and in-image XDG dirs set up so that compiled-in configuration can be used. +test -n "${XDG_DATA_DIRS}" && XDG_DATA_DIRS="${XDG_DATA_DIRS}:" +test -n "${XDG_CONFIG_DIRS}" $$ XDG_CONFIG_DIRS="${XDG_CONFIG_DIRS}:" +export XDG_DATA_DIRS="${XDG_DATA_DIRS}${APPDIR}/usr/share/" +export XDG_CONFIG_DIRS="${XDG_CONFIG_DIRS}${APPDIR}/etc/:${APPDIR}/usr/share/" +export PYTHONPATH="${APPDIR}/usr/lib:" cd "$APPDIR" exec "$APPDIR"/usr/bin/calamares.bin -X "$@" EOF diff --git a/src/libcalamares/utils/CalamaresUtils.cpp b/src/libcalamares/utils/CalamaresUtils.cpp index 3ab758522..4a8b1f528 100644 --- a/src/libcalamares/utils/CalamaresUtils.cpp +++ b/src/libcalamares/utils/CalamaresUtils.cpp @@ -99,21 +99,32 @@ setAppDataDir( const QDir& dir ) /* Split $ENV{@p name} on :, append to @p l, making sure each ends in / */ static void -mungeEnvironment( QStringList& l, const char *name ) +mungeEnvironment( QStringList& l, const char* name, const char* defaultDirs ) { - for ( auto s : QString( qgetenv( name ) ).split(':') ) + static const QString calamaresSubdir = QStringLiteral( "calamares/" ); + + QStringList dirs = QString( qgetenv( name ) ).split( ':' ); + if ( dirs.isEmpty() ) + dirs = QString( defaultDirs ).split( ':' ); + + for ( auto s : dirs ) + { + if ( s.isEmpty() ) + continue; if ( s.endsWith( '/' ) ) - l << s; + l << ( s + calamaresSubdir ) << s; else - l << ( s + '/' ); + l << ( s + '/' + calamaresSubdir ) << ( s + '/' ); + } } void setXdgDirs() { - s_haveExtraDirs = true; - mungeEnvironment( s_extraConfigDirs, "XDG_CONFIG_DIRS" ); - mungeEnvironment( s_extraDataDirs, "XDG_DATA_DIRS" ); + mungeEnvironment( s_extraConfigDirs, "XDG_CONFIG_DIRS", "/etc/xdg" ); + mungeEnvironment( s_extraDataDirs, "XDG_DATA_DIRS", "/usr/local/share/:/usr/share/" ); + + s_haveExtraDirs = !( s_extraConfigDirs.isEmpty() && s_extraDataDirs.isEmpty() ); } QStringList