# PROJECT CMAKE FILE # This file is autogenerated by the creator script cmake_minimum_required(VERSION 3.10) if(POLICY CMP0077) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) endif() # set the project name and version project(cugl VERSION 3.0) # specify the C++ standard set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED True) set(BUILD_SHARED_LIBS OFF) # Define the options # The are potentially incompatible, but we sort this out in the build flags option(CUGL_AUDIO "Enable CUGL audio support" ON) option(CUGL_SCENE2 "Enable 2d CUGL scene graphs" ON) option(CUGL_SCENE3 "Enable 3d CUGL scene graphs" ON) option(CUGL_PHYSICS2 "Enable box2d for CUGL" ON) option(CUGL_NETCODE "Enable CUGL networking" ON) option(CUGL_PHYSICS2_DISTRIB "Enable distributed box2d for CUGL" ON) option(CUGL_PHYSICS2_LIGHTS "Enable box2d shadows for CUGL" ON) # Determine the backend set(DEFAULT_BACKEND "opengl") set(CUGL_BACKEND ${DEFAULT_BACKEND} CACHE STRING "BACKEND: headless, opengl, vulkan") if (CUGL_BACKEND STREQUAL "headless") set(CUGL_BACKEND ${DEFAULT_BACKEND}) endif() # Only allow this makefile as a subdirectory if(NOT DEFINED CUGL_DIR) message(FATAL_ERROR, "Makefile for CUGL must be called as a subdirectory") endif() # Build flags for options set(BUILD_CUGL_HEADLESS OFF) set(BUILD_CUGL_OPENGL OFF) set(BUILD_CUGL_VULKAN OFF) if(CUGL_BACKEND STREQUAL "opengl") set(BUILD_CUGL_OPENGL ON) elseif(CUGL_BACKEND STREQUAL "vulkan") set(BUILD_CUGL_VULKAN ON) message(FATAL_ERROR "BACKEND=vulkan is not supported yet.\n" "Please use: headless or opengl.") endif() set(BUILD_CUGL_AUDIO ${CUGL_AUDIO}) set(BUILD_CUGL_SCENE2 ${CUGL_SCENE2}) set(BUILD_CUGL_SCENE3 ${CUGL_SCENE3}) set(BUILD_CUGL_PHYSICS2_DISTRIB ${CUGL_PHYSICS2_DISTRIB}) set(BUILD_CUGL_PHYSICS2_LIGHTS ${CUGL_PHYSICS2_LIGHTS}) if (CUGL_PHYSICS2_DISTRIB OR CUGL_PHYSICS2_LIGHTS) set(BUILD_CUGL_PHYSICS2 ON) else() set(BUILD_CUGL_PHYSICS2 ${CUGL_PHYSICS2}) endif() if (CUGL_PHYSICS2_DISTRIB) set(BUILD_CUGL_NETCODE ON) else() set(BUILD_CUGL_NETCODE ${CUGL_NETCODE}) endif() # Set up the directories if(NOT DEFINED SDL3_DIR) set(SDL3_DIR "${CUGL_DIR}/external/SDL_app") endif() if(NOT DEFINED BOX2_DIR) set(BOX2_DIR "${CUGL_DIR}/external/box2d") endif() if(NOT DEFINED POLY2_DIR) set(POLY2_DIR "${CUGL_DIR}/external/poly2tri") endif() if(NOT DEFINED WRTC_DIR) set(WRTC_DIR "${CUGL_DIR}/external/libdatachannel") endif() set(OSSL_DIR "${CUGL_DIR}/external/openssl") set(SDL3_APP_DIR "${SDL3_DIR}") # It is easiest (no compiler defines) to include everything list(APPEND EXTRA_INCLUDES "${CUGL_DIR}/include") list(APPEND EXTRA_INCLUDES "${CUGL_DIR}/external/SDL_app/include") list(APPEND EXTRA_INCLUDES "${CUGL_DIR}/external/SDL_app/components/SDL/include") list(APPEND EXTRA_INCLUDES "${CUGL_DIR}/external/SDL_app/components/SDL_atk/include") list(APPEND EXTRA_INCLUDES "${CUGL_DIR}/external/SDL_app/components/SDL_image/include") list(APPEND EXTRA_INCLUDES "${CUGL_DIR}/external/SDL_app/components/SDL_ttf/include") list(APPEND EXTRA_INCLUDES "${POLY2_DIR}") list(APPEND EXTRA_INCLUDES "${BOX2_DIR}/include") list(APPEND EXTRA_INCLUDES "${WRTC_DIR}/include") if (BUILD_CUGL_OPENGL) add_compile_definitions(CU_USE_OPENGL) elseif (BUILD_CUGL_VULKAN) add_compile_definitions(CU_USE_VULKAN) endif() # GATHER THE LIBRARES set(CORE_LIBS) set(NETCODE_LIBS) set(PHYSICS2_LIBS) # SDL3 set(SDL3APP_BUILD_SHARED_LIBS OFF) add_subdirectory(sdl3app) list(APPEND CORE_LIBS SDL3_app::SDL3_app-static) # poly2tri add_subdirectory(external/poly2tri) list(APPEND CORE_LIBS poly2tri) # CUGL CORE file(GLOB CORE_FILES CONFIGURE_DEPENDS ${CUGL_DIR}/source/core/*.cpp ${CUGL_DIR}/source/core/actions/*.cpp ${CUGL_DIR}/source/core/assets/*.c ${CUGL_DIR}/source/core/assets/*.cpp ${CUGL_DIR}/source/core/input/*.cpp ${CUGL_DIR}/source/core/input/gestures/*.cpp ${CUGL_DIR}/source/core/io/*.cpp ${CUGL_DIR}/source/core/math/*.cpp ${CUGL_DIR}/source/core/math/polygon/*.cpp ${CUGL_DIR}/source/core/util/*.cpp) add_library(cugl-core ${CORE_FILES}) target_link_libraries(cugl-core ${CORE_LIBS}) target_include_directories(cugl-core PUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} ) list(APPEND CUGL_PCKG_LIBS cugl-core) # CUGL GRAPHICS file(GLOB GRAPHICS_COMMON CONFIGURE_DEPENDS ${CUGL_DIR}/source/graphics/*.cpp ${CUGL_DIR}/source/graphics/loaders/*.cpp) set(GRAPHICS_BACKEND) if (BUILD_CUGL_OPENGL) file(GLOB GRAPHICS_BACKEND CONFIGURE_DEPENDS ${CUGL_DIR}/source/graphics/opengl/*.cpp) elseif (BUILD_CUGL_VULKAN) file(GLOB GRAPHICS_BACKEND CONFIGURE_DEPENDS ${CUGL_DIR}/source/graphics/vulkan/*.cpp) endif() set(GRAPHICS_FILES ${GRAPHICS_COMMON} ${GRAPHICS_BACKEND}) add_library(cugl-graphics ${GRAPHICS_FILES}) target_include_directories(cugl-graphics PUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} ) list(APPEND CUGL_PCKG_LIBS cugl-graphics) # CUGL AUDIO if (BUILD_CUGL_AUDIO) file(GLOB AUDIO_FILES CONFIGURE_DEPENDS ${CUGL_DIR}/source/audio/*.cpp ${CUGL_DIR}/source/audio/graph/*.cpp) add_library(cugl-audio ${AUDIO_FILES}) target_include_directories(cugl-audio PUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} ) list(APPEND CUGL_PCKG_LIBS cugl-audio) endif() # CUGL SCENE2 if (BUILD_CUGL_SCENE2) file(GLOB SCENE2_FILES CONFIGURE_DEPENDS ${CUGL_DIR}/source/scene2/*.cpp ${CUGL_DIR}/source/scene2/layout/*.cpp) add_library(cugl-scene2 ${SCENE2_FILES}) target_include_directories(cugl-scene2 PUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} ) list(APPEND CUGL_PCKG_LIBS cugl-scene2) endif() # CUGL SCENE3 if (BUILD_CUGL_SCENE3) file(GLOB SCENE3_FILES CONFIGURE_DEPENDS ${CUGL_DIR}/source/scene3/*.cpp) add_library(cugl-scene3 ${SCENE3_FILES}) target_include_directories(cugl-scene3 PUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} ) list(APPEND CUGL_PCKG_LIBS cugl-scene3) endif() # CUGL PHYSICS2 if (BUILD_CUGL_PHYSICS2) # box2d add_subdirectory(external/box2d) list(APPEND PHYSICS2_LIBS box2d) file(GLOB PHYSICS2_FILES CONFIGURE_DEPENDS ${CUGL_DIR}/source/physics2/*.cpp) add_library(cugl-physics2 ${PHYSICS2_FILES}) target_link_libraries(cugl-physics2 ${PHYSICS2_LIBS}) target_include_directories(cugl-physics2 PUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} ) list(APPEND CUGL_PCKG_LIBS cugl-physics2) endif() # CUGL NETCODE if (BUILD_CUGL_NETCODE) # libdatachannel add_subdirectory(external/libdatachannel) list(APPEND NETCODE_LIBS datachannel) file(GLOB NETCODE_FILES CONFIGURE_DEPENDS ${CUGL_DIR}/source/netcode/*.cpp) add_library(cugl-netcode ${NETCODE_FILES}) target_link_libraries(cugl-netcode ${NETCODE_LIBS}) target_include_directories(cugl-netcode PUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} ) list(APPEND CUGL_PCKG_LIBS cugl-netcode) endif() # CUGL DISTRIBUTED PHYSICS if (BUILD_CUGL_PHYSICS2_DISTRIB) file(GLOB PHYSICS_DISTRIB_FILES CONFIGURE_DEPENDS ${CUGL_DIR}/source/physics2/distrib/*.cpp) add_library(cugl-distrib-physics2 ${PHYSICS_DISTRIB_FILES}) target_include_directories(cugl-distrib-physics2 PUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} ) list(APPEND CUGL_PCKG_LIBS cugl-distrib-physics2) endif() # CUGL PHYSICS LIGHTING if (BUILD_CUGL_PHYSICS2_LIGHTS) file(GLOB PHYSICS_LIGHTS_FILES CONFIGURE_DEPENDS ${CUGL_DIR}/source/physics2/lights/*.cpp) add_library(cugl-lights-physics2 ${PHYSICS_LIGHTS_FILES}) target_include_directories(cugl-lights-physics2 PUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} ) list(APPEND CUGL_PCKG_LIBS cugl-lights-physics2) endif() # GLOBAL INTERFACE add_library(cugl INTERFACE) target_link_libraries(cugl INTERFACE ${CUGL_PCKG_LIBS}) target_include_directories(cugl INTERFACE "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} )