mirror of
https://github.com/AlexAltea/nucleus.git
synced 2024-05-16 11:10:40 -04:00
221 lines
7.4 KiB
CMake
221 lines
7.4 KiB
CMake
cmake_minimum_required(VERSION 2.8)
|
|
project(nucleus)
|
|
|
|
# Cross-compiling
|
|
option(TARGET_ANDROID "Enable to target Android devices")
|
|
option(TARGET_IOS "Enable to target iOS devices")
|
|
option(TARGET_LINUX "Enable to target X11-based Linux distributions")
|
|
option(TARGET_OSX "Enable to target OS X systems")
|
|
option(TARGET_UWP "Enable to target the Universal Windows Platform")
|
|
option(TARGET_WINDOWS "Enable to target desktop Windows systems")
|
|
|
|
# Guest platforms
|
|
option(PLATFORM_ANY "Enable to support emulation in any available platform")
|
|
option(PLATFORM_PS3 "Enable to support PlayStation 3 emulation")
|
|
option(PLATFORM_PS4 "Enable to support PlayStation 4 emulation")
|
|
option(PLATFORM_PSP "Enable to support PlayStation Portable emulation")
|
|
option(PLATFORM_PSVITA "Enable to support PlayStation Vita emulation")
|
|
|
|
# Features
|
|
set(FEATURE_AUDIO_BACKEND_XAUDIO2 "False")
|
|
set(FEATURE_CPU_BACKEND_ARM "False")
|
|
set(FEATURE_CPU_BACKEND_X86 "False")
|
|
set(FEATURE_GFX_BACKEND_DIRECT3D11 "False")
|
|
set(FEATURE_GFX_BACKEND_DIRECT3D12 "False")
|
|
set(FEATURE_GFX_BACKEND_OPENGL "False")
|
|
set(FEATURE_GFX_BACKEND_VULKAN "False")
|
|
|
|
# Target auto-select
|
|
if (NOT (TARGET_ANDROID OR TARGET_IOS OR TARGET_LINUX OR TARGET_OSX OR TARGET_UWP OR TARGET_WINDOWS))
|
|
message(STATUS "No target system specified (-DTARGET_*=ON). Choosing target automatically...")
|
|
if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
|
message(STATUS "Using TARGET_LINUX.")
|
|
set(TARGET_LINUX ON)
|
|
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
message(STATUS "Using TARGET_OSX.")
|
|
set(TARGET_OSX ON)
|
|
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
|
message(STATUS "Using TARGET_WINDOWS.")
|
|
set(TARGET_WINDOWS ON)
|
|
endif()
|
|
endif()
|
|
|
|
# Feature auto-select
|
|
if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
|
set(FEATURE_GFX_BACKEND_OPENGL "True")
|
|
set(FEATURE_GFX_BACKEND_VULKAN "True")
|
|
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
set(FEATURE_GFX_BACKEND_OPENGL "True")
|
|
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
|
set(FEATURE_AUDIO_BACKEND_XAUDIO2 "True")
|
|
set(FEATURE_GFX_BACKEND_DIRECT3D11 "True")
|
|
set(FEATURE_GFX_BACKEND_DIRECT3D12 "True")
|
|
set(FEATURE_GFX_BACKEND_OPENGL "True")
|
|
set(FEATURE_GFX_BACKEND_VULKAN "True")
|
|
endif()
|
|
|
|
# Paths
|
|
set(NUCLEUS_PATH_SOLUTION ${CMAKE_CURRENT_LIST_DIR})
|
|
set(NUCLEUS_PATH_BINARIES "${NUCLEUS_PATH_SOLUTION}/bin/")
|
|
set(NUCLEUS_PATH_EXTERNALS "${NUCLEUS_PATH_SOLUTION}/externals")
|
|
set(NUCLEUS_PATH_LIBRARIES "${NUCLEUS_PATH_SOLUTION}/libs/")
|
|
set(NUCLEUS_PATH_TESTS "${NUCLEUS_PATH_SOLUTION}/tests/")
|
|
set(NUCLEUS_PATH_WRAPPERS "${NUCLEUS_PATH_SOLUTION}/wrappers/")
|
|
|
|
# Project
|
|
if(NOT MSVC)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fpermissive -pthread")
|
|
endif()
|
|
|
|
# Dependencies
|
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
|
|
find_package(OpenGL QUIET)
|
|
find_package(ZLIB QUIET)
|
|
find_package(X11 QUIET)
|
|
find_package(XCB QUIET)
|
|
|
|
if (NOT OPENGL_FOUND)
|
|
message(WARNING "OpenGL not found. Corresponding backend will be disabled")
|
|
set(FEATURE_GFX_BACKEND_OPENGL "False")
|
|
endif()
|
|
|
|
file(GLOB_RECURSE NUCLEUS_FILES
|
|
"${NUCLEUS_PATH_SOLUTION}/externals/mongoose/mongoose.c"
|
|
"${NUCLEUS_PATH_SOLUTION}/externals/mongoose/mongoose.h"
|
|
"${NUCLEUS_PATH_SOLUTION}/externals/aes.cpp"
|
|
"${NUCLEUS_PATH_SOLUTION}/externals/aes.h"
|
|
"${NUCLEUS_PATH_SOLUTION}/externals/sha1.cpp"
|
|
"${NUCLEUS_PATH_SOLUTION}/externals/sha1.h"
|
|
"${NUCLEUS_PATH_SOLUTION}/nucleus/*.cpp"
|
|
"${NUCLEUS_PATH_SOLUTION}/nucleus/*.h"
|
|
)
|
|
|
|
# File specification macro
|
|
macro(NUCLEUS_FILES_APPEND)
|
|
file(GLOB_RECURSE FILES_APPEND ${ARGV})
|
|
list(APPEND NUCLEUS_FILES ${FILES_APPEND})
|
|
endmacro()
|
|
macro(NUCLEUS_FILES_REMOVE)
|
|
file(GLOB_RECURSE FILES_REMOVE ${ARGV})
|
|
list(REMOVE_ITEM NUCLEUS_FILES ${FILES_REMOVE})
|
|
endmacro()
|
|
|
|
# Set target-dependent files
|
|
if (TARGET_ANDROID)
|
|
NUCLEUS_FILES_APPEND(
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/android/*.cpp"
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/android/*.h"
|
|
)
|
|
elseif (TARGET_IOS)
|
|
NUCLEUS_FILES_APPEND(
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/ios/*.cpp"
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/ios/*.h"
|
|
)
|
|
elseif (TARGET_LINUX)
|
|
NUCLEUS_FILES_APPEND(
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/linux/*.cpp"
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/linux/*.h"
|
|
)
|
|
elseif (TARGET_OSX)
|
|
NUCLEUS_FILES_APPEND(
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/osx/*.cpp"
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/osx/*.h"
|
|
)
|
|
elseif (TARGET_UWP)
|
|
NUCLEUS_FILES_APPEND(
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/uwp/*.cpp"
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/uwp/*.h"
|
|
)
|
|
elseif (TARGET_WINDOWS)
|
|
NUCLEUS_FILES_APPEND(
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/windows/*.cpp"
|
|
"${NUCLEUS_PATH_SOLUTION}/wrappers/windows/*.h"
|
|
)
|
|
endif()
|
|
|
|
# Set feature-dependent files
|
|
if (NOT FEATURE_AUDIO_BACKEND_XAUDIO2)
|
|
NUCLEUS_FILES_REMOVE(
|
|
"${NUCLEUS_PATH_SOLUTION}/nucleus/audio/backend/xaudio2/*"
|
|
)
|
|
endif()
|
|
if (NOT FEATURE_GFX_BACKEND_DIRECT3D11)
|
|
NUCLEUS_FILES_REMOVE(
|
|
"${NUCLEUS_PATH_SOLUTION}/nucleus/graphics/backend/direct3d11/*"
|
|
)
|
|
endif()
|
|
if (NOT FEATURE_GFX_BACKEND_DIRECT3D12)
|
|
NUCLEUS_FILES_REMOVE(
|
|
"${NUCLEUS_PATH_SOLUTION}/nucleus/graphics/backend/direct3d12/*"
|
|
)
|
|
endif()
|
|
if (NOT FEATURE_GFX_BACKEND_OPENGL)
|
|
NUCLEUS_FILES_REMOVE(
|
|
"${NUCLEUS_PATH_SOLUTION}/nucleus/graphics/backend/opengl/*"
|
|
)
|
|
endif()
|
|
if (NOT FEATURE_GFX_BACKEND_VULKAN)
|
|
NUCLEUS_FILES_REMOVE(
|
|
"${NUCLEUS_PATH_SOLUTION}/nucleus/graphics/backend/vulkan/*"
|
|
)
|
|
endif()
|
|
|
|
# Executable
|
|
add_executable(nucleus ${NUCLEUS_FILES})
|
|
set_target_properties(nucleus PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${NUCLEUS_PATH_BINARIES})
|
|
set_target_properties(nucleus PROPERTIES OUTPUT_NAME "Nucleus")
|
|
set_target_properties(nucleus PROPERTIES LINKER_LANGUAGE CXX)
|
|
include_directories(${NUCLEUS_PATH_SOLUTION})
|
|
|
|
# Set feature definitions
|
|
if (FEATURE_AUDIO_BACKEND_XAUDIO2)
|
|
add_definitions(-D_NUCLEUS_FEATURE_AUDIOBACKEND_XAUDIO2)
|
|
endif()
|
|
if (FEATURE_GFX_BACKEND_DIRECT3D11)
|
|
add_definitions(-D_NUCLEUS_FEATURE_GFXBACKEND_DIRECT3D11)
|
|
endif()
|
|
if (FEATURE_GFX_BACKEND_DIRECT3D12)
|
|
add_definitions(-D_NUCLEUS_FEATURE_GFXBACKEND_DIRECT3D12)
|
|
endif()
|
|
if (FEATURE_GFX_BACKEND_OPENGL)
|
|
add_definitions(-D_NUCLEUS_FEATURE_GFXBACKEND_OPENGL)
|
|
endif()
|
|
if (FEATURE_GFX_BACKEND_VULKAN)
|
|
add_definitions(-D_NUCLEUS_FEATURE_GFXBACKEND_VULKAN)
|
|
endif()
|
|
|
|
# Dependencies
|
|
if (OPENGL_FOUND)
|
|
target_link_libraries(nucleus ${OPENGL_LIBRARIES})
|
|
endif()
|
|
|
|
if (ZLIB_FOUND)
|
|
include_directories(${ZLIB_INCLUDE_DIR})
|
|
target_link_libraries(nucleus ${ZLIB_LIBRARY})
|
|
else()
|
|
file(GLOB_RECURSE ZLIB_FILES
|
|
"${NUCLEUS_PATH_EXTERNALS}/zlib/*.c"
|
|
"${NUCLEUS_PATH_EXTERNALS}/zlib/*.h"
|
|
)
|
|
add_library(zlib STATIC ${ZLIB_FILES})
|
|
include_directories("${NUCLEUS_PATH_EXTERNALS}/zlib")
|
|
target_link_libraries(nucleus zlib)
|
|
endif()
|
|
|
|
# Set platform-dependent dependencies
|
|
if (TARGET_LINUX)
|
|
target_link_libraries(nucleus ${CMAKE_DL_LIBS})
|
|
if (X11_FOUND)
|
|
include_directories(${X11_INCLUDE_DIR})
|
|
target_link_libraries(nucleus ${X11_LIBRARIES})
|
|
else()
|
|
message(FATAL_ERROR "X11 could not be located")
|
|
endif()
|
|
if (XCB_FOUND)
|
|
include_directories(${XCB_INCLUDE_DIRS})
|
|
target_link_libraries(nucleus ${XCB_LIBRARIES})
|
|
else()
|
|
message(FATAL_ERROR "XCB could not be located")
|
|
endif()
|
|
endif()
|