Skip to content

Build libLiteRtLmC

Build libLiteRtLmC #2

name: Build libLiteRtLmC
# Builds the LiteRT-LM C engine as a shared library from source, uploads
# per-target artifacts. Run manually or on release tags for 0.2.0+.
on:
workflow_dispatch:
inputs:
litert_lm_tag:
description: "LiteRT-LM upstream tag to build from"
default: "v0.10.2"
type: string
push:
tags: ["lm-build-*"]
env:
LITERT_LM_TAG: ${{ inputs.litert_lm_tag || 'v0.10.2' }}
jobs:
build-linux-x86_64:
name: linux x86_64
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: install build deps
run: |
sudo apt-get update && sudo apt-get install -y \
cmake ninja-build g++ git
- name: clone litert-lm
run: |
git clone --depth=1 --branch=${{ env.LITERT_LM_TAG }} \
https://github.com/google-ai-edge/litert-lm.git /tmp/litert-lm
- name: patch CMakeLists to add shared lib target
run: |
cat >> /tmp/litert-lm/cmake/packages/litert_lm/CMakeLists.txt <<'PATCH'
# --- litert-rs: produce a shared library for FFI consumption ---
generate_local_aggregate()
add_library(litert_lm_shared SHARED ${LITERTLM_PROJECT_ROOT}/c/engine.cc
${LITERTLM_PROJECT_ROOT}/c/litert_lm_logging.cc)
target_include_directories(litert_lm_shared PRIVATE
${LITERTLM_INCLUDE_PATHS}
${LITERT_INCLUDE_PATHS}
${THIRD_PARTY_DIR}/json/include
)
target_link_libraries(litert_lm_shared PRIVATE
LiteRTLM::Local::Aggregate
${_LITERTLM_SYSLIBS}
)
set_target_properties(litert_lm_shared PROPERTIES
OUTPUT_NAME LiteRtLmC
VERSION 0.10.2
SOVERSION 0
)
# Only export litert_lm_* symbols
if(APPLE)
set_target_properties(litert_lm_shared PROPERTIES
LINK_FLAGS "-Wl,-exported_symbols_list,${LITERTLM_PROJECT_ROOT}/.github/litert_lm_exports.txt"
)
elseif(UNIX)
set_target_properties(litert_lm_shared PROPERTIES
LINK_FLAGS "-Wl,--version-script=${LITERTLM_PROJECT_ROOT}/.github/litert_lm_exports.map"
)
endif()
PATCH
- name: create export maps
run: |
mkdir -p /tmp/litert-lm/.github
# Linux version script
cat > /tmp/litert-lm/.github/litert_lm_exports.map <<'EOF'
VERS_1.0 {
global:
litert_lm_*;
local:
*;
};
EOF
# macOS exported_symbols_list
grep -E '^LITERT_LM_C_API_EXPORT' /tmp/litert-lm/c/engine.h -A1 | \
grep 'litert_lm_' | sed 's/.*\(litert_lm_[a-z_]*\).*/\1/' | \
sed 's/^/_/' > /tmp/litert-lm/.github/litert_lm_exports.txt || true
# The top-level CMakeLists uses ExternalProject_Add, making inner
# targets invisible. Invoke the inner cmake directly.
- name: cmake configure (inner project)
run: |
cmake -S /tmp/litert-lm/cmake/packages/litert_lm \
-B /tmp/litert-lm/build \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-DLITERTLM_PROJECT_ROOT=/tmp/litert-lm
- name: cmake build
run: cmake --build /tmp/litert-lm/build -j$(nproc) --target litert_lm_shared
timeout-minutes: 60
- name: inspect output
run: |
find /tmp/litert-lm/build -name 'libLiteRtLmC*' -type f -ls | head -5
LIB=$(find /tmp/litert-lm/build -name 'libLiteRtLmC.so*' -type f | head -1)
if [ -n "$LIB" ]; then
echo "exported litert_lm_* symbols:"
nm -D --defined-only "$LIB" | grep -c 'litert_lm_'
fi
- uses: actions/upload-artifact@v4
with:
name: libLiteRtLmC-linux-x86_64
path: /tmp/litert-lm/build/libLiteRtLmC*
if-no-files-found: warn
build-macos-arm64:
name: macos arm64
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: install build deps
run: brew install cmake ninja
- name: clone litert-lm
run: |
git clone --depth=1 --branch=${{ env.LITERT_LM_TAG }} \
https://github.com/google-ai-edge/litert-lm.git /tmp/litert-lm
- name: patch CMakeLists to add shared lib target
run: |
cat >> /tmp/litert-lm/cmake/packages/litert_lm/CMakeLists.txt <<'PATCH'
generate_local_aggregate()
add_library(litert_lm_shared SHARED ${LITERTLM_PROJECT_ROOT}/c/engine.cc
${LITERTLM_PROJECT_ROOT}/c/litert_lm_logging.cc)
target_include_directories(litert_lm_shared PRIVATE
${LITERTLM_INCLUDE_PATHS}
${LITERT_INCLUDE_PATHS}
${THIRD_PARTY_DIR}/json/include
)
target_link_libraries(litert_lm_shared PRIVATE
LiteRTLM::Local::Aggregate
${_LITERTLM_SYSLIBS}
)
set_target_properties(litert_lm_shared PROPERTIES
OUTPUT_NAME LiteRtLmC
VERSION 0.10.2
SOVERSION 0
)
PATCH
- name: cmake configure (inner project)
run: |
cmake -S /tmp/litert-lm/cmake/packages/litert_lm \
-B /tmp/litert-lm/build \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-DLITERTLM_PROJECT_ROOT=/tmp/litert-lm
- name: cmake build
run: cmake --build /tmp/litert-lm/build -j$(sysctl -n hw.ncpu) --target litert_lm_shared
timeout-minutes: 60
- name: inspect output
run: |
find /tmp/litert-lm/build -name 'libLiteRtLmC*' -type f -ls | head -5
LIB=$(find /tmp/litert-lm/build -name 'libLiteRtLmC*.dylib' -type f | head -1)
if [ -n "$LIB" ]; then
echo "exported litert_lm_* symbols:"
nm -gU "$LIB" | grep -c 'litert_lm_'
fi
- uses: actions/upload-artifact@v4
with:
name: libLiteRtLmC-macos-arm64
path: /tmp/litert-lm/build/libLiteRtLmC*
if-no-files-found: warn