私はEmacs 24.3の「ポータブル」バージョンを作りたいです。私はいくつかのDebian 7システムで作業していますが、rootアクセス権がありません。 Debian 7にはEmacs 24がないので、USBサムドライブを使って持ち運べるポータブルバージョンを作りたかったのです。私の具体的な質問は次のとおりです。
- インストールプレフィックスを柔軟に作成できますか、それとも固定的に接続されていますか
configure --prefix=...
? - インストール時に必要なすべてのファイルをどのよう
.so
にバンドルできますか?
答え1
簡単な方法から始めてこれを行ういくつかの方法があります。
インストールプレフィックスを柔軟にするのは難しいです。インストールプレフィックスをホームディレクトリまたはコンピュータからアクセスできる場所に設定し、次を使用します。
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)
必要な共有オブジェクトを確認し、それをフラッシュドライブにコピーできます。
編集1
接続したいライブラリの名前を取得する方法を見つけましたが、これは非常に役立ちます。
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 /
これは通常、ハードコードされたパスを持つライブラリにのみ名前にスラッシュがあるために機能します。次の可能性に進むときに何を見つけるべきかについてのアイデアを提供します。
編集2
手動で指定されたライブラリでシンボルを使用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
通常のスペースの終わりに達するまで追加を続けることができます。これを達成するには、Android携帯用にコンパイルされたバイナリを使用する必要があり、ncurses
携帯電話のパスはバイナリにハードコードされています。
あなたが見つけた最後の事実:これを追加して場所をハードコーディングしないようにすることができますld-linux.so.*
(システムの位置に合わせて調整し、次のコマンドを実行して次のlocate ld-linux
ような場所を見つけます)。
-Wl,--dynamic-linker=/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
あなたの変数にLDFLAGS
。
答え2
私はあなたと同じ問題を抱えました(いくつかの「セキュリティ」がある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
バイナリエディタ(たとえば)を使用し、ツリー内の12個のASCIIファイルをコピーして各「/usr/share」を「/tmp/share」および)に置き換えて、実行可能ファイルのすべての参照を修正しました。/usr/libexec
madedit
/tmp/libexec
mkdir /tmp/share
私の「emacs」機能にコピーされたemacsツリーに接続するために、2つのシンボリックリンク(テスト後にまだ存在しない)を追加しました。
その後実行
emacs <myfile>
私にぴったりです。私はEmacsの実際のポータブルバージョンを持っています(設定しません)。
答え3
CentOS 7でEmacs 24のポータブルバージョンを作成できました。 Debian にも同じアプローチが適用されます。私が最初にしたことは、rootアクセス権があり、必要なライブラリとツールをインストールできることを確認するために、新しいオペレーティングシステムのコピーを含む仮想マシンをインストールすることでした。
ポータブルインストールを作成する最初の試みには、仮想emacs
マシンにパッケージをインストールし、バイナリとライブラリをカスタムフォルダにコピーして、ライブラリを含むLD_LIBRARY_PATH
フォルダを設定することが含まれていました。これはターゲットシステムでEmacsを起動するのに十分ですが、残念ながらEmacsはいくつかの構成設定にハードコードされた値を使用しているように見えます。
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のソースコード(1つ以上のパフォーマンス!)を仮想マシンにダウンロードし、この./configure --prefix=<DIR>
コマンドを使用して自分のコピーを作成することでした。 Emacsを入手して構築する方法についてのガイドラインは、次のとおりです。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
)。
~/bin/centos
これで、私のフォルダ(Emacsを実行するために必要なすべてのバイナリとライブラリが含まれています)を別のCentOS 7システムの同じ場所にコピーしてそれを~/bin/centos/bin
私のフォルダに追加すると、PATH
Emacsが実行されます。設定とテーマを維持するために.emacs
ファイルとフォルダをコピーする必要がありました。.emacs.d
これは、デフォルトでシステムEmacsパッケージをインストールする権限がないシステムのホームディレクトリにあるスタンドアロンポータブルEmacsインストールです。
configure
USBドライブ上のフォルダ(たとえば)と一緒にコマンドを提供し、常にUSBドライブを同じ場所にマウントする場合は、USBドライブをマウントし、変数を設定し./configure --prefix=/media/usb/bin
てEmacsを実行できる必要があります。PATH
独自の呼び出しでカスタムファイルやフォルダを指定する方法はないようですが、.emacs
シンボリックリンクなどを使用できます。.emacs.d
emacs
~/.emacs
/media/usb/.emacs