cmake_minimum_required(VERSION 3.20) project(example_win32_directx11) # --------------------------------------------------------------------------- # C++ standard # The original .vcxproj used "stdcpplatest" on x64 configs. CMake 3.20+ # supports C++23; adjust downward to 20 if your toolchain doesn't support 23. # --------------------------------------------------------------------------- set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # --------------------------------------------------------------------------- # Source files # Paths are relative to this CMakeLists.txt, which lives at: # astral/examples/example_win32_directx11/ # --------------------------------------------------------------------------- set(IMGUI_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../..") set(SOURCES main.cpp # core imgui ${IMGUI_ROOT}/imgui.cpp ${IMGUI_ROOT}/imgui_demo.cpp ${IMGUI_ROOT}/imgui_draw.cpp ${IMGUI_ROOT}/imgui_tables.cpp ${IMGUI_ROOT}/imgui_widgets.cpp # Win32 + DirectX 11 backends ${IMGUI_ROOT}/backends/imgui_impl_dx11.cpp ${IMGUI_ROOT}/backends/imgui_impl_win32.cpp # FreeType font rasterizer — always compiled because imconfig.h defines # IMGUI_ENABLE_FREETYPE unconditionally. ${IMGUI_ROOT}/misc/freetype/imgui_freetype.cpp ) # --------------------------------------------------------------------------- # Target # --------------------------------------------------------------------------- add_executable(${PROJECT_NAME} ${SOURCES}) # --------------------------------------------------------------------------- # Include directories # --------------------------------------------------------------------------- target_include_directories(${PROJECT_NAME} PRIVATE ${IMGUI_ROOT} ${IMGUI_ROOT}/backends ) # --------------------------------------------------------------------------- # Preprocessor definitions # --------------------------------------------------------------------------- # The original project used Unicode on Win32 and MultiByte on x64. # We default to Unicode (the more modern choice). Override with -DUSE_MBCS=ON. option(USE_MBCS "Use Multi-Byte Character Set instead of Unicode" OFF) if(USE_MBCS) target_compile_definitions(${PROJECT_NAME} PRIVATE _MBCS) else() target_compile_definitions(${PROJECT_NAME} PRIVATE UNICODE _UNICODE) endif() # --------------------------------------------------------------------------- # Compiler options (MSVC) # --------------------------------------------------------------------------- if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W4 # Warning level 4 (original setting) /utf-8 # Source and execution charset = UTF-8 /MP # Multi-processor compilation (was enabled on x64 configs) ) # Debug-specific flags target_compile_options(${PROJECT_NAME} PRIVATE $<$:/Od> # Disable optimization ) # Release-specific flags target_compile_options(${PROJECT_NAME} PRIVATE $<$:/O2> # Max speed $<$:/Gy> # Function-level linking $<$:/Oi> # Intrinsic functions $<$:/GS-> # Disable buffer security check (as in original) ) # Link-time code generation / whole-program optimisation for Release set_property(TARGET ${PROJECT_NAME} PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE ) # Linker: COMDAT folding + reference optimisation for Release target_link_options(${PROJECT_NAME} PRIVATE $<$:/OPT:REF> $<$:/OPT:ICF> ) # Always emit PDB debug info (GenerateDebugInformation was true in all configs) target_link_options(${PROJECT_NAME} PRIVATE /DEBUG) # Console subsystem (SubSystem = Console in original) target_link_options(${PROJECT_NAME} PRIVATE /SUBSYSTEM:CONSOLE) endif() # --------------------------------------------------------------------------- # Link libraries # --------------------------------------------------------------------------- target_link_libraries(${PROJECT_NAME} PRIVATE d3d11 d3dcompiler dxgi dwmapi # Required for DwmIsCompositionEnabled / DwmEnableBlurBehindWindow etc. ) # FreeType — try a system/vcpkg install first, fall back to the local libs/ copy. find_package(Freetype QUIET) if(Freetype_FOUND) target_link_libraries(${PROJECT_NAME} PRIVATE Freetype::Freetype) else() message(STATUS "System FreeType not found, falling back to local libs/freetype") target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../libs/freetype/include ) target_link_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../libs/freetype/objs ) target_link_libraries(${PROJECT_NAME} PRIVATE freetype) endif() # --------------------------------------------------------------------------- # Output directories (mirrors the original build\debug / build\release layout) # --------------------------------------------------------------------------- set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/build/debug" RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/build/release" )