Emacs 24.3の「ポータブル」バージョンを作りたいのですが。 rootアクセス権がないDebian 7システムを使用しています。 Debian7にはEmacs24がないので、USBサムドライブに入れて持ち運べるポータブルバージョンを作りたいと思います。私の具体的な質問は次のとおりです。
configure --prefix=...
によってハードワイヤードされていますか?.so
-ファイルをバンドルするにはどうすればよいですか?これを行うにはいくつかの方法があります。最初は簡単な方法です。
インストールプレフィックスを柔軟にするのは難しいです-インストールプレフィックスをホームディレクトリ、または任意のマシンでアクセスできる場所に作成して、
_make install DESTDIR=/path/to/place/where/binaries/should/be/installed
_
プレフィックス以外の場所にインストールします。
私は個人的にバイナリを_$HOME/bin
_に持っているので、コマンドは次のようになります。
_./configure --prefix=$HOME
_
一部のプログラム(FFmpegは1つです)は、すべてのライブラリーをプログラムにコンパイルしてビルドでき、共有ライブラリーを回避します。 ffmpegの場合(およびおそらく他の場合)、構成フラグは_--disable-shared --enable-static
_です。
ldd (name-of-binary-file)
を使用して、必要な共有オブジェクトを確認し、それらをフラッシュドライブにコピーできます。
リンクされているライブラリの名前のみを取得する方法を作成しました。これは非常に便利です。
_ldd binary-name|sed 's/=>.*//'|sed 's/\t//'|sed 's/\ (0x.*//'
_
リンクされているすべてのライブラリのリストを取得します。
さらに、これにより、パスがハードコードされているファイルのみが取得されます。
_ldd binary-name|sed 's/=>.*//'|sed 's/\t//'|sed 's/\ (0x.*//'|grep --color=never /
_
通常、ハードコードされたパスを持つライブラリのみの名前にスラッシュが含まれているため、これは機能します。それはあなたに次の可能性をするときにあなたが何を探すべきかについての考えをあなたに与えます。
_LD_PRELOAD
_または_LD_LIBRARY_PATH
_を使用して手動で指定されたライブラリからシンボルをロードできるため、以下で説明する「ハードコードされたパス」の問題を回避できます。
ライブラリにハードコードされたパスがある場合、ランパスを変更できるchrpath
というツールについて聞いたことがあります。バイナリを16進エディタで開き、最初にコンパイルされたものよりも短い限り、共有ライブラリへのパスを変更することに(限定的に)成功しました。バイナリは文字列ターミネータ文字で終わる必要があります。 (Cでは、これはほとんどの場合_00
_です)。パスを変更するのに十分なスペースがあることを確認するために、ライブラリが_/usr/lib
_にある場合、次のように、プリフィックスをシンボリックリンクで途方もなく長いものに(システムでコンパイルする)設定します。
_Sudo mkdir /OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME/
Sudo ln -s /usr/lib /OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME/lib
mkdir destdir
./configure --prefix=/OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME
make
make install DESTDIR=$PWD/DESTDIR
_
(ちなみに、_$PWD
_は現在のディレクトリです。)
それはあなたに道を変えるための十分な余地を与えるでしょう。実際のパスの後にスペースが残っている場合は、通常のスペースの終わりに達するまで_00
_を追加し続けることができます。 ncurses
のパスがバイナリにハードコードされているAndroid電話用にコンパイルしたバイナリを使用して、これに頼るだけで済みました。
最後に見つけたのは、これを追加することで_ld-linux.so.*
_の場所をハードコードしないようにすることができることです(システムの場所に合わせて、_locate ld-linux
_のようなものを実行し、以下のようなものを見つけます。
_-Wl,--dynamic-linker=/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
_
LDFLAGS
変数に。
CentOS 7でEmacs 24のポータブルバージョンを作成することができました。Debianでも同じアプローチが機能するはずです。私が最初にしたことは、OSの新しいコピーを使用して仮想マシンをインストールし、rootがあり、必要なライブラリとツールをインストールできることを確認することでした。
ポータブルインストールを作成する最初の試みでは、仮想マシンにemacs
パッケージをインストールし、バイナリとライブラリをカスタムフォルダーにコピーしてから、LD_LIBRARY_PATH
をライブラリのあるフォルダーに設定しました。これはEmacsをターゲットシステムで起動するのに十分でしたが、残念ながら、Emacsはその構成設定の一部にハードコードされた値を使用しているようで、不足しているcharsetsディレクトリに関する次のエラーの回避策を見つけることができませんでした:
Warning: Arch-dependent data dir (/usr/libexec/emacs/24.3/x86_64-redhat-linux-gnu/) does not exist.
Warning: Arch-independent data dir (/usr/share/emacs/24.3/etc/) does not exist.
Warning: LISP directory `/usr/share/emacs/24.3/LISP' does not exist.
Warning: LISP directory `/usr/share/emacs/24.3/leim' does not exist.
Error: charsets directory not found:
/usr/share/emacs/24.3/etc/charsets
Emacs will not function correctly without the character map files.
Please check your installation!
ターゲットシステムの/usr/share
にリンクまたはフォルダを作成するためのアクセス権がないため、これにより進捗が停止しました。
私の2番目の試みは、Emacsのソースコード(ギガバイト以上!)をVMにダウンロードし、./configure --prefix=<DIR>
コマンドを使用して独自のコピーを作成することでした。 http://ergoemacs.org/emacs/building_emacs_from_git_repository.html 、Debianコマンドを使用しています。私のワークフローは次のとおりです。
git clone https://github.com/mirrors/emacs.git
cd emacs
git pull
./autogen.sh
# Here, I tell make to install emacs to ~/bin/centos
./configure --prefix=~/bin/centos
make bootstrap
make install
CentOS(Sudo yum install texinfo ncurses-devel.x86_64
)に固有のライブラリ依存関係をインストールするには、いくつかの迂回を行う必要がありました。
これで、Emacsの実行に必要なすべてのバイナリとライブラリを含む~/bin/centos
フォルダを他のCentOS 7システムの同じ場所にコピーし、~/bin/centos/bin
をPATH
に追加すると、Emacsを使用できるようになります。設定とテーマを保持するために、.emacs
ファイルと.emacs.d
フォルダーをコピーする必要がありました。これは基本的に、システムのEmacsパッケージをインストールする権限を持っていないシステムのホームディレクトリにある自己完結型のポータブルEmacsインストールです。
configure
コマンドにUSBドライブ上のフォルダー(./configure --prefix=/media/usb/bin
など)を指定し、常に同じ場所にUSBドライブをマウントすると、USBドライブをマウントし、PATH
変数を設定して、Emacsを実行できるはずです。 emacs
自体を呼び出すときにカスタム.emacs
ファイルまたは.emacs.d
フォルダーを指定する方法はないようですが、~/.emacs
から/media/usb/.emacs
などへのシンボリックリンクを使用することもできます。
私はあなたと同じ問題を抱えていました(いくつかの「証券化」されたLinux)。同じLinux OS(すべての/usr/share/emacs
および/usr/libexec
ツリーとすべての/usr/bin/emacs*
ファイル)で、すでにインストールされているバージョンを実行し、セキュリティで保護されたマシンに配置しました。
emacs24-x
を実行した後、共有ライブラリを要求しました(.so
)どれを思い出せません...
私はそれを宛先マシンにも持ち運び、emacs24-x
呼び出しを(関数パラメーター"$@"
を使用して).so
変数にLD_LIBRARY_PATH
位置を追加する関数にカプセル化しました(蓄積を避けるために()
で囲まれています)。
次に、/usr/share
およびlibexec
の場所に関する上記のメッセージを受け取りました。
実行可能ファイル内の/usr/share/emacs
および/usr/libexec
へのすべての参照を、バイナリエディタ(たとえばmadedit
など)を使用して、および数十のASCIIファイルで変更しました。コピーされたツリーで、すべての「/ usr/share」を「/ tmp/share」と/tmp/libexec
に置き換えます。
私の「emacs」関数では、コピーされたemacsツリーに接続するためにmkdir /tmp/share
と2つのシンボリックリンク(テスト後、それらはまだ存在していませんでした)を追加しました。
その後、実行
emacs <myfile>
私にとっては完璧に機能します。私は実際のポータブルEmacsバージョンを持っています(構成していません)。