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})
|