181 lines
7.2 KiB
CMake
181 lines
7.2 KiB
CMake
cmake_minimum_required(VERSION 3.22)
|
|
project(Step_3)
|
|
|
|
# I am using GCC-12
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
|
|
# You can ignore this as I am not using it for this project anymore
|
|
option(EnableDebugMenu "Enable the debug utils" OFF)
|
|
# Enable the GUI via GLFW. This requires libglfw3 and libglfw3-dev installed on your system. (X11 version is here but isn't support. Use at own risk.
|
|
# Why?
|
|
# I started with X11 because I really didn't want to bring GLFW in. When attempting to set the icon I found it extremely difficult
|
|
# I only managed to set the window icon but not the task bar icon and the window icon wasn't loading correct.
|
|
# plus debug mode was running at 5 fps which I initially blamed on XOrg (it wasn't X).
|
|
# also GLFW has better support as it deals with the quirks of XOrg / the X11 protocol for me.
|
|
# GUI isn't a requirement for ANY feature.
|
|
option(COMPILE_GUI "Enable compilation of the GUI + utils" OFF)
|
|
# Leave this unless you're an extremist who loves living on the edge.
|
|
option(USE_GLFW "Will try to use GLFW instead of X11. If libglfw3 and libglfw3-dev are not installed it will default to X11" ON)
|
|
# Requires you to have OpenMP installed on your system. The engine will work without this.
|
|
option(USE_OPENMP "Will try to use OpenMP. Requires OpenMP on your system." ON)
|
|
# Requires you have OpenMPI installed. The engine will work without this.
|
|
option(USE_MPI "Will try to use OpenMPI. Requires OpenMPI on your system." ON)
|
|
# Requires you to have an OpenCL IDC loader installed and working, should support CL2.0+ and you should also have any relevant dev libs/headers installed.
|
|
# Nvidia GPUs should work but I've only tested this on my 6700xt using a driver which was released a year before my card was even announced.
|
|
# Thanks AMD for only supporting ubuntu :/ Us debian users left in the dust >;(
|
|
# Why OpenCL? Let's go over the GPGPU options
|
|
# OpenGL Compute Shaders - Nice option but requires GUI and I don't require much more than what is provided by GLSL
|
|
# Vulkan Compute Shaders - Better option but requires GUI and I don't know Vulkan (yet)
|
|
# CUDA - Really good for devs with lots of great tools but is platform locked to nvidia. I have a 6700xt and run linux. Neither of these things play well with nvidia.
|
|
# OpenACC - No clue what this is
|
|
# ROCM - AMD's answer to CUDA. See above about AMD's ability to support things. (Pretty sure windows is completely out of the question here)
|
|
# OpenCL - Basically deprecated and treated as a joke. Tooling on AMD sucks so much especially on Linux. But it's the only "well" supported headless GPGPU option on this list.
|
|
option(COMPILE_OPENCL "Enable compilation of the OpenCL GPU Compute module." OFF)
|
|
|
|
|
|
|
|
#
|
|
# DO NOT TOUCH ANYTHING BELOW THIS LINE
|
|
# ====================================================================================================================
|
|
#
|
|
|
|
|
|
|
|
|
|
# used to debug memory related issues
|
|
if ((CMAKE_BUILD_TYPE MATCHES Debug))
|
|
if (UNIX)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -g")
|
|
add_compile_options(-fsanitize=address)
|
|
add_link_options(-fsanitize=address)
|
|
endif ()
|
|
set(COMPILER_DEBUG_ENABLED true)
|
|
message("Building for Debug")
|
|
else ()
|
|
set(COMPILER_DEBUG_ENABLED false)
|
|
message("Building for Release")
|
|
endif ()
|
|
set(COMPILER_DEBUG_ENABLED_BOOL true)
|
|
|
|
if (EnableDebugMenu MATCHES ON)
|
|
message("debug mode")
|
|
set(DEBUG_ENABLED true)
|
|
else ()
|
|
message("release mode")
|
|
set(DEBUG_ENABLED false)
|
|
endif (EnableDebugMenu MATCHES ON)
|
|
set(DEBUG_ENABLED_BOOL true)
|
|
|
|
#config stuff
|
|
configure_file(include/engine/config.h.in config.h @ONLY)
|
|
# include the config file
|
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
# enables AVX instructions. if you have issues, try disabling this.
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
|
|
|
|
#Setup project source compilation
|
|
set(engine_source_dir "${PROJECT_SOURCE_DIR}/src/engine")
|
|
file(GLOB_RECURSE engine_source_files "${engine_source_dir}/*.cpp" "${engine_source_dir}/*.c")
|
|
# only want to attempt to compile graphics if user requests it
|
|
# plus we can only compile on X11 supported systems, so basically unix
|
|
if (COMPILE_GUI MATCHES ON AND UNIX)
|
|
message("Compiling with GUI.")
|
|
find_package(OpenGL REQUIRED)
|
|
set(SHOULD_FIND_X ON)
|
|
|
|
if (USE_GLFW)
|
|
find_package(glfw3 3.3)
|
|
if (glfw3_FOUND)
|
|
message("Found GLFW3!")
|
|
set(SHOULD_FIND_X OFF)
|
|
else ()
|
|
message("Unable to find GLFW3. Please install with sudo apt install libglfw3 libglfw3-dev")
|
|
endif ()
|
|
endif ()
|
|
|
|
if (SHOULD_FIND_X MATCHES ON)
|
|
message("Defaulting to X11. Please consider using GLFW as it is consider to be more stable and is what is actively developed. Bugs are to be expected using X11.")
|
|
find_package(X11)
|
|
if (NOT X11_FOUND)
|
|
message("X11 wasn't found on your system. Do you have the development libs? sudo apt install libx11-dev")
|
|
endif ()
|
|
|
|
include_directories(${X11_INCLUDE_DIR})
|
|
endif ()
|
|
|
|
set(graphics_source_dir "${PROJECT_SOURCE_DIR}/src/graphics")
|
|
file(GLOB_RECURSE graphics_source_files "${graphics_source_dir}/*.cpp" "${graphics_source_dir}/*.c")
|
|
endif ()
|
|
|
|
if (USE_OPENMP)
|
|
find_package(OpenMP)
|
|
|
|
if (NOT OpenMP_CXX_FOUND)
|
|
message("OpenMP C++ Requested but was not found on system!")
|
|
endif()
|
|
|
|
include_directories(${OpenMP_CXX_INCLUDE_DIRS})
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
|
endif()
|
|
|
|
if (USE_MPI)
|
|
find_package(MPI)
|
|
|
|
if (NOT ${MPI_CCX_FOUND})
|
|
message("MPI Requested but was not found on system!")
|
|
endif()
|
|
|
|
include_directories(${MPI_CXX_INCLUDE_DIRS})
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MPI_CXX_COMPILE_OPTIONS}")
|
|
endif()
|
|
|
|
# Windows should be able to handle opencl no problem.
|
|
# i decided that i wanted to use opencl due to it having a much nicer c99 language.
|
|
if (COMPILE_OPENCL MATCHES ON)
|
|
find_package(OpenCL REQUIRED)
|
|
|
|
if (NOT OpenCL_FOUND)
|
|
message("Unable to find OpenCL on your system. Do you have the required libs?")
|
|
endif ()
|
|
|
|
include_directories(${OpenCL_INCLUDE_DIRS})
|
|
|
|
set(opencl_source_dir "${PROJECT_SOURCE_DIR}/src/opencl")
|
|
file(GLOB_RECURSE opencl_source_files "${opencl_source_dir}/*.cpp" "${opencl_source_dir}/*.c")
|
|
endif ()
|
|
|
|
#Setup project header files
|
|
include_directories(${PROJECT_SOURCE_DIR}/include)
|
|
|
|
#add_subdirectory(test/glm)
|
|
|
|
add_executable(${PROJECT_NAME} ${engine_source_files} ${graphics_source_files} ${opencl_source_files})
|
|
|
|
target_link_libraries(${PROJECT_NAME} pthread)
|
|
#target_link_libraries(${PROJECT_NAME} glm)
|
|
|
|
if (COMPILE_GUI MATCHES ON AND UNIX)
|
|
target_link_libraries(${PROJECT_NAME} OpenGL::GL OpenGL::GLU OpenGL::GLX)
|
|
target_link_libraries(${PROJECT_NAME} ${X11_LIBRARIES})
|
|
endif ()
|
|
|
|
if (USE_GLFW MATCHES ON AND glfw3_FOUND)
|
|
target_link_libraries(${PROJECT_NAME} glfw)
|
|
endif ()
|
|
|
|
if (COMPILE_OPENCL)
|
|
message("Compiling OpenCL ${OpenCL_LIBRARIES} || ${OpenCL_LIBRARY}")
|
|
target_link_libraries(${PROJECT_NAME} ${OpenCL_LIBRARIES})
|
|
target_link_libraries(${PROJECT_NAME} ${OpenCL_LIBRARY})
|
|
target_compile_definitions(${PROJECT_NAME} PRIVATE CL_TARGET_OPENCL_VERSION=220)
|
|
endif ()
|
|
|
|
if (USE_OPENMP)
|
|
target_link_libraries(${PROJECT_NAME} ${OpenMP_CXX_LIBRARIES})
|
|
endif()
|
|
|
|
if (USE_MPI)
|
|
target_link_libraries(${PROJECT_NAME} ${MPI_CXX_LIBRARIES})
|
|
endif()
|