File: CMakeLists.txt

package info (click to toggle)
f3d 3.1.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 23,504 kB
  • sloc: cpp: 99,106; python: 758; sh: 342; xml: 223; java: 101; javascript: 95; makefile: 25
file content (120 lines) | stat: -rw-r--r-- 4,177 bytes parent folder | download
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
cmake_minimum_required(VERSION 3.21)

project(pyf3d)

option(F3D_BINDINGS_PYTHON_GENERATE_STUBS "Generate Python stubs" OFF)

if (WIN32)
  set(F3D_BINDINGS_PYTHON_WINDOWS_BUILD_DLL_FIXUP "" CACHE STRING "Path to folder containing DLLs to point to when using the Python wheels from build")
  mark_as_advanced(F3D_BINDINGS_PYTHON_WINDOWS_BUILD_DLL_FIXUP)
endif ()

list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_LIST_DIR}/cmake")
include(GNUInstallDirs)
include(f3dPython)

find_package(Python 3.9 COMPONENTS Interpreter Development)
find_package(pybind11 2.9.2 REQUIRED)

pybind11_add_module(pyf3d MODULE F3DPythonBindings.cxx)

# In case pyf3d is built separately, we need to retrieve the existing libf3d
if(PROJECT_IS_TOP_LEVEL)
  find_package(f3d REQUIRED COMPONENTS library)
  set(F3D_VERSION "${f3d_VERSION}")
  target_link_libraries(pyf3d PRIVATE f3d::libf3d)
  target_include_directories(pyf3d PRIVATE "${f3d_INCLUDE_DIR}/f3d")
else()
  target_link_libraries(pyf3d PRIVATE libf3d)
endif()

set(f3d_python_package_name "f3d")
set(f3d_python_package_suffix "python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages")

get_property(F3D_MULTI_CONFIG_GENERATOR GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
set(f3d_binary_dir "${CMAKE_BINARY_DIR}$<${F3D_MULTI_CONFIG_GENERATOR}:/$<CONFIG>>")
set(f3d_module_dir "${f3d_binary_dir}/${f3d_python_package_name}")

set_target_properties(pyf3d PROPERTIES
  CXX_STANDARD 17
  CXX_VISIBILITY_PRESET hidden
  LIBRARY_OUTPUT_DIRECTORY "${f3d_module_dir}"
  )

if(SKBUILD)
  if(APPLE)
    set_target_properties(pyf3d PROPERTIES INSTALL_RPATH "@loader_path/${CMAKE_INSTALL_LIBDIR}")
  elseif(UNIX)
    set_target_properties(pyf3d PROPERTIES INSTALL_RPATH "$ORIGIN/${CMAKE_INSTALL_LIBDIR}")
  endif()
  set(f3d_python_install_path ".")
else()
  if(APPLE)
    set_target_properties(pyf3d PROPERTIES INSTALL_RPATH "@loader_path/../..")
  elseif(UNIX)
    set_target_properties(pyf3d PROPERTIES INSTALL_RPATH "$ORIGIN/../..")
  endif()
  set(f3d_python_install_path "${CMAKE_INSTALL_LIBDIR}/${f3d_python_package_suffix}/${f3d_python_package_name}")
endif()

# generate Windows fixup for build
set(F3D_ABSOLUTE_DLLS_FIXUP "")
set(F3D_RELATIVE_DLLS_FIXUP "")
if(WIN32)
  if(PROJECT_IS_TOP_LEVEL)
    f3d_python_windows_dll_fixup(PATHS "$<TARGET_FILE_DIR:f3d::libf3d>" OUTPUT F3D_ABSOLUTE_DLLS_FIXUP)
  else()
    set(f3d_win_dll_paths "${F3D_BINDINGS_PYTHON_WINDOWS_BUILD_DLL_FIXUP}" "$<TARGET_FILE_DIR:VTK::CommonCore>")
    if(BUILD_SHARED_LIBS)
      list(APPEND f3d_win_dll_paths "$<TARGET_FILE_DIR:libf3d>")
    endif()
    f3d_python_windows_dll_fixup(PATHS "${f3d_win_dll_paths}" OUTPUT F3D_ABSOLUTE_DLLS_FIXUP)
  endif()
endif()

configure_file("${CMAKE_CURRENT_SOURCE_DIR}/__init__.py.in"
  "${CMAKE_CURRENT_BINARY_DIR}/__init__.py-build" @ONLY)

file(GENERATE
  OUTPUT "${f3d_module_dir}/__init__.py"
  INPUT "${CMAKE_CURRENT_BINARY_DIR}/__init__.py-build"
)

# generate Windows fixup for install
set(F3D_ABSOLUTE_DLLS_FIXUP "")
set(F3D_RELATIVE_DLLS_FIXUP "")
if(WIN32)
  if(SKBUILD)
    set(f3d_python_dll_install_bin_path "${CMAKE_INSTALL_BINDIR}")
  else()
    set(f3d_python_dll_install_bin_path "../../../${CMAKE_INSTALL_BINDIR}")
  endif()
  f3d_python_windows_dll_fixup(PATHS "${f3d_python_dll_install_bin_path}" OUTPUT F3D_RELATIVE_DLLS_FIXUP)
endif()

configure_file("${CMAKE_CURRENT_SOURCE_DIR}/__init__.py.in"
  "${CMAKE_CURRENT_BINARY_DIR}/__init__.py-install" @ONLY)

# Stubs
if (F3D_BINDINGS_PYTHON_GENERATE_STUBS)
  add_custom_command(
    TARGET pyf3d
    POST_BUILD
    COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/generate_stubs.py --into=${f3d_binary_dir}
    WORKING_DIRECTORY ${f3d_binary_dir})
endif()

# testing
if(BUILD_TESTING)
  add_subdirectory(testing)
endif()

# installing
install(TARGETS pyf3d
  LIBRARY DESTINATION ${f3d_python_install_path} COMPONENT python)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/__init__.py-install" RENAME "__init__.py"
  DESTINATION ${f3d_python_install_path} COMPONENT python)
if (F3D_BINDINGS_PYTHON_GENERATE_STUBS)
  install(FILES  "${f3d_module_dir}/__init__.pyi" "${f3d_module_dir}/pyf3d.pyi"
    DESTINATION ${f3d_python_install_path} COMPONENT python)
endif()