cmake_minimum_required(VERSION 3.16)
project(tracy_matmul_demo LANGUAGES CXX)

# 全部使用 C++11，不依赖任何 C++14/17/20 特性。
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_COLOR_DIAGNOSTICS ON)

# profiler 要靠调试符号才能显示函数名和源码行，默认用 RelWithDebInfo（-O2 -g）。
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "构建类型" FORCE)
endif()

option(TRACY_ENABLE "是否启用 Tracy 插桩" ON)
option(ENABLE_NATIVE_ARCH "是否加 -march=native" ON)

# Tracy 的头文件和客户端源码已经拷贝到 include/（真实目录，不是软链接）。
set(TRACY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")

if(NOT EXISTS "${TRACY_DIR}/TracyClient.cpp")
  message(FATAL_ERROR "找不到 ${TRACY_DIR}/TracyClient.cpp")
endif()

find_package(Threads REQUIRED)

# ---------------------------------------------------------------------------
# Tracy 客户端单独编成一个静态库。
# 这样可以把 Tracy 自身的编译警告完全隔离掉：
#   SYSTEM 头文件目录 -> 不报告它头文件里的警告
#   -w                -> 不报告它实现文件里的警告
# ---------------------------------------------------------------------------
add_library(tracy_client STATIC "${TRACY_DIR}/TracyClient.cpp")
target_include_directories(tracy_client SYSTEM PUBLIC "${TRACY_DIR}")
target_compile_options(tracy_client PRIVATE -w)
target_link_libraries(tracy_client PUBLIC Threads::Threads ${CMAKE_DL_LIBS})

if(TRACY_ENABLE)
  target_compile_definitions(tracy_client PUBLIC TRACY_ENABLE)
endif()

# ---------------------------------------------------------------------------
# demo 本体
# ---------------------------------------------------------------------------
add_executable(matmul_demo src/main.cpp src/matmul.cpp)

# SYSTEM 关键字让编译器不再报告 Tracy 头文件里的警告。
target_include_directories(matmul_demo SYSTEM PRIVATE "${TRACY_DIR}")
target_include_directories(matmul_demo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src")

target_link_libraries(matmul_demo PRIVATE tracy_client)

# 产物直接落到 bin/，方便打包分发。
set_target_properties(matmul_demo PROPERTIES
  RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")

if(ENABLE_NATIVE_ARCH)
  include(CheckCXXCompilerFlag)
  check_cxx_compiler_flag("-march=native" HAS_MARCH_NATIVE)
  if(HAS_MARCH_NATIVE)
    target_compile_options(matmul_demo PRIVATE -march=native)
  endif()
endif()

# Tracy 采集调用栈需要帧指针。
target_compile_options(matmul_demo PRIVATE -fno-omit-frame-pointer)

message(STATUS "Tracy 目录   : ${TRACY_DIR}")
message(STATUS "C++ 标准     : ${CMAKE_CXX_STANDARD}")
message(STATUS "TRACY_ENABLE : ${TRACY_ENABLE}")
message(STATUS "构建类型     : ${CMAKE_BUILD_TYPE}")
