diff --git a/Makefile.tools b/Makefile.tools
index 1a4e56608..a8bff6df3 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -20,7 +20,7 @@ client_bluetoothctl_SOURCES = client/main.c \
 					client/cs.h client/cs.c
 client_bluetoothctl_LDADD = lib/libbluetooth-internal.la \
 			gdbus/libgdbus-internal.la src/libshared-glib.la \
-			$(GLIB_LIBS) $(DBUS_LIBS) -lreadline
+			$(GLIB_LIBS) $(DBUS_LIBS) $(READLINE_LIBS)
 endif
 
 if ZSH_COMPLETIONS
@@ -389,7 +389,7 @@ tools_meshctl_SOURCES = tools/meshctl.c \
 				tools/mesh-gatt/onoff-model.c
 tools_meshctl_LDADD = gdbus/libgdbus-internal.la src/libshared-glib.la \
 				lib/libbluetooth-internal.la \
-				$(GLIB_LIBS) $(DBUS_LIBS) -ljson-c -lreadline
+				$(GLIB_LIBS) $(DBUS_LIBS) -ljson-c $(READLINE_LIBS)
 endif
 
 bin_PROGRAMS +=  tools/mesh-cfgclient
@@ -406,7 +406,7 @@ tools_mesh_cfgclient_SOURCES = tools/mesh-cfgclient.c \
 				mesh/crypto.h mesh/crypto.c
 
 tools_mesh_cfgclient_LDADD = lib/libbluetooth-internal.la src/libshared-ell.la \
-						$(ell_ldadd) -ljson-c -lreadline
+						$(ell_ldadd) -ljson-c $(READLINE_LIBS)
 
 bin_PROGRAMS +=  tools/mesh-cfgtest
 
@@ -489,7 +489,7 @@ noinst_PROGRAMS += tools/btmgmt tools/obex-client-tool tools/obex-server-tool \
 tools_obex_client_tool_SOURCES = $(gobex_sources) $(btio_sources) \
 						tools/obex-client-tool.c
 tools_obex_client_tool_LDADD = lib/libbluetooth-internal.la \
-			       src/libshared-glib.la $(GLIB_LIBS) -lreadline
+			       src/libshared-glib.la $(GLIB_LIBS) $(READLINE_LIBS)
 
 tools_obex_server_tool_SOURCES = $(gobex_sources) $(btio_sources) \
 						tools/obex-server-tool.c
@@ -500,16 +500,16 @@ tools_bluetooth_player_SOURCES = tools/bluetooth-player.c client/print.c \
 				client/player.c
 tools_bluetooth_player_LDADD = gdbus/libgdbus-internal.la \
 				src/libshared-glib.la \
-				$(GLIB_LIBS) $(DBUS_LIBS) -lreadline
+				$(GLIB_LIBS) $(DBUS_LIBS) $(READLINE_LIBS)
 
 tools_obexctl_SOURCES = tools/obexctl.c
 tools_obexctl_LDADD = gdbus/libgdbus-internal.la src/libshared-glib.la \
-			$(GLIB_LIBS) $(DBUS_LIBS) -lreadline
+			$(GLIB_LIBS) $(DBUS_LIBS) $(READLINE_LIBS)
 
 tools_btmgmt_SOURCES = tools/btmgmt.c src/uuid-helper.c client/display.c \
 			client/mgmt.c
 tools_btmgmt_LDADD = lib/libbluetooth-internal.la src/libshared-glib.la \
-				$(GLIB_LIBS) -lreadline
+				$(GLIB_LIBS) $(READLINE_LIBS)
 if DEPRECATED
 noinst_PROGRAMS += attrib/gatttool
 
@@ -519,7 +519,7 @@ attrib_gatttool_SOURCES = attrib/gatttool.c attrib/att.c attrib/gatt.c \
 				attrib/utils.c src/log.c client/display.c \
 				client/display.h
 attrib_gatttool_LDADD = lib/libbluetooth-internal.la \
-			src/libshared-glib.la $(GLIB_LIBS) -lreadline
+			src/libshared-glib.la $(GLIB_LIBS) $(READLINE_LIBS)
 
 endif
 endif
@@ -575,5 +575,5 @@ client/btpclient/btpclient.$(OBJEXT): src/libshared-ell.la ell/internal
 
 client_btpclient_btpclientctl_SOURCES = client/btpclient/btpclientctl.c client/display.c
 client_btpclient_btpclientctl_LDADD = src/libshared-mainloop.la src/libshared-glib.la \
-				lib/libbluetooth-internal.la -lreadline
+				lib/libbluetooth-internal.la $(READLINE_LIBS)
 endif
diff --git a/configure.ac b/configure.ac
index b011e9b0a..10f1af4af 100644
--- a/configure.ac
+++ b/configure.ac
@@ -340,8 +340,7 @@ AC_ARG_ENABLE(client, AS_HELP_STRING([--disable-client],
 AM_CONDITIONAL(CLIENT, test "${enable_client}" != "no")
 
 if (test "${enable_client}" != "no" || test "${enable_mesh}" = "yes"); then
-        AC_CHECK_HEADERS(readline/readline.h, enable_readline=yes,
-                AC_MSG_ERROR(readline header files are required))
+        PKG_CHECK_MODULES([READLINE], [readline], enable_readline=yes)
 fi
 AM_CONDITIONAL(READLINE, test "${enable_readline}" = "yes")
 
