![調試 Open Dylan Debian 構建](https://rvso.com/image/76420/%E8%AA%BF%E8%A9%A6%20Open%20Dylan%20Debian%20%E6%A7%8B%E5%BB%BA.png)
我正在嘗試調試一些非常基本的和未完成的Debian 包裝為了打開迪倫。
我收到錯誤Debian 建置日誌(要點)。
相關位在最後,即:
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 不使用 Automake,儘管他們使用 Autoconf。所以他們有一個手寫的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
這新建日誌(要點) 現在上游 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
之前@
的一些行告訴 make「不要回顯此行」。
您可以編輯並刪除一些@
s 或將它們從 Makefile 中全部刪除:
sed -i -e 's/^\(\t\+)@/\1/ ; s/\(^\t\+\)echo/\1@echo/' Makefile
@Ortomala Lokni 的 make doc 摘錄提出了一個很好的觀點echo
,因此我修改了 sed 腳本以@
在任何echo
命令之前添加一個 back 。
為了處理 Automake,您可能需要更加小心地刪除字符@
,Automake 使用@NAME@
變數將變數替換到輸出 Makefile 中:
也許是這樣的,這樣它就不會改變以 開頭的行\t+@NAME@
:
sed -ire 's/^(\t+)@([^ @]+ )/(\t)\1/ ; s/(^\t+)echo/\1@echo/' Makefile.in
答案2
要完成 cas 答案,您可以閱讀GNU 製作手冊其中說:
通常,make 在執行之前會列印配方的每一行。我們稱之為回顯,因為它看起來像是您自己鍵入的行。
當一行以“@”開頭時,該行的回顯將被抑制。在該行傳遞到 shell 之前,「@」將被丟棄。通常,您可以將其用於唯一效果是列印某些內容的命令,例如用於指示 makefile 進度的 echo 命令:
@echo About to make distribution files
當 make 被賦予標誌「-n」或「--just-print」時,它只會回顯大多數配方,而不執行它們。請參閱選項摘要。在這種情況下,甚至會列印以“@”開頭的配方行。這個標誌對於找出哪些食譜使想法是必要的而不是實際執行它們非常有用。
'-s' 或 '--silent' 標誌可防止所有回顯,就好像所有食譜都以 '@' 開頭。沒有先決條件的特殊目標 .SILENT 的 makefile 中的規則具有相同的效果(請參閱特殊內建目標名稱)。 .SILENT 本質上已過時,因為“@”更靈活。