File size: 6,560 Bytes
d456972
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
cmake_minimum_required(VERSION 3.25)
project(motionbricks VERSION 0.1.0 LANGUAGES C CXX)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

include(GNUInstallDirs)

option(MOTIONBRICKS_BUILD_TESTS "Build motion-bricks.cpp tests" ON)
option(MOTIONBRICKS_ENABLE_GGML "Use the pinned GGML submodule when present" ON)
option(MOTIONBRICKS_ENABLE_VULKAN "Enable the GGML Vulkan backend" ON)
option(MOTIONBRICKS_ENABLE_FUZZERS "Build libFuzzer targets" OFF)
option(MOTIONBRICKS_SANITIZE "Enable AddressSanitizer and UndefinedBehaviorSanitizer" OFF)
option(MOTIONBRICKS_DOWNLOAD_MODELS "Download and verify the published runtime model/style bundle" ON)
set(MOTIONBRICKS_GGML_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ggml" CACHE PATH
    "Pinned GGML submodule source directory")
set(MOTIONBRICKS_MODEL_REPOSITORY "LocalAI-io/MotionBricks-G1-GGML" CACHE STRING
    "Hugging Face repository containing the runtime bundle")
set(MOTIONBRICKS_MODEL_REVISION "cc2a47603dbc203a4f18f35dd06ed3611833f506" CACHE STRING
    "Pinned Hugging Face revision containing the runtime bundle")
set(MOTIONBRICKS_REFERENCE_BUNDLE "${CMAKE_CURRENT_SOURCE_DIR}/generated/g1-f32" CACHE PATH
    "Downloaded or locally converted MotionBricks runtime bundle")
set(MOTIONBRICKS_REFERENCE_STYLES "${CMAKE_CURRENT_SOURCE_DIR}/generated/styles" CACHE PATH
    "Downloaded or locally converted MotionBricks style bundle")

if(MOTIONBRICKS_ENABLE_GGML AND MOTIONBRICKS_DOWNLOAD_MODELS)
    find_package(Python3 COMPONENTS Interpreter REQUIRED)
    execute_process(
        COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/scripts/download_gguf_weights.py"
            --output "${CMAKE_CURRENT_SOURCE_DIR}/generated"
            --repo "${MOTIONBRICKS_MODEL_REPOSITORY}"
            --revision "${MOTIONBRICKS_MODEL_REVISION}"
        RESULT_VARIABLE MOTIONBRICKS_MODEL_DOWNLOAD_RESULT
        COMMAND_ECHO STDOUT)
    if(NOT MOTIONBRICKS_MODEL_DOWNLOAD_RESULT EQUAL 0)
        message(FATAL_ERROR
            "MotionBricks model download/verification failed. Set "
            "MOTIONBRICKS_DOWNLOAD_MODELS=OFF for a source-only build.")
    endif()
endif()

set(MOTIONBRICKS_SOURCES
    src/capi.cpp
    src/decoder.cpp
    src/error.cpp
    src/model.cpp
    src/neural_runtime.cpp
    src/pose.cpp)
list(APPEND MOTIONBRICKS_SOURCES src/root.cpp)
list(APPEND MOTIONBRICKS_SOURCES src/motion_rep.cpp)
list(APPEND MOTIONBRICKS_SOURCES src/planner.cpp)
list(APPEND MOTIONBRICKS_SOURCES src/style.cpp)
list(APPEND MOTIONBRICKS_SOURCES src/agent.cpp)

add_library(motionbricks_shared SHARED ${MOTIONBRICKS_SOURCES})
add_library(motionbricks::motionbricks ALIAS motionbricks_shared)
set_target_properties(motionbricks_shared PROPERTIES
    OUTPUT_NAME motionbricks
    EXPORT_NAME motionbricks
    CXX_VISIBILITY_PRESET hidden
    VISIBILITY_INLINES_HIDDEN YES
    VERSION ${PROJECT_VERSION}
    SOVERSION 0)
