gpt4 book ai didi

variables - 如果未定义,如何提示特定于目标的 Makefile 变量?

转载 作者:行者123 更新时间:2023-12-04 14:33:11 25 4
gpt4 key购买 nike

这类似于 another issue ,但我只想要 make如果我正在运行特定目标并且未指定强制变量,则提示输入值。

当前代码:

install-crontab: PASSWORD ?= "$(shell read -p "Password: "; echo "$$REPLY")"
install-crontab: $(SCRIPT_PATH)
@echo "@midnight \"$(SCRIPT_PATH)\" [...] \"$(PASSWORD)\""

这只会导致以下输出并且没有提示:

Password: read: 1: arg count
@midnight [...] ""

这里重要的一点是,我只在运行这个目标时才需要询问,并且只有在变量尚未定义时才需要询问。我不能使用 configure脚本,因为显然我不应该在配置脚本中存储密码,并且因为这个目标不是标准安装过程的一部分。

最佳答案

原来问题是 Makefile 不使用 Dash/Bash 风格的引用,而 Dash 的 read与 Bash 不同,built-in 需要一个变量名。结果代码:

install-crontab-delicious: $(DELICIOUS_TARGET_PATH)
@while [ -z "$$DELICIOUS_USER" ]; do \
read -r -p "Delicious user name: " DELICIOUS_USER;\
done && \
while [ -z "$$DELICIOUS_PASSWORD" ]; do \
read -r -p "Delicious password: " DELICIOUS_PASSWORD; \
done && \
while [ -z "$$DELICIOUS_PATH" ]; do \
read -r -p "Delicious backup path: " DELICIOUS_PATH; \
done && \
( \
CRONTAB_NOHEADER=Y crontab -l || true; \
printf '%s' \
'@midnight ' \
'"$(DELICIOUS_TARGET_PATH)" ' \
"\"$$DELICIOUS_USER\" " \
"\"$$DELICIOUS_PASSWORD\" " \
"\"$$DELICIOUS_PATH\""; \
printf '\n') | crontab -

结果:

$ crontab -r; make install-crontab-delicious && crontab -l
Delicious user name: a\b c\d
Delicious password: e f g
Delicious backup path: h\ i
no crontab for <user>
@midnight "/usr/local/bin/export_Delicious" "a\b c\d" "e f g" "h\ i"
$ DELICIOUS_PASSWORD=foo make install-crontab-delicious && crontab -l
Delicious user name: bar
Delicious backup path: baz
@midnight "/usr/local/bin/export_Delicious" "a\b c\d" "e f g" "h\ i"
@midnight "/usr/local/bin/export_Delicious" "bar" "foo" "baz"

这段代码:
  • 将所有输入字符视为文字,因此它适用于空格和反斜杠,
  • 如果用户不写任何东西就按下 Enter 键,可以避免出现问题,
  • 使用环境变量(如果存在),以及
  • 无论 crontab 是否为空都有效。
  • 关于variables - 如果未定义,如何提示特定于目标的 Makefile 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8779487/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com