How do I get `make` to prompt the user for a password and store it in a Makefile variable?

A couple of things:

  • the $ for dereferencing shell variable pwd is being interpreted by make. You can escape it from make with $$
  • make is invoking the shell as Posix compatible /bin/sh instead of /bin/bash. As such, the -s option to read is not supported.

Try this instead:

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

This worked for me on Ubuntu 12.04 / GNU make 3.81 / bash 4.2.25(1)

And on 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
$ 

Update - @user5321531 pointed out that we can use POSIX sh instead of bash, and temporarily suppress echo with stty:

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

To answer @joeb 's question:

$ make; echo "---Makefile---"; cat Makefile
Password: <hidden>
test
test
---Makefile---
all: first second
PASSWORD ?= $(shell read -s -p "Password: " pass; echo $$pass)
define formatted
first:
        @echo $1
second:
        @echo $1
endef

$(eval $(call formatted,$(PASSWORD)))

Tags:

Bash

Makefile