From 0fbeccc2664669c5fb144c89baf3c84fd252a648 Mon Sep 17 00:00:00 2001 From: Jason von Nieda Date: Wed, 31 Aug 2022 22:13:41 -0500 Subject: [PATCH] - first attempt at adding native m1 builds using remote runner - my laptop --- .github/workflows/build.yml | 91 ++++++++++++++++++- pom.xml | 2 +- src/main/java/nu/pattern/OpenCV.java | 3 + .../nu/pattern/opencv/osx/ARMv8/README.md | 0 4 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/nu/pattern/opencv/osx/ARMv8/README.md diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9985f10..a25d0a2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -121,6 +121,9 @@ jobs: artifacts/bin/opencv-${{ env.OPENCV_VERSION_SHORT }}.jar artifacts/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.so + + + build_linux_arm64: strategy: matrix: @@ -224,6 +227,9 @@ jobs: artifacts/bin/opencv-${{ env.OPENCV_VERSION_SHORT }}.jar artifacts/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.so + + + # Build native libraries for Linux and Mac. Uploads the libraries # as artifacts which are used in subsequent jobs. build_mac_linux_x64: @@ -293,6 +299,78 @@ jobs: opencv-${{ env.OPENCV_VERSION }}/build/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.so opencv-${{ env.OPENCV_VERSION }}/build/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.dylib + + + + # Build Apple Silicon Mac native binary. + # See https://cmake.org/cmake/help/v3.23/variable/CMAKE_APPLE_SILICON_PROCESSOR.html + build_mac_aarch64: + strategy: + matrix: + java: [8] + runs-on: [self-hosted, macOS, ARM64] + + steps: + - name: Checkout Repo + uses: actions/checkout@v2 + + - name: Setup JDK ${{ matrix.java }} + uses: actions/setup-java@v1 + with: + java-version: ${{ matrix.java }} + + - name: Get Version Info + run: | + echo "POM_VERSION=$(mvn build-helper:parse-version org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV + echo "OPENCV_VERSION=$(mvn build-helper:parse-version org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=opencv.version.long -q -DforceStdout)" >> $GITHUB_ENV + echo "OPENCV_VERSION_SHORT=$(mvn build-helper:parse-version org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=opencv.version.short -q -DforceStdout)" >> $GITHUB_ENV + + - name: Build OpenCV + run: | + wget https://github.com/opencv/opencv/archive/${{ env.OPENCV_VERSION }}.zip > /dev/null + unzip ${{ env.OPENCV_VERSION }} > /dev/null + cd opencv-${{ env.OPENCV_VERSION }} + mkdir build + cd build + cmake \ + -D OPENCV_FORCE_3RDPARTY_BUILD=ON \ + -D BUILD_JAVA=ON \ + -D BUILD_FAT_JAVA_LIB=ON \ + -D OPENCV_ENABLE_NONFREE=ON \ + -D BUILD_SHARED_LIBS=OFF \ + -D BUILD_PERF_TESTS=OFF \ + -D BUILD_TESTS=OFF \ + -D BUILD_EXAMPLES=OFF \ + -D BUILD_DOCS=OFF \ + -D BUILD_PACKAGE=OFF \ + -D BUILD_opencv_python2=OFF \ + -D BUILD_opencv_python3=OFF \ + -D BUILD_opencv_apps=OFF \ + -D BUILD_opencv_gapi=OFF \ + -D CMAKE_BUILD_TYPE=RELEASE \ + -D CMAKE_APPLE_SILICON_PROCESSOR=arm64 \ + .. + make -j8 + + - name: Copy Libraries + run: | + cp opencv-${{ env.OPENCV_VERSION }}/build/bin/opencv-${{ env.OPENCV_VERSION_SHORT }}.jar upstream || : + cp opencv-${{ env.OPENCV_VERSION }}/build/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.dylib src/main/resources/nu/pattern/opencv/osx/ARMv8 || : + + - name: Build with Maven + run: mvn -B test + + - name: Upload Libraries + uses: actions/upload-artifact@v2 + with: + name: macos-aarch64 + path: | + opencv-${{ env.OPENCV_VERSION }}/build/bin/opencv-${{ env.OPENCV_VERSION_SHORT }}.jar + opencv-${{ env.OPENCV_VERSION }}/build/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.dylib + + + + # Downloads the Windows distribution from OpenCV, extracts it and uploads # the native libraries as artifacts for use by subsequent jobs. This is # in leiu of building the native libraries on Windows. @@ -331,10 +409,13 @@ jobs: name: windows-2016 path: opencv/build/java + + + # Download and combine the artifacts from the above jobs and build the # distribution jar. Uploads it as an artifact for subsequent steps. build_dist: - needs: [build_linux_arm, build_linux_arm64, build_mac_linux_x64, build_windows] + needs: [build_mac_aarch64, build_linux_arm, build_linux_arm64, build_mac_linux_x64, build_windows] strategy: matrix: @@ -365,6 +446,7 @@ jobs: run: | cp macos-10.15/bin/opencv-${{ env.OPENCV_VERSION_SHORT }}.jar upstream cp macos-10.15/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.dylib src/main/resources/nu/pattern/opencv/osx/x86_64 + cp macos-aarch64/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.dylib src/main/resources/nu/pattern/opencv/osx/ARMv8 cp ubuntu-18.04/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.so src/main/resources/nu/pattern/opencv/linux/x86_64 cp ubuntu-18.04-arm/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.so src/main/resources/nu/pattern/opencv/linux/ARMv7 cp ubuntu-18.04-arm64/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.so src/main/resources/nu/pattern/opencv/linux/ARMv8 @@ -380,6 +462,9 @@ jobs: name: dist path: target/opencv* + + + # Downloads the distribution jar that was built above and runs # a short smoke test on it on many platforms and versions of # Java. This is intended to ensure that the built jar @@ -418,6 +503,9 @@ jobs: shell: bash run: java -cp opencv-${{ env.POM_VERSION }}.jar nu.pattern.PrintVersion + + + publish: if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') @@ -457,6 +545,7 @@ jobs: run: | cp macos-10.15/bin/opencv-${{ env.OPENCV_VERSION_SHORT }}.jar upstream cp macos-10.15/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.dylib src/main/resources/nu/pattern/opencv/osx/x86_64 + cp macos-aarch64/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.dylib src/main/resources/nu/pattern/opencv/osx/ARMv8 cp ubuntu-18.04/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.so src/main/resources/nu/pattern/opencv/linux/x86_64 cp ubuntu-18.04-arm/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.so src/main/resources/nu/pattern/opencv/linux/ARMv7 cp ubuntu-18.04-arm64/lib/libopencv_java${{ env.OPENCV_VERSION_SHORT }}.so src/main/resources/nu/pattern/opencv/linux/ARMv8 diff --git a/pom.xml b/pom.xml index f5a44db..63e1de2 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ bundle org.openpnp opencv - 4.5.5-0 + 4.5.5-1 OpenPnP OpenCV OpenCV packaged with native libraries and loader for multiple platforms. http://github.com/openpnp/opencv diff --git a/src/main/java/nu/pattern/OpenCV.java b/src/main/java/nu/pattern/OpenCV.java index ab49118..af73f8e 100644 --- a/src/main/java/nu/pattern/OpenCV.java +++ b/src/main/java/nu/pattern/OpenCV.java @@ -377,6 +377,9 @@ private static Path extractNativeBinary(final OS os, final Arch arch) { case X86_64: location = "/nu/pattern/opencv/osx/x86_64/libopencv_java455.dylib"; break; + case ARMv8: + location = "/nu/pattern/opencv/osx/ARMv8/libopencv_java455.dylib"; + break; default: throw new UnsupportedPlatformException(os, arch); } diff --git a/src/main/resources/nu/pattern/opencv/osx/ARMv8/README.md b/src/main/resources/nu/pattern/opencv/osx/ARMv8/README.md new file mode 100644 index 0000000..e69de29