Как сделать GNU только выходными зависимостями?

Я работаю над проектом на ассемблере, используя GNU bintools 2.25, созданный для m68k-elf, а GNU make 3.81 обрабатывает сборку. (Поскольку это проект только для сборки, у меня нет сборки gcc для m68k.)

При доработке моей системы сборки я хотел бы иметь возможность автоматически генерировать список зависимостей для каждого из моих файлов сборки, аналогично семейству параметров -M* для gcc.

Я обнаружил, что моя копия m68k-elf-as поддерживает параметр -MD для перечисления зависимостей, поэтому я добавил следующее правило в свой Makefile:

%.d: %.asm
    $(AS) --register-prefix-optional -m68000 -MD $@ $(ASFLAGS) $<

Хотя это в основном работает, у меня есть две конкретные проблемы.

  1. Опция -MD требует имени файла для записи зависимостей; Я бы хотел, чтобы это было отправлено в STDOUT, чтобы я мог помассировать его с помощью sed до того, как make взглянет на него. Я пытался дать ему один тире (-), но он создает файл с таким именем вместо направления в STDOUT.

  2. Даже при включенной опции -MD as пытается собрать исходный код, что может привести к ошибке и остановке всего процесса сборки. Я бы ожидал, что он будет выводить зависимости вместо сборки кода, а не выполнять оба действия.

Хотя сейчас это не более чем неприятности, я вижу, что это значительно влияет на мои сборки по мере роста проекта, особенно последнего. Есть ли способ заставить as выводить зависимости, не пытаясь собрать код?


person DarkMorford    schedule 20.03.2015    source источник
comment
У меня нет для вас ответов, кроме взлома кода. Но я укажу, что создание зависимостей без сборки кода отражает устаревшую модель управления предварительными условиями. Модель, описанная в руководстве GNU make, во многих отношениях неоптимальна. Проверьте make.mad-scientist.net/papers/ для лучшей модели. Это не решит вашу проблему вывода на стандартный вывод, но решит ваши выходные данные только без сборки. Первое может быть решено с помощью sed -i возможно.   -  person MadScientist    schedule 21.03.2015


Ответы (1)


В документации по параметру -MD говорится, что "'as' может генерировать файл зависимостей для файла, который он создает" (выделение добавлено), что говорит мне, что он не будет определять зависимости без сборки. Я не очень хорошо разбираюсь в ассемблере, но это стандартная модель цепочки инструментов GNU, которая обслуживает также такие языки, как C, в которых невозможно определить исходные зависимости без выполнения хотя бы полной предварительной обработки исходного кода.

На практике этот режим отлично работает, если вы используете его по назначению, обновляя зависимости только в процессе сборки проекта. Вам не нужно обновлять зависимости вне этого контекста, потому что, если вы обновите свой источник, чтобы добавить новую зависимость, это в любом случае создаст необходимость перестроить этот источник, несмотря на его возраст относительно новой зависимости. Предположим, что Makefile обновляется измененной информацией о зависимостях в результате следующей сборки, будущие сборки будут соответствующим образом реагировать на изменения в новой зависимости.

Что касается массирования вывода зависимостей, запись его в файл означает только то, что вы не можете передать его в sed, а не то, что вы не можете обработать его с помощью sed.

person John Bollinger    schedule 20.03.2015