Build libLiteRtLmC #2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |