Files
panic/CMakeLists.txt
T
Bausager a791201f3a Matrix
First matrix implementation with print_matrix in io
2026-06-23 20:28:11 +02:00

127 lines
4.4 KiB
CMake

# Requires CMake version 3.16
cmake_minimum_required(VERSION 3.16)
# Set the project name and the language
# CXX means C++
project(panic LANGUAGES CXX)
# Uses C++11
set(CMAKE_CXX_STANDARD 11)
# This makes it so it uses C++11, and fails if not found.
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Makes sure it uses basic options
# -std=c++11 instead of -std=gnu++11
set(CMAKE_CXX_EXTENSIONS OFF)
#---------------------------------------------------------------------------------------------------------------------------
# OPENMP CONFIGURATION
#---------------------------------------------------------------------------------------------------------------------------
# OpenMP is disabled by default.
# Enable with:
# cmake -S . -B build -DPANIC_ENABLE_OPENMP=ON
option(PANIC_ENABLE_OPENMP "Enable OpenMP support" OFF)
# Number of OpenMP threads.
# 0 means OpenMP decides the default.
# Example that overrides default is: "-DPANIC_OMP_NUM_THREADS=":
# cmake -S . -B build -DPANIC_ENABLE_OPENMP=ON -DPANIC_OMP_NUM_THREADS=4
set(PANIC_OMP_NUM_THREADS "0" CACHE STRING "Number of OpenMP threads. 0 means OpenMP default.")
#---------------------------------------------------------------------------------------------------------------------------
# SOURCE FILES
#---------------------------------------------------------------------------------------------------------------------------
# This finds all the .cpp files in the src/ folder
# and its subfolders.
# This is saved in the variable PANIC_SOURCES
file(GLOB_RECURSE PANIC_SOURCES CONFIGURE_DEPENDS
src/*.cpp
)
#---------------------------------------------------------------------------------------------------------------------------
# EXECUTABLE
#---------------------------------------------------------------------------------------------------------------------------
# Creates an executable called "panic"
# It's built from main.cpp and all src/
add_executable(panic
main.cpp
${PANIC_SOURCES}
)
#---------------------------------------------------------------------------------------------------------------------------
# INCLUDE DIRECTORIES
#---------------------------------------------------------------------------------------------------------------------------
# Tells the compiler where to look for header files.
# This makes includes like <core/types.hpp> work.
target_include_directories(panic PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
)
#---------------------------------------------------------------------------------------------------------------------------
# OPENMP BUILD SETTINGS
#---------------------------------------------------------------------------------------------------------------------------
# If the user enabled OpenMP with:
# -DPANIC_ENABLE_OPENMP=ON
if(PANIC_ENABLE_OPENMP)
# Ask CMake to search for OpenMP support for the compiler.
# If found, CMake creates the target:
# OpenMP::OpenMP_CXX
# This target contains the needed compiler and linker flags.
find_package(OpenMP)
# Check if CMake found OpenMP for C++.
if(OpenMP_CXX_FOUND)
# Link the panic executable with OpenMP.
# This adds the correct compiler/linker options, for example -fopenmp.
target_link_libraries(panic PRIVATE OpenMP::OpenMP_CXX)
# Define preprocessor macros that the C++ code can read.
#
# This makes the compiler behave as if every .cpp file had:
# #define PANIC_USE_OPENMP 1
# #define PANIC_OMP_NUM_THREADS <value from CMake>
#
# Example:
# -DPANIC_OMP_NUM_THREADS=4
#
# becomes:
# #define PANIC_OMP_NUM_THREADS 4
target_compile_definitions(panic PRIVATE
PANIC_USE_OPENMP=1
PANIC_OMP_NUM_THREADS=${PANIC_OMP_NUM_THREADS}
PANIC_OMP_ALLOW_NESTED=0
)
else()
# The user asked for OpenMP, but CMake could not find it.
# So we warn the user and build PANIC without OpenMP instead.
message(WARNING "OpenMP requested, but OpenMP was not found. Building without OpenMP.")
# Tell the C++ code that OpenMP is disabled.
target_compile_definitions(panic PRIVATE
PANIC_USE_OPENMP=0
PANIC_OMP_NUM_THREADS=0
PANIC_OMP_ALLOW_NESTED=0
)
endif()
else()
# The user did not enable OpenMP.
# So PANIC builds as normal serial/portable code.
target_compile_definitions(panic PRIVATE
PANIC_USE_OPENMP=0
PANIC_OMP_NUM_THREADS=0
)
endif()