Fork for thermals request add-json-schema-dpeq
4.1 kB
116 lines
1cmake_minimum_required(VERSION 3.16)
2project(MLXSwift LANGUAGES C CXX Swift)
3
4# ----------------------------- Setup -----------------------------
5# note: 1:1 mirror of MLX configs
6
7set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
8set(CMAKE_CXX_STANDARD 17)
9set(CMAKE_CXX_STANDARD_REQUIRED ON)
10set(CMAKE_POSITION_INDEPENDENT_CODE ON)
11set(CMAKE_INSTALL_MESSAGE NEVER)
12set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
13
14# ----------------------------- Configuration -----------------------------
15# note: mirrors a subset of MLX options exactly (1:1 mapping)
16
17option(MLX_BUILD_EXAMPLES "Build examples for mlx" ON)
18option(MLX_BUILD_METAL "Build metal backend" ON)
19option(MLX_BUILD_CUDA "Build cuda backend" OFF)
20
21# ----------------------------- Lib -----------------------------
22
23include(FetchContent)
24# Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24:
25if(POLICY CMP0135)
26 cmake_policy(SET CMP0135 NEW)
27endif()
28
29# mlx-c
30FetchContent_Declare(
31 mlx-c
32 GIT_REPOSITORY "https://github.com/ml-explore/mlx-c.git"
33 GIT_TAG "v0.6.0")
34FetchContent_MakeAvailable(mlx-c)
35
36# swift-numerics
37set(swift_numerics_patch git apply
38 ${CMAKE_CURRENT_SOURCE_DIR}/cmake/swift-numerics.patch)
39FetchContent_Declare(
40 swift-numerics
41 GIT_REPOSITORY "https://github.com/apple/swift-numerics.git"
42 GIT_TAG "1.0.2"
43 PATCH_COMMAND ${swift_numerics_patch} || true)
44FetchContent_MakeAvailable(swift-numerics)
45
46# MLX package
47if(MLX_BUILD_CUDA)
48 find_package(CUDAToolkit REQUIRED)
49 include(${cudnn_frontend_SOURCE_DIR}/cmake/cuDNN.cmake)
50 message(STATUS "Patching 'mlxc' target to add public CUDA dependencies.")
51 target_link_libraries(
52 mlxc
53 PUBLIC CUDA::cudart
54 CUDA::cublasLt # Promoted from PRIVATE, required by mlx
55 CUDA::nvrtc # Promoted from PRIVATE, required by mlx
56 CUDA::cuda_driver # Promoted from PRIVATE, required by mlx
57 CUDNN::cudnn_all # Promoted from PRIVATE, required by mlx
58 )
59endif()
60file(GLOB MLX-src ${CMAKE_CURRENT_LIST_DIR}/Source/MLX/*.swift)
61
62if(NOT MLX_BUILD_METAL)
63 list(REMOVE_ITEM MLX-src ${CMAKE_CURRENT_LIST_DIR}/Source/MLX/GPU+Metal.swift
64 ${CMAKE_CURRENT_LIST_DIR}/Source/MLX/MLXArray+Metal.swift)
65endif()
66
67add_library(MLX STATIC ${MLX-src})
68target_include_directories(MLX
69 PUBLIC ${CMAKE_CURRENT_LIST_DIR}/Source/Cmlx/include)
70# Note: mlxc is target name exported by mlx-c
71target_link_libraries(MLX PUBLIC mlxc Numerics)
72target_compile_options(MLX PRIVATE -package-name MLX)
73
74# MLXRandom package
75file(GLOB MLXRandom-src ${CMAKE_CURRENT_LIST_DIR}/Source/MLXRandom/*.swift)
76add_library(MLXRandom STATIC ${MLXRandom-src})
77target_link_libraries(MLXRandom PRIVATE MLX)
78
79# MLXFast package
80file(GLOB MLXFast-src ${CMAKE_CURRENT_LIST_DIR}/Source/MLXFast/*.swift)
81add_library(MLXFast STATIC ${MLXFast-src})
82target_link_libraries(MLXFast PRIVATE MLX)
83
84# MLXNN package
85file(GLOB MLXNN-src ${CMAKE_CURRENT_LIST_DIR}/Source/MLXNN/*.swift)
86add_library(MLXNN STATIC ${MLXNN-src})
87target_link_libraries(MLXNN PRIVATE MLX MLXRandom MLXFast)
88
89# MLXOptimizers package
90file(GLOB MLXOptimizers-src
91 ${CMAKE_CURRENT_LIST_DIR}/Source/MLXOptimizers/*.swift)
92add_library(MLXOptimizers STATIC ${MLXOptimizers-src})
93target_link_libraries(MLXOptimizers PRIVATE MLX MLXNN)
94
95# MLXFFT package
96file(GLOB MLXFFT-src ${CMAKE_CURRENT_LIST_DIR}/Source/MLXFFT/*.swift)
97add_library(MLXFFT STATIC ${MLXFFT-src})
98target_link_libraries(MLXFFT PRIVATE MLX)
99
100# MLXLinalg package
101file(GLOB MLXLinalg-src ${CMAKE_CURRENT_LIST_DIR}/Source/MLXLinalg/*.swift)
102add_library(MLXLinalg STATIC ${MLXLinalg-src})
103target_link_libraries(MLXLinalg PRIVATE MLX)
104
105# Examples
106if(MLX_BUILD_EXAMPLES)
107 add_executable(example1
108 ${CMAKE_CURRENT_LIST_DIR}/Source/Examples/Example1.swift)
109 target_link_libraries(example1 PRIVATE MLX)
110 target_compile_options(example1 PRIVATE -parse-as-library)
111
112 add_executable(tutorial
113 ${CMAKE_CURRENT_LIST_DIR}/Source/Examples/Tutorial.swift)
114 target_link_libraries(tutorial PRIVATE MLX)
115 target_compile_options(tutorial PRIVATE -parse-as-library)
116endif()