From c130f8862446c067d5afe4d4338c23f3f05347d1 Mon Sep 17 00:00:00 2001
From: Brent Huisman <brenthuisman@users.noreply.github.com>
Date: Wed, 23 Nov 2022 12:46:55 +0100
Subject: [PATCH] Make ARB_MODCC functional again (#2029)

required for making an emscripten build of the arbor python library

* make ARB_MODCC functional again

* move add_subdir

* no modcc/CMakeLists.txt is needed also when external modcc is used.

* review
---
 CMakeLists.txt       | 13 +++++++++++--
 modcc/CMakeLists.txt | 43 ++++++++++++++++++++++---------------------
 2 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 41675d28..bb84ea9d 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 59134b29..b5a4982f 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})
-- 
GitLab