cmake_minimum_required(VERSION 3.25)
cmake_policy(VERSION 3.25)
project(Gorgon)
add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Tools/ShaderEmbedder")
set(GORGON_MAJOR_VERSION 4)
set(GORGON_MINOR_VERSION 0)
set(GORGON_PATCH_VERSION 0)
set(GORGON_VERSION_ALPHA 1)
set(GORGON_VERSION ${GORGON_MAJOR_VERSION}.${GORGON_MINOR_VERSION}.${GORGON_PATCH_VERSION})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/Lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/Lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/Bin)
set(CMAKE_TESTING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/Testing)
set(CMAKE_DOCUMENT_OUTPUT_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/Docs)
set(PROJECT_BINARY_DIR ${CMAKE_CURRENT_LIST_DIR}/Bin)
set(PROJECT_PACKAGE_DIR ${CMAKE_CURRENT_LIST_DIR}/Package)
set(gorgon_external_options "" NONE BUILTIN SYSTEM)
set(gorgon_external_mandatory_options "" BUILTIN SYSTEM)
# Enable generation of a compilation database (compile_commands.json) for tooling like clangd
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
option(OPENGL "Use OpenGL as underlying GL. Should be ON for now." ON)
option(AUDIO "Enable audio." ON)
option(GORGON_FAST_ANY "Make any to work fast by removing empty checks. This will only apply to release mode." OFF)
option(SCRIPTING "Enable scripting module." ON)
option(GSCRIPT_GENERATOR "Create scripting resources." OFF)
option(NO_LOGGING "Disables logger globally. If set, unit tests for logging will fail." OFF)
option(TESTMODE "Enable test mode." OFF)
option(DOCUMENTATION_GRAPHS "Enable graphs in documentation." OFF)
option(TESTS "Enable compiling of test applications." OFF)
option(CODE_COVERAGE "Enable coverage flags" OFF)
if(WIN32)
set(PNG BUILTIN CACHE STRING "Use built-in or system PNG library.")
else()
set(PNG SYSTEM CACHE STRING "Use system or built-in PNG library.")
endif()
if(NOT PNG IN_LIST gorgon_external_mandatory_options)
message(FATAL_ERROR "PNG should be set to one of ${gorgon_external_options}")
endif()
set_property(CACHE PNG PROPERTY STRINGS ${gorgon_external_mandatory_options})
if(WIN32)
set(FLAC BUILTIN CACHE STRING "Enable FLAC decoding and streaming.")
else()
set(FLAC SYSTEM CACHE STRING "Enable FLAC decoding and streaming.")
endif()
if(NOT FLAC IN_LIST gorgon_external_options)
message(FATAL_ERROR "FLAC should be set to one of ${gorgon_external_options}")
endif()
set_property(CACHE FLAC PROPERTY STRINGS ${gorgon_external_options})
option(UI "Enable UI subsystem." ON)
if(WIN32)
set(FREETYPE BUILTIN CACHE STRING "Enable FreeType font support")
else()
set(FREETYPE SYSTEM CACHE STRING "Enable FreeType font support")
endif()
if("${FREETYPE}" STREQUAL "ON")
set(FREETYPE SYSTEM CACHE STRING "Enable FreeType font support" FORCE)
endif()
if(NOT FREETYPE IN_LIST gorgon_external_options)
message(FATAL_ERROR "FREETYPE should be set to one of ${gorgon_external_options}")
endif()
set_property(CACHE FREETYPE PROPERTY STRINGS ${gorgon_external_options})
if(WIN32)
set(VORBIS BUILTIN CACHE STRING "Enable Vorbis audio support")
else()
set(VORBIS SYSTEM CACHE STRING "Enable Vorbis audio support")
endif()
if(NOT VORBIS IN_LIST gorgon_external_options)
message(FATAL_ERROR "VORBIS should be set to one of ${gorgon_external_options}")
endif()
set_property(CACHE VORBIS PROPERTY STRINGS ${gorgon_external_options})
if(WIN32)
set(FONTCONFIG NONE CACHE STRING "Enable Font config support")
else()
set(FONTCONFIG SYSTEM CACHE STRING "Enable Font config support")
endif()
if("${FONTCONFIG}" STREQUAL "ON")
set(FONTCONFIG SYSTEM CACHE STRING "Enable FreeType font support" FORCE)
endif()
if(NOT FONTCONFIG IN_LIST gorgon_external_options)
message(FATAL_ERROR "FONTCONFIG should be set to one of ${gorgon_external_options}")
endif()
set_property(CACHE FONTCONFIG PROPERTY STRINGS ${gorgon_external_options})
OPTION(FORCE_32_BIT "Force 32 bit compilation" OFF)
set(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
set(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
set(INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")
if(GSCRIPT_GENERATOR)
add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Tools/GscriptGenerator")
endif()
set(ADDITIONAL_CLIENT_FLAGS)
if(NOT(${FORCE_32_BIT}))
set(FIND_LIBRARY_USE_LIB64_PATHS ON)
if(NOT WIN32)
list(INSERT CMAKE_SYSTEM_LIBRARY_PATH 0 /usr/lib64)
endif()
endif()
if(AUDIO AND(NOT AUDIOLIB OR AUDIOLIB STREQUAL ""))
if(WIN32)
set(AUDIOLIB WASAPI)
else()
set(AUDIOLIB PULSE)
endif()
endif()
if(AUDIO)
add_definitions("-DAUDIO")
add_definitions("-DAUDIO_${AUDIOLIB}")
string(APPEND ADDITIONAL_CLIENT_FLAGS " -DAUDIO")
string(APPEND ADDITIONAL_CLIENT_FLAGS " -DAUDIO_${AUDIOLIB}")
endif()
if(FREETYPE STREQUAL "SYSTEM" OR FREETYPE STREQUAL "BUILTIN")
add_definitions("-DFREETYPE_SUPPORT")
string(APPEND ADDITIONAL_CLIENT_FLAGS " -DFREETYPE_SUPPORT")
endif()
if(FLAC STREQUAL "SYSTEM" OR FLAC STREQUAL "BUILTIN")
add_definitions("-DFLAC_SUPPORT")
string(APPEND ADDITIONAL_CLIENT_FLAGS " -DFLAC_SUPPORT")
endif()
if(VORBIS STREQUAL "SYSTEM" OR VORBIS STREQUAL "BUILTIN")
add_definitions("-DVORBIS_SUPPORT")
string(APPEND ADDITIONAL_CLIENT_FLAGS " -DVORBIS_SUPPORT")
endif()
if(FONTCONFIG STREQUAL "SYSTEM" OR FONTCONFIG STREQUAL "BUILTIN")
add_definitions("-DFONTCONFIG_SUPPORT")
string(APPEND ADDITIONAL_CLIENT_FLAGS " -DFONTCONFIG_SUPPORT")
endif()
if(SCRIPTING)
add_definitions("-DSCRIPTING")
string(APPEND ADDITIONAL_CLIENT_FLAGS " -DSCRIPTING")
endif()
if(OPENGL)
set(OpenGL_GL_PREFERENCE "LEGACY")
endif()
if(DOCUMENTATION_GRAPHS)
set(DOXYGRAPH YES)
else()
set(DOXYGRAPH NO)
endif()
if(TESTMODE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DTEST")
endif()
if(CODE_COVERAGE)
add_compile_options(--coverage -O0 -g)
add_link_options(--coverage)
endif()
if(NO_LOGGING)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNO_LOGGING")
endif()
if(GORGON_FAST_ANY)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DGORGON_FAST_ANY")
endif()
if(OPENGL)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOPENGL")
endif()
if(UI)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_UI")
endif()
if(UNIX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLINUX -Werror=return-type")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800")
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGLM_SWIZZLE -DGLM_FORCE_RADIANS")
foreach(p LIB BIN INCLUDE CMAKE)
set(var INSTALL_${p}_DIR)
if(NOT IS_ABSOLUTE "${${var}}")
set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
endif()
endforeach()
include(Scripts/Compiler.cmake)
include(Scripts/Macros.cmake)
set(DebugLibs "")
set(OptimizedLibs "")
StartSource(Source/Gorgon)
if(TESTS)
include(Scripts/Testing.cmake)
enable_testing() # Eklenmesi gereken satır
endif()
include(Scripts/Doxygen.cmake)
add_library(Gorgon STATIC ${All})
if(MSVC)
target_compile_options(Gorgon PRIVATE "/MP")
endif()
set_property(TARGET Gorgon PROPERTY CXX_STANDARD 14)
set_target_properties(Gorgon PROPERTIES
DEBUG_OUTPUT_NAME Gorgon_d
RELWITHDEBINFO_OUTPUT_NAME Gorgon_rd
MINSIZEREL_OUTPUT_NAME Gorgon_min
)
if(NOT ${deps} STREQUAL "")
add_dependencies(Gorgon ${deps})
endif()
include_directories(Source/External)
include_directories(Source)
include(Scripts/Libs.cmake)
target_link_libraries(Gorgon ${Libs})
if(NOT DebugLibs STREQUAL "")
target_link_libraries(Gorgon debug ${DebugLibs})
endif()
if(NOT OptimizedLibs STREQUAL "")
target_link_libraries(Gorgon optimized ${OptimizedLibs})
endif()
install(TARGETS Gorgon
EXPORT GorgonTargets
ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
PUBLIC_HEADER DESTINATION "${INSTALL_INCLUDE_DIR}/Gorgon"
)
export(TARGETS Gorgon APPEND FILE "${PROJECT_PACKAGE_DIR}/GorgonTargets.cmake")
export(PACKAGE Gorgon)
if(WIN32)
add_definitions("-DDWM")
else()
add_definitions("-DX11")
endif()
file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}" "${INSTALL_INCLUDE_DIR}")
set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/Source")
configure_file(Scripts/GorgonConfig.cmake.in
"${PROJECT_PACKAGE_DIR}/GorgonConfig.cmake" @ONLY)
set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/Source")
configure_file(Scripts/GorgonConfig.cmake.in
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/GorgonConfig.cmake" @ONLY)
configure_file(Scripts/GorgonConfigVersion.cmake.in
"${PROJECT_PACKAGE_DIR}/GorgonConfigVersion.cmake" @ONLY)
install(FILES
"${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/GorgonConfig.cmake"
"${PROJECT_PACKAGE_DIR}/GorgonConfigVersion.cmake"
DESTINATION "${INSTALL_CMAKE_DIR}"
)
install(EXPORT GorgonTargets DESTINATION "${INSTALL_CMAKE_DIR}")
if(CODE_COVERAGE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
add_compile_options(--coverage -O0 -g)
add_link_options(--coverage)
endif()
if(CODE_COVERAGE AND TESTS)
find_program(GCOVR_COMMAND gcov)
if(GCOVR_COMMAND)
add_custom_target(coverage
COMMAND ${GCOVR_COMMAND} -r ${CMAKE_SOURCE_DIR} -e ".*External.*" --html --html-details -o coverage.html
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Generating code coverage report with gcovr..."
)
else()
message(WARNING "gcov not found. The 'coverage' target will not be available.")
endif()
endif()
# Copy compile_commands.json to the source directory after building the target so editors can find it easily
if(CMAKE_EXPORT_COMPILE_COMMANDS)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${CMAKE_BINARY_DIR}/compile_commands.json
${CMAKE_CURRENT_SOURCE_DIR}/compile_commands.json
COMMENT "Copying compile_commands.json to source directory"
)
endif()