Make, кажется, считает необходимым предварительным условием промежуточный файл, удаляет его - PullRequest
3 голосов
/ 20 марта 2009

Для начала, это упражнение в GNU make было общепризнанным: упражнение, а не практичность, поскольку простого сценария bash было бы достаточно. Однако , это вызвало интересное поведение, я не совсем понимаю.

Я написал, казалось бы, простой Makefile для обработки пар ключей SSL / сертификат , необходимых для MySQL . Моя цель состояла в том, чтобы make <name> привел к <name>-key.pem, <name>-cert.pem и любым другим необходимым файлам (в частности, к паре CA, если какой-либо из них отсутствует или нуждается в обновлении, что приводит к другому интересному последующему упражнению в обработке). отмените deps для переиздания любых сертификатов, которые были подписаны отсутствующим / обновленным сертификатом CA).

После выполнения всех правил, как и ожидалось, make, кажется, слишком агрессивен в определении промежуточных файлов для удаления; он удаляет файл, который я считал «безопасным», поскольку он должен был быть сгенерирован как предварительное требование к основному правилу, которое я вызываю. (Смиренно переведенный, я, вероятно, неверно истолковал задокументированное поведение make в соответствии с моими ожиданиями, но не понимаю, как.

Отредактировано (спасибо, Крис !) Добавление %-cert.pem к .PRECIOUS, конечно, предотвращает удаление. (Я использовал неправильный синтаксис.)

Makefile:

OPENSSL = /usr/bin/openssl

<i># Corrected, thanks Chris!
.PHONY: clean</i>

default: ca

clean:
        rm -I *.pem

<b>%: %-key.pem %-cert.pem</b>
        @# Placeholder (to make this implicit create a rule and not cancel one)

Makefile:
        @# Prevent the catch-all from matching Makefile

ca-cert.pem: ca-key.pem
        $(OPENSSL) req -new -x509 -nodes -days 1000 -key ca-key.pem > $@

%-key.pem:
        $(OPENSSL) genrsa 2048 > $@

%-cert.pem: %-csr.pem ca-cert.pem ca-key.pem
        $(OPENSSL) x509 -req -in $ $@

Выход:

<b>$ make host1</b>
/usr/bin/openssl genrsa 2048 > ca-key.pem
/usr/bin/openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
/usr/bin/openssl genrsa 2048 > host1-key.pem
/usr/bin/openssl req -new -days 1000 -nodes -key host1-key.pem > host1-csr.pem
/usr/bin/openssl x509 -req -in host1-csr.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > host1-cert.pem
<b>rm host1-csr.pem host1-cert.pem</b>  

Это сводит меня с ума, и я с удовольствием попробую любые предложения и опубликую результаты. Если я просто сижу с этим, не стесняйтесь насмехаться. Вы не можете ранить мои чувства. :)

Ответы [ 4 ]

3 голосов
/ 17 марта 2010

http://www.gnu.org/software/automake/manual/make/Chained-Rules.html#Chained-Rules

Вы можете предотвратить автоматическое удаление промежуточный файл, пометив его как вторичный файл. Для этого перечислите в качестве предпосылки особого цель. ВТОРИЧНАЯ. Когда файл вторичный, make не создаст файл только потому, что это не уже существует, но не делает автоматически удалить файл. маркировка файл как вторичный также помечает его как промежуточный.

http://www.gnu.org/software/automake/manual/make/Special-Targets.html

Цели, от которых зависит .PRECIOUS, получают следующие специальная обработка: если марка убита или прервано во время исполнения их команды, цель не удален. Смотрите Прерывание или Убийство делать. Кроме того, если целью является промежуточный файл, не будет удален после того, как он больше не нужен, как обычно делается. Смотреть Цепи Неявные правила. В этом последнем отношении это совпадает с .SECONDARY специальная цель.

Вы также можете перечислить целевой шаблон неявного правила (например, `% .o ') в качестве обязательного файла специальная цель. ДРАГОЦЕННЫЙ, чтобы сохранить промежуточные файлы, созданные по правилам чьи целевые шаблоны соответствуют этому имя файла.

2 голосов
/ 20 марта 2009

Первое, что я заметил, это то, что ваша строка:

.PHONY = clean

должно быть:

.PHONY : clean

См .: http://www.gnu.org/software/automake/manual/make/Phony-Targets.html

1 голос
/ 26 мая 2014

Обратите внимание, что шаблонные правила, такие как %: %-key.pem %-cert.pem, являются неявными правилами, которые применяют правило промежуточной очистки.

Для файлов, которые действительно являются целевыми объектами, сделайте их явными, т. Е. Не используйте шаблонные правила.

В вашем случае Makefile должен быть:

OPENSSL = /usr/bin/openssl
# Replace this to match your host files
HOSTS=$(wildcard host*) 

# Corrected, thanks Chris!
.PHONY: clean

default: ca-cert.pem

clean:
        rm -I *.pem

ca-cert.pem: ca-key.pem
        $(OPENSSL) req -new -x509 -nodes -days 1000 -key ca-key.pem > $@

$(addsuffix -key.pem,$(HOSTS)): %-key.pem : $(HOSTS)
        $(OPENSSL) genrsa 2048 > $@

$(addsuffix -cert.pem,$(HOSTS)): %-cert.pem: %-csr.pem ca-cert.pem ca-key.pem
        $(OPENSSL) x509 -req -in $ $@
0 голосов
/ 14 февраля 2012

Попробуйте:

.SECONDARY: $(wildcard *-csr.pem) $(wildcard *-cert.pem)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...