
私はコントロールパネルメーカーが提供するこのツールを使用しています。
手順に沿って手順に従いましたが、サンプルコードをコンパイルしようとすると、if句の「$ basenameを実行できません」ブランチでコンパイルプロセスが中断されました。
私はbashスクリプトのウィザードではないので、私が何を見ているのかわかりません。
#!/bin/bash
# uclibc-toolchain-wrapper
basename=$0
if [ -d $basename ]
then
echo "This can't be a directory."
exit 1;
fi
tool_name=${basename##*/}
if [[ $tool_name =~ "mips-linux-uclibc-gnu" ]]
then
prefix=${basename%-uclibc-*}
postfix=${basename##*mips-linux-uclibc}
$prefix$postfix "-muclibc" $@
else
echo "$basename can't execute."
exit 1;
fi
では、このスクリプトをローリングするにはどうすればよいですか?
ユーザーマニュアルには、ツールチェーンを「インストール」するために環境変数を変更するように指示されています。これには、デフォルトで.bashrcの「PATH」変数に指定されたパスを追加することが含まれます。もちろん、ツールチェーン全体を指定されたフォルダに配置しました。
ソースフォルダに「make」コマンドを入力すると、ツールチェーンが呼び出されるように見えますが、「uclibc-toolchain-wrapperを実行できません」エラーが印刷されると、このスクリプトで実行が停止します。ここで、「uclibc-toolchain-wrapper」はスクリプトのファイル名です。
私はlubuntu 13、ubuntu 22、Debian 5で試してみましたが、すべて同じ結果を得ました。
助けてください!よろしくお願いします!
答え1
スクリプトの先頭で、「このスクリプトが実行される名前(ディレクトリパスを含む)」$basename
と同じに設定します。$0
cc1-mips-linux-uclibc-gnu
このスクリプトの明白な目的は、コンパイラの最初のステップなど、さまざまな名前にリンク/コピーすることです。その名前で実行されたら、コマンドを並べ替えてcc1-mips-linux-gnu -muclibc <script parameters>
実行しようとします。
これにより、ツールチェーンパッケージには、次の名前の複数の実行可能なツールが含まれる可能性があります。
<tool name>-mips-linux-gnu<possible suffix>
このラッパーは次のように接続できます。
<tool name>-mips-linux-uclibc-gnu<possible suffix>
各ツールには、部品を含む長い形式のツール名が許可されています-uclibc-
。
ls -lF
ツールチェーン実行可能ファイルを含むディレクトリで実行している場合は、次のシンボリックリンクが表示されることがあります。
cc1-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
<some tool>-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
<another tool>-mips-linux-uclibc-gnu -> uclibc-toolchain-wrapper
...
また、同じディレクトリまたはツールチェーンパッケージの他の場所には、次の名前の実行可能ファイルがあります。
cc1-mips-linux-gnu
<some tool>-mips-linux-gnu
<another tool>-mips-linux-gnu
...
etc.などは、よく知られているコンパイラ/リンカコンポーネント名または<some tool>
他のツールです。<another tool>
cpp
ld
ただし、実行時に受信される文字通りのエラーメッセージが次のようなmake
場合
uclibc-toolchain-wrapper can't execute
さて、スクリプトは単に実行されていることを検出しますuclibc-toolchain-wrapper
。これは間違っています。スクリプトは、文字列を含むすべての名前で呼び出されると予想しますmips-linux-uclibc-gnu
。これは実際に失敗した場合は「$basenameを実行できません」エラーメッセージを生成するテストです。
ツールチェーンパッケージをUnixファミリーではなくファイルシステム(NTFSなど)に抽出し、そこで実行してみましたか?これらのファイルシステムでは、シンボリックリンクセマンティクスはUnixファミリーファイルシステムとは異なる動作をする可能性があります。これは、スクリプトがスクリプトを実行するために使用されたシンボリックリンクの元の名前を取得できず、代わりにuclibc-toolchain-wrapper
script()の実際の名前を取得する理由を説明できます。この場合の修正方法は、ツールチェーンパッケージを実際のUnixファミリーファイルシステムに再抽出してそこで使用することです。
あるいは、Makefileが実際に名前を使用してスクリプトを呼び出す場合、uclibc-toolchain-wrapper
Makefileは愚かな、または何らかの方法で誤って設定されています。