Как сделать так, чтобы все цели в Makefile зависели от конкретного файла?

Вопрос или проблема

Здесь, в make, я хочу сделать так, чтобы все цели в целом Makefile зависели от конкретного файла. (Тем самым конкретным файлом является Makefile, потому что именно там у меня находятся все мои формулы. Но это не суть.)

Здесь я вижу, что я, как какой-то дурачок, painstakingly добавил это к каждой цели,

$ grep Y Makefile
Y = Makefile
h32540000_zong.csv: $Y; $L | perl -pwle 'BEGIN{$$b=3; $$start=5;};$w; s/@\s+/\n/g;' > $@
h32540000_heng.csv: $Y; $L | perl -pwle \
h32540001_zong.csv: $Y; $L | perl -pwle 'BEGIN{$$start=8;};$w;$(\
h32540001_wall_zong.csv: $Y; $L | perl -wple \
h32540001_heng.csv: $Y; $L | perl -pwle \
h32540001_wall_heng.csv: $Y; $L | perl -pwle \

Существует ли какой-то более умный способ?

Существует ли какая-то

.ALL_TARGETS: Makefile #или,
%: Makefile

и т. д. нотация, которую я мог бы использовать для достижения такого же эффекта?

Или, может быть, просто сделать так, чтобы это работало для всех целей, соответствующих конкретному шаблону?

Я думал использовать нотацию %, но, увы, это перераспределит список команд по созданию каждой цели…

Ответ или решение

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

Подход 1: Использование переменных и специального правила

Вы можете ввести переменную, которая будет содержать имя файла, от которого должны зависеть все цели. Затем вы можете использовать такую конструкцию:

# Определите файл зависимости
Y = Makefile

# Задаем зависимость для всех целей
all: h32540000_zong.csv h32540000_heng.csv h32540001_zong.csv h32540001_wall_zong.csv h32540001_heng.csv h32540001_wall_heng.csv

h32540000_zong.csv h32540000_heng.csv h32540001_zong.csv h32540001_wall_zong.csv h32540001_heng.csv h32540001_wall_heng.csv: $(Y)

# Примеры целей
h32540000_zong.csv: $Y; $(L) | perl -pwle 'BEGIN{$$b=3; $$start=5;};$w; s/@\s+/\n/g;' > $@
h32540000_heng.csv: $Y; $(L) | perl -pwle ...
h32540001_zong.csv: $Y; $(L) | perl -pwle 'BEGIN{$$start=8;};$w;$(...
h32540001_wall_zong.csv: $Y; $(L) | perl -wple ...
h32540001_heng.csv: $Y; $(L) | perl -pwle ...
h32540001_wall_heng.csv: $Y; $(L) | perl -pwle ...

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

Подход 2: Шаблонные правила для обработки множества целей

Если вы хотите сделать зависимость динамически и применить одну логику для множества целей, можно использовать шаблоны:

# Определите файл зависимости
Y = Makefile

# Задаем зависимость для всех целей через шаблон
%: $(Y) 
    @echo "Building $@"
    # Ваши команды для сборки
    $(L) | perl -pwle '...' > $@

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

Подход 3: Использование .PHONY для явных целей

Если ваши цели не производят выходные файлы, вы можете использовать специальный маркер .PHONY:

.PHONY: all clean depend

# Определите файл зависимости
Y = Makefile

depend: all

all: h32540000_zong.csv h32540000_heng.csv h32540001_zong.csv h32540001_wall_zong.csv h32540001_heng.csv h32540001_wall_heng.csv

h32540000_zong.csv h32540000_heng.csv h32540001_zong.csv h32540001_wall_zong.csv h32540001_heng.csv h32540001_wall_heng.csv: $(Y)

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...