mirror of
https://github.com/crazywhalecc/static-php-cli.git
synced 2026-07-04 15:25:41 +08:00
Add imagemagick,jbig,lerc,libaom,libde265,libheif,libjxl,libtiff,libwebp,libzip
This commit is contained in:
83
src/Package/Library/imagemagick.php
Normal file
83
src/Package/Library/imagemagick.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Package\Library;
|
||||
|
||||
use StaticPHP\Attribute\Package\BuildFor;
|
||||
use StaticPHP\Attribute\Package\Library;
|
||||
use StaticPHP\Package\LibraryPackage;
|
||||
use StaticPHP\Runtime\Executor\UnixAutoconfExecutor;
|
||||
use StaticPHP\Runtime\SystemTarget;
|
||||
use StaticPHP\Toolchain\Interface\ToolchainInterface;
|
||||
use StaticPHP\Util\FileSystem;
|
||||
|
||||
#[Library('imagemagick')]
|
||||
class imagemagick
|
||||
{
|
||||
#[BuildFor('Darwin')]
|
||||
#[BuildFor('Linux')]
|
||||
public function buildUnix(LibraryPackage $lib, ToolchainInterface $toolchain): void
|
||||
{
|
||||
$ldflags = $original_ldflags = getenv('SPC_DEFAULT_LD_FLAGS');
|
||||
if (str_contains($ldflags, '-Wl,--as-needed')) {
|
||||
$ldflags = str_replace('-Wl,--as-needed', '', $ldflags);
|
||||
f_putenv("SPC_DEFAULT_LD_FLAGS={$ldflags}");
|
||||
}
|
||||
|
||||
$ac = UnixAutoconfExecutor::create($lib)
|
||||
->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();
|
||||
}
|
||||
}
|
||||
46
src/Package/Library/jbig.php
Normal file
46
src/Package/Library/jbig.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Package\Library;
|
||||
|
||||
use StaticPHP\Attribute\Package\BuildFor;
|
||||
use StaticPHP\Attribute\Package\Library;
|
||||
use StaticPHP\Attribute\Package\PatchBeforeBuild;
|
||||
use StaticPHP\Package\LibraryPackage;
|
||||
use StaticPHP\Package\PackageBuilder;
|
||||
use StaticPHP\Util\FileSystem;
|
||||
|
||||
#[Library('jbig')]
|
||||
class jbig
|
||||
{
|
||||
#[PatchBeforeBuild]
|
||||
public function patchBeforeBuild(LibraryPackage $lib): void
|
||||
{
|
||||
FileSystem::replaceFileStr($lib->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()}");
|
||||
}
|
||||
}
|
||||
21
src/Package/Library/lerc.php
Normal file
21
src/Package/Library/lerc.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Package\Library;
|
||||
|
||||
use StaticPHP\Attribute\Package\BuildFor;
|
||||
use StaticPHP\Attribute\Package\Library;
|
||||
use StaticPHP\Package\LibraryPackage;
|
||||
use StaticPHP\Runtime\Executor\UnixCMakeExecutor;
|
||||
|
||||
#[Library('lerc')]
|
||||
class lerc extends LibraryPackage
|
||||
{
|
||||
#[BuildFor('Darwin')]
|
||||
#[BuildFor('Linux')]
|
||||
public function buildUnix(): void
|
||||
{
|
||||
UnixCMakeExecutor::create($this)->build();
|
||||
}
|
||||
}
|
||||
33
src/Package/Library/libaom.php
Normal file
33
src/Package/Library/libaom.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Package\Library;
|
||||
|
||||
use StaticPHP\Attribute\Package\BuildFor;
|
||||
use StaticPHP\Attribute\Package\Library;
|
||||
use StaticPHP\Package\LibraryPackage;
|
||||
use StaticPHP\Runtime\Executor\UnixCMakeExecutor;
|
||||
use StaticPHP\Toolchain\Interface\ToolchainInterface;
|
||||
use StaticPHP\Toolchain\ZigToolchain;
|
||||
|
||||
#[Library('libaom')]
|
||||
class libaom extends LibraryPackage
|
||||
{
|
||||
#[BuildFor('Darwin')]
|
||||
#[BuildFor('Linux')]
|
||||
public function buildUnix(ToolchainInterface $toolchain): void
|
||||
{
|
||||
$extra = getenv('SPC_COMPILER_EXTRA');
|
||||
if ($toolchain instanceof ZigToolchain) {
|
||||
$new = trim($extra . ' -D_GNU_SOURCE');
|
||||
f_putenv("SPC_COMPILER_EXTRA={$new}");
|
||||
}
|
||||
UnixCMakeExecutor::create($this)
|
||||
->setBuildDir("{$this->getSourceDir()}/builddir")
|
||||
->addConfigureArgs('-DAOM_TARGET_CPU=generic')
|
||||
->build();
|
||||
f_putenv("SPC_COMPILER_EXTRA={$extra}");
|
||||
$this->patchPkgconfPrefix(['aom.pc']);
|
||||
}
|
||||
}
|
||||
24
src/Package/Library/libde265.php
Normal file
24
src/Package/Library/libde265.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Package\Library;
|
||||
|
||||
use StaticPHP\Attribute\Package\BuildFor;
|
||||
use StaticPHP\Attribute\Package\Library;
|
||||
use StaticPHP\Package\LibraryPackage;
|
||||
use StaticPHP\Runtime\Executor\UnixCMakeExecutor;
|
||||
|
||||
#[Library('libde265')]
|
||||
class libde265 extends LibraryPackage
|
||||
{
|
||||
#[BuildFor('Darwin')]
|
||||
#[BuildFor('Linux')]
|
||||
public function buildUnix(): void
|
||||
{
|
||||
UnixCMakeExecutor::create($this)
|
||||
->addConfigureArgs('-DENABLE_SDL=OFF')
|
||||
->build();
|
||||
$this->patchPkgconfPrefix(['libde265.pc']);
|
||||
}
|
||||
}
|
||||
45
src/Package/Library/libheif.php
Normal file
45
src/Package/Library/libheif.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Package\Library;
|
||||
|
||||
use StaticPHP\Attribute\Package\BuildFor;
|
||||
use StaticPHP\Attribute\Package\Library;
|
||||
use StaticPHP\Attribute\Package\PatchBeforeBuild;
|
||||
use StaticPHP\Package\LibraryPackage;
|
||||
use StaticPHP\Runtime\Executor\UnixCMakeExecutor;
|
||||
use StaticPHP\Util\FileSystem;
|
||||
|
||||
#[Library('libheif')]
|
||||
class libheif
|
||||
{
|
||||
#[PatchBeforeBuild]
|
||||
public function patchBeforeBuild(LibraryPackage $lib): void
|
||||
{
|
||||
if (!str_contains(file_get_contents($lib->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']);
|
||||
}
|
||||
}
|
||||
52
src/Package/Library/libjxl.php
Normal file
52
src/Package/Library/libjxl.php
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Package\Library;
|
||||
|
||||
use StaticPHP\Attribute\Package\BuildFor;
|
||||
use StaticPHP\Attribute\Package\Library;
|
||||
use StaticPHP\Package\LibraryPackage;
|
||||
use StaticPHP\Runtime\Executor\UnixCMakeExecutor;
|
||||
use StaticPHP\Toolchain\Interface\ToolchainInterface;
|
||||
use StaticPHP\Toolchain\ZigToolchain;
|
||||
|
||||
#[Library('libjxl')]
|
||||
class libjxl extends LibraryPackage
|
||||
{
|
||||
#[BuildFor('Darwin')]
|
||||
#[BuildFor('Linux')]
|
||||
public function buildUnix(ToolchainInterface $toolchain): void
|
||||
{
|
||||
$cmake = UnixCMakeExecutor::create($this)
|
||||
->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();
|
||||
}
|
||||
}
|
||||
50
src/Package/Library/libtiff.php
Normal file
50
src/Package/Library/libtiff.php
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Package\Library;
|
||||
|
||||
use StaticPHP\Attribute\Package\BuildFor;
|
||||
use StaticPHP\Attribute\Package\Library;
|
||||
use StaticPHP\Package\LibraryPackage;
|
||||
use StaticPHP\Runtime\Executor\UnixAutoconfExecutor;
|
||||
use StaticPHP\Runtime\SystemTarget;
|
||||
use StaticPHP\Util\FileSystem;
|
||||
|
||||
#[Library('libtiff')]
|
||||
class libtiff
|
||||
{
|
||||
#[BuildFor('Darwin')]
|
||||
#[BuildFor('Linux')]
|
||||
public function buildUnix(LibraryPackage $lib): void
|
||||
{
|
||||
$libcpp = SystemTarget::getTargetOS() === 'Linux' ? '-lstdc++' : '-lc++';
|
||||
FileSystem::replaceFileStr("{$lib->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']);
|
||||
}
|
||||
}
|
||||
44
src/Package/Library/libwebp.php
Normal file
44
src/Package/Library/libwebp.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Package\Library;
|
||||
|
||||
use StaticPHP\Attribute\Package\BuildFor;
|
||||
use StaticPHP\Attribute\Package\Library;
|
||||
use StaticPHP\Package\LibraryPackage;
|
||||
use StaticPHP\Runtime\Executor\UnixCMakeExecutor;
|
||||
|
||||
#[Library('libwebp')]
|
||||
class libwebp extends LibraryPackage
|
||||
{
|
||||
#[BuildFor('Darwin')]
|
||||
#[BuildFor('Linux')]
|
||||
public function buildUnix(): void
|
||||
{
|
||||
$code = '#include <immintrin.h>
|
||||
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']);
|
||||
}
|
||||
}
|
||||
36
src/Package/Library/libzip.php
Normal file
36
src/Package/Library/libzip.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Package\Library;
|
||||
|
||||
use StaticPHP\Attribute\Package\BuildFor;
|
||||
use StaticPHP\Attribute\Package\Library;
|
||||
use StaticPHP\Package\LibraryPackage;
|
||||
use StaticPHP\Runtime\Executor\UnixCMakeExecutor;
|
||||
|
||||
#[Library('libzip')]
|
||||
class libzip
|
||||
{
|
||||
#[BuildFor('Darwin')]
|
||||
#[BuildFor('Linux')]
|
||||
public function buildUnix(LibraryPackage $lib): void
|
||||
{
|
||||
UnixCMakeExecutor::create($lib)
|
||||
->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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user