diff options
| author | Levent Kaya <levent@dev> | 2025-11-06 01:53:21 +0300 |
|---|---|---|
| committer | Levent Kaya <levent@dev> | 2025-11-06 01:53:21 +0300 |
| commit | 2140653c001a2ac415fb717d48ca2b55ff2aa037 (patch) | |
| tree | 5dfc3697eee8aca4308aded02c95c2a32bccf509 /CMakeLists.txt | |
| parent | f6f40266ba57ab2df99b897c375f85f0a8a97856 (diff) | |
[feature] basic demo screen
Diffstat (limited to 'CMakeLists.txt')
| -rw-r--r-- | CMakeLists.txt | 259 |
1 files changed, 241 insertions, 18 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 3669e77..0db7d1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,30 +1,253 @@ cmake_minimum_required(VERSION 3.15) -project(boltdbg VERSION 0.1.0 LANGUAGES C CXX) -# Load BoltDBG option definitions first -list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") -include(BoltDbgOptions) +# ============================================================================ +# Project Definition +# ============================================================================ +project(BoltDBG + VERSION 0.1.0 + DESCRIPTION "Modern C++ Debugger with GUI" + LANGUAGES C CXX +) + +# ============================================================================ +# C++ Standard +# ============================================================================ +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) -# Some basic options -set(CMAKE_CXX_STANDARD 23) set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) -# include helper modules -include(compiler_warnings) -include(Sanitizer) -include(PlatformConfig) -#include(CodeStyle) +# Export compile commands for IDE support +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -# src -add_subdirectory(src) +# Make builds more robust when mixing static/shared libs +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +# ============================================================================ +# Options +# ============================================================================ +option(BOLTDBG_BUILD_TESTS "Build test suite" OFF) +option(BOLTDBG_BUILD_EXAMPLES "Build examples" OFF) +option(BOLTDBG_USE_SYSTEM_LIBS "Prefer system libraries" ON) +option(BOLTDBG_ENABLE_ASAN "Enable Address Sanitizer" OFF) +option(BOLTDBG_ENABLE_UBSAN "Enable UB Sanitizer" OFF) +option(BOLTDBG_ENABLE_TSAN "Enable Thread Sanitizer" OFF) -# add optional format targets if enabled -if (BOLTDBG_ENABLE_FORMAT_TARGET) - #add_clang_format_target(boltdbg) +# ============================================================================ +# CMake Modules Path +# ============================================================================ +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +# Include compiler warnings if available +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/CompilerWarnings.cmake") + include(CompilerWarnings) endif() -# Tests -if (BOLTDBG_BUILD_TESTS) +# Include sanitizers if available +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Sanitizers.cmake") + include(Sanitizers) +endif() + +# ============================================================================ +# Basic packages +# ============================================================================ +# Threads (pthread) is commonly required for libraries and linking +find_package(Threads REQUIRED) + +# ============================================================================ +# Dependencies (FetchContent) +# ============================================================================ +include(FetchContent) + +# --- GLFW --- +if(BOLTDBG_USE_SYSTEM_LIBS) + find_package(glfw3 3.3 QUIET) +endif() + +if(NOT TARGET glfw AND NOT TARGET glfw3::glfw3) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/external/glfw/CMakeLists.txt") + message(STATUS "Using vendored GLFW from external/glfw") + set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) + set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) + set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) + set(GLFW_INSTALL OFF CACHE BOOL "" FORCE) + add_subdirectory(external/glfw) + else() + message(STATUS "Fetching GLFW via FetchContent") + FetchContent_Declare( + glfw + GIT_REPOSITORY https://github.com/glfw/glfw.git + GIT_TAG 3.3.8 + GIT_SHALLOW TRUE + ) + set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) + set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) + set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(glfw) + endif() +endif() + +# Create alias if needed +if(TARGET glfw3::glfw3 AND NOT TARGET glfw) + add_library(glfw ALIAS glfw3::glfw3) +endif() + +# --- spdlog --- +if(BOLTDBG_USE_SYSTEM_LIBS) + find_package(spdlog 1.11 QUIET) +endif() + +if(NOT TARGET spdlog::spdlog) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/external/spdlog/CMakeLists.txt") + message(STATUS "Using vendored spdlog from external/spdlog") + add_subdirectory(external/spdlog) + else() + message(STATUS "Fetching spdlog via FetchContent") + FetchContent_Declare( + spdlog + GIT_REPOSITORY https://github.com/gabime/spdlog.git + GIT_TAG v1.11.0 + GIT_SHALLOW TRUE + ) + FetchContent_MakeAvailable(spdlog) + endif() +endif() + +# --- ImGui --- +if(NOT TARGET imgui) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/external/imgui/imgui.cpp") + message(STATUS "Using vendored ImGui from external/imgui") + set(IMGUI_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/imgui") + else() + message(STATUS "Fetching ImGui via FetchContent") + FetchContent_Declare( + imgui + GIT_REPOSITORY https://github.com/ocornut/imgui.git + GIT_TAG v1.89.8 + GIT_SHALLOW TRUE + ) + FetchContent_MakeAvailable(imgui) + set(IMGUI_DIR ${imgui_SOURCE_DIR}) + endif() + + # Create ImGui library target + add_library(imgui STATIC + ${IMGUI_DIR}/imgui.cpp + ${IMGUI_DIR}/imgui_demo.cpp + ${IMGUI_DIR}/imgui_draw.cpp + ${IMGUI_DIR}/imgui_tables.cpp + ${IMGUI_DIR}/imgui_widgets.cpp + ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp + ${IMGUI_DIR}/backends/imgui_impl_opengl3.cpp + ) + target_include_directories(imgui PUBLIC + ${IMGUI_DIR} + ${IMGUI_DIR}/backends + ) + + # Link libraries imgui backend needs — glad/glfw/OpenGL/Threads + # Note: glad and platform libs may be created later; using PUBLIC allows consumers to pick them up. + # We'll append actual platform libs after platform-detection block below. +endif() + +# --- GLAD --- +if(NOT TARGET glad) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/external/glad/src/glad.c") + message(STATUS "Using vendored GLAD from external/glad") + set(GLAD_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/glad") + # Create GLAD library target manually + add_library(glad STATIC ${GLAD_DIR}/src/glad.c) + target_include_directories(glad PUBLIC ${GLAD_DIR}/include) + else() + message(STATUS "Fetching GLAD via FetchContent") + FetchContent_Declare( + glad + GIT_REPOSITORY https://github.com/Dav1dde/glad.git + GIT_TAG v0.1.36 + GIT_SHALLOW TRUE + ) + FetchContent_MakeAvailable(glad) + # GLAD's CMakeLists.txt typically creates the 'glad' target automatically. + endif() +endif() + +# ============================================================================ +# Platform-specific OpenGL and platform libs +# ============================================================================ +set(PLATFORM_LIBS "") +if(APPLE) + find_library(COCOA_FRAMEWORK Cocoa REQUIRED) + find_library(IOKIT_FRAMEWORK IOKit REQUIRED) + find_library(COREVIDEO_FRAMEWORK CoreVideo REQUIRED) + find_library(OPENGL_FRAMEWORK OpenGL REQUIRED) + list(APPEND PLATFORM_LIBS ${COCOA_FRAMEWORK} ${IOKIT_FRAMEWORK} ${COREVIDEO_FRAMEWORK} ${OPENGL_FRAMEWORK}) +elseif(WIN32) + list(APPEND PLATFORM_LIBS opengl32) +else() + # Unix/Linux + find_package(OpenGL REQUIRED) + list(APPEND PLATFORM_LIBS OpenGL::GL ${CMAKE_DL_LIBS}) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + list(APPEND PLATFORM_LIBS pthread) + endif() +endif() + +# Now that PLATFORM_LIBS and glad exist, make sure imgui links them +if(TARGET imgui) + # link what we have: glfw, glad, platform libs, threads + # Use PRIVATE here because imgui's public headers don't require these symbols, but keep PUBLIC if consumers need transitive link. + # Use PUBLIC to be safe for consumers (exe targets). + target_link_libraries(imgui PUBLIC glfw) + if(TARGET glad) + target_link_libraries(imgui PUBLIC glad) + endif() + # PLATFORM_LIBS may contain import targets or plain names; link them too + if(PLATFORM_LIBS) + target_link_libraries(imgui PUBLIC ${PLATFORM_LIBS}) + endif() + # Threads + target_link_libraries(imgui PUBLIC Threads::Threads) +endif() + +# ============================================================================ +# Subdirectories +# ============================================================================ +# Add src (this file should contain project targets like executable/library) +add_subdirectory(src) + +# Tests and examples +if(BOLTDBG_BUILD_TESTS AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests/CMakeLists.txt") enable_testing() add_subdirectory(tests) endif() + +if(BOLTDBG_BUILD_EXAMPLES AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/examples/CMakeLists.txt") + add_subdirectory(examples) +endif() + +# ============================================================================ +# Sanitizers flags summary (if your included Sanitizers.cmake sets flags, keep it) +# (Sanitizers.cmake is optional and included at top if exists) +# ============================================================================ + +# ============================================================================ +# Summary +# ============================================================================ +message(STATUS "") +message(STATUS "========================================") +message(STATUS " BoltDBG ${PROJECT_VERSION}") +message(STATUS "========================================") +message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") +message(STATUS "C++ compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}") +message(STATUS "") +message(STATUS "Options:") +message(STATUS " Build tests: ${BOLTDBG_BUILD_TESTS}") +message(STATUS " Build examples: ${BOLTDBG_BUILD_EXAMPLES}") +message(STATUS " System libs: ${BOLTDBG_USE_SYSTEM_LIBS}") +message(STATUS " ASAN: ${BOLTDBG_ENABLE_ASAN}") +message(STATUS " UBSAN: ${BOLTDBG_ENABLE_UBSAN}") +message(STATUS " TSAN: ${BOLTDBG_ENABLE_TSAN}") +message(STATUS "========================================") +message(STATUS "") |
