![Open Dylan Debianビルドのデバッグ](https://rvso.com/image/76420/Open%20Dylan%20Debian%E3%83%93%E3%83%AB%E3%83%89%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0.png)
デバッグしようとしているとても基本的な未完成Debian パッケージのためにディランを開く。
エラーが発生していますDebian ビルド ログ (gist)。
関連する部分は最後にあります。
Preparing to install Open Dylan...
Copying sources...
cp: cannot create directory ‘/usr/local/sources’: Permission denied
Makefile:328: recipe for target 'install-stage' failed
これは明らかに342から始まる行に対応しています。 メイクファイル.inすなわち:
# Install stage installs stage 3 into prefix
install-stage:
@echo Preparing to install Open Dylan in $(prefix)...
@install -d $(prefix)
@echo Copying sources to $(prefix)/sources...
@rm -rf $(prefix)/sources
@cp -R $(abs_srcdir)/sources $(prefix)
おそらく最後の行が原因だと思いますが、何が間違っているのか分かりません。
ビルドで実行前にすべての行を一貫してエコーできれば非常に役立ちますが、上記の抜粋でわかるように、必要なときにエコーされませんでした。つまり、そのcp
行ではエコーされませんでした。
注: Open Dylan は Autoconf を使用していますが、Automake は使用していません。そのため、手書きの がありますMakefile.in
。
更新:make -n
およびオーバーライドを追加するdh_auto_build
とdh_auto_install
機能します。つまり:
override_dh_auto_build:
PATH=$(binpath):$$PATH make -n
override_dh_auto_install:
PATH=$(binpath):$$PATH make -n install
の新しいビルドログ(gist) アップストリームの Open Dylan Makefile インストール ターゲットには、次のものが追加されました。
echo Preparing to install Open Dylan...
install -d /usr/local
echo Copying sources...
rm -rf /usr/local/sources
cp -R /usr/local/src/opendylan/opendylan-2014.1/sources /usr/local
find /usr/local/sources -depth -name '.*' -exec rm -rf {} \;
rm -rf /usr/local/sources/bootstrap1-registry
echo Installing Open Dylan in /usr/local
install -d /usr/local/bin /usr/local/databases /usr/local/lib /usr/local/lib/runtime
install -d /usr/local/share/opendylan /usr/local/include/opendylan
cp -R /usr/local/src/opendylan/opendylan-2014.1/Bootstrap.3/bin /usr/local
cp -R /usr/local/src/opendylan/opendylan-2014.1/Bootstrap.3/databases /usr/local
cp -R /usr/local/src/opendylan/opendylan-2014.1/Bootstrap.3/include/opendylan /usr/local/include
# We use force here because on Mac OS X, the lib directory likely contains read-only
# static libraries for the Boehm GC.
cp -Rf /usr/local/src/opendylan/opendylan-2014.1/Bootstrap.3/lib /usr/local
cp -Rf /usr/local/src/opendylan/opendylan-2014.1/Bootstrap.3/share/opendylan /usr/local/share
cp -R /usr/local/src/opendylan/opendylan-2014.1/tools/lldb /usr/local/share/opendylan
cp -R /usr/local/src/opendylan/opendylan-2014.1/tools/bash_completion /usr/local/share/opendylan
cp /usr/local/src/opendylan/opendylan-2014.1/License.txt /usr/local
cp /usr/local/src/opendylan/opendylan-2014.1/packages/unix/README /usr/local
echo Done!
これは明らかに最初からすべて間違っています。何らかの理由で、prefix
ここは ですが/usr/local
、そうあるべきです/debian/tmp/usr
(そうだと思います)。
最初の行Dylan Makefile.in を開くもっている:
prefix = $(DESTDIR)@prefix@
これはちょっと非標準のようです。生成された Makefile では、次のようになります。
prefix = $(DESTDIR)/usr/local
通常、Debian はデフォルトで/usr
を渡すので./configure
、ここで何が起こったのか、またはなぜ (どうやら) 空白になっているのかはわかりませんDESTDIR
。
答え1
@
いくつかの行の前には、「この行をエコーしない」ように指示するものがあります。
次のようにして、 の一部を編集して削除したり@
、 Makefile からすべてを削除したりできます。
sed -i -e 's/^\(\t\+)@/\1/ ; s/\(^\t\+\)echo/\1@echo/' Makefile
@Ortomala Lokni による make doc の抜粋で について良い点が指摘されていたecho
ので、sed スクリプトを変更して、コマンド@
の前に を置きましたecho
。
@
Automake を扱うには、 Automake が@NAME@
出力 Makefile に変数を代入するために使用する文字を削除することにもう少し注意する必要があります。
おそらく、次のようなもので、 で始まる行は変更されません\t+@NAME@
:
sed -ire 's/^(\t+)@([^ @]+ )/(\t)\1/ ; s/(^\t+)echo/\1@echo/' Makefile.in
答え2
CASの回答を完了するには、GNU make マニュアルそれはこう言います:
通常、make は、実行前にレシピの各行を出力します。これは、行を自分で入力しているように見えることから、エコーと呼ばれます。
行が '@' で始まる場合、その行のエコーは抑制されます。'@' は、行がシェルに渡される前に破棄されます。通常、これは、makefile の進行状況を示す echo コマンドなど、何かを印刷するだけのコマンドに使用します。
@echo About to make distribution files
make にフラグ '-n' または '--just-print' が与えられると、ほとんどのレシピは実行されずにエコーされるだけです。オプションの概要を参照してください。この場合、'@' で始まるレシピ行も出力されます。このフラグは、make が実際に実行せずに、どのレシピが必要であると考えるかを調べるのに役立ちます。
make の '-s' または '--silent' フラグは、すべてのレシピが '@' で始まっているかのように、すべてのエコーを防止します。前提条件のない特殊ターゲット .SILENT の makefile 内のルールは同じ効果があります (「特殊組み込みターゲット名」を参照)。 .SILENT は、'@' の方が柔軟性が高いため、基本的に廃止されています。