diff --git a/config/pkg/lib/imagemagick.yml b/config/pkg/lib/imagemagick.yml new file mode 100644 index 00000000..17fc03e8 --- /dev/null +++ b/config/pkg/lib/imagemagick.yml @@ -0,0 +1,32 @@ +imagemagick: + type: library + artifact: + source: { + "type": "ghtar", + "repo": "ImageMagick/ImageMagick" + } + metadata: + license-files: [LICENSE] + lang: cpp + pkg-configs: [ + "Magick++-7.Q16HDRI", + "MagickCore-7.Q16HDRI", + "MagickWand-7.Q16HDRI" + ] + depends: + - zlib + - libjpeg + - libjxl + - libpng + - libwebp + - freetype + - libtiff + - libheif + - bzip2 + suggests: + - zstd + - xz + - libzip + - libxml2 + + diff --git a/config/pkg/lib/jbig.yml b/config/pkg/lib/jbig.yml new file mode 100644 index 00000000..f96ecf46 --- /dev/null +++ b/config/pkg/lib/jbig.yml @@ -0,0 +1,15 @@ +jbig: + type: library + artifact: + source: 'https://dl.static-php.dev/static-php-cli/deps/jbig/jbigkit-2.1.tar.gz' + source-mirror: 'https://www.cl.cam.ac.uk/~mgk25/jbigkit/download/jbigkit-2.1.tar.gz' + metadata: + license-files: [COPYING] + license: GPL-2.0-or-later + headers: + - jbig.h + - jbig85.h + - jbig_ar.h + static-libs@unix: + - libjbig.a + - libjbig85.a diff --git a/config/pkg/lib/lerc.yml b/config/pkg/lib/lerc.yml new file mode 100644 index 00000000..330ca795 --- /dev/null +++ b/config/pkg/lib/lerc.yml @@ -0,0 +1,12 @@ +lerc: + type: library + artifact: + source: + type: ghtar + repo: Esri/lerc + prefer-stable: true + metadata: + license-files: [LICENSE] + lang: cpp + static-libs@unix: + - libLerc.a diff --git a/config/pkg/lib/libaom.yml b/config/pkg/lib/libaom.yml new file mode 100644 index 00000000..6a2dbe3c --- /dev/null +++ b/config/pkg/lib/libaom.yml @@ -0,0 +1,12 @@ +libaom: + type: library + artifact: + source: + type: git + rev: main + url: 'https://aomedia.googlesource.com/aom' + metadata: + license-files: [LICENSE] + lang: cpp + static-libs@unix: + - libaom.a diff --git a/config/pkg/lib/libde265.yml b/config/pkg/lib/libde265.yml new file mode 100644 index 00000000..679c875a --- /dev/null +++ b/config/pkg/lib/libde265.yml @@ -0,0 +1,13 @@ +libde265: + type: library + artifact: + source: + type: ghrel + repo: strukturag/libde265 + match: libde265-.+\.tar\.gz + prefer-stable: true + metadata: + license-files: [COPYING] + lang: cpp + static-libs@unix: + - libde265.a diff --git a/config/pkg/lib/libheif.yml b/config/pkg/lib/libheif.yml new file mode 100644 index 00000000..4265f2c2 --- /dev/null +++ b/config/pkg/lib/libheif.yml @@ -0,0 +1,18 @@ +libheif: + type: library + artifact: + source: + type: ghrel + repo: strukturag/libheif + match: libheif-.+\.tar\.gz + prefer-stable: true + metadata: + license-files: [COPYING] + depends: + - libde265 + - libwebp + - libaom + - zlib + - brotli + static-libs@unix: + - libheif.a diff --git a/config/pkg/lib/libjxl.yml b/config/pkg/lib/libjxl.yml new file mode 100644 index 00000000..f2f3d551 --- /dev/null +++ b/config/pkg/lib/libjxl.yml @@ -0,0 +1,21 @@ +libjxl: + type: library + artifact: + source: + type: git + url: 'https://github.com/libjxl/libjxl' + rev: main + submodules: [third_party/highway, third_party/libjpeg-turbo, third_party/sjpeg, third_party/skcms] + metadata: + license-files: [LICENSE] + license: BSD-3-Clause + depends: + - brotli + - libjpeg + - libpng + - libwebp + pkg-configs: + - libjxl + - libjxl_cms + - libjxl_threads + - libhwy diff --git a/config/pkg/lib/libtiff.yml b/config/pkg/lib/libtiff.yml new file mode 100644 index 00000000..e3f345f1 --- /dev/null +++ b/config/pkg/lib/libtiff.yml @@ -0,0 +1,21 @@ +libtiff: + type: library + artifact: + source: + type: filelist + url: 'https://download.osgeo.org/libtiff/' + regex: '/href="(?tiff-(?[^"]+)\.tar\.xz)"/' + metadata: + license-files: [LICENSE.md] + license: libtiff + depends: + - zlib + - libjpeg + suggests@unix: + - lerc + - libwebp + - jbig + - xz + - zstd + static-libs@unix: + - libtiff.a diff --git a/config/pkg/lib/libwebp.yml b/config/pkg/lib/libwebp.yml new file mode 100644 index 00000000..62ddddc1 --- /dev/null +++ b/config/pkg/lib/libwebp.yml @@ -0,0 +1,16 @@ +libwebp: + type: library + artifact: + source: + type: ghtagtar + repo: webmproject/libwebp + match: v1\.\d+\.\d+$ + metadata: + license-files: [COPYING] + license: BSD-3-Clause + pkg-configs: + - libwebp + - libwebpdecoder + - libwebpdemux + - libwebpmux + - libsharpyuv diff --git a/config/pkg/lib/libzip.yml b/config/pkg/lib/libzip.yml new file mode 100644 index 00000000..3d8c02f8 --- /dev/null +++ b/config/pkg/lib/libzip.yml @@ -0,0 +1,23 @@ +libzip: + type: library + artifact: + source: { + "type": "ghrel", + "repo": "nih-at/libzip", + "match": "libzip.+\\.tar\\.xz", + "prefer-stable": true + } + metadata: + license-files: [LICENSE] + static-libs@unix: + - libzip.a + headers: + - zip.h + - zipconf.h + depends@unix: + - zlib + suggests@unix: + - bzip2 + - xz + - zstd + - openssl diff --git a/src/Package/Library/imagemagick.php b/src/Package/Library/imagemagick.php new file mode 100644 index 00000000..941f1580 --- /dev/null +++ b/src/Package/Library/imagemagick.php @@ -0,0 +1,83 @@ +optionalPackage('libzip', ...ac_with_args('zip')) + ->optionalPackage('libjpeg', ...ac_with_args('jpeg')) + ->optionalPackage('libpng', ...ac_with_args('png')) + ->optionalPackage('libwebp', ...ac_with_args('webp')) + ->optionalPackage('libxml2', ...ac_with_args('xml')) + ->optionalPackage('libheif', ...ac_with_args('heic')) + ->optionalPackage('zlib', ...ac_with_args('zlib')) + ->optionalPackage('xz', ...ac_with_args('lzma')) + ->optionalPackage('zstd', ...ac_with_args('zstd')) + ->optionalPackage('freetype', ...ac_with_args('freetype')) + ->optionalPackage('bzip2', ...ac_with_args('bzlib')) + ->optionalPackage('libjxl', ...ac_with_args('jxl')) + ->optionalPackage('jbig', ...ac_with_args('jbig')) + ->addConfigureArgs( + '--disable-openmp', + '--without-x', + ); + + // special: linux-static target needs `-static` + $ldflags = $toolchain->isStatic() ? '-static -ldl' : '-ldl'; + + // special: macOS needs -iconv + $libs = SystemTarget::getTargetOS() === 'Darwin' ? '-liconv' : ''; + + $ac->appendEnv([ + 'LDFLAGS' => $ldflags, + 'LIBS' => $libs, + 'PKG_CONFIG' => '$PKG_CONFIG --static', + ]); + + $ac->configure()->make(); + + f_putenv("SPC_DEFAULT_LD_FLAGS={$original_ldflags}"); + + $filelist = [ + 'ImageMagick.pc', + 'ImageMagick-7.Q16HDRI.pc', + 'Magick++.pc', + 'Magick++-7.Q16HDRI.pc', + 'MagickCore.pc', + 'MagickCore-7.Q16HDRI.pc', + 'MagickWand.pc', + 'MagickWand-7.Q16HDRI.pc', + ]; + $lib->patchPkgconfPrefix($filelist); + foreach ($filelist as $file) { + FileSystem::replaceFileRegex( + "{$lib->getLibDir()}/pkgconfig/{$file}", + '#includearchdir=/include/ImageMagick-7#m', + 'includearchdir=${prefix}/include/ImageMagick-7' + ); + } + $lib->patchLaDependencyPrefix(); + } +} diff --git a/src/Package/Library/jbig.php b/src/Package/Library/jbig.php new file mode 100644 index 00000000..1cfe60b7 --- /dev/null +++ b/src/Package/Library/jbig.php @@ -0,0 +1,46 @@ +getSourceDir() . '/Makefile', 'CFLAGS = -O2 -W -Wno-unused-result', 'CFLAGS = -O2 -W -Wno-unused-result -fPIC'); + } + + #[BuildFor('Darwin')] + #[BuildFor('Linux')] + public function buildUnix(LibraryPackage $lib, PackageBuilder $builder): void + { + $ccenv = [ + 'CC' => getenv('CC'), + 'CXX' => getenv('CXX'), + 'AR' => getenv('AR'), + 'LD' => getenv('LD'), + ]; + $env = []; + foreach ($ccenv as $k => $v) { + $env[] = "{$k}={$v}"; + } + $env_str = implode(' ', $env); + shell()->cd($lib->getSourceDir())->initializeEnv($lib) + ->exec("make -j{$builder->concurrency} {$env_str} lib") + ->exec("cp libjbig/libjbig.a {$lib->getLibDir()}") + ->exec("cp libjbig/libjbig85.a {$lib->getLibDir()}") + ->exec("cp libjbig/jbig.h {$lib->getIncludeDir()}") + ->exec("cp libjbig/jbig85.h {$lib->getIncludeDir()}") + ->exec("cp libjbig/jbig_ar.h {$lib->getIncludeDir()}"); + } +} diff --git a/src/Package/Library/lerc.php b/src/Package/Library/lerc.php new file mode 100644 index 00000000..fc1e8bad --- /dev/null +++ b/src/Package/Library/lerc.php @@ -0,0 +1,21 @@ +build(); + } +} diff --git a/src/Package/Library/libaom.php b/src/Package/Library/libaom.php new file mode 100644 index 00000000..167ef076 --- /dev/null +++ b/src/Package/Library/libaom.php @@ -0,0 +1,33 @@ +setBuildDir("{$this->getSourceDir()}/builddir") + ->addConfigureArgs('-DAOM_TARGET_CPU=generic') + ->build(); + f_putenv("SPC_COMPILER_EXTRA={$extra}"); + $this->patchPkgconfPrefix(['aom.pc']); + } +} diff --git a/src/Package/Library/libde265.php b/src/Package/Library/libde265.php new file mode 100644 index 00000000..b3e8f62f --- /dev/null +++ b/src/Package/Library/libde265.php @@ -0,0 +1,24 @@ +addConfigureArgs('-DENABLE_SDL=OFF') + ->build(); + $this->patchPkgconfPrefix(['libde265.pc']); + } +} diff --git a/src/Package/Library/libheif.php b/src/Package/Library/libheif.php new file mode 100644 index 00000000..65545f36 --- /dev/null +++ b/src/Package/Library/libheif.php @@ -0,0 +1,45 @@ +getSourceDir() . '/CMakeLists.txt'), 'libbrotlienc')) { + FileSystem::replaceFileStr( + $lib->getSourceDir() . '/CMakeLists.txt', + 'list(APPEND REQUIRES_PRIVATE "libbrotlidec")', + 'list(APPEND REQUIRES_PRIVATE "libbrotlidec")' . "\n" . ' list(APPEND REQUIRES_PRIVATE "libbrotlienc")' + ); + } + } + + #[BuildFor('Darwin')] + #[BuildFor('Linux')] + public function buildUnix(LibraryPackage $lib): void + { + UnixCMakeExecutor::create($lib) + ->addConfigureArgs( + '--preset=release', + '-DWITH_EXAMPLES=OFF', + '-DWITH_GDK_PIXBUF=OFF', + '-DBUILD_TESTING=OFF', + '-DWITH_LIBSHARPYUV=ON', // optional: libwebp + '-DENABLE_PLUGIN_LOADING=OFF', + ) + ->build(); + $lib->patchPkgconfPrefix(['libheif.pc']); + } +} diff --git a/src/Package/Library/libjxl.php b/src/Package/Library/libjxl.php new file mode 100644 index 00000000..48e9a239 --- /dev/null +++ b/src/Package/Library/libjxl.php @@ -0,0 +1,52 @@ +addConfigureArgs( + '-DJPEGXL_ENABLE_TOOLS=OFF', + '-DJPEGXL_ENABLE_EXAMPLES=OFF', + '-DJPEGXL_ENABLE_MANPAGES=OFF', + '-DJPEGXL_ENABLE_BENCHMARK=OFF', + '-DJPEGXL_ENABLE_PLUGINS=OFF', + '-DJPEGXL_ENABLE_SJPEG=ON', + '-DJPEGXL_ENABLE_JNI=OFF', + '-DJPEGXL_ENABLE_TRANSCODE_JPEG=ON', + '-DJPEGXL_STATIC=' . ($toolchain->isStatic() ? 'ON' : 'OFF'), + '-DJPEGXL_FORCE_SYSTEM_BROTLI=ON', + '-DBUILD_TESTING=OFF' + ); + + if ($toolchain instanceof ZigToolchain) { + $cflags = getenv('SPC_DEFAULT_C_FLAGS') ?: getenv('CFLAGS') ?: ''; + $has_avx512 = str_contains($cflags, '-mavx512') || str_contains($cflags, '-march=x86-64-v4'); + if (!$has_avx512) { + $cmake->addConfigureArgs( + '-DCXX_MAVX512F_SUPPORTED:BOOL=FALSE', + '-DCXX_MAVX512DQ_SUPPORTED:BOOL=FALSE', + '-DCXX_MAVX512CD_SUPPORTED:BOOL=FALSE', + '-DCXX_MAVX512BW_SUPPORTED:BOOL=FALSE', + '-DCXX_MAVX512VL_SUPPORTED:BOOL=FALSE' + ); + } + } + + $cmake->build(); + } +} diff --git a/src/Package/Library/libtiff.php b/src/Package/Library/libtiff.php new file mode 100644 index 00000000..385ff3ca --- /dev/null +++ b/src/Package/Library/libtiff.php @@ -0,0 +1,50 @@ +getSourceDir()}/configure", '-lwebp', '-lwebp -lsharpyuv'); + FileSystem::replaceFileStr("{$lib->getSourceDir()}/configure", '-l"$lerc_lib_name"', "-l\"\$lerc_lib_name\" {$libcpp}"); + UnixAutoconfExecutor::create($lib) + ->optionalPackage('lerc', '--enable-lerc', '--disable-lerc') + ->optionalPackage('zstd', '--enable-zstd', '--disable-zstd') + ->optionalPackage('libwebp', '--enable-webp', '--disable-webp') + ->optionalPackage('xz', '--enable-lzma', '--disable-lzma') + ->optionalPackage('jbig', '--enable-jbig', '--disable-jbig') + ->configure( + // zlib deps + '--enable-zlib', + "--with-zlib-include-dir={$lib->getIncludeDir()}", + "--with-zlib-lib-dir={$lib->getLibDir()}", + // libjpeg deps + '--enable-jpeg', + "--with-jpeg-include-dir={$lib->getIncludeDir()}", + "--with-jpeg-lib-dir={$lib->getLibDir()}", + '--disable-old-jpeg', + '--disable-jpeg12', + '--disable-libdeflate', + '--disable-tools', + '--disable-contrib', + '--disable-cxx', + '--without-x', + ) + ->make(); + $lib->patchPkgconfPrefix(['libtiff-4.pc']); + } +} diff --git a/src/Package/Library/libwebp.php b/src/Package/Library/libwebp.php new file mode 100644 index 00000000..0ee4028d --- /dev/null +++ b/src/Package/Library/libwebp.php @@ -0,0 +1,44 @@ + +int main() { return _mm256_cvtsi256_si32(_mm256_setzero_si256()); }'; + $cc = getenv('CC') ?: 'gcc'; + [$ret] = shell()->execWithResult("printf '%s' '{$code}' | {$cc} -x c -mavx2 -o /dev/null - 2>&1"); + $disableAvx2 = $ret !== 0 && GNU_ARCH === 'x86_64' && PHP_OS_FAMILY === 'Linux'; + + UnixCMakeExecutor::create($this) + ->addConfigureArgs( + '-DWEBP_BUILD_EXTRAS=OFF', + '-DWEBP_BUILD_ANIM_UTILS=OFF', + '-DWEBP_BUILD_CWEBP=OFF', + '-DWEBP_BUILD_DWEBP=OFF', + '-DWEBP_BUILD_GIF2WEBP=OFF', + '-DWEBP_BUILD_IMG2WEBP=OFF', + '-DWEBP_BUILD_VWEBP=OFF', + '-DWEBP_BUILD_WEBPINFO=OFF', + '-DWEBP_BUILD_WEBPMUX=OFF', + '-DWEBP_BUILD_FUZZTEST=OFF', + $disableAvx2 ? '-DWEBP_ENABLE_SIMD=OFF' : '' + ) + ->build(); + // patch pkgconfig + $this->patchPkgconfPrefix(patch_option: PKGCONF_PATCH_PREFIX | PKGCONF_PATCH_LIBDIR); + $this->patchPkgconfPrefix(['libsharpyuv.pc'], PKGCONF_PATCH_CUSTOM, ['/^includedir=.*$/m', 'includedir=${prefix}/include/webp']); + } +} diff --git a/src/Package/Library/libzip.php b/src/Package/Library/libzip.php new file mode 100644 index 00000000..f6ebdfea --- /dev/null +++ b/src/Package/Library/libzip.php @@ -0,0 +1,36 @@ +optionalPackage('bzip2', ...cmake_boolean_args('ENABLE_BZIP2')) + ->optionalPackage('xz', ...cmake_boolean_args('ENABLE_LZMA')) + ->optionalPackage('openssl', ...cmake_boolean_args('ENABLE_OPENSSL')) + ->optionalPackage('zstd', ...cmake_boolean_args('ENABLE_ZSTD')) + ->addConfigureArgs( + '-DENABLE_GNUTLS=OFF', + '-DENABLE_MBEDTLS=OFF', + '-DBUILD_DOC=OFF', + '-DBUILD_EXAMPLES=OFF', + '-DBUILD_REGRESS=OFF', + '-DBUILD_TOOLS=OFF', + '-DBUILD_OSSFUZZ=OFF', + ) + ->build(); + $lib->patchPkgconfPrefix(['libzip.pc'], PKGCONF_PATCH_PREFIX); + } +}