# CMake 2026 Project Setup Plan ## Overview This document outlines the technical plan for setting up a CMake-based C++ project with the following requirements: - clang++ compiler with C++23 defaults - Automatic source file discovery in src/ directory - Executable generation from files containing 'main' in filename - External dependency handling for git submodules - Organized compile flags and variables ## Key Components ### 1. Compiler Configuration - Use clang++ as the C++ compiler - Set C++ standard to C++23 - Configure appropriate compiler flags for clang ### 2. Source File Discovery - Scan src/ directory for all .cpp files - Use regex pattern `.*main.*\.cpp$` to identify main files - Separate main files from other source files ### 3. Executable Generation - Automatically create executables from files with 'main' in filename - Create a library from all non-main source files - Link the library to each executable ### 4. External Dependency Management - Handle dependencies in external/ directory - Example: spdlog in external/spdlog with namespace spdlog - Create interface libraries for external dependencies ### 5. Compile Flags Organization - Debug build flags: -g -O0 -Wall -Wextra - Release build flags: -O3 -DNDEBUG -Wall -Wextra - Common flags: -std=c++23 -fPIC ## Implementation Details ### Regex Pattern ``` .*main.*\.cpp$ ``` Used to detect files containing 'main' in their filename. ### Directory Structure - `src/` - Source files directory - `external/` - Git submodules directory - `include/` - Header files directory ### File Processing Logic 1. Find all .cpp files in src/ 2. Separate main files from other source files 3. Create library from non-main files 4. Generate executables from main files 5. Link library and external dependencies to each executable ## CMake Commands Used - `cmake_minimum_required(VERSION 3.15)` - `project(ProjectEuler CXX)` - `file(GLOB_RECURSE)` - `list(APPEND)` - `add_executable()` - `add_library()` - `target_link_libraries()` - `target_compile_features()` - `find_package()` - `add_subdirectory()`