# PolyGun # Copyright (c) 2023 kacperks https://kacperks.cubesoftware.xyz # 2023 mrkubax10 # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. cmake_minimum_required(VERSION 3.19 FATAL_ERROR) project(polygun) if(SERENITYOS) set(CMAKE_CXX_STANDARD 20) else() set(CMAKE_CXX_STANDARD 17) endif() set(CMAKE_CXX_STANDARD_REQUIRED true) list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/mk/cmake") if(NOT BUILD_FLAG_SUPPRESS_WARNING_MODE) # Compile with highest warning mode by default if(MSVC) set(DEFAULT_COMPILE_OPTIONS /W4 /WX) else() set(DEFAULT_COMPILE_OPTIONS -Wall -Wpedantic -Werror) endif() endif() include_directories(deps) include_directories("${CMAKE_SOURCE_DIR}/src") include_directories("${CMAKE_BINARY_DIR}") option(BUILD_CLIENT "Build client" ON) option(BUILD_SERVER "Build server" ON) option(BUILD_TOOLS "Build tools" OFF) if(APPLE OR SERENITYOS) set(RENDERER_GL_DEFAULT OFF) else() set(RENDERER_GL_DEFAULT ON) endif() option(RENDERER_GL "Enable OpenGL renderer" ${RENDERER_GL_DEFAULT}) if(SERENITYOS) set(RENDERER_LEGACY_GL_DEFAULT ON) else() set(RENDERER_LEGACY_GL_DEFAULT OFF) endif() # Please note that LEGACY_GL renderer should be only used on hardware/operating systems that do not support OpenGL 2.0+ option(RENDERER_LEGACY_GL "Enable legacy OpenGL renderer" ${RENDERER_LEGACY_GL_DEFAULT}) if(NOT BUILD_CLIENT) set(RENDERER_GL OFF) set(RENDERER_LEGACY_GL OFF) endif() if(WIN32) set(WINDOW_WIN32_DEFAULT ON) else() set(WINDOW_WIN32_DEFAULT OFF) endif() option(WINDOW_WIN32 "Enable Win32 window creation (Windows only)" ${WINDOW_WIN32_DEFAULT}) if(UNIX AND NOT APPLE AND NOT SERENITYOS) if(X11_INCLUDE_DIRS AND X11_LIBRARIES) set(WINDOW_X11_DEFAULT ON) else() find_package(X11 QUIET) if(X11_FOUND) set(WINDOW_X11_DEFAULT ON) else() set(WINDOW_X11_DEFAULT OFF) endif() endif() endif() option(WINDOW_X11 "Enable X11 window creation" ${WINDOW_X11_DEFAULT}) if(UNIX AND NOT APPLE AND NOT SERENITYOS) if(WaylandClient_INCLUDE_DIR AND WaylandClient_LIBRARY) set(WINDOW_WAYLAND_DEFAULT ON) else() find_package(WaylandClient QUIET) if(WaylandClient_FOUND) set(WINDOW_WAYLAND_DEFAULT ON) else() set(WINDOW_WAYLAND_DEFAULT OFF) endif() endif() endif() option(WINDOW_WAYLAND "Enable Wayland window creation" ${WINDOW_WAYLAND_DEFAULT}) if(SERENITYOS) set(WINDOW_SERENITYOS_DEFAULT ON) execute_process(COMMAND patch INPUT_FILE mk/fixes/serenityos/01_angelscript_no_malloc_h.diff) add_definitions("-D__serenityos__") endif() option(WINDOW_SERENITYOS "Enable SerenityOS window creation" ${WINDOW_SERENITYOS_DEFAULT}) if(BUILD_CLIENT) set(CLIENT_SOURCES src/game/audio/audio.cpp src/game/audio/buffer.cpp src/game/audio/source.cpp src/game/engine/content_registry.cpp src/game/engine/engine.cpp src/game/engine/greedy_meshing.cpp src/game/engine/player_camera.cpp src/game/engine/resource_manager.cpp src/game/engine/screen_manager.cpp src/game/engine/texture_atlas.cpp src/game/gui/box.cpp src/game/gui/button.cpp src/game/gui/component.cpp src/game/gui/constraint.cpp src/game/gui/container.cpp src/game/gui/gui_master.cpp src/game/gui/label.cpp src/game/gui/layout.cpp src/game/gui/style_change_listener.cpp src/game/gui/style.cpp src/game/gui/text_edit.cpp src/game/math/rect.cpp src/game/renderer/font.cpp src/game/renderer/gui_renderer.cpp src/game/renderer/master_renderer.cpp src/game/renderer/mesh.cpp src/game/renderer/mesh_renderer.cpp src/game/renderer/ortho_camera.cpp src/game/renderer/surface.cpp src/game/renderer/texture.cpp src/game/renderer/vertex_array.cpp src/game/screens/game_session_screen.cpp src/game/screens/main_menu_screen.cpp src/game/window/keyboard.cpp src/game/window/mouse.cpp src/game/window/window.cpp src/game/world/chunk.cpp ) if(RENDERER_GL) list(APPEND CLIENT_SOURCES src/game/renderer/gl/gl_context.cpp src/game/renderer/gl/gl_gui_renderer.cpp src/game/renderer/gl/gl_mesh.cpp src/game/renderer/gl/gl_mesh_renderer.cpp src/game/renderer/gl/gl_shader.cpp src/game/renderer/gl/gl_texture.cpp src/game/renderer/gl/opengl.cpp ) endif() if(RENDERER_LEGACY_GL) list(APPEND CLIENT_SOURCES src/game/renderer/gl/gl_context.cpp src/game/renderer/gl/gl_texture.cpp src/game/renderer/gl/opengl.cpp src/game/renderer/legacy_gl/legacy_gl_mesh.cpp src/game/renderer/legacy_gl/legacy_gl_mesh_renderer.cpp ) endif() if(WINDOW_WIN32) list(APPEND CLIENT_SOURCES src/game/window/win32_window.cpp ) if(RENDERER_GL OR RENDERER_LEGACY_GL) list(APPEND CLIENT_SOURCES src/game/renderer/gl/win32_gl_context.cpp ) endif() endif() if(WINDOW_X11) list(APPEND CLIENT_SOURCES src/game/window/x11_window.cpp ) if(RENDERER_GL OR RENDERER_LEGACY_GL) list(APPEND CLIENT_SOURCES src/game/renderer/gl/x11_gl_context.cpp ) endif() endif() if(WINDOW_WAYLAND) list(APPEND CLIENT_SOURCES src/game/window/wayland_window.cpp ) if(RENDERER_GL OR RENDERER_LEGACY_GL) list(APPEND CLIENT_SOURCES src/game/renderer/gl/egl_gl_context.cpp ) endif() execute_process(COMMAND wayland-scanner client-header INPUT_FILE ${CMAKE_SOURCE_DIR}/mk/wayland/relative-pointer-unstable-v1.xml OUTPUT_FILE ${CMAKE_BINARY_DIR}/wayland-relative-pointer-unstable-v1.h) execute_process(COMMAND wayland-scanner private-code INPUT_FILE ${CMAKE_SOURCE_DIR}/mk/wayland/relative-pointer-unstable-v1.xml OUTPUT_FILE ${CMAKE_BINARY_DIR}/wayland-relative-pointer-unstable-v1.c) execute_process(COMMAND wayland-scanner client-header INPUT_FILE ${CMAKE_SOURCE_DIR}/mk/wayland/pointer-constraints-unstable-v1.xml OUTPUT_FILE ${CMAKE_BINARY_DIR}/wayland-pointer-constraints-unstable-v1.h) execute_process(COMMAND wayland-scanner private-code INPUT_FILE ${CMAKE_SOURCE_DIR}/mk/wayland/pointer-constraints-unstable-v1.xml OUTPUT_FILE ${CMAKE_BINARY_DIR}/wayland-pointer-constraints-unstable-v1.c) list(APPEND CLIENT_SOURCES ${CMAKE_BINARY_DIR}/wayland-relative-pointer-unstable-v1.c ${CMAKE_BINARY_DIR}/wayland-pointer-constraints-unstable-v1.c ) endif() if(WINDOW_SERENITYOS) list(APPEND CLIENT_SOURCES src/game/window/serenityos_window.cpp ) if(RENDERER_LEGACY_GL) list(APPEND CLIENT_SOURCES src/game/renderer/gl/serenityos_gl_context.cpp ) endif() endif() endif() if(BUILD_SERVER) file(GLOB_RECURSE SERVER_SOURCES "src/server/**.cpp") include(CheckCXXSourceCompiles) check_cxx_source_compiles( " #include #include int main(){ const char* sig = strsignal(SIGINT); return 0; } " HAVE_STRSIGNAL_CHECK ) if(HAVE_STRSIGNAL_CHECK) option(HAVE_STRSIGNAL "STRSIGNAL" ON) endif() endif() configure_file("config.hpp.in" "config.hpp") if(BUILD_TOOLS) add_executable("extract_strings" tools/extract_strings.cpp src/common/xml/xml_node.cpp src/common/xml/lexer.cpp src/common/xml/parser.cpp src/common/logger.cpp ) target_compile_options(extract_strings PRIVATE ${DEFAULT_COMPILE_OPTIONS}) endif() file(GLOB_RECURSE COMMON_SOURCES "src/common/**.cpp") if(BUILD_SERVER AND NOT BUILD_CLIENT) set(PROJECT_NAME "polygun_server") endif() if(NOT BUILD_CLIENT AND NOT BUILD_SERVER) message(FATAL_ERROR "You need to select at least one configuration (BUILD_CLIENT and/or BUILD_SERVER)") endif() add_executable(${PROJECT_NAME} ${CLIENT_SOURCES} ${SERVER_SOURCES} ${COMMON_SOURCES} src/main.cpp ) target_compile_options(${PROJECT_NAME} PRIVATE ${DEFAULT_COMPILE_OPTIONS}) if(BUILD_CLIENT) if(RENDERER_GL OR RENDERER_LEGACY_GL) set(RENDERER_GL_LIBRARIES OpenGL::GL) if(SERENITYOS) set(OPENGL_INCLUDE_DIR "/usr/include/LibGL") set(RENDERER_GL_LIBRARIES "gl;gfx") set(OPENGL_LIBRARIES "gl") endif() if(NOT OPENGL_INCLUDE_DIR OR NOT OPENGL_LIBRARIES) set(RENDERER_GL_COMPONENTS OpenGL) if(WINDOW_X11) list(APPEND RENDERER_GL_COMPONENTS ";GLX") list(APPEND RENDERER_GL_LIBRARIES ";OpenGL::GLX") endif() if(WINDOW_WAYLAND) list(APPEND RENDERER_GL_COMPONENTS ";EGL") list(APPEND RENDERER_GL_LIBRARIES ";OpenGL::EGL") if(NOT WaylandEGL_INCLUDE_DIR OR NOT WaylandEGL_LIBRARY) find_package(WaylandEGL REQUIRED) endif() include_directories(${WaylandEGL_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${WaylandEGL_LIBRARY}) endif() find_package(OpenGL REQUIRED COMPONENTS ${RENDERER_GL_COMPONENTS}) endif() include_directories(${OPENGL_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${RENDERER_GL_LIBRARIES}) endif() if(WINDOW_X11) if(NOT X11_INCLUDE_DIRS OR NOT X11_LIBRARIES) find_package(X11 REQUIRED) endif() include_directories(${X11_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} "${X11_LIBRARIES}") endif() if(WINDOW_WAYLAND) if(NOT WaylandClient_INCLUDE_DIR OR NOT WaylandClient_LIBRARY) find_package(WaylandClient REQUIRED) endif() include_directories(${WaylandClient_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${WaylandClient_LIBRARY}) if(NOT WaylandCursor_INCLUDE_DIR OR NOT WaylandCursor_LIBRARY) find_package(WaylandCursor REQUIRED) endif() include_directories(${WaylandCursor_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${WaylandCursor_LIBRARY}) if(NOT Libdecor_INCLUDE_DIR OR NOT Libdecor_LIBRARY) find_package(Libdecor REQUIRED) endif() include_directories(${Libdecor_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${Libdecor_LIBRARY}) if(NOT XKBCommon_INCLUDE_DIR OR NOT XKBCommon_LIBRARY) find_package(XKBCommon REQUIRED) endif() include_directories(${XKBCommon_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${XKBCommon_LIBRARY}) endif() if(NOT GLM_INCLUDE_DIRS) find_package(GLM REQUIRED) endif() include_directories("${GLM_INCLUDE_DIRS}") if(NOT OPENAL_INCLUDE_DIR OR NOT OPENAL_LIBRARY) find_package(OpenAL REQUIRED) endif() include_directories("${OPENAL_INCLUDE_DIR}") target_link_libraries(${PROJECT_NAME} "${OPENAL_LIBRARY}") if(NOT OGG_INCLUDE_DIR OR NOT OGG_LIBRARY OR NOT VORBIS_INCLUDE_DIR OR NOT VORBIS_LIBRARY) find_package(OggVorbis REQUIRED) endif() include_directories("${OGG_INCLUDE_DIR}") include_directories("${VORBIS_INCLUDE_DIR}") target_link_libraries(${PROJECT_NAME} "${VORBIS_LIBRARY}") target_link_libraries(${PROJECT_NAME} "${OGG_LIBRARY}") if(NOT PNG_INCLUDE_DIRS OR NOT PNG_LIBRARIES) find_package(PNG REQUIRED) endif() include_directories("${PNG_INCLUDE_DIRS}") target_link_libraries(${PROJECT_NAME} "${PNG_LIBRARIES}") if(NOT ZLIB_INCLUDE_DIRS OR NOT ZLIB_LIBRARIES) find_package(ZLIB REQUIRED) endif() include_directories("${ZLIB_INCLUDE_DIRS}") target_link_libraries(${PROJECT_NAME} "${ZLIB_LIBRARIES}") if(NOT FREETYPE_INCLUDE_DIRS OR NOT FREETYPE_LIBRARIES) find_package(Freetype REQUIRED) endif() include_directories(${FREETYPE_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} ${FREETYPE_LIBRARIES}) if(UNIX) target_link_libraries(${PROJECT_NAME} "dl") endif() endif() if(BUILD_SERVER) add_subdirectory("${CMAKE_SOURCE_DIR}/external/angelscript/angelscript/projects/cmake") include_directories("${CMAKE_SOURCE_DIR}/external/angelscript/angelscript/include") include_directories("${CMAKE_SOURCE_DIR}/external/angelscript/add_on") target_link_libraries(${PROJECT_NAME} "angelscript") add_library("angelscript_addons" STATIC external/angelscript/add_on/scriptstdstring/scriptstdstring.cpp external/angelscript/add_on/scriptstdstring/scriptstdstring_utils.cpp ) target_link_libraries(${PROJECT_NAME} "angelscript_addons") endif() if(WIN32) target_link_libraries(${PROJECT_NAME} "ws2_32") endif() if(SERENITYOS) target_link_libraries(${PROJECT_NAME} "gcc_s" "gui" "threading" "core") endif() find_package(Threads REQUIRED) target_link_libraries(${PROJECT_NAME} "${CMAKE_THREAD_LIBS_INIT}")