【发布时间】:2010-10-14 11:39:06
【问题描述】:
对于初学者来说,GNU make 中的这个练习无疑只是:练习而不是实用性,因为一个简单的 bash 脚本就足够了。 然而,它带来了我不太理解的有趣行为。
我编写了一个看似简单的 Makefile 来处理 SSL 密钥/证书对 as necessary for MySQL 的生成。我的目标是让make <name> 生成<name>-key.pem、<name>-cert.pem 和任何其他必要的文件(特别是CA 对,如果其中任何一个丢失或需要更新,这会导致另一个有趣的后续处理练习反向部门重新颁发已由丢失/更新的 CA 证书签名的任何证书)。
按预期执行所有规则后,make 似乎过于激进地识别要删除的中间文件;它删除了一个我认为是“安全”的文件,因为它应该是作为我正在调用的主要规则的先决条件生成的。 (谦虚地翻译,我可能误解了 make 的 documented behavior 以符合我的期望,但不明白如何。;-)
已编辑(感谢Chris!) 将%-cert.pem 添加到.PRECIOUS 当然可以防止删除。 (我一直使用错误的语法。)
生成文件:
OPENSSL = /usr/bin/openssl
# 已更正,谢谢 Chris!
.PHONY:干净
默认值:ca
干净的:
rm -I *.pem
%: %-key.pem %-cert.pem
@# 占位符(使这个隐式创建一个规则而不是取消一个)
生成文件:
@# 防止 catch-all 匹配 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 $$@
输出:
$ 制作主机1 /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 rm host1-csr.pem host1-cert.pem
这让我发疯了,我很乐意尝试任何建议并发布结果。如果我只是对这个完全不感兴趣,请随意嘲笑。你不可能伤害我的感情。 :)
【问题讨论】:
-
+1 因为这是 GNU make 中一个有趣的利基市场,但没有得到很好的探索......