-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
168 lines (153 loc) · 7.58 KB
/
CMakeLists.txt
File metadata and controls
168 lines (153 loc) · 7.58 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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
cmake_minimum_required(VERSION 3.13)
project(chromobius)
include_directories(src)
set(CMAKE_CXX_STANDARD 20)
if (NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY out)
endif()
if (NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY out)
endif()
if (NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY out)
endif()
if (NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET)
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15)
endif()
# Make changes to file_lists trigger a reconfigure.
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS file_lists/source_files_no_main)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS file_lists/test_files)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS file_lists/perf_files)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS file_lists/pybind_files)
file(STRINGS file_lists/source_files_no_main SOURCE_FILES_NO_MAIN)
file(STRINGS file_lists/test_files TEST_FILES)
file(STRINGS file_lists/perf_files PERF_FILES)
file(STRINGS file_lists/pybind_files PYBIND_FILES)
include(FetchContent)
if(WIN32)
# Use a shorter path for dependencies to avoid MAX_PATH issues on Windows.
set(FETCHCONTENT_BASE_DIR "C:/tmp/deps" CACHE PATH "Override fetchcontent dir" FORCE)
endif()
find_package(GTest QUIET)
if(NOT GTest_FOUND)
message(STATUS "GTest not found. Will try fetching and building from source.")
FetchContent_Declare(googletest
GIT_REPOSITORY https://github.com/google/googletest.git
# Note: keep the version of GTest here and in .github/workflows/ci.yml the same.
GIT_TAG release-1.12.1
)
# For Windows: prevent overriding parent project's compiler/linker settings.
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
if(TARGET GTest::gtest)
message(STATUS "GTest fetch successful.")
set(GTest_FOUND TRUE)
else()
message(WARNING "Failed to find GoogleTest. Some tests will not be built. To fix "
"this, follow the Standalone CMake Project install instructions for GTest "
"at https://github.com/google/googletest/blob/master/googletest/README.md")
endif()
endif()
set(SIMD_WIDTH 128)
FetchContent_Declare(stim
GIT_REPOSITORY https://github.com/quantumlib/stim.git
GIT_TAG 1320ad7eac7de34d2e9c70daa44fbc6d84174450) # v1.15.dev0 (what PyMatching 2.2.2 uses)
FetchContent_GetProperties(stim)
if(NOT stim_POPULATED)
FetchContent_MakeAvailable(stim)
endif()
FetchContent_Declare(pymatching
GIT_REPOSITORY https://github.com/oscarhiggott/pymatching.git
GIT_TAG 08f4f03fc876bd3e13351b677241fc2e160b8b38) # v2.2.2
FetchContent_GetProperties(pymatching)
if(NOT pymatching_POPULATED)
FetchContent_MakeAvailable(pymatching)
endif()
add_executable(chromobius src/main.cc ${SOURCE_FILES_NO_MAIN})
target_compile_options(chromobius PRIVATE -O3 -Wall -Wpedantic)
target_link_options(chromobius PRIVATE -O3)
target_link_libraries(chromobius libstim libpymatching)
install(TARGETS chromobius RUNTIME DESTINATION bin)
add_library(libchromobius ${SOURCE_FILES_NO_MAIN})
set_target_properties(libchromobius PROPERTIES PREFIX "")
target_include_directories(libchromobius PUBLIC src)
target_link_libraries(libchromobius PRIVATE libstim libpymatching)
if(NOT(MSVC))
target_compile_options(libchromobius PRIVATE -O3 -Wall -Wpedantic -fPIC -fno-strict-aliasing)
target_link_options(libchromobius PRIVATE -O3)
else()
target_compile_options(libchromobius PRIVATE)
endif()
install(TARGETS libchromobius LIBRARY DESTINATION)
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/" DESTINATION "include" FILES_MATCHING PATTERN "*.h" PATTERN "*.inl")
add_executable(chromobius_perf ${SOURCE_FILES_NO_MAIN} ${PERF_FILES})
target_compile_options(chromobius_perf PRIVATE -Wall -Wpedantic -O3 -g -fno-omit-frame-pointer -DNDEBUG)
target_link_options(chromobius_perf PRIVATE -pthread)
target_link_libraries(chromobius_perf PRIVATE libstim libpymatching)
if(GTest_FOUND)
add_executable(chromobius_test ${SOURCE_FILES_NO_MAIN} ${TEST_FILES})
target_link_libraries(chromobius_test GTest::gtest GTest::gtest_main libstim libpymatching)
target_compile_options(chromobius_test PRIVATE -Wall -Wpedantic -g -fno-omit-frame-pointer -fno-strict-aliasing
-fsanitize=undefined -fsanitize=address)
target_link_options(chromobius_test PRIVATE -g -fno-omit-frame-pointer -fsanitize=undefined -fsanitize=address)
add_executable(chromobius_test_o3 ${SOURCE_FILES_NO_MAIN} ${TEST_FILES})
target_link_libraries(chromobius_test_o3 GTest::gtest GTest::gtest_main libstim libpymatching)
target_compile_options(chromobius_test_o3 PRIVATE -O3 -Wall -Wpedantic -fno-strict-aliasing)
target_link_options(chromobius_test_o3 PRIVATE)
else()
message(WARNING "Skipped target 'chromobius_test' because GoogleTest could not be found. "
"To fix this, follow the Standalone CMake Project install instructions for GTest "
"at https://github.com/google/googletest/blob/master/googletest/README.md")
endif()
find_package(Python COMPONENTS Interpreter Development)
# Look for the same Pybind version range as ci.yml uses.
find_package(pybind11 2.11.1...<2.12.0 QUIET CONFIG)
if(NOT pybind11_FOUND)
message(STATUS "Pybind11 not found or the version found is not the version needed. "
"Will try fetching and building the desired version from source.")
FetchContent_Declare(pybind11
GIT_REPOSITORY https://github.com/pybind/pybind11.git
GIT_TAG v2.11.2
)
FetchContent_MakeAvailable(pybind11)
if(TARGET pybind11::pybind11)
message(STATUS "Pybind11 fetch successful.")
set(pybind11_FOUND TRUE)
endif()
endif()
if ((pybind11_FOUND AND Python_FOUND) OR "$ENV{CMAKE_FORCE_PYBIND_CHROMOBIUS}")
pybind11_add_module(chromobius_pybind ${PYBIND_FILES} ${SOURCE_FILES_NO_MAIN})
set_target_properties(chromobius_pybind PROPERTIES OUTPUT_NAME chromobius)
target_compile_options(chromobius_pybind PRIVATE -O3 -DNDEBUG)
target_link_libraries(chromobius_pybind PRIVATE libstim libpymatching)
target_link_options(chromobius_pybind PRIVATE -O3)
set(SETUPPY_PATH "${CMAKE_CURRENT_SOURCE_DIR}/setup.py")
file(READ ${SETUPPY_PATH} SETUPPY_TEXT)
string(REGEX MATCH "__version__[ \t]*=[ \t]*[\"']([^\"']+)[\"']" _ ${SETUPPY_TEXT})
if(NOT CMAKE_MATCH_1)
message(FATAL_ERROR "Could not find __version__ string in ${SETUPPY_PATH}.")
else()
message(STATUS "Chromobius version is ${CMAKE_MATCH_1}")
endif()
set(CHROMOBIUS_VERSION_INFO "${CMAKE_MATCH_1}")
add_compile_definitions(CHROMOBIUS_VERSION_INFO=${CHROMOBIUS_VERSION_INFO})
message(STATUS "Added chromobius_pybind target.")
else()
message(WARNING "Skipped target 'chromobius_pybind' because `pybind11` could not be found. "
"To fix this, install pybind11. On Debian and Ubuntu Linux distributions, the "
"package name is 'pybind11-dev'. For other systems, please see the pybind11 "
"instructions at https://pybind11.readthedocs.io/.")
endif()