diff --git a/configure.ac b/configure.ac
index a5e346ff56330da020eec12df6b686b0efbbc92c..a8a66c27c04025f3c14160a8a1c340ab15cf3e2b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -962,7 +962,8 @@ fi
 TargetHasLibm=$HaveLibM
 AC_SUBST(TargetHasLibm)
 
-FP_BFD_SUPPORT
+FP_BFD_FLAG
+AC_SUBST([UseLibbfd])
 
 dnl ################################################################
 dnl Check for libraries
diff --git a/m4/fp_bfd_support.m4 b/m4/fp_bfd_support.m4
index 2f357820f7b62ce5d1b07737635417d774b2ce51..fcc1dcca9ecdf70b8dd2e4921bf50f4e5c6ba971 100644
--- a/m4/fp_bfd_support.m4
+++ b/m4/fp_bfd_support.m4
@@ -1,49 +1,59 @@
 # FP_BFD_SUPPORT()
 # ----------------------
-# whether to use libbfd for debugging RTS
-AC_DEFUN([FP_BFD_SUPPORT], [
-    HaveLibbfd=NO
-    AC_ARG_ENABLE(bfd-debug,
-        [AS_HELP_STRING([--enable-bfd-debug],
-              [Enable symbol resolution for -debug rts ('+RTS -Di') via binutils' libbfd [default=no]])],
-        [
-            # don't pollute general LIBS environment
-            save_LIBS="$LIBS"
-            AC_CHECK_HEADERS([bfd.h])
-            dnl ** check whether this machine has BFD and libiberty installed (used for debugging)
-            dnl    the order of these tests matters: bfd needs libiberty
-            AC_CHECK_LIB(iberty, xmalloc)
-            dnl 'bfd_init' is a rare non-macro in libbfd
-            AC_CHECK_LIB(bfd,    bfd_init)
+# Whether to use libbfd for debugging RTS
+#
+# Sets:
+#   UseLibbfd: [YES|NO]
+AC_DEFUN([FP_BFD_FLAG], [
+  UseLibbfd=NO
+  AC_ARG_ENABLE(bfd-debug,
+    [AS_HELP_STRING([--enable-bfd-debug],
+          [Enable symbol resolution for -debug rts ('+RTS -Di') via binutils' libbfd [default=no]])],
+    [UseLibbfd=YES],
+    [UseLibbfd=NO])
+])
+
+# FP_WHEN_ENABLED_BFD
+# ----------------------
+# Checks for libraries in the default way, which will define various
+# `HAVE_*` macros.
+AC_DEFUN([FP_WHEN_ENABLED_BFD], [
+  # don't pollute general LIBS environment
+  save_LIBS="$LIBS"
+  AC_CHECK_HEADERS([bfd.h])
+  dnl ** check whether this machine has BFD and libiberty installed (used for debugging)
+  dnl    the order of these tests matters: bfd needs libiberty
+  AC_CHECK_LIB(iberty, xmalloc)
+  dnl 'bfd_init' is a rare non-macro in libbfd
+  AC_CHECK_LIB(bfd,    bfd_init)
 
-            AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <bfd.h>]],
-                        [[
-                                /* mimic our rts/Printer.c */
-                                bfd* abfd;
-                                const char * name;
-                                char **matching;
+  AC_LINK_IFELSE(
+    [AC_LANG_PROGRAM(
+      [[#include <bfd.h>]],
+      [[
+        /* mimic our rts/Printer.c */
+        bfd* abfd;
+        const char * name;
+        char **matching;
 
-                                name = "some.executable";
-                                bfd_init();
-                                abfd = bfd_openr(name, "default");
-                                bfd_check_format_matches (abfd, bfd_object, &matching);
-                                {
-                                    long storage_needed;
-                                    storage_needed = bfd_get_symtab_upper_bound (abfd);
-                                }
-                                {
-                                    asymbol **symbol_table;
-                                    long number_of_symbols;
-                                    symbol_info info;
+        name = "some.executable";
+        bfd_init();
+        abfd = bfd_openr(name, "default");
+        bfd_check_format_matches (abfd, bfd_object, &matching);
+        {
+            long storage_needed;
+            storage_needed = bfd_get_symtab_upper_bound (abfd);
+        }
+        {
+            asymbol **symbol_table;
+            long number_of_symbols;
+            symbol_info info;
 
-                                    number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
-                                    bfd_get_symbol_info(abfd,symbol_table[0],&info);
-                                }
-                        ]])],
-                        HaveLibbfd=YES,dnl bfd seems to work
-                        [AC_MSG_ERROR([can't use 'bfd' library])])
-            LIBS="$save_LIBS"
-        ]
-    )
-    AC_SUBST([UseLibbfd],[$HaveLibbfd])
+            number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table);
+            bfd_get_symbol_info(abfd,symbol_table[0],&info);
+        }
+      ]])],
+    [], dnl bfd seems to work
+    [AC_MSG_ERROR([can't use 'bfd' library])])
+  LIBS="$save_LIBS"
 ])
diff --git a/rts/configure.ac b/rts/configure.ac
index 4983685a93f657c01af080b8b8d2b04d307b3ce7..1fbd2164070eea73dbc8027aad363ab8f4912a2a 100644
--- a/rts/configure.ac
+++ b/rts/configure.ac
@@ -33,6 +33,8 @@ GHC_CONVERT_PLATFORM_PARTS([host], [Host])
 FPTOOLS_SET_PLATFORM_VARS([host], [Host])
 FPTOOLS_SET_HASKELL_PLATFORM_VARS([Host])
 
+AS_IF([test "$CABAL_FLAG_libbfd" = 1], [FP_WHEN_ENABLED_BFD])
+
 dnl ################################################################
 dnl Check for libraries
 dnl ################################################################