Encryption make:encrypt&;解密文件

Encryption make:encrypt&;解密文件,encryption,makefile,dependencies,circular-dependency,Encryption,Makefile,Dependencies,Circular Dependency,我正在创建一个makefile来加密和解密源文件:hello.md。Makefile给出一个循环警告,但没有错误 我想知道在这种特殊情况下,是否有办法解决循环依赖 CIPHER = enc -aes256 PASSWORD = pass:2942f59899a1e35cb30dafacfe9ac087 ENC = hello.md.enc DEC = hello.md enc: $(ENC) dec: $(DEC) %.md.enc: %.md @echo Encrypt $<

我正在创建一个makefile来加密和解密源文件:hello.md。Makefile给出一个循环警告,但没有错误

我想知道在这种特殊情况下,是否有办法解决循环依赖

CIPHER = enc -aes256
PASSWORD = pass:2942f59899a1e35cb30dafacfe9ac087

ENC = hello.md.enc
DEC = hello.md

enc: $(ENC)
dec: $(DEC)

%.md.enc: %.md
    @echo Encrypt $<
    @openssl $(CIPHER) -e -pass $(PASSWORD) -base64 -in $< -out $@

%.md: %.md.enc
    @echo Decrypt $<
    @openssl $(CIPHER) -d -pass $(PASSWORD) -base64 -in $< -out $@
CIPHER=enc-aes256
密码=密码:2942f59899a1e35cb30dafacfe9ac087
ENC=hello.md.ENC
DEC=hello.md
附件:$(附件)
十二月:$(十二月)
%.md.enc:%.md
@回声加密$<
@openssl$(密码)-e-pass$(密码)-base64-in$<-out$@
%.md:%.md.enc
@回声解密$<
@openssl$(密码)-d-pass$(密码)-base64-in$<-out$@
生成enc的输出:

make: Circular hello.md <- hello.md.enc dependency dropped.
Encrypt hello.md
make: Circular hello.md.enc <- hello.md dependency dropped.
Decrypt hello.md.enc

make:Circular hello.md如果两个规则都已定义,则无法删除此循环依赖项消息(您可以将源代码编辑为GNU make以删除它…供本地使用)

您可以使用if语句仅声明一个规则或另一个规则,具体取决于命令行上请求的目标。有很多方法可以做到这一点;其中之一是:

ifeq ($(filter enc,$(MAKECMDGOALS)),enc)
%.md.enc: %.md
        @echo Encrypt $<
        @openssl $(CIPHER) -e -pass $(PASSWORD) -base64 -in $< -out $@
else
%.md: %.md.enc
        @echo Decrypt $<
        @openssl $(CIPHER) -d -pass $(PASSWORD) -base64 -in $< -out $@
endif
ifeq($(过滤器enc,$(MAKECMDGOALS)),enc)
%.md.enc:%.md
@回声加密$<
@openssl$(密码)-e-pass$(密码)-base64-in$<-out$@
其他的
%.md:%.md.enc
@回声解密$<
@openssl$(密码)-d-pass$(密码)-base64-in$<-out$@
恩迪夫

通常,人们会选择一种形式作为更基本的形式——通常是基于您打算分发的形式——并只提供一个规则来派生另一种形式。您不需要反向规则,因为您将以这种方式获得的文件被假定为可用的起点
make
和makefile语言不是为通用脚本而设计或设计的。更直接地说:正如您所阐述的,它本质上是循环的:您需要一个makefile,它定义了如何从B构建a以及如何从a构建B。可能存在可以掩盖固有循环的GNUIMs,但是引进这样的东西会让已经很糟糕的情况变得更糟。嗨,约翰。我想和你一样;然而,我们可能错了。但我相信makefile可以提供解决方案。不管怎样,谢谢你的快速回复。疯狂科学家的解决方案有效。谢谢。正如你提到的很多方法。我很想知道怎么做,你能分享一些其他的方法吗?这不是任何人真正做的事情(我不记得有类似的问题)。所以,据我所知,没有什么方法。但其他方式可能是同一主题的变体;例如,您可以将规则放入单独的文件中,并使用
include
选择要加载的规则,或使用递归
$(MAKE)
调用或类似的方法。它们都有相同的结果:确保在特定的make运行中只有一条规则可见。