我正在尝试调试一些非常基本的和未完成的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 本质上已过时,因为“@”更灵活。