pound-emu_pound/CMakeLists.txt
Ronald Caesar e2459f5392
temp commit
Signed-off-by: Ronald Caesar <github43132@proton.me>
2025-10-19 00:35:50 -04:00

158 lines
4.7 KiB
CMake

cmake_minimum_required(VERSION 3.25)
#------------------------
# ---- Project Setup ----
#------------------------
project(Pound)
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
endif()
set(CMAKE_C_STANDARD 17)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_C_STANDARD_REQUIRED TRUE)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
#-------------------------------
# ---- Dependency Discovery ----
#-------------------------------
find_package(OpenGL REQUIRED)
find_package(fmt 10.2.1 CONFIG)
find_package(SDL3 3.2.10 CONFIG)
message(STATUS "Verifying Git submodules integrity...")
# Check if submodules are properly initialized.
execute_process(
COMMAND git submodule status
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE submodule_status
RESULT_VARIABLE result
)
if(NOT result EQUAL 0)
message(FATAL_ERROR "Failed to get submodule status")
endif()
# Function to verify a specific submodule's pinned commit
function(verify_pinned_commit name path actual_commit expected_commit)
if(NOT actual_commit STREQUAL expected_commit)
message(FATAL_ERROR
"${name} submodule commit mismatch!\n"
"Path: ${path}\n"
"Expected: ${expected_commit}\n"
"Actual: ${actual_commit}\n"
"Submodule may have been updated. Please revert to pinned commit with:\n"
" cd ${path}\n"
" git checkout ${expected_commit}\n"
" cd ../..\n"
" git add ${path}\n"
" git commit -m \"Revert ${name} to pinned commit\""
)
endif()
message(STATUS "${name} commit matches pinned version: ${expected_commit}")
endfunction()
# Parse submodule status and verify each one
string(REPLACE "\n" ";" submodule_lines ${submodule_status})
foreach(line ${submodule_lines})
# Extract status character (first character)
string(SUBSTRING ${line} 0 1 status_char)
# Extract commit hash
string(REGEX REPLACE "^([ +-])([0-9a-f]+) .*" "\\2" commit_hash ${line})
# Extract path
string(REGEX REPLACE "^[ +-][0-9a-f]+ ([^ ]+).*" "\\1" submodule_path ${line})
if(status_char STREQUAL "-")
message(FATAL_ERROR "Submodule ${submodule_path} is not initialized. Please run: git submodule update --init --recursive")
elseif(status_char STREQUAL "+")
message(WARNING "Submodule ${submodule_path} has uncommitted chamges")
endif()
# Verify pinned commit for known submodules
if(submodule_path STREQUAL "3rd_Party/imgui")
verify_pinned_commit("imgui" "${submodule_path}" "${commit_hash}" "bf75bfec48fc00f532af8926130b70c0e26eb099")
elseif(submodule_path STREQUAL "3rd_Party/SDL3")
verify_pinned_commit("SDL3" "${submodule_path}" "${commit_hash}" "a96677bdf6b4acb84af4ec294e5f60a4e8cbbe03")
endif()
message(STATUS "Verified submodule: ${submodule_path} (${commit_hash})")
endforeach()
message(STATUS "All submodules verified successfully")
#-----------------------------
# ---- Target Definitions ----
#-----------------------------
add_executable(Pound
src/main.cpp
)
add_subdirectory(3rd_Party)
add_subdirectory(src/common)
add_subdirectory(src/host)
add_subdirectory(src/jit)
add_subdirectory(src/pvm)
add_subdirectory(src/targets/switch1/hardware)
#--------------------------------
# ---- Target Configurations ----
#--------------------------------
include(TestBigEndian)
TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
list(APPEND POUND_PROJECT_TARGETS common host pvm)
foreach(TARGET ${POUND_PROJECT_TARGETS})
# Apply Endianness definitions to all our targets.
if(WORDS_BIGENDIAN)
target_compile_definitions(${TARGET} PRIVATE HOST_IS_BIG_ENDIAN=1 HOST_IS_LITTLE_ENDIAN=0)
else()
target_compile_definitions(${TARGET} PRIVATE HOST_IS_BIG_ENDIAN=0 HOST_IS_LITTLE_ENDIAN=1)
endif()
target_compile_options(${TARGET} PRIVATE
$<$<CXX_COMPILER_ID:GNU,Clang>:
-Wall
-Wpedantic
-Wshadow
-Wpointer-arith
-Wcast-qual
-Wcast-align
-Wconversion>
)
if(WIN32)
target_compile_options(${TARGET} PRIVATE -DNOMINMAX -DWIN32_LEAN_AND_MEAN)
target_compile_definitions(${TARGET} PRIVATE _CRT_SECURE_NO_WARNINGS) # Disable some Windows SDK deprecation warnings
endif()
# Set Compile time log level for all targets.
# 1: Trace
# 2: Debug
# 3: Info
# 4: Warning
# 5: Error
# 6: Fatal
target_compile_definitions(${TARGET} PRIVATE COMPILE_TIME_LOG_LEVEL=1)
endforeach()
# Optimizations
set_property(TARGET Pound PROPERTY CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE)
target_link_libraries(Pound PRIVATE
common
host
jit
pvm
OpenGL::GL
SDL3::SDL3
imgui
)