cmake_minimum_required(VERSION 3.16) project(rnllama VERSION 1.0.0 LANGUAGES CXX C ASM) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # iOS specific settings set(CMAKE_OSX_DEPLOYMENT_TARGET 13.0) set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO) # Dependencies and compile options add_definitions( -DNDEBUG -DO3 -DLM_GGML_USE_CPU -DLM_GGML_USE_ACCELERATE -DLM_GGML_USE_BLAS -DLM_GGML_BLAS_USE_ACCELERATE -DLM_GGML_USE_METAL -DLM_GGML_METAL_EMBED_LIBRARY=1 ) if (CMAKE_OSX_ARCHITECTURES STREQUAL "arm64;x86_64") add_definitions(-DLM_GGML_CPU_GENERIC) endif () set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cpp) # Collect source files using glob patterns file(GLOB MODEL_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/models/*.cpp) file(GLOB GGML_CPU_C_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/ggml-cpu/*.c) file(GLOB GGML_CPU_CPP_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/ggml-cpu/*.cpp) file(GLOB GGML_CPU_AMX_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/ggml-cpu/amx/*.cpp) file(GLOB GGML_METAL_CPP_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/ggml-metal/*.cpp) file(GLOB GGML_METAL_M_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/ggml-metal/*.m) file(GLOB GGML_METAL_S_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/ggml-metal/*.s) set_source_files_properties(${GGML_METAL_S_FILES} PROPERTIES LANGUAGE ASM) file(GLOB GGML_BLAS_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/ggml-blas/*.cpp) file(GLOB LLAMA_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/llama*.cpp) file(GLOB MTMD_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/tools/mtmd/*.cpp) file(GLOB MTMD_MODEL_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/tools/mtmd/models/*.cpp) file(GLOB COMMON_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/common/*.cpp) file(GLOB JINJA_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/common/jinja/*.cpp) file(GLOB CODEC_FILES CONFIGURE_DEPENDS ${SOURCE_DIR}/codec/src/*.cpp ${SOURCE_DIR}/codec/src/batch/*.cpp ${SOURCE_DIR}/codec/src/models/*.cpp ${SOURCE_DIR}/codec/src/ops/*.cpp ${SOURCE_DIR}/codec/src/runtime/*.cpp ${SOURCE_DIR}/codec/src/lm/*.cpp ${SOURCE_DIR}/codec/common/*.cpp ) # tts_runner{,_flow}.cpp are codec.cpp's reference host loop; they pull in # codec_example_* helpers from examples/utils (not shipped here) and un-prefixed # common_* symbols. rn-tts drives its own AR loop via codec_lm_*, so drop them — # matching tests/CMakeLists.txt (keeps only audio_lm.cpp from codec/common). list(REMOVE_ITEM CODEC_FILES ${SOURCE_DIR}/codec/common/tts_runner.cpp ${SOURCE_DIR}/codec/common/tts_runner_flow.cpp ) if (CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") set(SOURCE_FILES_ARCH ${SOURCE_DIR}/ggml-cpu/arch/arm/quants.c ${SOURCE_DIR}/ggml-cpu/arch/arm/repack.cpp ) endif () # Define public headers set(PUBLIC_HEADERS ${SOURCE_DIR}/rn-llama.h ${SOURCE_DIR}/rn-completion.h ${SOURCE_DIR}/rn-slot.h ${SOURCE_DIR}/rn-slot-manager.h ${SOURCE_DIR}/rn-tts.h ${SOURCE_DIR}/llama.h ${SOURCE_DIR}/llama-impl.h ${SOURCE_DIR}/common/speculative.h ${SOURCE_DIR}/ggml.h ) # Create library target add_library(rnllama SHARED # Core GGML files ${SOURCE_DIR}/ggml.c ${SOURCE_DIR}/ggml-alloc.c ${SOURCE_DIR}/ggml-backend.cpp ${SOURCE_DIR}/ggml-backend-dl.cpp ${SOURCE_DIR}/ggml-backend-meta.cpp ${SOURCE_DIR}/ggml-backend-reg.cpp ${SOURCE_DIR}/ggml-opt.cpp ${SOURCE_DIR}/ggml-threading.cpp ${SOURCE_DIR}/ggml-quants.c ${SOURCE_DIR}/gguf.cpp # GGML CPU files (globbed) ${GGML_CPU_C_FILES} ${GGML_CPU_CPP_FILES} ${GGML_CPU_AMX_FILES} # GGML Metal files (globbed) ${GGML_METAL_CPP_FILES} ${GGML_METAL_M_FILES} ${GGML_METAL_S_FILES} # GGML BLAS files (globbed) ${GGML_BLAS_FILES} # Llama files (globbed) ${LLAMA_FILES} ${SOURCE_DIR}/unicode-data.cpp ${SOURCE_DIR}/unicode.cpp # Common utilities ${COMMON_FILES} ${SOURCE_DIR}/anyascii.c # Jinja template engine ${JINJA_FILES} # codec.cpp sources ${CODEC_FILES} # Headers (needed for build) ${SOURCE_DIR}/common/chat.h ${SOURCE_DIR}/common/common.h ${SOURCE_DIR}/common/speculative.h # Multimodal support (globbed) ${MTMD_MODEL_FILES} ${MTMD_FILES} # React Native llama APIs ${SOURCE_DIR}/rn-llama.cpp ${SOURCE_DIR}/rn-completion.cpp ${SOURCE_DIR}/rn-slot.cpp ${SOURCE_DIR}/rn-slot-manager.cpp ${SOURCE_DIR}/rn-tts.cpp # Model implementations (globbed) ${MODEL_FILES} # Architecture-specific files ${SOURCE_FILES_ARCH} ) # Setup include directories target_include_directories(rnllama PUBLIC $ $ $ $ $ $ $ $ ) # Link required frameworks target_link_libraries(rnllama PRIVATE "-framework Accelerate" "-framework Foundation" "-framework Metal" "-framework MetalKit" ) # Set properties for framework set_target_properties(rnllama PROPERTIES MACOSX_FRAMEWORK_IDENTIFIER "com.rnllama" MACOSX_FRAMEWORK_BUNDLE_VERSION 1.0.0 MACOSX_FRAMEWORK_SHORT_VERSION_STRING 1.0.0 FRAMEWORK TRUE FRAMEWORK_VERSION 1.0.0 VERSION 1.0.0 PUBLIC_HEADER "${PUBLIC_HEADERS}" XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC NO # Generate dSYMs so packaged xcframework slices can be symbolicated in App Store crash logs. XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym" XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS YES )