![Отладка Open Dylan Debian build](https://rvso.com/image/76420/%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0%20Open%20Dylan%20Debian%20build.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 в Makefile.в, а именно:
# 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
Theновый журнал сборки (суть) теперь имеет следующее для основной цели установки 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
Перед @
некоторыми строками написано «не повторять эту строку».
Вы можете отредактировать и удалить некоторые из @
s или убрать их все из Makefile с помощью:
sed -i -e 's/^\(\t\+)@/\1/ ; s/\(^\t\+\)echo/\1@echo/' Makefile
В отрывке из документа make, написанном @Ortomala Lokni, было сделано хорошее замечание по этому поводу echo
, поэтому я изменил скрипт sed, чтобы добавить @
back перед всеми echo
командами.
При работе с Automake вам, вероятно, следует быть немного осторожнее с удалением @
символов, которые Automake использует @NAME@
для подстановки переменных в выходной Makefile:
Может быть, что-то вроде этого, чтобы не менять строки, начинающиеся с \t+@NAME@
:
sed -ire 's/^(\t+)@([^ @]+ )/(\t)\1/ ; s/(^\t+)echo/\1@echo/' Makefile.in
решение2
Чтобы завершить ответ на вопрос, вы можете прочитатьРуководство по GNU makeв котором говорится:
Обычно печатайте каждую строку рецепта перед его выполнением. Мы называем это эхом, потому что это создает видимость того, что вы печатаете строки самостоятельно.
Если строка начинается с '@', эхо этой строки подавляется. '@' отбрасывается до того, как строка передается в оболочку. Обычно это используется для команды, единственным эффектом которой является вывод чего-либо, например, для команды echo, указывающей ход выполнения makefile:
@echo About to make distribution files
Когда make получает флаг '-n' или '--just-print', он только выводит большинство рецептов, не выполняя их. См. Сводку параметров. В этом случае печатаются даже строки рецептов, начинающиеся с '@'. Этот флаг полезен для выяснения того, какие рецепты make считает необходимыми, не выполняя их на самом деле.
Флаг '-s' или '--silent' для make предотвращает все повторы, как если бы все рецепты начинались с '@'. Правило в makefile для специальной цели .SILENT без предварительных условий имеет тот же эффект (см. Специальные встроенные имена целей). .SILENT по сути устарел, поскольку '@' более гибок.