Для начала, это упражнение в 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>
Это сводит меня с ума, и я с удовольствием попробую любые предложения и опубликую результаты. Если я просто сижу с этим, не стесняйтесь насмехаться. Вы не можете ранить мои чувства. :)