Najprostszym sposobem na zainstalowanie bibliotek obsługi systemu Emacs Windows

15

Zainstalowałem pliki binarne Emacsa 24.4 dla Windows i chcę zainstalować biblioteki obsługi opisane w README Emacsa dla Windows . Najnowsze wstępnie skompilowane biblioteki są dostępne w projekcie ezwinports , ale ich instalacja zajmuje trochę czasu. Muszę wybrać wszystkie biblioteki wymienione w README Emacsa, zeskanować plik README ezwinports pod kątem dalszych wymagań wstępnych i pobrać wszystkie archiwa zip. Następnie rozpakuj je, przenieś do stałej lokalizacji i dodaj poszczególne katalogi do mojej PATHzmiennej. W tych archiwach znajdują się duplikaty plików, więc uważam, aby rozpakować je wszystkie do tego samego katalogu bez sprawdzania, czy są one identyczne.

Czy istnieje zautomatyzowany sposób to zrobić?

Michael Hoffman
źródło
O ile mogę stwierdzić, pliki binarne zawierają wszystkie wymagania wstępne, więc nawet jeśli są one wymienione w pliku Readme, nie musisz zawracać sobie głowy ich osobnym pobieraniem. Dlatego masz duplikaty plików w różnych pakietach.
Alan Trzeciego

Odpowiedzi:

10

Począwszy od Emacsa 25, katalog pobierania Emacsa dla systemu Windows zawiera teraz depspakiet, który zawiera wszystkie zależności dla konkretnej architektury. Na przykład dla x86_64 użyj emacs-25-x86_64-deps.zip.

Używam następującego skryptu, aby automatycznie zainstalować Emacsa. Powinien działać dla WSL lub Cygwin. Musi być uruchamiany z elewacją, a już Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSignedw pewnym momencie miał już działać w PowerShell.

#!/usr/bin/env bash

set -o nounset -o pipefail -o errexit

emacs_major=26
emacs_minor=1
emacs_ver="$emacs_major.$emacs_minor"
arch="x86_64"
emacs_url_root="https://ftpmirror.gnu.org/emacs/windows/emacs-$emacs_major"

emacs_deps_zip="emacs-$emacs_major-$arch-deps.zip"
emacs_zip="emacs-$emacs_ver-$arch.zip"

if [[ "$(uname -r)" == *Microsoft ]]; then
    programfiles="$(bin/wslpath "%ProgramFiles%")"
    programfilesx86="$(bin/wslpath "%ProgramFiles(x86)%")"
    allusersprofile="$(bin/wslpath "%AllUsersProfile%")"
    public_desktop="$(bin/wslpath "%Public%\\Desktop")"
    desktop="$(bin/wslpath "%UserProfile%\\Desktop")"
else
    CSIDL_PROGRAM_FILES=38
    CSIDL_PROGRAM_FILESX86=42
    CSIDL_COMMON_APPDATA=35
    CSIDL_COMMON_DESKTOPDIRECTORY=25
    CSIDL_DESKTOP=0

    programfiles="$(cygpath -F "$CSIDL_PROGRAM_FILES")"
    programfilesx86="$(cygpath -F "$CSIDL_PROGRAM_FILESX86")"
    allusersprofile="$(cygpath -F "$CSIDL_COMMON_APPDATA")"
    public_desktop="$(cygpath -F "$CSIDL_COMMON_DESKTOPDIRECTORY")"
    desktop="$(cygpath -F "$CSIDL_DESKTOP")"
fi

emacs_root="$programfiles/Emacs"

old_tmpdir="${TMPDIR:-}"
TMPDIR="$(mktemp -dt install-windows-pkgs.XXXXXXXXXX)"
export TMPDIR

on_exit () {
    rm -rf "$TMPDIR"
}

trap on_exit EXIT

unzip_dest () {
    local zip="$1"
    local dest="$2"

    if [[ ! -d "$dest" ]]; then
        if ! mkdir -p "$dest"; then
            result="$?"
            echo "Can't create '$dest'. Try running under elevation" >&2
            exit "$result"
        fi

        unzip -n "$zip" -d "$dest"
    fi
}

install_emacs_pkg () {
    local zip="$1"
    local dest="$2"

    # XXX: move to tmp
    if [[ ! -d "$dest" ]]; then
        wget --directory-prefix "$TMPDIR" "$emacs_url_root/$zip"
        unzip_dest "$TMPDIR/$zip" "$dest"
    fi
}

on_exit
trap EXIT
TMPDIR="$old_tmpdir"

# XXX: Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
# XXX: sticking cmd.exe /c start before this causes all nature of space-quoting problems
powershell.exe windows\\add_path.ps1 "%ProgramFiles%\\Emacs\\emacs-$emacs_ver\\bin" "%ProgramFiles%\\Emacs\\emacs-$emacs_major-deps\\bin"

# XXX: would be nice to pin runemacs.exe to taskbar, but the need to edit
# that is probably best seen as Emacs bug/flaw
Michael Hoffman
źródło
5

To nie jest w pełni zautomatyzowane rozwiązanie, ale jest na tym etapie. O ile mogę stwierdzić, obecny zestaw bibliotek pomocniczych i ich wymagania wstępne to:

  • libpng-1.6.12
  • Cairo-1.12.16
  • gdk-pixbuf-2.30.2
  • giflib-5.1.0
  • glib-2.38.2
  • gnutls-3.0.9
  • jpeg-v9a
  • libcroco-0.6.8
  • libffi-3.0.13
  • librsvg-2.40.1-2
  • libxml2-2.7.8
  • lzo-2.06
  • pango-1.36.1-2
  • pixman-0.32.4
  • tiff-4.0.3
  • zlib-1.2.8-2

Pobierz je wszystkie z obszaru plików ezwinports do katalogu pomostowego. Następnie użyj unp, aby rozpakować każdy z nich do własnych katalogów. Użyj renamepolecenia w Cygwin, aby wyeliminować wszelkie -w32-binprzyrostki.

rename -- -w32-bin "" *-w32-bin

Użyj polecenia takiego jak poniżej, aby uzyskać listę katalogów, które musisz dodać do PATH:

command ls -1 | perl -pe 's/^/C:\\Program Files (x86)\\/; s/\n/\\bin;/'

Następnie możesz przenieść je wszystkie w takie miejsce C:\Program Files (x86).

Michael Hoffman
źródło
2
Ponieważ biblioteki wsparcia prawdopodobnie się zmienią, niechętnie spędzam dużo czasu próbując oczyścić lub zautomatyzować całą sprawę. Rozpakowanie i zmiana nazwy nie są tak naprawdę konieczne, ponieważ możesz po prostu unzipprzenieść te pliki do żądanej lokalizacji. Ale miałem je w pobliżu, więc łatwiej było z nich korzystać.
Michael Hoffman
4

Wiem, że to stare pytanie, ale jeśli ktoś natknie się na to: spróbuj emacsbinw64 lub emacsbin . Zawierają wszystkie wymagane biblioteki dll i nie trzeba ręcznie rozwiązywać zależności.

itmuckel
źródło
Zauważ, że wygląda na to, że przestał być aktualizowany.
NetMage