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 main-solution-N files # ----------------------------- file(GLOB SOLUTION_MAINS "${CMAKE_CURRENT_SOURCE_DIR}/src/main-solution-*.cpp") # ----------------------------- # Detect all other .cpp files (common utilities) # ----------------------------- file(GLOB_RECURSE ALL_CPP "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp") list(REMOVE_ITEM ALL_CPP ${SOLUTION_MAINS}) # remove all mains # ----------------------------- # Create an executable for each main-solution-N # ----------------------------- foreach(MAIN_FILE ${SOLUTION_MAINS}) get_filename_component(MAIN_NAME ${MAIN_FILE} NAME_WE) set(EXE_NAME "${PROJECT_NAME}-${MAIN_NAME}") # Each executable = its main + all common cpp files add_executable(${EXE_NAME} ${MAIN_FILE} ${ALL_CPP}) 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()