Как отобразить зависимости, заданные в makefile в виде дерева?

Необходимо установить DEBIAN_FRONTEND = noninteractive . Кажется, я припоминаю, что его было немного сложно найти, поскольку на самом деле это опция для debconf , а не для apt-get . Тем не менее, это упоминается, например, здесь и, конечно же, в руководстве к debconf .

Итак, создайте сценарий, содержащий

#/bin/sh
DEBIAN_FRONTEND=noninteractive apt-get upgrade -q -y 

, и запустите его из cron. И не забудьте также запустить apt-get update .

Конечно, возможно, вам стоит использовать unattended-upgrade или что-то специально разработанное для этого.

Но у меня есть одна машина Debian, использующая этот сценарий, и он работает нормально:

#/bin/sh
apt-get -q -q  update 
if apt-get -s upgrade | grep -q "0 upgraded" ; then
        true
else
        DEBIAN_FRONTEND=noninteractive apt-get -y -q upgrade
fi

Первый apt-get -s предназначен для подавления вывода и бесполезной электронной почты на случай, если нечего обновлять.

Аналогичный вопрос на askubuntu.

19
16.05.2016, 23:17
3 ответа

Я нашел своего рода хак, чтобы хотя бы выводить четко структурированную информацию о том, какая цель зависит от каких предпосылок. Минус в том, что это довольно навязчиво. Другими словами, вам нужно изменить свой make-файл, чтобы обернуть рецепты сборки всех ваших целей в небольшую условную функцию. Выложу краткий пример:

getRecipe = $(if $(DEPENDENCY_GRAPH),@echo Target $@ depends on prerequisites "$^",$(1))


VARIABLE_TARGET_NAME = foobar.txt

all : TopLevelTarget

TopLevelTarget : Target_A Target_D
    $(call getRecipe,\
        @echo Building target $@)

Target_A : Target_B
    $(call getRecipe,\
        @echo Building target $@)

Target_D : Target_C
    $(call getRecipe,\
        @echo Building target $@)

Target_B : $(VARIABLE_TARGET_NAME)
    $(call getRecipe,\
        @echo Building target $@)

Target_C :
    $(call getRecipe,\
        @echo Building target $@)

$(VARIABLE_TARGET_NAME) :
    $(call getRecipe,\
        @echo Building target $@)

В этом примере я использую -свернутую вручную функцию getRecipe, чтобы обернуть рецепт каждой отдельной цели, а затем решить, действительно ли запустить этот рецепт или просто вывести, какая цель создается и от каких предварительных требований она зависит. Последнее происходит, только если переменная DEPENDENCY_GRAPHустановлена ​​(, например. как переменная окружения ). В этом примере рецепт сборки — это не более чем эхо, говорящее о том, что цель строится, но вы, очевидно, можете заменить его командой по вашему выбору.

Если для параметра DEPENDENCY_GRAPHустановлено значение 1, это приводит к выходу:

Target foobar.txt depends on prerequisites ""
Target Target_B depends on prerequisites "foobar.txt"
Target Target_A depends on prerequisites "Target_B"
Target Target_C depends on prerequisites ""
Target Target_D depends on prerequisites "Target_C"
Target TopLevelTarget depends on prerequisites "Target_A Target_D"

, который достаточно просто разобрать, а затем преобразовать в точечный -граф.

Если параметр DEPENDENCY_GRAPHвообще не установлен или установлен на 0, выходным сигналом является:

Building target foobar.txt
Building target Target_B
Building target Target_A
Building target Target_C
Building target Target_D
Building target TopLevelTarget

или, другими словами, вместо этого используется обычный рецепт сборки. Я еще не проверял, надежно ли это работает со сложными рецептами. Одна проблема, с которой я уже столкнулся, заключается в том, что он вообще не работает с многострочными -рецептами.

Например, в последнем рецепте сборки цели, если в дополнение к тому, что цель создается, я на самом деле хотел touchфайл:

$(VARIABLE_TARGET_NAME) :
    $(call getRecipe,\
        @echo Building target $@\
        touch $@)

makeкажется, что часть touch $@— это просто часть эха в предыдущей строке:

Building target foobar.txt touch foobar.txt

Если я оставлю обратную косую черту в предыдущей строке,makeжалуется *** unterminated call to functionзвонит' :отсутствует )'. Stop.Если у кого-нибудь есть идеи, как заставить makeвести себя хорошо, я внимательно слушаю.:)

РЕДАКТИРОВАТЬ :Другая проблема с этим подходом заключается в том, что он будет работать только в том случае, если результаты сборки уже не существуют, поскольку make, очевидно, не выполняет рецепт сборки цели, которую он считает, от -до -. ] Дата.

4
27.01.2020, 19:45

Я использовал ремейк --профиль(дроп -вместо make), он сгенерировал дерево зависимостей в формате callgrind.

Затем gprof2dot может сгенерировать образ целевого дерева.

4
27.01.2020, 19:45

Если вам просто нужно вывести список зависимостей для конкретной цели, вы можете использовать следующую команду:

make -dn MAKE=: you_target | sed -rn "s/^ *Considering target file '(.*)'\.$/\1/p"

MAKE=:для неработающего ребенка делает .

К сожалению, включены Makefiles. Вы можете отфильтровать их , используя следующий сценарий оболочки(list-deps):

#!/bin/sh -e

dbg="`make -dn "$@"`"
all="`echo -n "$dbg" | sed -rn "s/^ *Considering target file '(.+)'\.$/\1/p"`"
mks="`echo -n "$dbg" | sed -rn "s/^ *Reading makefile '([^']+)'.*$/\1/p"`"
echo -n "$all" | grep -vxF "$mks"

Теперь вы можете перечислить все зависимости для цели, используя эту команду:

list-deps MAKE=: your_target

Если вам нужно перечислить только те зависимости, которые необходимо переделать, см. этот ответ .

3
24.03.2020, 08:45

Теги

Похожие вопросы