Repository navigation
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
148 lines (148 loc) · 11.1 KB
/
Copy pathCMakeLists.txt
File metadata and controls
148 lines (148 loc) · 11.1 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
cmake_minimum_required(VERSION 3.24)
project(Cere VERSION 0.1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt6 6.8 REQUIRED COMPONENTS Core Gui Quick Qml Network Widgets DBus)
find_package(LayerShellQt REQUIRED)
set(CERE_NATIVE native/controller.cpp native/controller.h native/citations.h native/motion.cpp native/motion.h native/avatarpuppet.cpp native/avatarpuppet.h native/avatardefinition.h native/avatarskeleton.h)
qt_add_executable(cere native/main.cpp ${CERE_NATIVE})
qt_add_resources(cere cere-palettes PREFIX "/" FILES assets/palettes.json)
target_link_libraries(cere PRIVATE Qt6::Core Qt6::Gui Qt6::Quick Qt6::Qml Qt6::Network Qt6::Widgets Qt6::DBus LayerShellQt::Interface)
target_compile_definitions(cere PRIVATE CERE_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
set_target_properties(cere PROPERTIES INSTALL_RPATH "$ORIGIN")
include(GNUInstallDirs)
find_program(NODE_EXECUTABLE node REQUIRED)
set(CERE_ICON_SIZES 16 22 24 32 48 64 128 256 512)
set(CERE_ICON_OUTPUTS)
foreach(CERE_ICON_SIZE IN LISTS CERE_ICON_SIZES)
list(APPEND CERE_ICON_OUTPUTS "${CMAKE_CURRENT_BINARY_DIR}/icons/hicolor/${CERE_ICON_SIZE}x${CERE_ICON_SIZE}/apps/cere.png")
endforeach()
add_custom_command(
OUTPUT ${CERE_ICON_OUTPUTS}
COMMAND ${NODE_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/prepare-icons.mjs
${CMAKE_CURRENT_SOURCE_DIR}/assets/cere-emblem.png ${CMAKE_CURRENT_BINARY_DIR}/icons/hicolor
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/assets/cere-emblem.png ${CMAKE_CURRENT_SOURCE_DIR}/tools/prepare-icons.mjs
COMMENT "Preparing Cere application icons"
VERBATIM)
add_custom_target(cere-icons ALL DEPENDS ${CERE_ICON_OUTPUTS})
# The build's identity (package version, source commit, dirty), reported by the broker in
# diagnostics and in the mobile welcome. Rewritten only when it changes.
add_custom_target(cere-build-info ALL
COMMAND ${NODE_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/build-info.mjs ${CMAKE_CURRENT_BINARY_DIR}/build-info.json
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/build-info.json
COMMENT "Recording the build identity"
VERBATIM)
add_dependencies(cere cere-icons)
find_package(Python3 3.12 REQUIRED COMPONENTS Interpreter)
find_path(NODE_INCLUDE_DIR node_api.h PATH_SUFFIXES node REQUIRED)
add_library(cere-peercred MODULE native/peercred.cpp)
target_include_directories(cere-peercred PRIVATE ${NODE_INCLUDE_DIR})
set_target_properties(cere-peercred PROPERTIES PREFIX "" SUFFIX ".node" AUTOMOC OFF)
add_library(cere-telemetry MODULE native/telemetry.cpp)
add_executable(cere-report native/report.cpp)
set_target_properties(cere-report PROPERTIES AUTOMOC OFF)
target_include_directories(cere-telemetry PRIVATE ${NODE_INCLUDE_DIR})
set_target_properties(cere-telemetry PROPERTIES PREFIX "" SUFFIX ".node" AUTOMOC OFF)
execute_process(COMMAND ${NODE_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/stage-runtime.mjs ${CMAKE_CURRENT_BINARY_DIR}/runtime RESULT_VARIABLE CERE_RUNTIME_RESULT)
if(NOT CERE_RUNTIME_RESULT EQUAL 0)
message(FATAL_ERROR "Could not stage Cere runtime dependencies; run npm ci first")
endif()
execute_process(COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/tools/prepare-tts.py
--output ${CMAKE_CURRENT_BINARY_DIR}/tts --arch ${CMAKE_SYSTEM_PROCESSOR}
RESULT_VARIABLE CERE_TTS_RESULT)
if(NOT CERE_TTS_RESULT EQUAL 0)
message(FATAL_ERROR "Could not stage offline Piper speech assets; see tools/prepare-tts.py")
endif()
include(CTest)
if(BUILD_TESTING)
find_package(Qt6 REQUIRED COMPONENTS Test)
enable_language(C)
find_package(PkgConfig REQUIRED)
# Optional offline artwork tooling; the desktop renderer does not use OpenCV.
pkg_search_module(CERE_OPENCV QUIET opencv5 opencv4)
if(CERE_OPENCV_FOUND)
add_executable(cere-avatar-interpolate tools/interpolate-avatar-poses.cpp tools/avatar-registration.h)
add_executable(cere-avatar-registration-check tests/avatar-registration.cpp tools/avatar-registration.h)
foreach(target cere-avatar-interpolate cere-avatar-registration-check)
target_include_directories(${target} PRIVATE ${CERE_OPENCV_INCLUDE_DIRS})
target_link_directories(${target} PRIVATE ${CERE_OPENCV_LIBRARY_DIRS})
target_link_libraries(${target} PRIVATE opencv_video opencv_imgcodecs opencv_imgproc opencv_core)
endforeach()
set_target_properties(cere-avatar-interpolate cere-avatar-registration-check PROPERTIES AUTOMOC OFF)
add_test(NAME avatar-registration COMMAND cere-avatar-registration-check)
endif()
pkg_check_modules(WAYLAND_CLIENT REQUIRED IMPORTED_TARGET wayland-client)
find_program(WAYLAND_SCANNER wayland-scanner REQUIRED)
set(CERE_POINTER_PROTOCOL ${CMAKE_CURRENT_SOURCE_DIR}/tests/fixtures/wlr-virtual-pointer-unstable-v1.xml)
add_custom_command(OUTPUT wlr-virtual-pointer-client.h wlr-virtual-pointer-protocol.c
COMMAND ${WAYLAND_SCANNER} client-header ${CERE_POINTER_PROTOCOL} wlr-virtual-pointer-client.h
COMMAND ${WAYLAND_SCANNER} private-code ${CERE_POINTER_PROTOCOL} wlr-virtual-pointer-protocol.c
DEPENDS ${CERE_POINTER_PROTOCOL} VERBATIM)
qt_add_executable(cere-ui-check tests/ui.cpp ${CERE_NATIVE})
target_sources(cere-ui-check PRIVATE tests/acceptancepointer.h
${CMAKE_CURRENT_BINARY_DIR}/wlr-virtual-pointer-client.h ${CMAKE_CURRENT_BINARY_DIR}/wlr-virtual-pointer-protocol.c)
target_include_directories(cere-ui-check PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
qt_add_resources(cere-ui-check cere-test-palettes PREFIX "/" FILES assets/palettes.json)
target_link_libraries(cere-ui-check PRIVATE Qt6::Core Qt6::Gui Qt6::Quick Qt6::Qml Qt6::Network Qt6::Widgets Qt6::DBus Qt6::Test LayerShellQt::Interface PkgConfig::WAYLAND_CLIENT)
target_compile_definitions(cere-ui-check PRIVATE CERE_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
# Startup cost of the interface controller (time and peak memory), for before/after comparisons.
qt_add_executable(cere-measure-startup tools/measure-startup.cpp ${CERE_NATIVE})
qt_add_resources(cere-measure-startup cere-measure-palettes PREFIX "/" FILES assets/palettes.json)
target_include_directories(cere-measure-startup PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/native)
target_link_libraries(cere-measure-startup PRIVATE Qt6::Core Qt6::Gui Qt6::Quick Qt6::Qml Qt6::Network Qt6::Widgets Qt6::DBus LayerShellQt::Interface)
# Documentation screenshots from a scripted demo profile; tools/screenshots/run.sh prepares and runs it.
qt_add_executable(cere-screenshots tools/screenshots/capture.cpp ${CERE_NATIVE})
qt_add_resources(cere-screenshots cere-screenshot-palettes PREFIX "/" FILES assets/palettes.json)
target_link_libraries(cere-screenshots PRIVATE Qt6::Core Qt6::Gui Qt6::Quick Qt6::Qml Qt6::Network Qt6::Widgets Qt6::DBus Qt6::Test LayerShellQt::Interface)
target_compile_definitions(cere-screenshots PRIVATE CERE_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
qt_add_executable(cere-motion-check tests/motion.cpp native/motion.cpp native/motion.h)
target_link_libraries(cere-motion-check PRIVATE Qt6::Core Qt6::Gui Qt6::Test)
# Checked standard-library preconditions (for example std::clamp's ordered bounds).
target_compile_definitions(cere-motion-check PRIVATE CERE_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}" _GLIBCXX_ASSERTIONS)
add_test(NAME motion COMMAND cere-motion-check)
qt_add_executable(cere-avatar-check tests/avatarpuppet.cpp native/avatarpuppet.cpp native/avatarpuppet.h native/avatardefinition.h native/avatarskeleton.h)
target_include_directories(cere-avatar-check PRIVATE native)
target_link_libraries(cere-avatar-check PRIVATE Qt6::Core Qt6::Gui Qt6::Quick Qt6::Qml)
add_test(NAME avatar COMMAND cere-avatar-check ${CMAKE_CURRENT_SOURCE_DIR})
set_tests_properties(avatar PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen;QT_QUICK_BACKEND=rhi;QSG_RHI_BACKEND=opengl")
add_test(NAME avatar-software COMMAND cere-avatar-check ${CMAKE_CURRENT_SOURCE_DIR})
set_tests_properties(avatar-software PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen;QT_QUICK_BACKEND=software;CERE_PUPPET_TEST_SOFTWARE=1")
# QML component tests. The portrait tests read their fixtures through XMLHttpRequest.
find_program(CERE_QMLTESTRUNNER qmltestrunner HINTS "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_BINS}" REQUIRED)
add_test(NAME qml COMMAND ${CERE_QMLTESTRUNNER} -input ${CMAKE_CURRENT_SOURCE_DIR}/tests/qml -import ${CMAKE_CURRENT_SOURCE_DIR}/qml)
set_tests_properties(qml PROPERTIES ENVIRONMENT "QML_XHR_ALLOW_FILE_READ=1;QT_QPA_PLATFORM=offscreen;QT_QUICK_BACKEND=software")
endif()
install(TARGETS cere RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/cere)
install(PROGRAMS tools/cere DESTINATION ${CMAKE_INSTALL_BINDIR})
install(DIRECTORY qml assets broker DESTINATION ${CMAKE_INSTALL_DATADIR}/cere
PATTERN "*.kate-swp" EXCLUDE
PATTERN "*.swp" EXCLUDE)
install(DIRECTORY protocol DESTINATION ${CMAKE_INSTALL_DATADIR}/cere)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tts DESTINATION ${CMAKE_INSTALL_DATADIR}/cere USE_SOURCE_PERMISSIONS)
install(FILES tools/setup-speech.ts tools/setup-kokoro.py DESTINATION ${CMAKE_INSTALL_DATADIR}/cere/tools)
install(FILES tools/setup-indextts.py DESTINATION ${CMAKE_INSTALL_DATADIR}/cere/tools)
install(FILES packaging/indextts-manifest.json DESTINATION ${CMAKE_INSTALL_DATADIR}/cere/packaging)
install(TARGETS cere-peercred LIBRARY DESTINATION ${CMAKE_INSTALL_DATADIR}/cere/native)
install(TARGETS cere-telemetry LIBRARY DESTINATION ${CMAKE_INSTALL_DATADIR}/cere/native)
install(DIRECTORY shell DESTINATION ${CMAKE_INSTALL_DATADIR}/cere)
install(TARGETS cere-report RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(PROGRAMS tools/cere-run tools/cere-telemetry-hooks DESTINATION ${CMAKE_INSTALL_BINDIR})
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/runtime/node_modules DESTINATION ${CMAKE_INSTALL_DATADIR}/cere)
install(FILES package.json package-lock.json ${CMAKE_CURRENT_BINARY_DIR}/build-info.json DESTINATION ${CMAKE_INSTALL_DATADIR}/cere)
install(FILES packaging/cere.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
foreach(CERE_ICON_SIZE IN LISTS CERE_ICON_SIZES)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/icons/hicolor/${CERE_ICON_SIZE}x${CERE_ICON_SIZE}/apps/cere.png
DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/${CERE_ICON_SIZE}x${CERE_ICON_SIZE}/apps)
endforeach()
install(FILES packaging/cere-broker.service DESTINATION ${CMAKE_INSTALL_LIBDIR}/systemd/user)
install(FILES README.md VALIDATION.md DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/cere)
install(FILES docs/tts.md DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/cere/docs)
install(FILES docs/workspace-telemetry.md DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/cere/docs)
install(FILES docs/FEATURE-MATRIX.md docs/CONVERSATION-STATES.md docs/SERVICES-GATE.md docs/REVIEW-VALIDATION.md DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/cere/docs)
install(FILES packaging/tts-NOTICES.md DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/cere/packaging)
install(DIRECTORY docs/memory DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/cere)
install(DIRECTORY docs/mobile DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/cere)
install(FILES packaging/memory-compose.yml packaging/memory.env.example DESTINATION ${CMAKE_INSTALL_DATADIR}/cere/packaging)
install(PROGRAMS tools/memory-dependencies.sh DESTINATION ${CMAKE_INSTALL_DATADIR}/cere/tools)
install(FILES tools/check-memory-adapters.ts DESTINATION ${CMAKE_INSTALL_DATADIR}/cere/tools)