这很可能是显而易见的和/或平庸的。但是由于我尝试了数小时却没有成功的方法...
我在Linux Mint 19上。我对Makefiles完全陌生。请问,如果问题不大。
很明显,我只在这个问题上关心distrib
和SHA512SUMS
目标。
随着我大量更改这些脚本的代码,我希望每次运行SHA512SUMS
目标时都重新生成distrib
文件,但是如果我运行{{1 }}目标,当然,这会使check
目标变得无关紧要。
对于Shell脚本编写者来说,此Makefile变得有些复杂。任何帮助将不胜感激。
check
答案 0 :(得分:1)
我希望在Force Targets上读到下面的解决方案:
如果一条规则没有任何先决条件或配方,并且该规则的目标是不存在的文件,则可以想象该规则在运行时就已经更新了该目标。这意味着所有依赖于此目标的目标将始终运行其配方。
因此,我创建了一个空目标force-rebuild-hash-file:
。
因此,在调用此目标或依赖它的SHA512SUM
目标时,将始终重新创建distrib
文件。
我认为这最终将得到解决,如果没有,请随时发表评论。
如果您或我本人发现任何错误,我将更新此答案以反映出来。
要删除重复的代码,我遇到了this answer并应用了它。
我将SHA512SUMS
重命名为SHA512SUM
,这没什么大不了,但是我发现它更常用。
我发现$@
打印目标名称是跟踪正在运行的目标的好方法。例如,如果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
答案 1 :(得分:0)
您还可以将SHA512SUM
声明为order-only prerequisite的支票,而不是distrib
的先决条件,但可以在您的$(MAKE) --always-make SHA512SUM
配方中添加distrib
:
check: $(encrypt_script) $(decrypt_script) | SHA512SUM
...
distrib: check $(encrypt_script) $(decrypt_script) Makefile
$(MAKE) --always-make SHA512SUM
...
答案 2 :(得分:-1)
我认为最好的方法是从check
-target中删除对SHA512SUMS的显式依赖,并在该目标中进行一个(shell)测试,并在尚不存在的情况下显式创建该文件:
check: ...
...
if [ ! -e SHA512SUM ] ; then <create SHA512SUM HERE>; fi
.. do something with SHA512SUM ...