target_compile_definitions(motionbricks_shared PRIVATE MOTIONBRICKS_BUILD MOTIONBRICKS_SHARED)

add_library(motionbricks_static STATIC ${MOTIONBRICKS_SOURCES})
add_library(motionbricks::motionbricks_static ALIAS motionbricks_static)
set_target_properties(motionbricks_static PROPERTIES
    OUTPUT_NAME motionbricks
    EXPORT_NAME motionbricks_static)
target_compile_definitions(motionbricks_static PRIVATE MOTIONBRICKS_BUILD)

foreach(target motionbricks_shared motionbricks_static)
    target_include_directories(${target}
        PUBLIC
            "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
            "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
        PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src")
    if(MSVC)
        target_compile_options(${target} PRIVATE /W4 /permissive-)
    else()
        target_compile_options(${target} PRIVATE
            -Wall -Wextra -Wpedantic -Wconversion -Wshadow)
    endif()
endforeach()

if(MOTIONBRICKS_ENABLE_GGML)
    if(EXISTS "${MOTIONBRICKS_GGML_SOURCE_DIR}/CMakeLists.txt")
        set(GGML_BUILD_TESTS OFF CACHE BOOL "" FORCE)
        set(GGML_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
        set(GGML_NATIVE OFF CACHE BOOL "" FORCE)
        set(GGML_VULKAN ${MOTIONBRICKS_ENABLE_VULKAN} CACHE BOOL "" FORCE)
        set(GGML_BACKEND_DL OFF CACHE BOOL "" FORCE)
        add_subdirectory("${MOTIONBRICKS_GGML_SOURCE_DIR}"
                         "${CMAKE_BINARY_DIR}/ggml" EXCLUDE_FROM_ALL)
        # GGML is currently an internal build-tree dependency. Its installed
        # runtime/package contract will be added with the first neural graph.
        target_link_libraries(motionbricks_shared PRIVATE "$<BUILD_INTERFACE:ggml>")
        target_link_libraries(motionbricks_static PRIVATE "$<BUILD_INTERFACE:ggml>")
        target_compile_definitions(motionbricks_shared PRIVATE MOTIONBRICKS_HAVE_GGML=1)
        target_compile_definitions(motionbricks_static PRIVATE MOTIONBRICKS_HAVE_GGML=1)
        if(MOTIONBRICKS_ENABLE_VULKAN AND TARGET ggml-vulkan)
            target_link_libraries(motionbricks_shared PRIVATE "$<BUILD_INTERFACE:ggml-vulkan>")
            target_link_libraries(motionbricks_static PRIVATE "$<BUILD_INTERFACE:ggml-vulkan>")
            target_compile_definitions(motionbricks_shared PRIVATE MOTIONBRICKS_HAVE_VULKAN=1)
            target_compile_definitions(motionbricks_static PRIVATE MOTIONBRICKS_HAVE_VULKAN=1)
        endif()
    else()
        message(STATUS "GGML submodule not present; building the ABI scaffold only")
    endif()
endif()

if(MOTIONBRICKS_SANITIZE)
    if(MSVC)
        message(FATAL_ERROR "MOTIONBRICKS_SANITIZE currently requires Clang or GCC")
    endif()
    foreach(target motionbricks_shared motionbricks_static)
        target_compile_options(${target} PRIVATE -fsanitize=address,undefined -fno-omit-frame-pointer)
        target_link_options(${target} PRIVATE -fsanitize=address,undefined)
    endforeach()
endif()

add_executable(motionbricks-cli src/cli.cpp)
target_link_libraries(motionbricks-cli PRIVATE motionbricks::motionbricks)
set_target_properties(motionbricks-cli PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

include(CTest)
if(BUILD_TESTING AND MOTIONBRICKS_BUILD_TESTS)
    add_subdirectory(tests)
endif()

install(TARGETS motionbricks_shared motionbricks_static motionbricks-cli
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})