继续阅读强制目标 https://www.gnu.org/software/make/manual/html_node/Force-Targets.html,我希望有一个解决方案如下:
如果规则没有先决条件或配方,并且规则的目标是不存在的文件,则 make 会在其规则运行时假设该目标已更新。这意味着依赖于该目标的所有目标将始终运行其配方。
因此,我创建了一个空目标force-rebuild-hash-file:
.
就这样SHA512SUM
当调用此目标或时,文件将始终被重新创建distrib
目标取决于它。
我想总体上已经解决了,如果没有,请随意发表评论。
如果您或我本人发现任何错误,我将更新此答案以反映它们。
为了消除我遇到的一些代码的重复这个答案 https://stackoverflow.com/a/27132934/1997354并应用它。
我改名了SHA512SUMS
to SHA512SUM
,没多大关系,但是我觉得用的比较多。
I found $@
打印目标名称是跟踪正在运行的目标的好方法。例如,如果SHA512SUM
不存在,我们这样安装:
make install PREFIX=./test
我们得到了一个非常好的概述(输出):
echo && echo Target: check && echo
Target: check
if [ -f SHA512SUM ]; then ( echo && sha512sum --check SHA512SUM && ( echo && echo "Ok. You may use 'sudo make install' or '(sudo) make install PREFIX=SomeDir' command now." ) || ( echo && echo "ERROR: Files hash sum mismatch!" && echo && exit 1 ) ) else make --file=Makefile SHA512SUM; fi
make[1]: Entering directory '/home/vlastimil/Development/sh/openssl-encryption'
echo && echo Target: SHA512SUM && echo
Target: SHA512SUM
sha512sum encrypt-file-aes256 decrypt-file-aes256 > SHA512SUM
make[1]: Leaving directory '/home/vlastimil/Development/sh/openssl-encryption'
echo && echo Target: install && echo
Target: install
echo && [ -d ./test ] || mkdir --parents ./test
install --verbose --mode=0755 --target-directory=./test encrypt-file-aes256 decrypt-file-aes256
'encrypt-file-aes256' -> './test/encrypt-file-aes256'
'decrypt-file-aes256' -> './test/decrypt-file-aes256'
当前的生成文件
DESTDIR ?=
PREFIX ?= /usr/local/bin
install_path := $(DESTDIR)$(PREFIX)
encrypt_script := encrypt-file-aes256
decrypt_script := decrypt-file-aes256
distrib_name := openssl-encryption
this_file := $(lastword $(MAKEFILE_LIST))
.PHONY: check install uninstall distrib
# https://stackoverflow.com/a/27132934/1997354
check: $(encrypt_script) $(decrypt_script)
echo && echo Target: $@ && echo
if [ -f SHA512SUM ]; then ( echo && sha512sum --check SHA512SUM && ( echo && echo "Ok. You may use 'sudo make install' or '(sudo) make install PREFIX=SomeDir' command now." ) || ( echo && echo "ERROR: Files hash sum mismatch!" && echo && exit 1 ) ) else $(MAKE) --file=$(this_file) SHA512SUM; fi
install: check
echo && echo Target: $@ && echo
echo && [ -d $(install_path) ] || mkdir --parents $(install_path)
install --verbose --mode=0755 --target-directory=$(install_path) $(encrypt_script) $(decrypt_script)
uninstall:
echo && echo Target: $@ && echo
rm $(install_path)/$(encrypt_script) $(install_path)/$(decrypt_script)
rmdir --ignore-fail-on-non-empty $(install_path)
distrib: SHA512SUM check $(encrypt_script) $(decrypt_script) Makefile
echo && echo Target: $@ && echo
# https://english.stackexchange.com/a/468131/319970
# https://stackoverflow.com/a/52782747/1997354
if [ $$(id --user) -eq 0 ]; then ( echo && echo "Target 'distrib' has to be run as normal user!" && echo && exit 1 ) fi
rm --force $(distrib_name).tar.xz
rm --force $(distrib_name).tar.xz.asc
rm --force --recursive $(distrib_name)
mkdir $(distrib_name)
cp $(encrypt_script) $(decrypt_script) Makefile SHA512SUM $(distrib_name)
wget --quiet --output-document=$(distrib_name)/LICENSE https://git.io/fxByv
wget --quiet --output-document=$(distrib_name)/README https://git.io/fxByJ
chmod 755 $(distrib_name)/$(encrypt_script) $(distrib_name)/$(decrypt_script)
chmod 644 $(distrib_name)/Makefile $(distrib_name)/SHA512SUM $(distrib_name)/LICENSE $(distrib_name)/README
tar --create --file=$(distrib_name).tar $(distrib_name)
xz --format=xz -9 --extreme --check=sha256 $(distrib_name).tar
rm --force --recursive $(distrib_name)
gpg --local-user 7D2E022E39A88ACF3EF6D4498F37AF4CE46008C3 --sign --armor --output $(distrib_name).tar.xz.asc --detach-sig $(distrib_name).tar.xz
# https://www.gnu.org/software/make/manual/html_node/Force-Targets.html
force-rebuild-hash-file:
# real target file
SHA512SUM: force-rebuild-hash-file
echo && echo Target: $@ && echo
sha512sum $(encrypt_script) $(decrypt_script) > SHA512SUM