Skip to content

Support macOS apple silicon #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Mar 9, 2024
Merged
Show file tree
Hide file tree
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
55 changes: 55 additions & 0 deletions .github/workflows/build_macos_arm64.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: TEST build for macos arm64

on:
push:
branches: [ "macos_apple_silicon" ]
tags:
- "v*.*.*"
pull_request:
branches: [ "macos_apple_silicon" ]

env:
ANDROID_NDK_VERSION: r26c
OPENCV_VERSION: 4.9.0

jobs:
build-macos-arm64:
name: build-macos-arm64
runs-on: macos-14
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: setup
run: |
# brew update
brew install --force --overwrite ninja ccache ffmpeg
cd ${{github.workspace}}
- name: build
run: |
python3 scripts/build.py --opencv --src src --build-dir build macos --arch arm64
python3 scripts/build.py --dart --src src --build-dir build macos --arch arm64
- uses: subosito/flutter-action@v2
with:
# flutter-version: '3.16.9'
channel: "stable"

- uses: actions/upload-artifact@v4
name: upload-libopencv_dart-macos-arm64
with:
path: build/publish/libopencv_dart-macos-arm64.tar.gz
name: libopencv_dart-macos-arm64.tar.gz
- name: Run Test
run: |
ls -alh $GITHUB_WORKSPACE/macos
export DYLD_LIBRARY_PATH=$GITHUB_WORKSPACE/macos:$DYLD_LIBRARY_PATH
flutter pub get
flutter test -x no-local-files
- name: Release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
draft: true
prerelease: false
files: |
build/publish/libopencv_dart-macos-arm64.tar.gz
24 changes: 12 additions & 12 deletions .github/workflows/build_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ jobs:
mv build/android-ndk-$ANDROID_NDK_VERSION build/android-ndk
- name: build-android
run: |
python3 scripts/build.py --dart --os android --arch x64 --src src --build-dir build \
--android-ndk build/android-ndk --android-abi x86_64
python3 scripts/build.py --dart --os android --arch x64 --src src --build-dir build \
--android-ndk build/android-ndk --android-abi arm64-v8a
python3 scripts/build.py --dart --os android --arch x64 --src src --build-dir build \
--android-ndk build/android-ndk --android-abi armeabi-v7a
python3 scripts/build.py --dart --src src --build-dir build \
--android-ndk build/android-ndk android --arch x86_64
python3 scripts/build.py --dart --src src --build-dir build \
--android-ndk build/android-ndk android --arch arm64-v8a
python3 scripts/build.py --dart --src src --build-dir build \
--android-ndk build/android-ndk android --arch armeabi-v7a

- uses: actions/upload-artifact@v4
name: upload-libopencv_dart-android-x86_64
Expand Down Expand Up @@ -96,8 +96,8 @@ jobs:
submodules: true
- name: build-opencv-dart
run: |
python3 scripts/build.py --opencv --os linux --arch x64 --src src --build-dir build
python3 scripts/build.py --dart --os linux --arch x64 --src src --build-dir build
python3 scripts/build.py --opencv --src src --build-dir build linux --arch x64
python3 scripts/build.py --dart --src src --build-dir build linux --arch x64
- uses: subosito/flutter-action@v2
with:
# flutter-version: '3.16.9'
Expand Down Expand Up @@ -134,8 +134,8 @@ jobs:
python-version: '3.11'
- name: build-opencv-dart
run: |
python3 ${{github.workspace}}\scripts\build.py --opencv --os windows --arch x64 --src src --build-dir build
python3 ${{github.workspace}}\scripts\build.py --dart --os windows --arch x64 --src src --build-dir build
python3 ${{github.workspace}}\scripts\build.py --opencv --src src --build-dir build windows --arch x64
python3 ${{github.workspace}}\scripts\build.py --dart --src src --build-dir build windows --arch x64
- uses: subosito/flutter-action@v2
with:
# flutter-version: '3.16.9'
Expand Down Expand Up @@ -172,8 +172,8 @@ jobs:
cd ${{github.workspace}}
- name: build
run: |
python3 scripts/build.py --opencv --os macos --arch x64 --src src --build-dir build
python3 scripts/build.py --dart --os macos --arch x64 --src src --build-dir build
python3 scripts/build.py --opencv --src src --build-dir build macos --arch x64
python3 scripts/build.py --dart --src src --build-dir build macos --arch x64
- uses: subosito/flutter-action@v2
with:
# flutter-version: '3.16.9'
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ __pycache__
.cache/
small2.mp4
test/models/
*.dylib

