https://github.com/libsemigroups/libsemigroups/pull/969

diff --git a/Makefile.am b/Makefile.am
index 613b204e..f308f1c8 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -8,11 +8,14 @@ AM_CXXFLAGS += -I$(abs_top_srcdir)/third_party/Catch2-3.14.0
 AM_CXXFLAGS += -I$(abs_top_srcdir)/third_party/HPCombi-1.1.2/include
 AM_CXXFLAGS += -I$(abs_top_srcdir)/third_party/HPCombi-1.1.2/third_party
 AM_CXXFLAGS += -I$(abs_top_srcdir)/third_party/rx-ranges/include
-AM_CXXFLAGS += -I$(abs_top_srcdir)/third_party/magic_enum-0.9.7/include
 AM_CXXFLAGS += -std=gnu++17 -O3 -Wall -Wextra
 AM_CXXFLAGS += $(WARNING_CXXFLAGS)
 AM_CXXFLAGS += $(FMT_CFLAGS)
 AM_CXXFLAGS += $(EIGEN3_CFLAGS)
+AM_CXXFLAGS += $(MAGICENUM_CFLAGS)
+if USE_BUNDLED_MAGIC_ENUM
+AM_CXXFLAGS += -I$(abs_top_srcdir)/third_party/magic_enum-0.9.7/include
+endif
 if LIBSEMIGROUPS_HPCOMBI_ENABLED
 AM_CXXFLAGS += $(HPCOMBI_CXXFLAGS)
 endif
@@ -217,6 +220,7 @@ detailinclude_HEADERS += include/libsemigroups/detail/word-iterators.hpp
 catch2includedir = $(includedir)/libsemigroups/Catch2-3.14.0/
 catch2include_HEADERS = third_party/Catch2-3.14.0/catch_amalgamated.hpp
 
+if USE_BUNDLED_MAGIC_ENUM
 magicenumincludedir = $(includedir)/libsemigroups/magic_enum
 magicenuminclude_HEADERS = third_party/magic_enum-0.9.7/include/magic_enum/magic_enum.hpp
 magicenuminclude_HEADERS += third_party/magic_enum-0.9.7/include/magic_enum/magic_enum_all.hpp
@@ -227,6 +231,7 @@ magicenuminclude_HEADERS += third_party/magic_enum-0.9.7/include/magic_enum/magi
 magicenuminclude_HEADERS += third_party/magic_enum-0.9.7/include/magic_enum/magic_enum_iostream.hpp
 magicenuminclude_HEADERS += third_party/magic_enum-0.9.7/include/magic_enum/magic_enum_switch.hpp
 magicenuminclude_HEADERS += third_party/magic_enum-0.9.7/include/magic_enum/magic_enum_utility.hpp
+endif
 
 rxrangesincludedir = $(includedir)/libsemigroups/rx
 rxrangesinclude_HEADERS = third_party/rx-ranges/include/rx/ranges.hpp
diff --git a/configure.ac b/configure.ac
index 737103b5..92d9eba7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -135,6 +135,9 @@ AX_CHECK_FMT()
 # disabled altogether
 AX_CHECK_EIGEN()
 
+# Check for an external magic_enum
+AX_CHECK_MAGIC_ENUM()
+
 dnl Output configured files
 
 dnl compiler builtins
diff --git a/m4/ax_check_magic_enum.m4 b/m4/ax_check_magic_enum.m4
new file mode 100644
index 00000000..b364bb60
--- /dev/null
+++ b/m4/ax_check_magic_enum.m4
@@ -0,0 +1,32 @@
+# handle magic_enum checks
+#
+AC_DEFUN([AX_CHECK_MAGIC_ENUM], [
+  AC_ARG_WITH(
+    [external-magic-enum],
+    [AS_HELP_STRING([--with-external-magic-enum], [use external magic_enum (default: no)])],
+    [],
+    [with_external_magic_enum=no]
+  )
+  AC_MSG_CHECKING([whether to use external magic_enum])
+  AC_MSG_RESULT([$with_external_magic_enum])
+
+  AS_IF([test "x$with_external_magic_enum" = xyes], [
+    # Check if we can use magic_enum from the system. If not, error.
+    # The version constraint is to ensure that the headers relative to
+    # $includedir are magic_enum/foo.hpp. In 0.9.6, the magic_enum/
+    # prefix was not used.
+    m4_ifdef([PKG_CHECK_MODULES], [
+      PKG_CHECK_MODULES(MAGICENUM, [magic_enum >= 0.9.7], [
+        AC_MSG_NOTICE([external magic_enum will be used])
+      ], [
+        AC_MSG_ERROR([external magic_enum not found])
+      ])
+    ], [
+      AC_MSG_ERROR(m4_normalize([
+        cannot use flag --with-external-magic-enum, the libsemigroups configure file
+        was created on a system without m4 macros for pkg-config available...
+      ]))
+    ])
+  ])
+  AM_CONDITIONAL([USE_BUNDLED_MAGIC_ENUM], [test "x$with_external_magic_enum" != xyes])
+])
