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

l0b*_*0b0 6 variables makefile

这类似于另一个问题,但我只想make提示一个值,如果我正在运行一个特定的目标并且尚未指定一个必需的变量.

目前的代码:

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

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

Password: read: 1: arg count
@midnight [...] ""
Run Code Online (Sandbox Code Playgroud)

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

l0b*_*0b0 6

事实证明,Makefile不使用Dash/Bash风格的引用,而且 Dash的read内置需要一个变量名,与Bash不同.结果代码:

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 -
Run Code Online (Sandbox Code Playgroud)

结果:

$ 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"
Run Code Online (Sandbox Code Playgroud)

这段代码:

  • 将所有输入字符视为文字,因此它适用于空格和反斜杠,
  • 如果用户在Enter没有写任何东西的情况下按下,
  • 使用环境变量(如果存在),和
  • 适用于crontab是否为空.