# Link Pymllm Lib

> Create or update the pymllm/lib symlink to point to a C++ build directory's bin/ folder. Required after editable installs with C++ builds so that Python can find the compiled .so libraries. Use when the user asks to link, fix, or set up pymllm native libraries.

- Skill: `ubiquitouslearning/link-pymllm-lib` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ubiquitouslearning/link-pymllm-lib`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ubiquitouslearning/link-pymllm-lib/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ubiquitouslearning (https://skillmd.com/u/ubiquitouslearning)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ubiquitouslearning/link-pymllm-lib

---


# Link pymllm lib

## Goal

Create a symlink at `pymllm/lib` pointing to the correct build output directory so that an editable-installed pymllm can load the compiled C++ shared libraries (`MllmFFIExtension.so`, `libMllmRT.so`, etc.).

## Background

When pymllm is installed in editable mode (`pip install -e .`), Python imports from the source tree directly. The C++ libraries are compiled into `<build-dir>/bin/` by CMake, but pymllm looks for them at `pymllm/lib/`. A symlink bridges this gap:

```
pymllm/lib -> <project-root>/<build-dir>/bin
```

## Workflow

### Step 1: Detect available build directories

Scan the project root for directories matching the pattern `build*/bin/` that contain `MllmFFIExtension.so` (or `.dylib` on macOS). List all valid candidates.

Common build directories and their corresponding platforms:

| Build directory | Platform / Config | Typical build command |
|----------------|-------------------|----------------------|
| `build/bin` | X86 CPU only | `python task.py tasks/build_x86.yaml` |
| `build-x86-cuda/bin` | X86 + CUDA | `python task.py tasks/build_x86_cuda.yaml` |
| `build-qnn-aot/bin` | X86 + QNN AOT | `python task.py tasks/build_x86_qnn_aot.yaml` |
| `build-android-arm64-v8a-qnn/bin` | Android ARM + QNN | `python task.py tasks/build_android_qnn.yaml` |

### Step 2: Ask the user which build to link

Use `AskUserQuestion` to let the user pick from the detected build directories. Show each option with its path and the platform it corresponds to.

If no build directories with `.so` files are found, inform the user they need to build first:

```bash
pip install -r requirements.txt
python task.py tasks/build_x86.yaml  # or another build task
```

### Step 3: Check existing symlink

Before creating a new symlink, check if `pymllm/lib` already exists:

- If it's a symlink, show where it currently points and confirm replacement.
- If it's a real directory, warn the user and ask before removing it.
- If it doesn't exist, proceed directly.

### Step 4: Create the symlink

```bash
ln -sfn <project-root>/<build-dir>/bin <project-root>/pymllm/lib
```

Use `ln -sfn` to atomically replace any existing symlink.

### Step 5: Verify

After creating the symlink, verify by checking that the target `.so` file is accessible:

```bash
ls -la pymllm/lib/MllmFFIExtension.so
```

Then run a quick Python check:

```bash
python -c "import pymllm; print('mobile available:', pymllm.is_mobile_available())"
```

If `is_mobile_available()` returns `True`, the link is correct.

## Important Notes

- The symlink target must be an **absolute path** for reliability.
- On macOS, the library extension is `.dylib` instead of `.so`.
- Android build directories (e.g., `build-android-arm64-v8a-qnn/bin`) contain ARM binaries that cannot run on x86 hosts. Warn the user if they select one of these on a non-ARM machine.
- If the user has multiple build directories, they can re-run this skill anytime to switch which build pymllm uses.

