Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 157 additions & 0 deletions docs/Building_macos_system_libs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
# Building CCExtractor on macOS using System Libraries (-system-libs)

## Overview

This document explains how to build CCExtractor on macOS using system-installed libraries instead of bundled third-party libraries.

This build mode is required for Homebrew compatibility and is enabled via the `-system-libs` flag introduced in PR #1862.

## Why is -system-libs needed?

### Background

CCExtractor was removed from Homebrew (homebrew-core) because:

- Homebrew does not allow bundling third-party libraries
- The default CCExtractor build compiles libraries from `src/thirdparty/`
- This violates Homebrew packaging policies

### What -system-libs fixes

The `-system-libs` flag allows CCExtractor to:

- Use system-installed libraries via Homebrew
- Resolve headers and linker flags using `pkg-config`
- Skip compiling bundled copies of common libraries

This makes CCExtractor acceptable for Homebrew packaging.

## Build Modes Explained

### 1️⃣ Default Build (Bundled Libraries)

**Command:**

```bash
./mac/build.command
```

**Behavior:**

- Compiles bundled libraries:
- `freetype`
- `libpng`
- `zlib`
- `utf8proc`
- Self-contained binary
- Larger size
- Suitable for standalone builds

### 2️⃣ System Libraries Build (Homebrew-compatible)

**Command:**

```bash
./mac/build.command -system-libs
```

**Behavior:**

- Uses system libraries via `pkg-config`
- Does not compile bundled libraries
- Smaller binary
- Faster build
- Required for Homebrew

## Required Homebrew Dependencies

Install required dependencies:

```bash
brew install pkg-config autoconf automake libtool \
gpac freetype libpng protobuf-c utf8proc zlib
```

**Optional** (OCR / HARDSUBX support):

```bash
brew install tesseract leptonica ffmpeg
```

## How to Build

```bash
cd mac
./build.command -system-libs
```

**Verify:**

```bash
./ccextractor --version
```

## What Changes Internally with -system-libs

### Libraries NOT compiled (system-provided)

- **FreeType**
- **libpng**
- **zlib**
- **utf8proc**

### Libraries STILL bundled

- **lib_hash** (Custom SHA-256 implementation, no system equivalent)

## CI Coverage

A new CI job was added:

- `build_shell_system_libs`

**What it does:**

- Installs Homebrew dependencies
- Runs `./build.command -system-libs`
- Verifies the binary runs correctly

This ensures Homebrew-compatible builds stay working.

## Verification (Local)

You can confirm system libraries are used:

```bash
otool -L mac/ccextractor
```

**Expected output includes paths like:**

```
/opt/homebrew/opt/gpac/lib/libgpac.dylib
```

## Homebrew Formula Usage (Future)

Example formula snippet:

```ruby
def install
system "./mac/build.command", "-system-libs"
bin.install "mac/ccextractor"
end
```

## Summary

- `-system-libs` is opt-in
- Default build remains unchanged
- Enables CCExtractor to return to Homebrew
- Fully tested in CI and locally

## Related

- **PR #1862** — Add `-system-libs` flag
- **Issue #1580** — Homebrew compatibility
- **Issue #1534** — System library support