Вот Makefile, который я использую в настоящее время для создания целей с различными конфигурациями, т. Е. Я создаю различные пакеты программного обеспечения с одной и той же целью, либо сразу, либо индивидуально.Соответствие различным/нескольким частям цели Makefile
.PHONY: build test %.build %.test build-all test-all
%.build %.test: PACKAGE = $*
%.build:
@echo build $(PACKAGE)
%.test:
@echo test $(PACKAGE)
build-all: a.build b.build
test-all: a.test b.test
build: $(PACKAGE).build
test: $(PACKAGE).test
теперь я могу построить все пакеты с make build-all
или отдельными пакетами, например, с make build PACKAGE=a
. Однако я хотел бы, чтобы переключить тело из %.build
и build
и т.д. цели, как в следующем:
.PHONY: build test %.build %.test build-all test-all
build:
@echo build $(PACKAGE)
test:
@echo test $(PACKAGE)
build-all: a.build b.build
test-all: a.test b.test
%.build %.test: PACKAGE = $*
$(PACKAGE).%: $*
Таким образом, соответствие логической модели полностью отделена от «главных» мишеней build
и test
, которые должны содержат фактические команды сборки; делая важные части Makefile более читаемыми. Однако последняя строка не работает должным образом, то есть работает make a.build
, и, таким образом, make build-all
должен запускать цель build
с PACKAGE=a
. Назначение переменной во второй строке работает, сопоставление целей в последней строке не выполняется.
Вопрос: Есть ли способ выразить цель соответствия как $(PACKAGE).%: $*
или померяться отдельные части мишени, как %.%: $2
?
Я понимаю, что это всего лишь пример, но здесь нет ничего, что требовало бы сделать. Если это действительно так, то вы используете неправильный инструмент, просто напишите сценарий оболочки. В первом предложении на странице [make homepage] (https://www.gnu.org/software/make/) «GNU Make - это инструмент, который управляет генерацией исполняемых файлов ** и другими файлами, отличными от исходного программа из исходных файлов программы. ** « – user657267
Я использую этот шаблон для сборки и тестирования исполняемых файлов из кода go, например, вызывая' go build' или 'go install' и' go test' для пакетов в разных subdirs. Я также использую этот шаблон для создания исполняемых файлов внутри изображений докеров и для создания самих изображений докеров. – Juve