Как мне заставить `make` запрашивать у пользователя пароль и хранить его в переменной Makefile?

Я пишу Makefile, и некоторые из команд, которые запускают makefile, требуют пароля. Я хотел бы предоставить пользователю возможность передать это как переменную Makefile с помощью make PASSWORD=password или если пользователь не передает ее, а затем запросит у пользователя ее и сохранит ответ в указанной переменной Makefile.

В настоящий момент я могу проверить переменную Makefile, а затем, как часть моих целевых правил, написать команды оболочки, которые запрашивают пароль пользователя и сохраняют его в переменной оболочки. Однако эта переменная доступна только для этой конкретной оболочки, а не для других.

Как я могу что-то прочитать у пользователя и сохранить его в переменной?

Я пробовал следующее:

PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $pwd)

но подсказка никогда не печатается. Я также пробовал echo "Password: " внутри оболочки, но это тоже не печатается.

Любые идеи?

Edit:

Чтобы уточнить, пароль должен быть установлен для конкретной цели, поэтому у меня есть что-то вроде этого:

PASSWORD := 

my-target: PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $$pwd)

my-target:
    # rules for mytarget that use $(PASSWORD)

Изменить 2:

Я нашел проблему. Когда я устанавливаю PASSWORD := в верхней части script, он устанавливает PASSWORD в пустую строку, а это, в свою очередь, заставляет ?= пропускаться (поскольку PASSWORD) уже установлен.

Ответ 1

Пара вещей:

  • переменная $ для разыменования оболочки pwd интерпретируется командой make. Вы можете избежать этого с помощью $$
  • make вызывает оболочку как Posix-совместимый /bin/sh вместо /bin/bash. Таким образом, опция -s для read не поддерживается.

Попробуйте это вместо:

PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd')

Это работало для меня на Ubuntu 12.04/GNU make 3.81/bash 4.2.25 (1)

А на OSX 10.8.5/make 3.81/bash 3.2.48 (1):

$ cat Makefile 
PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd')

all:
    echo The password is $(PASSWORD)
$ make
Password: echo The password is 1234
The password is 1234
$ 

Обновление - @user5321531 указало, что мы можем использовать POSIX sh вместо bash и временно подавить эхо с помощью stty:

PASSWORD ?= $(shell stty -echo; read -p "Password: " pwd; stty echo; echo $$pwd)