BareGit

Refactor: Split build system into a library and an executable CLI target

Author: MetroWind <chris.corsair@gmail.com>
Date: Sat Feb 28 16:35:44 2026 -0800
Commit: 1b4e98229918708920b3ab70795dcea2af975bfd

Changes

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4f158a4..d5b5028 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,8 +39,7 @@ set(LIBMW_BUILD_CRYPTO OFF)
 
 FetchContent_MakeAvailable(libmw spdlog json cxxopts)
 
-set(SOURCE_FILES
-    src/main.cpp
+set(LIB_SOURCE_FILES
     src/agent.cpp
     src/llm_client.cpp
     src/memory.cpp
@@ -54,21 +53,26 @@ set(LIBS
     mw::sqlite
     spdlog::spdlog
     nlohmann_json::nlohmann_json
-    cxxopts::cxxopts
 )
 
 set(INCLUDES
     ${libmw_SOURCE_DIR}/includes
     ${json_SOURCE_DIR}/single_include
-    ${cxxopts_SOURCE_DIR}/include
 )
 
-add_executable(agent_smith ${SOURCE_FILES})
-
-set_property(TARGET agent_smith PROPERTY COMPILE_WARNING_AS_ERROR FALSE)
+# 1. Build the Agent Smith Library
+add_library(agent_smith ${LIB_SOURCE_FILES})
+set_property(TARGET agent_smith PROPERTY CXX_STANDARD 23)
 target_compile_options(agent_smith PRIVATE -Wall -Wextra)
-target_include_directories(agent_smith PRIVATE ${INCLUDES} src)
-target_link_libraries(agent_smith PRIVATE ${LIBS})
+target_include_directories(agent_smith PUBLIC ${INCLUDES} src)
+target_link_libraries(agent_smith PUBLIC ${LIBS})
+
+# 2. Build the Example CLI Executable
+add_executable(agent_smith_cli src/main.cpp)
+set_property(TARGET agent_smith_cli PROPERTY CXX_STANDARD 23)
+target_compile_options(agent_smith_cli PRIVATE -Wall -Wextra)
+target_include_directories(agent_smith_cli PRIVATE ${cxxopts_SOURCE_DIR}/include)
+target_link_libraries(agent_smith_cli PRIVATE agent_smith cxxopts::cxxopts)
 
 option(AGENT_SMITH_BUILD_TESTS "Build unit tests" ON)
 
@@ -88,26 +92,17 @@ if(AGENT_SMITH_BUILD_TESTS)
     src/message_test.cpp
   )
 
-  add_executable(agent_smith_test 
-    ${TEST_FILES} 
-    src/agent.cpp 
-    src/memory.cpp 
-    src/tool.cpp 
-    src/llm_client.cpp
-    src/message.cpp
-  )
+  add_executable(agent_smith_test ${TEST_FILES})
   
   set_property(TARGET agent_smith_test PROPERTY CXX_STANDARD 23)
   target_compile_options(agent_smith_test PRIVATE -Wall -Wextra)
   target_include_directories(agent_smith_test PRIVATE 
-    ${INCLUDES} 
-    src
     ${googletest_SOURCE_DIR}/googletest/include
     ${googletest_SOURCE_DIR}/googlemock/include
   )
 
   target_link_libraries(agent_smith_test PRIVATE
-    ${LIBS}
+    agent_smith
     GTest::gtest_main
     GTest::gmock_main
   )