Repository navigation
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
136 lines (118 loc) · 4.39 KB
/
Copy pathCMakeLists.txt
File metadata and controls
136 lines (118 loc) · 4.39 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
cmake_minimum_required(VERSION 3.24)
project(sensor_processing_native)
# Set C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Set build type to Release for optimization
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
# Compiler-specific optimizations
# Note: -ffast-math is intentionally omitted — it breaks FINUFFT (IEEE-754 violations)
# CI runners use a portable baseline -- x86-64-v3 (AVX2) on x86, the Apple M1
# on Apple Silicon -- so release wheels run on any CPU of that family; local
# builds use native.
if(DEFINED ENV{CI} AND "$ENV{CI}" STREQUAL "true")
if(APPLE AND CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64")
set(MARCH_FLAG "-mcpu=apple-m1")
else()
set(MARCH_FLAG "-march=x86-64-v3")
endif()
# FINUFFT defaults FINUFFT_ARCH_FLAGS to "native" (-march=native), which bakes
# the build machine's ISA (e.g. AVX-512) into libfinufft.so. Release wheels
# must be portable, so pin the dependency to the same baseline as the rest of
# the build. This must be a CACHE variable: FINUFFT's own CMakeLists declares
# it with `CACHE`, and normal variables do not propagate into its scope.
set(FINUFFT_ARCH_FLAGS "${MARCH_FLAG}" CACHE STRING "" FORCE)
else()
set(MARCH_FLAG "-march=native -mtune=native")
set(FINUFFT_ARCH_FLAGS "-march=native" CACHE STRING "" FORCE)
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 ${MARCH_FLAG}")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 ${MARCH_FLAG}")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set(CMAKE_CXX_FLAGS_RELEASE "/O2 /arch:AVX2")
endif()
# Apple Clang needs explicit help finding Homebrew's libomp.
# Flags must be semicolon-separated CMake lists, not space-separated strings,
# so that each flag is passed as a separate argument to the compiler.
if(APPLE)
if(DEFINED ENV{LIBOMP_PREFIX})
set(LIBOMP_PREFIX "$ENV{LIBOMP_PREFIX}")
else()
# Only use Homebrew-specific hints if Homebrew is available.
find_program(HOMEBREW_EXECUTABLE brew)
endif()
if(NOT LIBOMP_PREFIX AND HOMEBREW_EXECUTABLE)
execute_process(
COMMAND "${HOMEBREW_EXECUTABLE}" --prefix libomp
OUTPUT_VARIABLE LIBOMP_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
)
endif()
if(LIBOMP_PREFIX)
set(OpenMP_C_FLAGS "-Xpreprocessor;-fopenmp;-I${LIBOMP_PREFIX}/include")
set(OpenMP_CXX_FLAGS "-Xpreprocessor;-fopenmp;-I${LIBOMP_PREFIX}/include")
set(OpenMP_C_LIB_NAMES "omp")
set(OpenMP_CXX_LIB_NAMES "omp")
set(OpenMP_omp_LIBRARY "${LIBOMP_PREFIX}/lib/libomp.dylib")
endif()
endif()
# Download CPM.cmake
file(
DOWNLOAD
https://github.com/cpm-cmake/CPM.cmake/releases/download/v0.40.8/CPM.cmake
${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake
EXPECTED_HASH SHA256=78ba32abdf798bc616bab7c73aac32a17bbd7b06ad9e26a6add69de8f3ae4791
)
include(${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake)
# Add finufft dependency
CPMAddPackage("gh:flatironinstitute/finufft@2.5.0")
# Find required packages
find_package(PkgConfig)
# Add src/ to include paths
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
# Add the shared library
add_library(sensor_processing SHARED
src/sensor_processing_native.cpp
)
# Set library properties
set_target_properties(sensor_processing PROPERTIES
CXX_VISIBILITY_PRESET default
VERSION 2.0.0
SOVERSION 2
)
# Include directories
target_include_directories(sensor_processing PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
)
# Link required FINUFFT dependency
target_link_libraries(sensor_processing PRIVATE finufft)
# Platform-specific settings
if(ANDROID)
# Android-specific settings
find_library(log-lib log)
target_link_libraries(sensor_processing PRIVATE ${log-lib})
elseif(APPLE)
# macOS/iOS-specific settings
set_target_properties(sensor_processing PROPERTIES
MACOSX_RPATH TRUE
INSTALL_RPATH "@loader_path"
)
elseif(WIN32)
# Windows-specific settings
target_compile_definitions(sensor_processing PRIVATE WIN32_LEAN_AND_MEAN)
elseif(UNIX)
# Linux-specific settings
target_link_libraries(sensor_processing PRIVATE m pthread)
endif()
# Install rules
install(TARGETS sensor_processing
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
)
# Export compile commands for IDEs
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)