Add SHARED libavif CI with locally built dependencies
Add ci-unix-shared.yml.
Add JPEG_LIBRARY to SHARED LOCAL LIBYUV_LIBRARY.
diff --git a/.github/workflows/ci-unix-shared.yml b/.github/workflows/ci-unix-shared.yml
new file mode 100644
index 0000000..232fb1a
--- /dev/null
+++ b/.github/workflows/ci-unix-shared.yml
@@ -0,0 +1,81 @@
+# This is a copy of ci.yml for building shared libraries. It differs from ci.yml as follows:
+#
+# * The os matrix consists of ubuntu-latest only.
+# * Does not build dav1d, rav1e, SVT-AV1 nor libgav1.
+
+name: CI (shared libraries)
+on: [push, pull_request]
+jobs:
+ build:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest]
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set GCC & G++ 10 compiler (on Linux)
+ if: runner.os == 'Linux'
+ run: echo "CC=gcc-10" >> $GITHUB_ENV && echo "CXX=g++-10" >> $GITHUB_ENV
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.x'
+
+ - name: Cache external dependencies
+ id: cache-ext
+ uses: actions/cache@v3
+ with:
+ path: ext
+ key: ${{ runner.os }}-${{ hashFiles('ext/*.cmd') }}
+ - name: Setup cmake
+ uses: jwlawson/actions-setup-cmake@v1.12
+ with:
+ cmake-version: '3.13.x'
+ - name: Print cmake version
+ run: cmake --version
+ - uses: ilammy/setup-nasm@v1
+ with:
+ version: 2.15.05
+ - uses: seanmiddleditch/gha-setup-ninja@v3
+ - name: Set shared libs
+ # if: steps.cache-ext.outputs.cache-hit != 'true'
+ working-directory: ./ext
+ run: >
+ sed -i'' -e 's/-DBUILD_SHARED_LIBS=OFF/-DBUILD_SHARED_LIBS=ON/' *.cmd
+
+ sed -i'' -e 's/ninja yuv/ninja yuv_shared/' libyuv.cmd
+ - name: Build aom
+ # if: steps.cache-ext.outputs.cache-hit != 'true'
+ working-directory: ./ext
+ run: bash aom.cmd
+ - name: Build libyuv
+ # if: steps.cache-ext.outputs.cache-hit != 'true'
+ working-directory: ./ext
+ run: bash libyuv.cmd
+ - name: Build libsharpyuv
+ # if: steps.cache-ext.outputs.cache-hit != 'true'
+ working-directory: ./ext
+ run: bash libsharpyuv.cmd
+ - name: Build GoogleTest
+ # if: steps.cache-ext.outputs.cache-hit != 'true'
+ working-directory: ./ext
+ run: bash googletest.cmd
+
+ - name: Prepare libavif (cmake)
+ run: >
+ mkdir build && cd build
+
+ cmake .. -G Ninja
+ -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON
+ -DAVIF_CODEC_AOM=ON -DAVIF_LOCAL_AOM=ON
+ -DAVIF_LOCAL_LIBYUV=ON
+ -DAVIF_LOCAL_LIBSHARPYUV=ON
+ -DAVIF_BUILD_EXAMPLES=ON -DAVIF_BUILD_APPS=ON
+ -DAVIF_BUILD_TESTS=ON -DAVIF_ENABLE_GTEST=ON -DAVIF_LOCAL_GTEST=ON
+ - name: Build libavif (ninja)
+ working-directory: ./build
+ run: ninja
+ - name: Run AVIF Tests
+ working-directory: ./build
+ run: ctest -j $(getconf _NPROCESSORS_ONLN)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6d9431c..0e0cb1f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -70,6 +70,14 @@
set(XCRUN)
endif()
+if(BUILD_SHARED_LIBS)
+ set(AVIF_LIBRARY_PREFIX "${CMAKE_SHARED_LIBRARY_PREFIX}")
+ set(AVIF_LIBRARY_SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}")
+else()
+ set(AVIF_LIBRARY_PREFIX "${CMAKE_STATIC_LIBRARY_PREFIX}")
+ set(AVIF_LIBRARY_SUFFIX "${CMAKE_STATIC_LIBRARY_SUFFIX}")
+endif()
+
# ---------------------------------------------------------------------------------------
# This insanity is for people embedding libavif or making fully static or Windows builds.
# Any proper unix environment should ignore these entire following blocks.
@@ -87,7 +95,7 @@
set(PREV_ANDROID ${ANDROID})
set(ANDROID TRUE)
set(PNG_BUILD_ZLIB "${CMAKE_CURRENT_SOURCE_DIR}/ext/zlib" CACHE STRING "" FORCE)
- set(PNG_SHARED OFF CACHE BOOL "")
+ set(PNG_SHARED ${BUILD_SHARED_LIBS} CACHE BOOL "")
set(PNG_TESTS OFF CACHE BOOL "")
add_subdirectory(ext/libpng)
set(PNG_PNG_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ext/libpng")
@@ -111,7 +119,7 @@
option(AVIF_LOCAL_LIBYUV "Build libyuv by providing your own copy inside the ext subdir." OFF)
if(AVIF_LOCAL_LIBYUV)
set(LIB_FILENAME
- "${CMAKE_CURRENT_SOURCE_DIR}/ext/libyuv/build/${CMAKE_STATIC_LIBRARY_PREFIX}yuv${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/ext/libyuv/build/${AVIF_LIBRARY_PREFIX}yuv${AVIF_LIBRARY_SUFFIX}"
)
if(NOT EXISTS "${LIB_FILENAME}")
message(FATAL_ERROR "libavif(AVIF_LOCAL_LIBYUV): ${LIB_FILENAME} is missing, bailing out")
@@ -123,10 +131,15 @@
set(LIBYUV_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ext/libyuv/include" PARENT_SCOPE)
set(LIBYUV_LIBRARY ${LIB_FILENAME} PARENT_SCOPE)
endif()
+ if(BUILD_SHARED_LIBS)
+ # Fix "libyuv.so: undefined reference to `jpeg_read_raw_data'" errors.
+ find_package(JPEG REQUIRED)
+ set(LIBYUV_LIBRARY ${LIBYUV_LIBRARY} ${JPEG_LIBRARY})
+ endif()
endif()
option(AVIF_LOCAL_LIBSHARPYUV "Build libsharpyuv by providing your own copy inside the ext subdir." OFF)
if(AVIF_LOCAL_LIBSHARPYUV)
- set(LIB_FILENAME "${CMAKE_CURRENT_SOURCE_DIR}/ext/libwebp/build/libsharpyuv${CMAKE_STATIC_LIBRARY_SUFFIX}")
+ set(LIB_FILENAME "${CMAKE_CURRENT_SOURCE_DIR}/ext/libwebp/build/libsharpyuv${AVIF_LIBRARY_SUFFIX}")
message(STATUS "AVIF_LOCAL_LIBSHARPYUV LIB_FILENAME ${LIB_FILENAME}")
if(NOT EXISTS "${LIB_FILENAME}")
message(FATAL_ERROR "libavif(AVIF_LOCAL_LIBSHARPYUV): ${LIB_FILENAME} is missing, bailing out")
@@ -304,7 +317,7 @@
if(DEFINED ANDROID_ABI)
set(AVIF_LIBGAV1_BUILD_DIR "${AVIF_LIBGAV1_BUILD_DIR}/${ANDROID_ABI}")
endif()
- set(LIB_FILENAME "${AVIF_LIBGAV1_BUILD_DIR}/libgav1${CMAKE_STATIC_LIBRARY_SUFFIX}")
+ set(LIB_FILENAME "${AVIF_LIBGAV1_BUILD_DIR}/libgav1${AVIF_LIBRARY_SUFFIX}")
if(NOT EXISTS "${LIB_FILENAME}")
message(FATAL_ERROR "libavif: ${LIB_FILENAME} is missing, bailing out")
endif()
@@ -329,7 +342,7 @@
if(AVIF_LOCAL_RAV1E)
set(LIB_FILENAME
- "${CMAKE_CURRENT_SOURCE_DIR}/ext/rav1e/build.libavif/usr/lib/${CMAKE_STATIC_LIBRARY_PREFIX}rav1e${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/ext/rav1e/build.libavif/usr/lib/${AVIF_LIBRARY_PREFIX}rav1e${AVIF_LIBRARY_SUFFIX}"
)
if(NOT EXISTS "${LIB_FILENAME}")
message(FATAL_ERROR "libavif: compiled rav1e library is missing (in ext/rav1e/build.libavif/usr/lib), bailing out")
@@ -362,7 +375,7 @@
if(AVIF_LOCAL_SVT)
set(LIB_FILENAME
- "${CMAKE_CURRENT_SOURCE_DIR}/ext/SVT-AV1/Bin/Release/${CMAKE_STATIC_LIBRARY_PREFIX}SvtAv1Enc${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/ext/SVT-AV1/Bin/Release/${AVIF_LIBRARY_PREFIX}SvtAv1Enc${AVIF_LIBRARY_SUFFIX}"
)
if(NOT EXISTS "${LIB_FILENAME}")
message(FATAL_ERROR "libavif: compiled svt library is missing (in ext/SVT-AV1/Bin/Release), bailing out")
@@ -402,7 +415,7 @@
set(AVIF_SRCS ${AVIF_SRCS} src/codec_aom.c)
if(AVIF_LOCAL_AOM)
set(LIB_FILENAME
- "${CMAKE_CURRENT_SOURCE_DIR}/ext/aom/build.libavif/${CMAKE_STATIC_LIBRARY_PREFIX}aom${CMAKE_STATIC_LIBRARY_SUFFIX}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/ext/aom/build.libavif/${AVIF_LIBRARY_PREFIX}aom${AVIF_LIBRARY_SUFFIX}"
)
if(NOT EXISTS "${LIB_FILENAME}")
message(FATAL_ERROR "libavif: ${LIB_FILENAME} is missing, bailing out")
diff --git a/ext/aom.cmd b/ext/aom.cmd
index 139b7e1..632c0ad 100755
--- a/ext/aom.cmd
+++ b/ext/aom.cmd
@@ -14,6 +14,6 @@
mkdir build.libavif
cd build.libavif
-cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 -DENABLE_TESTS=0 -DENABLE_TOOLS=0 ..
+cmake -G Ninja -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DENABLE_DOCS=0 -DENABLE_EXAMPLES=0 -DENABLE_TESTDATA=0 -DENABLE_TESTS=0 -DENABLE_TOOLS=0 ..
ninja
cd ../..
diff --git a/ext/googletest.cmd b/ext/googletest.cmd
index e984af6..6dd460a 100755
--- a/ext/googletest.cmd
+++ b/ext/googletest.cmd
@@ -14,6 +14,6 @@
: # The gtest_force_shared_crt option makes gtest link the Microsoft C runtime library (CRT) dynamically
: # on Windows:
: # https://github.com/google/googletest/blob/main/googletest/README.md#visual-studio-dynamic-vs-static-runtimes
-cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_GMOCK=OFF -Dgtest_force_shared_crt=ON ..
+cmake -G Ninja -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DBUILD_GMOCK=OFF -Dgtest_force_shared_crt=ON ..
cmake --build .
cd ../..
diff --git a/ext/libyuv.cmd b/ext/libyuv.cmd
index 2477946..f357040 100755
--- a/ext/libyuv.cmd
+++ b/ext/libyuv.cmd
@@ -19,6 +19,6 @@
mkdir build
cd build
-cmake -G Ninja -DBUILD_SHARED_LIBS=0 -DCMAKE_BUILD_TYPE=Release ..
+cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ..
ninja yuv
cd ../..
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index a1ce2b1..9625d73 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -51,10 +51,10 @@
if(AVIF_LOCAL_GTEST)
set(GTEST_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/ext/googletest/googletest/include)
set(GTEST_LIBRARIES
- ${CMAKE_SOURCE_DIR}/ext/googletest/build/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
+ ${CMAKE_SOURCE_DIR}/ext/googletest/build/lib/${AVIF_LIBRARY_PREFIX}gtest${AVIF_LIBRARY_SUFFIX}
)
set(GTEST_MAIN_LIBRARIES
- ${CMAKE_SOURCE_DIR}/ext/googletest/build/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX}
+ ${CMAKE_SOURCE_DIR}/ext/googletest/build/lib/${AVIF_LIBRARY_PREFIX}gtest_main${AVIF_LIBRARY_SUFFIX}
)
set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES})
if(NOT EXISTS ${GTEST_INCLUDE_DIRS}/gtest/gtest.h)