Как запросить переменную Makefile для конкретной цели, если она не определена? - PullRequest
6 голосов
/ 08 января 2012

Это похоже на другую проблему , но я хочу, чтобы 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, поскольку, очевидно, мне не следует хранить пароли в сценарии конфигурации, а также потому, что эта цель не является частью стандартной процедуры установки.

Ответы [ 2 ]

6 голосов
/ 08 января 2012

Оказывается, проблема заключалась в том, что Make-файлы не используют кавычки в стиле 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 -

Результат:

$ 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"

Этот код:

  • обрабатывает все входные символы как литералы, поэтому он работает с пробелами и обратной косой чертой,
  • позволяет избежать проблем, если пользователь нажимает Ввод , ничего не записывая,
  • использует переменные окружения, если они существуют, и
  • работает независимо от того, пуст или нет crontab.
2 голосов
/ 14 января 2013

Ответ l0b0 помог мне с подобной проблемой, где я хотел выйти, если пользователь не вводит 'y'. Я закончил тем, что сделал это:

@while [ -z "$$CONTINUE" ]; do \
    read -r -p "Type anything but Y or y to exit. [y/N] " CONTINUE; \
done ; \
if [ ! $$CONTINUE == "y" ]; then \
if [ ! $$CONTINUE == "Y" ]; then \
    echo "Exiting." ; exit 1 ; \
fi \
fi

Надеюсь, это кому-нибудь поможет. Трудно найти дополнительную информацию об использовании пользовательского ввода для if / else в make-файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...