File: CMakeLists.txt

package info (click to toggle)
dm-tree 0.1.9-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 368 kB
  • sloc: python: 1,472; cpp: 614; makefile: 17; sh: 5
file content (127 lines) | stat: -rw-r--r-- 4,082 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
121
122
123
124
125
126
127
# Version >= 3.24 required for new `FindPython` module and `FIND_PACKAGE_ARGS`
# keyword of `FetchContent` module.
# https://cmake.org/cmake/help/v3.24/release/3.24.html
cmake_minimum_required(VERSION 3.24)

cmake_policy(SET CMP0135 NEW)

project (tree LANGUAGES CXX)

option(USE_SYSTEM_ABSEIL "Force use of system abseil-cpp" OFF)
option(USE_SYSTEM_PYBIND11 "Force use of system pybind11" OFF)

# Required for Python.h and python binding.
find_package(Python3 COMPONENTS Interpreter Development)
include_directories(SYSTEM ${Python3_INCLUDE_DIRS})
if(Python3_VERSION VERSION_LESS "3.6.0")
  message(FATAL_ERROR
    "Python found ${Python3_VERSION} < 3.6.0")
endif()

# Use C++14 standard.
set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ version selection")

# Position-independent code is needed for Python extension modules.
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

# Set default build type.
if(NOT CMAKE_BUILD_TYPE)
   set(CMAKE_BUILD_TYPE RELEASE
       CACHE STRING "Choose the type of build: Debug Release."
       FORCE)
endif()
message("Current build type is: ${CMAKE_BUILD_TYPE}")
message("PROJECT_BINARY_DIR is: ${PROJECT_BINARY_DIR}")

if (NOT (WIN32 OR MSVC))
  if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
    # Basic build for debugging (default).
    # -Og enables optimizations that do not interfere with debugging.
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Og")
  endif()

  if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
    # Optimized release build: turn off debug runtime checks
    # and turn on highest speed optimizations.
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNDEBUG -O3")
  endif()
endif()

if(APPLE)
  # On MacOS:
  #   -undefined dynamic_lookup is necessary for pybind11 linking
  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-everything -w -undefined dynamic_lookup")

  # On MacOS, we need this so that CMake will use the right Python if the user
  # has a virtual environment active
  set (CMAKE_FIND_FRAMEWORK LAST)
endif()

# Use `FetchContent` module to manage all external dependencies (i.e.
# abseil-cpp and pybind11).
include(FetchContent)

# Needed to disable Abseil tests.
set(BUILD_TESTING OFF)

# Try to find abseil-cpp package system-wide first.
if (USE_SYSTEM_ABSEIL)
    message(STATUS "Use system abseil-cpp: ${USE_SYSTEM_ABSEIL}")
    set(ABSEIL_FIND_PACKAGE_ARGS FIND_PACKAGE_ARGS)
endif()

# Include abseil-cpp.
set(ABSEIL_REPO https://github.com/abseil/abseil-cpp)
set(ABSEIL_CMAKE_ARGS
  "-DCMAKE_INSTALL_PREFIX=${CMAKE_SOURCE_DIR}/abseil-cpp"
  "-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}"
  "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
  "-DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}"
  "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
  "-DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}"
  "-DLIBRARY_OUTPUT_PATH=${CMAKE_SOURCE_DIR}/abseil-cpp/lib"
  "-DABSL_PROPAGATE_CXX_STD=ON")
if(DEFINED CMAKE_OSX_ARCHITECTURES)
  set(ABSEIL_CMAKE_ARGS
      ${ABSEIL_CMAKE_ARGS}
      "-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}")
endif()

FetchContent_Declare(
  absl
  URL         ${ABSEIL_REPO}/archive/refs/tags/20220623.2.tar.gz
  URL_HASH    SHA256=773652c0fc276bcd5c461668dc112d0e3b6cde499600bfe3499c5fdda4ed4a5b
  CMAKE_ARGS  ${ABSEIL_CMAKE_ARGS}
  EXCLUDE_FROM_ALL
  ${ABSEIL_FIND_PACKAGE_ARGS})

# Try to find pybind11 package system-wide first.
if (USE_SYSTEM_PYBIND11)
    message(STATUS "Use system pybind11: ${USE_SYSTEM_PYBIND11}")
    set(PYBIND11_FIND_PACKAGE_ARGS FIND_PACKAGE_ARGS)
endif()

FetchContent_Declare(
  pybind11
  URL       https://github.com/pybind/pybind11/archive/refs/tags/v2.10.1.tar.gz
  URL_HASH  SHA256=111014b516b625083bef701df7880f78c2243835abdb263065b6b59b960b6bad
  ${PYBIND11_FIND_PACKAGE_ARGS})

FetchContent_MakeAvailable(absl pybind11)

# Define pybind11 tree module.
pybind11_add_module(_tree tree.h tree.cc)

target_link_libraries(
  _tree
  PRIVATE
    absl::int128
    absl::raw_hash_set
    absl::raw_logging_internal
    absl::strings
    absl::throw_delegate)

# Make the module private to tree package.
set_target_properties(_tree PROPERTIES OUTPUT_NAME tree/_tree)