diff --git a/CMakeLists.txt b/CMakeLists.txt
index 41675d28c04a9d756325d28b62455dc26667e9c6..bb84ea9d2ec7de54adba103572ba210ee321ffbc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,7 +26,7 @@ option(ARBDEV_COLOR "Always produce ANSI-colored output (GNU/Clang only)." OFF)
 # Configure-time build options for Arbor:
 #----------------------------------------------------------
 
-# Specify target archiecture.
+# Specify target architecture.
 
 set(ARB_ARCH "native" CACHE STRING "Target architecture for arbor libraries")
 
@@ -394,7 +394,16 @@ endif()
 # Build modcc flags
 #------------------------------------------------
 
-set(modcc $<TARGET_FILE:modcc>)
+if(ARB_MODCC)
+    find_program(modcc NAMES ${ARB_MODCC} NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH REQUIRED)
+    if(NOT modcc)
+        message(FATAL_ERROR "Unable to find modcc executable.")
+    endif()
+    set(ARB_WITH_EXTERNAL_MODCC TRUE)
+else()
+    set(modcc $<TARGET_FILE:modcc>)
+    set(ARB_WITH_EXTERNAL_MODCC FALSE)
+endif()
 set(ARB_MODCC_FLAGS)
 if(ARB_VECTORIZE)
     list(APPEND ARB_MODCC_FLAGS "--simd")
diff --git a/modcc/CMakeLists.txt b/modcc/CMakeLists.txt
index 59134b29cb08913a777f6c0f1583ebdc778f6b3a..b5a4982f0762e445b5c92c70cf4ec820995d6fb4 100644
--- a/modcc/CMakeLists.txt
+++ b/modcc/CMakeLists.txt
@@ -1,4 +1,4 @@
-# The modcc compiler is split into a staric library and driver;
+# The modcc compiler is split into a static library and driver;
 # unit tests for the driver also use this library.
 
 set(libmodcc_sources
@@ -54,27 +54,28 @@ set_target_properties(libmodcc PROPERTIES OUTPUT_NAME modcc)
 
 export_visibility(libmodcc)
 
+if (NOT ARB_WITH_EXTERNAL_MODCC)
+    add_executable(modcc ${modcc_sources})
 
-add_executable(modcc ${modcc_sources})
+    if (ARB_USE_BUNDLED_FMT)
+        target_include_directories(modcc
+            PUBLIC
+                $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+                $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
+            PRIVATE
+                $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../ext/fmt/include>)
 
-if (ARB_USE_BUNDLED_FMT)
-    target_include_directories(modcc
-        PUBLIC
-            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
-            $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
-        PRIVATE
-            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../ext/fmt/include>)
+        target_compile_definitions(modcc PRIVATE FMT_HEADER_ONLY)
+    else()
+        target_include_directories(modcc
+            PUBLIC
+                $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
+                $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>)
+        find_package(fmt REQUIRED)
+        target_link_libraries(modcc PRIVATE fmt::fmt-header-only)
+    endif()
 
-    target_compile_definitions(modcc PRIVATE FMT_HEADER_ONLY)
-else()
-    target_include_directories(modcc
-        PUBLIC
-            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
-            $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>)
-    find_package(fmt REQUIRED)
-    target_link_libraries(modcc PRIVATE fmt::fmt-header-only)
+    target_link_libraries(modcc PRIVATE libmodcc ext-tinyopt)
+    set_target_properties(modcc libmodcc PROPERTIES EXCLUDE_FROM_ALL ${ARB_WITH_EXTERNAL_MODCC})
+    install(TARGETS modcc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
 endif()
-
-target_link_libraries(modcc PRIVATE libmodcc ext-tinyopt)
-set_target_properties(modcc libmodcc PROPERTIES EXCLUDE_FROM_ALL OFF)
-install(TARGETS modcc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})