summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt259
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 "")