Вопрос или проблема
Здесь, в 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, уменьшает дублирование, а также улучшает читаемость и поддерживаемость. Выбор стратегии по созданию зависимостей зависит от вашего конкретного контекста и потребностей, но общая идея заключается в том, чтобы свести к минимуму повторение кода и улучшить поддержку сборки вашего проекта.