1
+ cmake_minimum_required (VERSION 3.24 )
2
+
3
+ project (mlx LANGUAGES CXX )
4
+
5
+ # ----------------------------- Setup -----------------------------
6
+ set (CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR} /cmake" )
7
+ set (CMAKE_CXX_STANDARD 17 )
8
+ set (CMAKE_CXX_STANDARD_REQUIRED ON )
9
+ set (CMAKE_POSITION_INDEPENDENT_CODE ON )
10
+ set (CMAKE_INSTALL_MESSAGE NEVER )
11
+
12
+ # ----------------------------- Configuration -----------------------------
13
+ option (MLX_BUILD_TESTS "Build tests for mlx" ON )
14
+ option (MLX_BUILD_EXAMPLES "Build examples for mlx" ON )
15
+ option (MLX_BUILD_BENCHMARKS "Build benchmarks for mlx" OFF )
16
+ option (MLX_BUILD_PYTHON_BINDINGS "Build python bindings for mlx" OFF )
17
+ option (MLX_BUILD_METAL "Build metal backend" ON )
18
+ option (BUILD_SHARED_LIBS "Build mlx as a shared library" OFF )
19
+
20
+ if (NOT MLX_VERSION )
21
+ set (MLX_VERSION 0.0.1 )
22
+ endif ()
23
+
24
+ # ----------------------------- Lib -----------------------------
25
+
26
+ include (FetchContent )
27
+ # Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24:
28
+ cmake_policy (SET CMP0135 NEW )
29
+
30
+ add_library (mlx )
31
+
32
+ if (MLX_BUILD_METAL )
33
+ find_library (METAL_LIB Metal )
34
+ find_library (FOUNDATION_LIB Foundation )
35
+ find_library (QUARTZ_LIB QuartzCore )
36
+ endif ()
37
+
38
+ if (MLX_BUILD_METAL AND NOT METAL_LIB )
39
+ message (STATUS "Metal not found. Unable to build GPU" )
40
+ elseif (MLX_BUILD_METAL )
41
+ message (STATUS "Building METAL sources" )
42
+ add_compile_definitions (_METAL_ )
43
+
44
+ execute_process (COMMAND zsh "-c" "/usr/bin/sw_vers | cut -f2- -d: | sed -n 2p | grep -Eo '[0-9]+.[0-9]+'"
45
+ OUTPUT_VARIABLE MACOS_VERSION )
46
+
47
+ message (STATUS "Detected macOS version ${MACOS_VERSION} " )
48
+ if (${MACOS_VERSION} GREATER_EQUAL 14.0 )
49
+ set (METAL_CPP_URL https://developer.apple.com/metal/cpp/files/metal-cpp_macOS14_iOS17-beta.zip )
50
+ elseif (${MACOS_VERSION} GREATER_EQUAL 13.3 )
51
+ set (METAL_CPP_URL https://developer.apple.com/metal/cpp/files/metal-cpp_macOS13.3_iOS16.4.zip )
52
+ else ()
53
+ set (METAL_CPP_URL https://developer.apple.com/metal/cpp/files/metal-cpp_macOS13_iOS16.zip )
54
+ endif ()
55
+
56
+ FetchContent_Declare (
57
+ metal_cpp
58
+ URL ${METAL_CPP_URL}
59
+ )
60
+
61
+ FetchContent_MakeAvailable (metal_cpp )
62
+ target_include_directories (
63
+ mlx PUBLIC
64
+ $< BUILD_INTERFACE:${metal_cpp_SOURCE_DIR} >
65
+ $< INSTALL_INTERFACE:include/metal_cpp>
66
+ )
67
+ target_link_libraries (
68
+ mlx
69
+ ${METAL_LIB}
70
+ ${FOUNDATION_LIB}
71
+ ${QUARTZ_LIB} )
72
+ endif ()
73
+
74
+ find_library (ACCELERATE_LIBRARY Accelerate )
75
+ if (ACCELERATE_LIBRARY )
76
+ message (STATUS "Accelerate found ${ACCELERATE_LIBRARY} " )
77
+ set (MLX_BUILD_ACCELERATE ON )
78
+ target_link_libraries (mlx ${ACCELERATE_LIBRARY} )
79
+ add_compile_definitions (ACCELERATE_NEW_LAPACK )
80
+ else ()
81
+ message (STATUS "Accelerate not found, using default backend." )
82
+ set (MLX_BUILD_ACCELERATE OFF )
83
+ #set(BLA_VENDOR Generic)
84
+ find_package (BLAS REQUIRED )
85
+ if (NOT BLAS_FOUND )
86
+ message (FATAL_ERROR "Must have BLAS installed" )
87
+ endif ()
88
+ # TODO find a cleaner way to do this
89
+ find_path (BLAS_INCLUDE_DIRS cblas.h
90
+ /usr/include
91
+ /usr/local/include
92
+ $ENV{BLAS_HOME} /include )
93
+ message (STATUS ${BLAS_LIBRARIES} )
94
+ message (STATUS ${BLAS_INCLUDE_DIRS} )
95
+ target_include_directories (mlx PRIVATE ${BLAS_INCLUDE_DIRS} )
96
+ target_link_libraries (mlx ${BLAS_LIBRARIES} )
97
+ endif ()
98
+
99
+ add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /mlx )
100
+
101
+ target_include_directories (
102
+ mlx
103
+ PUBLIC
104
+ $< BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR} >
105
+ $< INSTALL_INTERFACE:include>
106
+ )
107
+
108
+ if (MLX_BUILD_PYTHON_BINDINGS )
109
+ message (STATUS "Building Python bindings." )
110
+ find_package (Python COMPONENTS Interpreter Development )
111
+ find_package (pybind11 CONFIG REQUIRED )
112
+ add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /python/src )
113
+ endif ()
114
+
115
+ if (MLX_BUILD_TESTS )
116
+ include (CTest )
117
+ add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /tests )
118
+ endif ()
119
+
120
+ if (MLX_BUILD_EXAMPLES )
121
+ add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /examples/cpp )
122
+ endif ()
123
+
124
+ if (MLX_BUILD_BENCHMARKS )
125
+ add_subdirectory (${CMAKE_CURRENT_LIST_DIR} /benchmarks/cpp )
126
+ endif ()
127
+
128
+ # ----------------------------- Installation -----------------------------
129
+ include (GNUInstallDirs )
130
+
131
+ # Install library
132
+ install (
133
+ TARGETS mlx
134
+ EXPORT MLXTargets
135
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
136
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
137
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
138
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
139
+ )
140
+
141
+
142
+ # Install headers
143
+ install (
144
+ DIRECTORY ${CMAKE_CURRENT_LIST_DIR} /mlx
145
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
146
+ COMPONENT headers
147
+ FILES_MATCHING PATTERN "*.h"
148
+ )
149
+
150
+ # Install metal dependencies
151
+ if (MLX_BUILD_METAL )
152
+
153
+ # Install metal cpp
154
+ install (
155
+ DIRECTORY ${metal_cpp_SOURCE_DIR} /
156
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} /metal_cpp
157
+ COMPONENT metal_cpp_source
158
+ )
159
+
160
+ endif ()
161
+
162
+ # Install cmake config
163
+ set (MLX_CMAKE_BUILD_CONFIG ${CMAKE_BINARY_DIR} /MLXConfig.cmake )
164
+ set (MLX_CMAKE_BUILD_VERSION_CONFIG ${CMAKE_BINARY_DIR} /MLXConfigVersion.cmake )
165
+ set (MLX_CMAKE_INSTALL_MODULE_DIR share/cmake/MLX )
166
+
167
+ install (
168
+ EXPORT MLXTargets
169
+ FILE MLXTargets.cmake
170
+ DESTINATION ${MLX_CMAKE_INSTALL_MODULE_DIR}
171
+ )
172
+
173
+ include (CMakePackageConfigHelpers )
174
+
175
+ write_basic_package_version_file (
176
+ ${MLX_CMAKE_BUILD_VERSION_CONFIG}
177
+ COMPATIBILITY SameMajorVersion
178
+ VERSION ${MLX_VERSION}
179
+ )
180
+
181
+ configure_package_config_file (
182
+ ${CMAKE_CURRENT_LIST_DIR} /mlx.pc.in
183
+ ${MLX_CMAKE_BUILD_CONFIG}
184
+ INSTALL_DESTINATION ${MLX_CMAKE_INSTALL_MODULE_DIR}
185
+ NO_CHECK_REQUIRED_COMPONENTS_MACRO
186
+ PATH_VARS CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_INCLUDEDIR MLX_CMAKE_INSTALL_MODULE_DIR
187
+ )
188
+
189
+ install (
190
+ FILES ${MLX_CMAKE_BUILD_CONFIG} ${MLX_CMAKE_BUILD_VERSION_CONFIG}
191
+ DESTINATION ${MLX_CMAKE_INSTALL_MODULE_DIR}
192
+ )
193
+
194
+ install (
195
+ DIRECTORY ${CMAKE_MODULE_PATH} /
196
+ DESTINATION ${MLX_CMAKE_INSTALL_MODULE_DIR}
197
+ )
0 commit comments