# Files and directories created by pub
.dart_tool/
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.6.3

- add support for macOS with Apple Silicon

## 0.6.2

* try add support for macos, see [this workflow](https://github.com/rainyl/opencv_dart/actions/workflows/build_macos.yaml)
Expand Down
24 changes: 21 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ please run `dart run opencv_dart:setup -p <platform> -a <arch>` to download
prebuilt binaries.

- `platform`: `auto` `android` `linux` `windows` `macos`
- `arch`: `auto` `x86` `x64` `x86_64`(android only) `arm64-v8a`(android only) `armeabi-v7a`(android only)
- `arch`: `auto` `x86` `x64` `x86_64`(android only) `arm64` (macOS only) `arm64-v8a`(android only) `armeabi-v7a`(android only)

**Please use v0.3.0 and later version.**

Expand Down Expand Up @@ -101,6 +101,12 @@ This package is in heavy development, dynamic libraries for Windows and linux ha
libgflags-dev python3 libjpeg-dev libpng-dev libtiff-dev
```

macos:

```bash
brew install --force --overwrite ninja ccache ffmpeg nasm
```

2. install dependencies: `cmake`, `python`, add to PATH
3. clone this repo, `git clone --recursive https://github.com/rainyl/opencv_dart.git`
4. `cd opencv_dart`
Expand All @@ -118,7 +124,13 @@ This package is in heavy development, dynamic libraries for Windows and linux ha
python ./scripts/build.py --opencv --os linux --arch x64 --build-dir build --src src
```

for android, you need to download [android ndk](https://developer.android.com/ndk/downloads) and [opencv for android sdk](https://opencv.org/releases/), extract opencv sdk and copy and rename `OpenCV-android-sdk` to `build/opencv/android` directory.
for macOS:

```bash
python3 ./scripts/build.py --opencv --os macos --arch arm64 --build-dir build --src src
```

for android, you need to download [android ndk](https://developer.android.com/ndk/downloads) and [opencv for android sdk](https://opencv.org/releases/), extract opencv sdk and copy and rename `OpenCV-android-sdk` to `build/opencv/android` directory.

6. compile this package along with gocv.

Expand All @@ -132,7 +144,13 @@ This package is in heavy development, dynamic libraries for Windows and linux ha

```bash
python ./scripts/build.py --dart --os linux --arch x64 --build-dir build --src src
```
```

macOS:

```bash
python3 ./scripts/build.py --dart --os macos --arch arm64 --build-dir build --src src
```

Android:

Expand Down
152 changes: 9 additions & 143 deletions bin/setup.dart
Original file line number Diff line number Diff line change
@@ -1,147 +1,13 @@
import 'dart:convert';
import 'dart:io';
import 'package:args/command_runner.dart';

import 'package:args/args.dart';
import 'package:yaml/yaml.dart';
import 'package:archive/archive_io.dart';
import 'package:path/path.dart' as p;

class OS {
static const auto = "auto";
static const windows = "windows";
static const linux = "linux";
static const android = "android";
static const fuchsia = "fuchsia";
static const ios = "ios";
static const macos = "macos";
}
import 'setup_commands.dart';

void main(List<String> args) async {
final parser = ArgParser();
// parser.addFlag(
// "flutter",
// negatable: true,
// defaultsTo: false,
// help: "Setup for Flutter",
// );
parser.addOption(
"platform",
abbr: "p",
allowed: [
"auto",
"windows",
"linux",
"android",
"fuchsia",
"ios",
"macos",
],
defaultsTo: "auto",
help: "Platform to setup",
);
parser.addOption(
"arch",
abbr: "a",
allowed: [
"auto",
"x86",
"x64",
"x86_64",
"arm64-v8a",
"armeabi-v7a",
],
defaultsTo: "auto",
help: "Architecture to setup",
);

final argsParsed = parser.parse(args);
final platform =
argsParsed["platform"] == OS.auto ? Platform.operatingSystem : argsParsed["platform"] as String;
final arch = argsParsed["arch"] == OS.auto
? (platform == "android" ? "arm64-v8a" : "x64")
: argsParsed["arch"] as String;
final setupPkgName = "opencv_dart";

// Assumed package root
final root = Directory.current.uri;
print('Building with assumed project root in:');
print(root.toFilePath());

// Assumed package_config.json
final packageConfigFile = File.fromUri(
root.resolve('.dart_tool/package_config.json'),
);
dynamic packageConfig;
try {
packageConfig = json.decode(await packageConfigFile.readAsString());
} on FileSystemException {
print('Missing .dart_tool/package_config.json');
print('Run `flutter pub get` first.');
exit(1);
} on FormatException {
print('Invalid .dart_tool/package_config.json');
print('Run `flutter pub get` first.');
exit(1);
}

// Determine the source path of package:webcrypto in the PUB_CACHE
final pkg = (packageConfig['packages'] ?? []).firstWhere(
(e) => e['name'] == setupPkgName,
orElse: () => null,
);
if (pkg == null) {
print('dependency on package:$setupPkgName is required');
exit(1);
}
final opencvRoot = packageConfigFile.uri.resolve(pkg['rootUri'] ?? '');
print('Using package:$setupPkgName from ${opencvRoot.toFilePath()}');

final doc = loadYaml(File("${opencvRoot.toFilePath()}/pubspec.yaml").readAsStringSync());
final _version = doc["version"] as String;
final version = _version.replaceAll(RegExp(r"\-dev.*"), "");
final libTarName = "libopencv_dart-$platform-$arch.tar.gz";

print('Downloading prebuilt binary...');
String url = "https://github.com/rainyl/opencv_dart/releases/download/v$version/$libTarName";

final cacheTarPath = p.join(opencvRoot.toFilePath(), ".cache", libTarName);
final saveFile = File(cacheTarPath);
if (!saveFile.parent.existsSync()) saveFile.parent.createSync(recursive: true);

print("Downloading $url");
final request = await HttpClient().getUrl(Uri.parse(url));
final response = await request.close();
if (response.statusCode == 200) {
await response.pipe(saveFile.openWrite());
print("Cached to $cacheTarPath");
} else {
print("Download Failed with status: ${response.statusCode}");
exit(1);
}

print("Extracting...");
String extractPath = "";
switch (platform) {
case OS.windows:
extractPath = p.join(opencvRoot.toFilePath(), "windows");
break;
case OS.linux:
extractPath = p.join(opencvRoot.toFilePath(), "linux");
break;
case OS.android:
extractPath = p.join(opencvRoot.toFilePath(), "android", "src", "main", "jniLibs", arch);
case OS.macos:
extractPath = p.join(opencvRoot.toFilePath(), "macos");
case OS.fuchsia:
case OS.ios:
throw UnimplementedError();
default:
throw UnsupportedError("Platform $platform not supported");
}

if (!Directory(extractPath).existsSync()) Directory(extractPath).createSync(recursive: true);
await extractFileToDisk(cacheTarPath, extractPath);

print("Finished");
exit(0);
final runner = CommandRunner("setup", "Setup for opencv_dart")
..addCommand(WindowsSetupCommand())
..addCommand(LinuxSetupCommand())
..addCommand(MacOsSetupCommand())
..addCommand(AndroidSetupCommand())
// ..addCommand(IosSetupCommand())
..run(args);
}
Loading