-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
149 lines (128 loc) · 4.74 KB
/
CMakeLists.txt
File metadata and controls
149 lines (128 loc) · 4.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
cmake_minimum_required(VERSION 3.10)
project(NEXT)
# ============================
# Detect compiler environment
# ============================
if (MINGW)
message(STATUS "Detected MinGW GCC — using MinGW settings")
set(USING_MINGW TRUE)
elseif (MSVC)
message(STATUS "Detected MSVC — using MSVC settings")
set(USING_MSVC TRUE)
elseif (APPLE)
message(STATUS "Detected macOS — limited MPI support")
set(USING_APPLE TRUE)
elseif (UNIX)
message(STATUS "Detected Linux/UNIX — using standard settings")
set(USING_UNIX TRUE)
endif()
# ============================
# Options
# ============================
option(NEXT_FP32 "Use 32-bit floats (scalar)" OFF)
option(NEXT_FP64 "Use 64-bit floats (scalar)" ON)
option(NEXT_MPI "Enable MPI support" OFF)
option(NEXT_COPY_TO_CMAKE_SOURCE_DIR "Copy final executable from build dir to source dir" ON)
# ============================
# Precision modes
# ============================
set(NEXT_MODES NEXT_FP32 NEXT_FP64)
set(NEXT_MODE_COUNT 0)
foreach(m ${NEXT_MODES})
if(${m})
math(EXPR NEXT_MODE_COUNT "${NEXT_MODE_COUNT} + 1")
endif()
endforeach()
if(NEXT_MODE_COUNT EQUAL 0)
message(FATAL_ERROR "You must enable NEXT_FP64 or NEXT_FP32.")
elseif(NEXT_MODE_COUNT GREATER 1)
message(FATAL_ERROR "Enable only one precision mode.")
endif()
if(NEXT_FP32)
add_compile_definitions(NEXT_FP32)
elseif(NEXT_FP64)
add_compile_definitions(NEXT_FP64)
endif()
# ============================
# Includes and sources
# ============================
include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${CMAKE_SOURCE_DIR}/src)
file(GLOB_RECURSE SRC_FILES ${CMAKE_SOURCE_DIR}/src/*.cpp)
file(GLOB ARGPARSE_FILES ${CMAKE_SOURCE_DIR}/argparse/*.cpp)
add_executable(next ${SRC_FILES} ${ARGPARSE_FILES})
# ============================
# Vectorization reports
# ============================
option(ENABLE_VEC_REPORT "Enable compiler vectorization reports" OFF)
if(ENABLE_VEC_REPORT)
if(CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM")
target_compile_options(next PRIVATE -O3 -Rpass=loop-vectorize -Rpass-missed=loop-vectorize)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
target_compile_options(next PRIVATE -O3 -fopt-info-vec-optimized -fopt-info-vec-missed)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
target_compile_options(next PRIVATE -O3 -Rpass=loop-vectorize -Rpass-missed=loop-vectorize)
endif()
endif()
# ============================
# OpenMP
# ============================
find_package(OpenMP QUIET)
if(OpenMP_CXX_FOUND)
message(STATUS "OpenMP detected — enabling multithreading.")
if(MSVC)
target_compile_options(next PRIVATE /openmp:llvm)
else()
target_link_libraries(next PRIVATE OpenMP::OpenMP_CXX)
endif()
else()
message(STATUS "OpenMP not found — building in single-threaded mode.")
endif()
# ============================
# MPI detection
# ============================
if(NEXT_MPI)
if(USING_UNIX)
# Linux: standard OpenMPI
find_package(MPI REQUIRED)
message(STATUS "MPI (OpenMPI) detected — enabling distributed memory parallelism.")
target_compile_definitions(next PRIVATE NEXT_MPI)
target_link_libraries(next PRIVATE MPI::MPI_CXX)
elseif(USING_MSVC OR USING_MINGW)
# Windows: Microsoft MPI
find_package(MPI REQUIRED)
message(STATUS "MPI (MS-MPI) detected — enabling distributed memory parallelism.")
target_compile_definitions(next PRIVATE NEXT_MPI)
target_link_libraries(next PRIVATE MPI::MPI_CXX)
elseif(USING_APPLE)
message(WARNING "MPI requested, but macOS does not ship MPI by default. Please install OpenMPI via Homebrew (brew install open-mpi).")
find_package(MPI REQUIRED)
target_compile_definitions(next PRIVATE NEXT_MPI)
target_link_libraries(next PRIVATE MPI::MPI_CXX)
endif()
endif()
# ============================
# HDF5 detection
# ============================
if (USING_MSVC AND DEFINED ENV{HDF5_DIR})
set(HDF5_ROOT "$ENV{HDF5_DIR}")
set(CMAKE_PREFIX_PATH "${HDF5_ROOT};${CMAKE_PREFIX_PATH}")
endif()
if (USING_MINGW)
set(CMAKE_PREFIX_PATH "C:/tools/msys64/mingw64")
message(STATUS "Using MSYS2 MinGW HDF5 path: ${CMAKE_PREFIX_PATH}")
endif()
find_package(HDF5 REQUIRED COMPONENTS C HL)
include_directories(${HDF5_INCLUDE_DIRS})
target_link_libraries(next PRIVATE ${HDF5_LIBRARIES})
# ============================
# Optional: Copy executable to source dir
# ============================
if(NEXT_COPY_TO_CMAKE_SOURCE_DIR)
add_custom_command(TARGET next POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
$<TARGET_FILE:next>
${CMAKE_SOURCE_DIR}/$<TARGET_FILE_NAME:next>
COMMENT "Copying executable to CMake source directory"
)
endif()