Files
project-euler-solutions/.opencode/cmake-plan.md

2.0 KiB

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()