Files
mock-uil-2025/CMakeLists.txt
2025-11-21 23:12:15 -06:00

78 lines
2.2 KiB
CMake

cmake_minimum_required(VERSION 3.20)
# -----------------------------
# Project setup
# -----------------------------
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)
project(mock-uil LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_BUILD_TYPE Release)
# -----------------------------
# Dependencies
# -----------------------------
add_subdirectory(external/fmt)
add_subdirectory(external/spdlog)
set(COMMON_LIBS fmt spdlog)
# -----------------------------
# External includes
# -----------------------------
set(EXTERNAL_INCLUDES
${CMAKE_CURRENT_SOURCE_DIR}/external/fmt/include
${CMAKE_CURRENT_SOURCE_DIR}/external/spdlog/include
)
# -----------------------------
# Collect all include dirs under src/
# -----------------------------
file(GLOB_RECURSE SRC_SUBDIRS LIST_DIRECTORIES true "${CMAKE_CURRENT_SOURCE_DIR}/src/*")
set(SRC_INCLUDES "")
foreach(dir ${SRC_SUBDIRS})
if(IS_DIRECTORY ${dir})
list(APPEND SRC_INCLUDES ${dir})
endif()
endforeach()
# -----------------------------
# Detect all .cpp files
# -----------------------------
file(GLOB_RECURSE ALL_CPP "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
# -----------------------------
# Detect all main-solution-N files
# -----------------------------
file(GLOB SOLUTION_MAINS "${CMAKE_CURRENT_SOURCE_DIR}/src/main-solution-*.cpp")
# -----------------------------
# Create an executable for each main-solution-N
# -----------------------------
foreach(MAIN_FILE ${SOLUTION_MAINS})
get_filename_component(MAIN_NAME ${MAIN_FILE} NAME_WE)
# Executable name: mock-uil-main-solution-N
set(EXE_NAME "${PROJECT_NAME}-${MAIN_NAME}")
# All CPP files except this executable's main
set(CPP_FILES ${ALL_CPP})
list(REMOVE_ITEM CPP_FILES ${MAIN_FILE})
add_executable(${EXE_NAME} ${MAIN_FILE})
target_sources(${EXE_NAME} PRIVATE ${CPP_FILES})
target_link_libraries(${EXE_NAME} PRIVATE ${COMMON_LIBS})
target_include_directories(${EXE_NAME} PRIVATE ${EXTERNAL_INCLUDES} ${SRC_INCLUDES})
endforeach()
# -----------------------------
# Clang warnings
# -----------------------------
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic -Wconversion)
endif()