Files
steam-audio-godot/CMakeLists.txt

195 lines
6.5 KiB
CMake

# SPDX-License-Identifier: Unlicense
cmake_minimum_required(VERSION 3.22)
# Opt into the new install-destination normalization behavior
if(POLICY CMP0177)
cmake_policy(SET CMP0177 NEW)
endif()
message(STATUS "Using CMake ${CMAKE_VERSION}")
# Require out-of-source builds
file(TO_CMAKE_PATH "${PROJECT_BINARY_DIR}/CMakeLists.txt" LOC_PATH)
if(EXISTS "${LOC_PATH}")
message(FATAL_ERROR "You cannot build in the source directory. Please use a build subdirectory.")
endif()
# Add custom CMake modules
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
# Enable LTO for release if supported
include(CheckIPOSupported)
check_ipo_supported(RESULT ipo_supported OUTPUT ipo_output)
if(ipo_supported)
message(STATUS "IPO/LTO supported: enabling interprocedural optimization")
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
else()
message(STATUS "IPO/LTO not supported: skipping LTO flags (${ipo_output})")
endif()
# Output compile commands for editor integration
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Build universal library on macOS
if(APPLE)
set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "")
endif()
# Project definition
project(SteamAudioGodot
VERSION 0.1.0
LANGUAGES CXX
)
# Create the shared library target
add_library(${PROJECT_NAME} SHARED)
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
# Determine architecture label
set(LIB_ARCH ${CMAKE_SYSTEM_PROCESSOR})
if(APPLE)
set(LIB_ARCH "universal")
endif()
# Where Godot expects library binaries
set(LIB_DIR "lib/${CMAKE_SYSTEM_NAME}-${LIB_ARCH}")
message(STATUS "Building ${PROJECT_NAME} for ${LIB_ARCH} on ${CMAKE_SYSTEM_NAME}")
# Output directories for built library
set(BUILD_OUTPUT_DIR "${PROJECT_BINARY_DIR}/${PROJECT_NAME}/")
set_target_properties(${PROJECT_NAME} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${BUILD_OUTPUT_DIR}/${LIB_DIR}"
LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_DIR}/${LIB_DIR}"
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN TRUE
)
# Append debug postfix if needed
if(NOT DEFINED CMAKE_DEBUG_POSTFIX)
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "-d")
endif()
# (Optional) Copy support_files icons and templates next to build output
# if you need them in your local addon for testing. Exclude the 'lib' folder to avoid nested structure.
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${CMAKE_SOURCE_DIR}/support_files/icons"
"${BUILD_OUTPUT_DIR}/icons"
)
# Build source files
add_subdirectory(src)
# ─────────────────────────────────────────────────────────────────────────────
# Stage Steam Audio runtimes alongside the built GDExtension
# ─────────────────────────────────────────────────────────────────────────────
# Detect platform-specific subdirectories
if(WIN32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(_SA_RUNTIME_SUBDIR "windows-x64")
set(_SA_GDE_DIR "Windows-AMD64")
else()
set(_SA_RUNTIME_SUBDIR "windows-x86")
set(_SA_GDE_DIR "Windows-386")
endif()
elseif(APPLE)
set(_SA_RUNTIME_SUBDIR "ios") # switch to "osx" if targeting desktop
set(_SA_GDE_DIR "Darwin")
elseif(ANDROID)
set(_SA_RUNTIME_SUBDIR "${ANDROID_ABI}")
set(_SA_GDE_DIR "${ANDROID_ABI}")
elseif(UNIX)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(_SA_RUNTIME_SUBDIR "linux-x64")
set(_SA_GDE_DIR "Linux-x64")
else()
set(_SA_RUNTIME_SUBDIR "linux-x86")
set(_SA_GDE_DIR "Linux-x86")
endif()
else()
message(FATAL_ERROR "Unsupported platform for SteamAudioGodot")
endif()
# Path to prebuilt Steam Audio runtime files
set(_SA_RUNTIME_DIR "${CMAKE_CURRENT_SOURCE_DIR}/support_files/lib/${_SA_RUNTIME_SUBDIR}")
# Where Godot will load the binaries (target output directory already equals build_output/lib/Platform)
set(_SA_OUTPUT_DIR "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
# Copy the runtime files after build
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory "${_SA_OUTPUT_DIR}"
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${_SA_RUNTIME_DIR}"
"${_SA_OUTPUT_DIR}"
)
# Include paths for Steam Audio SDK and godot-cpp
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/extern/steam-audio/include
${CMAKE_CURRENT_SOURCE_DIR}/extern/godot-cpp/include
${CMAKE_CURRENT_SOURCE_DIR}/src
)
# Installation setup
set(INSTALL_DIR "${CMAKE_SOURCE_DIR}/install/${PROJECT_NAME}/")
message(STATUS "Install directory: ${INSTALL_DIR}")
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${INSTALL_DIR}/${LIB_DIR}
LIBRARY DESTINATION ${INSTALL_DIR}/${LIB_DIR}
)
# Install Steam Audio runtime libraries into the addon install folder
install(
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/support_files/lib/${_SA_RUNTIME_SUBDIR}/"
DESTINATION "${INSTALL_DIR}/${LIB_DIR}/"
FILES_MATCHING
PATTERN "*.dll"
PATTERN "*.so"
PATTERN "*.dylib"
PATTERN "*.a"
)
# Templates subdir
add_subdirectory(templates)
# ccache integration
include(ccache)
# Install Steam Audio runtime libraries into the addon install folder
install(
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/support_files/lib/${_SA_RUNTIME_SUBDIR}/"
DESTINATION "${INSTALL_DIR}/${LIB_DIR}/"
FILES_MATCHING
PATTERN "*.dll"
PATTERN "*.so"
PATTERN "*.dylib"
PATTERN "*.a"
)
# Code formatting
include(ClangFormat)
include(ccache)
# Code formatting
include(ClangFormat)
# godot-cpp bindings
if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/extern/godot-cpp/Makefile")
message(FATAL_ERROR "[${PROJECT_NAME}] Missing godot-cpp submodule. Run: git submodule update --init --recursive.")
endif()
set(GODOT_CPP_SYSTEM_HEADERS ON CACHE BOOL "" FORCE)
add_subdirectory(extern/godot-cpp)
set_target_properties(godot-cpp PROPERTIES CXX_VISIBILITY_PRESET hidden)
# Link against godot-cpp and Steam Audio phonon library
# Add Steam Audio phonon lib search path
target_link_directories(${PROJECT_NAME} PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/extern/steam-audio/lib/${_SA_RUNTIME_SUBDIR}"
)
target_link_libraries(${PROJECT_NAME} PRIVATE
godot-cpp
phonon
)