-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
142 lines (119 loc) · 6.22 KB
/
Copy pathCMakeLists.txt
File metadata and controls
142 lines (119 loc) · 6.22 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
# CMakeLists.txt for building the Python extension
cmake_minimum_required(VERSION 3.16)
project(sphinxsim_python_binding)
include(CTest)
option(SPHINXSIM_BUILD_SIMULATION_TESTS "Build and register simulation class C++ tests" ON)
option(SPHINXSIM_COPY_BINDINGS_AFTER_BUILD "Copy Python bindings to a stable folder after build" OFF)
set(SPHINXSIM_BINDINGS_OUTPUT_DIR "${CMAKE_SOURCE_DIR}/sphinxsim/bindings/native"
CACHE PATH "Stable output directory for copied Python binding modules")
# Set C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Set vcpkg toolchain file if not already set
if(NOT CMAKE_TOOLCHAIN_FILE)
# Try different common vcpkg locations
if(DEFINED ENV{VCPKG_ROOT})
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "Vcpkg toolchain file")
elseif(EXISTS "$ENV{HOME}/vcpkg/scripts/buildsystems/vcpkg.cmake")
set(CMAKE_TOOLCHAIN_FILE "$ENV{HOME}/vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "Vcpkg toolchain file")
elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake")
set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "Vcpkg toolchain file")
endif()
endif()
# Find required packages
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
find_package(pybind11 CONFIG REQUIRED)
find_package(nlohmann_json CONFIG REQUIRED)
# Install extension modules into the package so wheel installers place them
# directly under site-packages/sphinxsim/bindings/native.
set(SPHINXSIM_PYTHON_INSTALL_DIR "sphinxsim/bindings/native"
CACHE PATH "Install destination for Python extension modules")
if(SPHINXSIM_BUILD_SIMULATION_TESTS)
if(DEFINED VCPKG_INSTALLED_DIR AND DEFINED VCPKG_TARGET_TRIPLET)
set(_SPHINXSIM_VCPKG_GTEST_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/share/gtest")
if(EXISTS "${_SPHINXSIM_VCPKG_GTEST_DIR}/GTestConfig.cmake")
set(GTest_DIR "${_SPHINXSIM_VCPKG_GTEST_DIR}" CACHE PATH "Path to GTestConfig.cmake" FORCE)
find_package(GTest CONFIG REQUIRED
PATHS "${_SPHINXSIM_VCPKG_GTEST_DIR}"
NO_DEFAULT_PATH)
else()
find_package(GTest CONFIG REQUIRED)
endif()
else()
find_package(GTest CONFIG REQUIRED)
endif()
include(GoogleTest)
endif()
# Set SPHinXsys options to minimal for Python binding
set(SPHINXSYS_BUILD_TESTS OFF CACHE BOOL "Don't build tests")
set(SPHINXSYS_DEVELOPER_MODE OFF CACHE BOOL "Disable developer mode")
set(SPHINXSYS_USE_SYCL OFF CACHE BOOL "Disable SYCL")
set(SPHINXSYS_2D ON CACHE BOOL "Build 2D library")
set(SPHINXSYS_3D ON CACHE BOOL "Build 3D library")
# Include headers and sources for sph simulation library
file(GLOB_RECURSE SPH_SIMULATION_INCLUDE CONFIGURE_DEPENDS sphinxsim/sph_simulation/*.h sphinxsim/sph_simulation/*.hpp)
file(GLOB_RECURSE SPH_SIMULATION_SOURCES CONFIGURE_DEPENDS sphinxsim/sph_simulation/*.cpp)
function(get_all_include_dirs result dir)
file(GLOB_RECURSE children LIST_DIRECTORIES true "${dir}/*")
set(dirs "${dir}")
foreach(child ${children})
if(IS_DIRECTORY "${child}")
list(APPEND dirs "${child}")
endif()
endforeach()
list(REMOVE_DUPLICATES dirs)
set(${result} "${dirs}" PARENT_SCOPE)
endfunction()
get_all_include_dirs(SPH_SIMULATION_INCLUDE "sphinxsim/sph_simulation")
# Include SPHinXsys as subdirectory - this will build the sphinxsys libraries
add_subdirectory(sphinxsim/sphinxsys)
# Define the source file
set(BIND_SOURCE_FILES sphinxsim/bindings/sphinxsys_python.cpp)
if(SPHINXSYS_2D)
add_library(sph_simulation_2d)
set_target_properties(sph_simulation_2d PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_include_directories(sph_simulation_2d PUBLIC ${SPH_SIMULATION_INCLUDE})
target_sources(sph_simulation_2d PRIVATE ${SPH_SIMULATION_SOURCES})
target_link_libraries(sph_simulation_2d PRIVATE nlohmann_json::nlohmann_json)
target_link_libraries(sph_simulation_2d PUBLIC sphinxsys_2d)
target_compile_definitions(sph_simulation_2d PUBLIC SPHINXSYS_2D VERSION_INFO="0.1.0")
pybind11_add_module(_sphinxsys_core_2d ${BIND_SOURCE_FILES})
target_link_libraries(_sphinxsys_core_2d PRIVATE sph_simulation_2d)
target_compile_features(_sphinxsys_core_2d PRIVATE cxx_std_17)
install(TARGETS _sphinxsys_core_2d DESTINATION ${SPHINXSIM_PYTHON_INSTALL_DIR})
if(SPHINXSIM_COPY_BINDINGS_AFTER_BUILD)
add_custom_command(TARGET _sphinxsys_core_2d POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${SPHINXSIM_BINDINGS_OUTPUT_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:_sphinxsys_core_2d>
${SPHINXSIM_BINDINGS_OUTPUT_DIR}/
COMMENT "Copying _sphinxsys_core_2d to ${SPHINXSIM_BINDINGS_OUTPUT_DIR}")
endif()
endif()
if(SPHINXSYS_3D)
add_library(sph_simulation_3d)
set_target_properties(sph_simulation_3d PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_include_directories(sph_simulation_3d PUBLIC ${SPH_SIMULATION_INCLUDE})
target_sources(sph_simulation_3d PRIVATE ${SPH_SIMULATION_SOURCES})
target_link_libraries(sph_simulation_3d PRIVATE nlohmann_json::nlohmann_json)
target_link_libraries(sph_simulation_3d PUBLIC sphinxsys_3d)
target_compile_definitions(sph_simulation_3d PUBLIC SPHINXSYS_3D VERSION_INFO="0.1.0")
pybind11_add_module(_sphinxsys_core_3d ${BIND_SOURCE_FILES})
target_link_libraries(_sphinxsys_core_3d PRIVATE sph_simulation_3d)
target_compile_features(_sphinxsys_core_3d PRIVATE cxx_std_17)
install(TARGETS _sphinxsys_core_3d DESTINATION ${SPHINXSIM_PYTHON_INSTALL_DIR})
if(SPHINXSIM_COPY_BINDINGS_AFTER_BUILD)
add_custom_command(TARGET _sphinxsys_core_3d POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${SPHINXSIM_BINDINGS_OUTPUT_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:_sphinxsys_core_3d>
${SPHINXSIM_BINDINGS_OUTPUT_DIR}/
COMMENT "Copying _sphinxsys_core_3d to ${SPHINXSIM_BINDINGS_OUTPUT_DIR}")
endif()
endif()
if(SPHINXSIM_BUILD_SIMULATION_TESTS)
add_subdirectory(tests/test_simulation)
endif()