diff --git a/src/SPC/builder/unix/executor/Executor.php b/src/SPC/builder/unix/executor/Executor.php index 0d50d49a..9667de9c 100644 --- a/src/SPC/builder/unix/executor/Executor.php +++ b/src/SPC/builder/unix/executor/Executor.php @@ -17,6 +17,4 @@ abstract class Executor { return new static($library); } - - abstract public function build(): void; } diff --git a/src/SPC/builder/unix/executor/UnixCMakeExecutor.php b/src/SPC/builder/unix/executor/UnixCMakeExecutor.php index 421bd4bb..727607ab 100644 --- a/src/SPC/builder/unix/executor/UnixCMakeExecutor.php +++ b/src/SPC/builder/unix/executor/UnixCMakeExecutor.php @@ -18,7 +18,9 @@ class UnixCMakeExecutor extends Executor protected ?array $custom_default_args = null; - public function build(): void + protected int $steps = 3; + + public function build(string $build_pos = '..'): void { // set cmake dir $this->initCMakeBuildDir(); @@ -35,13 +37,13 @@ class UnixCMakeExecutor extends Executor $shell = shell()->cd($this->cmake_build_dir)->setEnv($env); // config - $shell->execWithEnv("cmake {$this->getConfigureArgs()} {$this->getDefaultCMakeArgs()}"); + $this->steps >= 1 && $shell->execWithEnv("cmake {$this->getConfigureArgs()} {$this->getDefaultCMakeArgs()} {$build_pos}"); // make - $shell->execWithEnv("cmake --build . -j {$this->library->getBuilder()->concurrency}"); + $this->steps >= 2 && $shell->execWithEnv("cmake --build . -j {$this->library->getBuilder()->concurrency}"); // install - $shell->execWithEnv('make install'); + $this->steps >= 3 && $shell->execWithEnv('make install'); } /** @@ -73,6 +75,11 @@ class UnixCMakeExecutor extends Executor return $this; } + public function toStep(int $step): static + { + $this->steps = $step; + } + /** * Set custom CMake build directory. * @@ -113,6 +120,7 @@ class UnixCMakeExecutor extends Executor '-DCMAKE_INSTALL_BINDIR=bin', '-DCMAKE_INSTALL_LIBDIR=lib', '-DCMAKE_INSTALL_INCLUDE_DIR=include', + '-DBUILD_SHARED_LIBS=OFF', "-DCMAKE_TOOLCHAIN_FILE={$this->makeCmakeToolchainFile()}", '..', ]); diff --git a/src/SPC/builder/unix/library/brotli.php b/src/SPC/builder/unix/library/brotli.php index 9e764fcb..a12810d7 100644 --- a/src/SPC/builder/unix/library/brotli.php +++ b/src/SPC/builder/unix/library/brotli.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; use SPC\store\FileSystem; @@ -16,21 +17,10 @@ trait brotli */ protected function build(): void { - FileSystem::resetDir($this->source_dir . '/build-dir'); - shell()->cd($this->source_dir . '/build-dir') - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv( - 'cmake ' . - '-DCMAKE_BUILD_TYPE=Release ' . - "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . - '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . - '-DCMAKE_INSTALL_LIBDIR=lib ' . - '-DSHARE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . - '-DBUILD_SHARED_LIBS=OFF ' . - '..' - ) - ->execWithEnv("cmake --build . -j {$this->builder->concurrency}") - ->execWithEnv('make install'); + UnixCMakeExecutor::create($this) + ->setCMakeBuildDir("{$this->getSourceDir()}/build-dir") + ->build(); + $this->patchPkgconfPrefix(['libbrotlicommon.pc', 'libbrotlidec.pc', 'libbrotlienc.pc']); shell()->cd(BUILD_ROOT_PATH . '/lib')->exec('ln -sf libbrotlicommon.a libbrotli.a'); foreach (FileSystem::scanDirFiles(BUILD_ROOT_PATH . '/lib/', false, true) as $filename) { diff --git a/src/SPC/builder/unix/library/curl.php b/src/SPC/builder/unix/library/curl.php index 23b1c80a..95afe34e 100644 --- a/src/SPC/builder/unix/library/curl.php +++ b/src/SPC/builder/unix/library/curl.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait curl { @@ -16,79 +16,25 @@ trait curl */ protected function build(): void { - $extra = ''; - // lib:openssl - if ($this->builder->getLib('openssl')) { - $extra .= - '-DCURL_USE_OPENSSL=ON ' . - '-DCURL_CA_BUNDLE=OFF ' . - '-DCURL_CA_PATH=OFF ' . - '-DCURL_CA_FALLBACK=ON '; - } else { - $extra .= '-DCURL_USE_OPENSSL=OFF -DCURL_ENABLE_SSL=OFF '; - } - // lib:brotli - $extra .= $this->builder->getLib('brotli') ? '-DCURL_BROTLI=ON ' : '-DCURL_BROTLI=OFF '; - // lib:libssh2 - $libssh2 = $this->builder->getLib('libssh2'); - if ($this->builder->getLib('libssh2')) { - /* @phpstan-ignore-next-line */ - $extra .= '-DLIBSSH2_LIBRARY="' . $libssh2->getStaticLibFiles(style: 'cmake') . '" ' . - '-DLIBSSH2_INCLUDE_DIR="' . BUILD_INCLUDE_PATH . '" '; - } else { - $extra .= '-DCURL_USE_LIBSSH2=OFF '; - } - // lib:nghttp2 - if ($nghttp2 = $this->builder->getLib('nghttp2')) { - $extra .= '-DUSE_NGHTTP2=ON ' . - /* @phpstan-ignore-next-line */ - '-DNGHTTP2_LIBRARY="' . $nghttp2->getStaticLibFiles(style: 'cmake') . '" ' . - '-DNGHTTP2_INCLUDE_DIR="' . BUILD_INCLUDE_PATH . '" '; - } else { - $extra .= '-DUSE_NGHTTP2=OFF '; - } - // lib:nghttp3 - if ($nghttp3 = $this->builder->getLib('nghttp3')) { - $extra .= '-DUSE_NGHTTP3=ON ' . - /* @phpstan-ignore-next-line */ - '-DNGHTTP3_LIBRARY="' . $nghttp3->getStaticLibFiles(style: 'cmake') . '" ' . - '-DNGHTTP3_INCLUDE_DIR="' . BUILD_INCLUDE_PATH . '" '; - } else { - $extra .= '-DUSE_NGHTTP3=OFF '; - } - // lib:ngtcp2 - if ($ngtcp2 = $this->builder->getLib('ngtcp2')) { - $extra .= '-DUSE_NGTCP2=ON ' . - /* @phpstan-ignore-next-line */ - '-DNGTCP2_LIBRARY="' . $ngtcp2->getStaticLibFiles(style: 'cmake') . '" ' . - '-DNGTCP2_INCLUDE_DIR="' . BUILD_INCLUDE_PATH . '" '; - } else { - $extra .= '-DUSE_NGTCP2=OFF '; - } - // lib:ldap - $extra .= $this->builder->getLib('ldap') ? '-DCURL_DISABLE_LDAP=OFF ' : '-DCURL_DISABLE_LDAP=ON '; - // lib:zstd - $extra .= $this->builder->getLib('zstd') ? '-DCURL_ZSTD=ON ' : '-DCURL_ZSTD=OFF '; - // lib:idn2 - $extra .= $this->builder->getLib('idn2') ? '-DUSE_LIBIDN2=ON ' : '-DUSE_LIBIDN2=OFF '; - // lib:psl - $extra .= $this->builder->getLib('psl') ? '-DCURL_USE_LIBPSL=ON ' : '-DCURL_USE_LIBPSL=OFF '; - // lib:libcares - $extra .= $this->builder->getLib('libcares') ? '-DENABLE_ARES=ON ' : ''; + shell()->cd($this->source_dir)->exec('sed -i.save s@\${CMAKE_C_IMPLICIT_LINK_LIBRARIES}@@ ./CMakeLists.txt'); - FileSystem::resetDir($this->source_dir . '/build'); + UnixCMakeExecutor::create($this) + ->optionalLib('openssl', '-DCURL_USE_OPENSSL=ON -DCURL_CA_BUNDLE=OFF -DCURL_CA_PATH=OFF -DCURL_FALLBACK=ON', '-DCURL_USE_OPENSSL=OFF -DCURL_ENABLE_SSL=OFF') + ->optionalLib('brotli', ...cmake_boolean_args('CURL_BROTLI')) + ->optionalLib('libssh2', fn ($lib) => "-DLIBSSH2_LIBRARY=\"{$lib->getStaticLibFiles(style: 'cmake')}\" -DLIBSSH2_INCLUDE_DIR={$lib->getIncludeDir()}", '-DCURL_USE_LIBSSH2=OFF') + ->optionalLib('nghttp2', fn ($lib) => "-DUSE_NGHTTP2=ON -DNGHTTP2_LIBRARY=\"{$lib->getStaticLibFiles(style: 'cmake')}\" -DNGHTTP2_INCLUDE_DIR={$lib->getIncludeDir()}", '-DUSE_NGHTTP2=OFF') + ->optionalLib('nghttp3', fn ($lib) => "-DUSE_NGHTTP3=ON -DNGHTTP3_LIBRARY=\"{$lib->getStaticLibFiles(style: 'cmake')}\" -DNGHTTP3_INCLUDE_DIR={$lib->getIncludeDir()}", '-DUSE_NGHTTP3=OFF') + ->optionalLib('ldap', ...cmake_boolean_args('CURL_DISABLE_LDAP', true)) + ->optionalLib('zstd', ...cmake_boolean_args('CURL_ZSTD')) + ->optionalLib('idn2', ...cmake_boolean_args('USE_LIBIDN2')) + ->optionalLib('psl', ...cmake_boolean_args('CURL_USE_LIBPSL')) + ->optionalLib('libcares', '-DENABLE_ARES=ON') + ->addConfigureArgs( + '-DBUILD_CURL_EXE=OFF', + '-DBUILD_LIBCURL_DOCS=OFF', + ) + ->build(); - // compile! - shell()->cd($this->source_dir . '/build') - ->setEnv([ - 'CFLAGS' => $this->getLibExtraCFlags(), - 'LDFLAGS' => $this->getLibExtraLdFlags(), - 'LIBS' => $this->getLibExtraLibs(), - ]) - ->exec('sed -i.save s@\${CMAKE_C_IMPLICIT_LINK_LIBRARIES}@@ ../CMakeLists.txt') - ->execWithEnv("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF -DBUILD_CURL_EXE=OFF -DBUILD_LIBCURL_DOCS=OFF {$extra} ..") - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install'); // patch pkgconf $this->patchPkgconfPrefix(['libcurl.pc']); shell()->cd(BUILD_LIB_PATH . '/cmake/CURL/') diff --git a/src/SPC/builder/unix/library/freetype.php b/src/SPC/builder/unix/library/freetype.php index 94998b7c..fd551593 100644 --- a/src/SPC/builder/unix/library/freetype.php +++ b/src/SPC/builder/unix/library/freetype.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; use SPC\exception\WrongUsageException; @@ -18,24 +19,18 @@ trait freetype */ protected function build(): void { - $extra = ''; + $cmake = UnixCMakeExecutor::create($this) + ->optionalLib('libpng', ...cmake_boolean_args('FT_DISABLE_PNG', true)) + ->optionalLib('bzip2', ...cmake_boolean_args('FT_DISABLE_BZIP2', true)) + ->optionalLib('brotli', ...cmake_boolean_args('FT_DISABLE_BROTLI', true)) + ->addConfigureArgs('-DFT_DISABLE_HARFBUZZ=ON'); + + // fix cmake 4.0 compatibility if (version_compare(get_cmake_version(), '4.0.0', '>=')) { - $extra .= '-DCMAKE_POLICY_VERSION_MINIMUM=3.12 '; + $cmake->addConfigureArgs('-DCMAKE_POLICY_VERSION_MINIMUM=3.12'); } - $extra .= $this->builder->getLib('libpng') ? '-DFT_DISABLE_PNG=OFF ' : '-DFT_DISABLE_PNG=ON '; - $extra .= $this->builder->getLib('bzip2') ? '-DFT_DISABLE_BZIP2=OFF ' : '-DFT_DISABLE_BZIP2=ON '; - $extra .= $this->builder->getLib('brotli') ? '-DFT_DISABLE_BROTLI=OFF ' : '-DFT_DISABLE_BROTLI=ON '; - FileSystem::resetDir($this->source_dir . '/build'); - shell()->cd($this->source_dir . '/build') - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv( - "cmake {$this->builder->makeCmakeArgs()} -DFT_DISABLE_HARFBUZZ=ON " . - '-DBUILD_SHARED_LIBS=OFF ' . - "{$extra}.." - ) - ->execWithEnv('make clean') - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install'); + + $cmake->build(); $this->patchPkgconfPrefix(['freetype2.pc']); FileSystem::replaceFileStr( diff --git a/src/SPC/builder/unix/library/gmssl.php b/src/SPC/builder/unix/library/gmssl.php index 1d946621..7c007f52 100644 --- a/src/SPC/builder/unix/library/gmssl.php +++ b/src/SPC/builder/unix/library/gmssl.php @@ -4,25 +4,12 @@ declare(strict_types=1); namespace SPC\builder\unix\library; -use SPC\exception\FileSystemException; -use SPC\exception\RuntimeException; -use SPC\store\FileSystem; +use SPC\builder\unix\executor\UnixCMakeExecutor; trait gmssl { - /** - * @throws FileSystemException - * @throws RuntimeException - */ protected function build(): void { - // CMake needs a clean build directory - FileSystem::resetDir($this->source_dir . '/build'); - // Start build - shell()->cd($this->source_dir . '/build') - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF ..") - ->execWithEnv("cmake --build . -j {$this->builder->concurrency}") - ->execWithEnv('make install'); + UnixCMakeExecutor::create($this)->build(); } } diff --git a/src/SPC/builder/unix/library/libaom.php b/src/SPC/builder/unix/library/libaom.php index 5ecf6704..e4a28903 100644 --- a/src/SPC/builder/unix/library/libaom.php +++ b/src/SPC/builder/unix/library/libaom.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait libaom { @@ -16,21 +16,10 @@ trait libaom */ protected function build(): void { - // CMake needs a clean build directory - FileSystem::resetDir($this->source_dir . '/builddir'); - // Start build - shell()->cd($this->source_dir . '/builddir') - ->exec( - 'cmake ' . - '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . - "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . - '-DCMAKE_BUILD_TYPE=Release ' . - '-DBUILD_SHARED_LIBS=OFF ' . - '-DAOM_TARGET_CPU=generic ' . - '..' - ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + UnixCMakeExecutor::create($this) + ->setCMakeBuildDir("{$this->source_dir}/builddir") + ->addConfigureArgs('-DAOM_TARGET_GPU=generic') + ->build(); $this->patchPkgconfPrefix(['aom.pc']); } } diff --git a/src/SPC/builder/unix/library/libavif.php b/src/SPC/builder/unix/library/libavif.php index c2aaafcd..dd9efb33 100644 --- a/src/SPC/builder/unix/library/libavif.php +++ b/src/SPC/builder/unix/library/libavif.php @@ -4,10 +4,10 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; use SPC\exception\WrongUsageException; -use SPC\store\FileSystem; trait libavif { @@ -18,14 +18,9 @@ trait libavif */ protected function build(): void { - // CMake needs a clean build directory - FileSystem::resetDir($this->source_dir . '/build'); - // Start build - shell()->cd($this->source_dir . '/build') - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv("cmake {$this->builder->makeCmakeArgs()} -DBUILD_SHARED_LIBS=OFF -DAVIF_LIBYUV=OFF ..") - ->execWithEnv("cmake --build . -j {$this->builder->concurrency}") - ->execWithEnv('make install'); + UnixCMakeExecutor::create($this) + ->addConfigureArgs('-DAVIF_LIBYUV=OFF') + ->build(); // patch pkgconfig $this->patchPkgconfPrefix(['libavif.pc']); $this->cleanLaFiles(); diff --git a/src/SPC/builder/unix/library/libde265.php b/src/SPC/builder/unix/library/libde265.php index df02bbb3..e6e57c44 100644 --- a/src/SPC/builder/unix/library/libde265.php +++ b/src/SPC/builder/unix/library/libde265.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait libde265 { @@ -16,21 +16,9 @@ trait libde265 */ protected function build(): void { - // CMake needs a clean build directory - FileSystem::resetDir($this->source_dir . '/build'); - // Start build - shell()->cd($this->source_dir . '/build') - ->exec( - 'cmake ' . - '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . - "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . - '-DCMAKE_BUILD_TYPE=Release ' . - '-DBUILD_SHARED_LIBS=OFF ' . - '-DENABLE_SDL=OFF ' . // Disable SDL, currently not supported - '..' - ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + UnixCMakeExecutor::create($this) + ->addConfigureArgs('-DENABLE_SDL=OFF') + ->build(); $this->patchPkgconfPrefix(['libde265.pc']); } } diff --git a/src/SPC/builder/unix/library/libevent.php b/src/SPC/builder/unix/library/libevent.php index 2e80f32e..ee9357ac 100644 --- a/src/SPC/builder/unix/library/libevent.php +++ b/src/SPC/builder/unix/library/libevent.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; use SPC\store\FileSystem; @@ -39,27 +40,16 @@ trait libevent */ protected function build(): void { - [$lib, $include, $destdir] = SEPARATED_PATH; - // CMake needs a clean build directory - FileSystem::resetDir($this->source_dir . '/build'); - // Start build - shell()->cd($this->source_dir . '/build') - ->setEnv(['CFLAGS' => $this->getLibExtraCFlags(), 'LDFLAGS' => $this->getLibExtraLdFlags(), 'LIBS' => $this->getLibExtraLibs()]) - ->execWithEnv( - 'cmake ' . - '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . - "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . - '-DCMAKE_BUILD_TYPE=Release ' . - '-DEVENT__LIBRARY_TYPE=STATIC ' . - '-DEVENT__DISABLE_BENCHMARK=ON ' . - '-DEVENT__DISABLE_THREAD_SUPPORT=ON ' . - '-DEVENT__DISABLE_MBEDTLS=ON ' . - '-DEVENT__DISABLE_TESTS=ON ' . - '-DEVENT__DISABLE_SAMPLES=ON ' . - '..' + UnixCMakeExecutor::create($this) + ->addConfigureArgs( + '-DEVENT__LIBRARY_TYPE=STATIC', + '-DEVENT__DISABLE_BENCHMARK=ON', + '-DEVENT__DISABLE_THREAD_SUPPORT=ON', + '-DEVENT__DISABLE_MBEDTLS=ON', + '-DEVENT__DISABLE_TESTS=ON', + '-DEVENT__DISABLE_SAMPLES=ON', ) - ->execWithEnv("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + ->build(); $this->patchPkgconfPrefix(['libevent.pc', 'libevent_core.pc', 'libevent_extra.pc', 'libevent_openssl.pc']); diff --git a/src/SPC/builder/unix/library/libheif.php b/src/SPC/builder/unix/library/libheif.php index e2d2a486..0a171431 100644 --- a/src/SPC/builder/unix/library/libheif.php +++ b/src/SPC/builder/unix/library/libheif.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait libheif { @@ -16,26 +16,16 @@ trait libheif */ protected function build(): void { - // CMake needs a clean build directory - FileSystem::resetDir($this->source_dir . '/build'); - // Start build - shell()->cd($this->source_dir . '/build') - ->exec( - 'cmake ' . - '--preset=release ' . - '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . - "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . - '-DCMAKE_BUILD_TYPE=Release ' . - '-DBUILD_SHARED_LIBS=OFF ' . - '-DWITH_EXAMPLES=OFF ' . - '-DWITH_GDK_PIXBUF=OFF ' . - '-DBUILD_TESTING=OFF ' . - '-DWITH_LIBSHARPYUV=ON ' . // optional: libwebp - '-DENABLE_PLUGIN_LOADING=OFF ' . - '..' + UnixCMakeExecutor::create($this) + ->addConfigureArgs( + '--preset=release', + '-DWITH_EXAMPLES=OFF', + '-DWITH_GDK_PIXBUF=OFF', + '-DBUILD_TESTING=OFF', + '-DWITH_LIBSHARPYUV=ON', // optional: libwebp + '-DENABLE_PLUGIN_LOADING=OFF', ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + ->build(); $this->patchPkgconfPrefix(['libheif.pc']); } } diff --git a/src/SPC/builder/unix/library/libjpeg.php b/src/SPC/builder/unix/library/libjpeg.php index c4f9833d..1be81cf3 100644 --- a/src/SPC/builder/unix/library/libjpeg.php +++ b/src/SPC/builder/unix/library/libjpeg.php @@ -4,10 +4,10 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; use SPC\exception\WrongUsageException; -use SPC\store\FileSystem; trait libjpeg { @@ -18,18 +18,12 @@ trait libjpeg */ protected function build(): void { - // CMake needs a clean build directory - FileSystem::resetDir($this->source_dir . '/build'); - // Start build - shell()->cd($this->source_dir . '/build') - ->exec( - "cmake {$this->builder->makeCmakeArgs()} " . - '-DENABLE_STATIC=ON ' . - '-DENABLE_SHARED=OFF ' . - '..' + UnixCMakeExecutor::create($this) + ->addConfigureArgs( + '-DENABLE_STATIC=ON', + '-DENABLE_SHARED=OFF', ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + ->build(); // patch pkgconfig $this->patchPkgconfPrefix(['libjpeg.pc', 'libturbojpeg.pc']); $this->cleanLaFiles(); diff --git a/src/SPC/builder/unix/library/librabbitmq.php b/src/SPC/builder/unix/library/librabbitmq.php index 42ef553b..dbf2e8ad 100644 --- a/src/SPC/builder/unix/library/librabbitmq.php +++ b/src/SPC/builder/unix/library/librabbitmq.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait librabbitmq { @@ -16,20 +16,6 @@ trait librabbitmq */ protected function build(): void { - // CMake needs a clean build directory - FileSystem::resetDir($this->source_dir . '/build'); - // Start build - shell()->cd($this->source_dir . '/build') - ->exec( - 'cmake ' . - '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . - "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . - '-DCMAKE_BUILD_TYPE=Release ' . - '-DBUILD_SHARED_LIBS=OFF ' . - '-DBUILD_STATIC_LIBS=ON ' . - '..' - ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + UnixCMakeExecutor::create($this)->addConfigureArgs('-DBUILD_STATIC_LIBS=ON')->build(); } } diff --git a/src/SPC/builder/unix/library/libssh2.php b/src/SPC/builder/unix/library/libssh2.php index 9e999ca9..9aee6116 100644 --- a/src/SPC/builder/unix/library/libssh2.php +++ b/src/SPC/builder/unix/library/libssh2.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait libssh2 { @@ -16,24 +16,14 @@ trait libssh2 */ protected function build(): void { - $enable_zlib = $this->builder->getLib('zlib') !== null ? 'ON' : 'OFF'; - - FileSystem::resetDir($this->source_dir . '/build'); - shell()->cd($this->source_dir . '/build') - ->exec( - 'cmake ' . - '-DCMAKE_BUILD_TYPE=Release ' . - "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . - '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . - '-DCMAKE_INSTALL_LIBDIR=lib ' . - '-DBUILD_SHARED_LIBS=OFF ' . - '-DBUILD_EXAMPLES=OFF ' . - '-DBUILD_TESTING=OFF ' . - "-DENABLE_ZLIB_COMPRESSION={$enable_zlib} " . - '..' + UnixCMakeExecutor::create($this) + ->optionalLib('zlib', ...cmake_boolean_args('ENABLE_ZLIB_COMPRESSION')) + ->addConfigureArgs( + '-DBUILD_EXAMPLES=OFF', + '-DBUILD_TESTING=OFF' ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + ->build(); + $this->patchPkgconfPrefix(['libssh2.pc']); } } diff --git a/src/SPC/builder/unix/library/libuuid.php b/src/SPC/builder/unix/library/libuuid.php index 65ed02ac..becb5e41 100644 --- a/src/SPC/builder/unix/library/libuuid.php +++ b/src/SPC/builder/unix/library/libuuid.php @@ -4,26 +4,18 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; -use SPC\exception\RuntimeException; use SPC\store\FileSystem; trait libuuid { /** * @throws FileSystemException - * @throws RuntimeException */ protected function build(): void { - FileSystem::resetDir($this->source_dir . '/build'); - shell()->cd($this->source_dir . '/build') - ->exec( - 'cmake ' . - "{$this->builder->makeCmakeArgs()} " . - '..' - ) - ->exec("cmake --build . -j {$this->builder->concurrency}"); + UnixCMakeExecutor::create($this)->toStep(2)->build(); copy($this->source_dir . '/build/libuuid.a', BUILD_LIB_PATH . '/libuuid.a'); FileSystem::createDir(BUILD_INCLUDE_PATH . '/uuid'); copy($this->source_dir . '/uuid.h', BUILD_INCLUDE_PATH . '/uuid/uuid.h'); diff --git a/src/SPC/builder/unix/library/libuv.php b/src/SPC/builder/unix/library/libuv.php index fda11c0a..1110d34d 100644 --- a/src/SPC/builder/unix/library/libuv.php +++ b/src/SPC/builder/unix/library/libuv.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait libuv { @@ -16,13 +16,9 @@ trait libuv */ protected function build(): void { - // CMake needs a clean build directory - FileSystem::resetDir($this->source_dir . '/build'); - // Start build - shell()->cd($this->source_dir . '/build') - ->exec("cmake {$this->builder->makeCmakeArgs()} -DLIBUV_BUILD_SHARED=OFF ..") - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + UnixCMakeExecutor::create($this) + ->addConfigureArgs('-DLIBUV_BUILD_SHARED=OFF') + ->build(); // patch pkgconfig $this->patchPkgconfPrefix(['libuv-static.pc']); } diff --git a/src/SPC/builder/unix/library/libwebp.php b/src/SPC/builder/unix/library/libwebp.php index efb78a68..b735fa8e 100644 --- a/src/SPC/builder/unix/library/libwebp.php +++ b/src/SPC/builder/unix/library/libwebp.php @@ -4,10 +4,10 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; use SPC\exception\WrongUsageException; -use SPC\store\FileSystem; trait libwebp { @@ -18,19 +18,9 @@ trait libwebp */ protected function build(): void { - // CMake needs a clean build directory - FileSystem::resetDir($this->source_dir . '/build'); - // Start build - shell()->cd($this->source_dir . '/build') - ->exec( - 'cmake ' . - $this->builder->makeCmakeArgs() . ' ' . - '-DBUILD_SHARED_LIBS=OFF ' . - '-DWEBP_BUILD_EXTRAS=ON ' . - '..' - ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + UnixCMakeExecutor::create($this) + ->addConfigureArgs('-DWEBP_BUILD_EXTRAS=ON') + ->build(); // patch pkgconfig $this->patchPkgconfPrefix(['libsharpyuv.pc', 'libwebp.pc', 'libwebpdecoder.pc', 'libwebpdemux.pc', 'libwebpmux.pc'], PKGCONF_PATCH_PREFIX | PKGCONF_PATCH_LIBDIR); $this->patchPkgconfPrefix(['libsharpyuv.pc'], PKGCONF_PATCH_CUSTOM, ['/^includedir=.*$/m', 'includedir=${prefix}/include/webp']); diff --git a/src/SPC/builder/unix/library/libyaml.php b/src/SPC/builder/unix/library/libyaml.php index 53962e9b..799b141a 100644 --- a/src/SPC/builder/unix/library/libyaml.php +++ b/src/SPC/builder/unix/library/libyaml.php @@ -4,8 +4,7 @@ declare(strict_types=1); namespace SPC\builder\unix\library; -use SPC\exception\FileSystemException; -use SPC\exception\RuntimeException; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\store\FileSystem; trait libyaml @@ -25,29 +24,8 @@ trait libyaml return null; } - /** - * @throws RuntimeException - * @throws FileSystemException - */ protected function build(): void { - [$lib, $include, $destdir] = SEPARATED_PATH; - - FileSystem::resetDir($this->source_dir . '/build'); - shell()->cd($this->source_dir . '/build') - ->exec( - 'cmake ' . - // '--debug-find ' . - '-DCMAKE_BUILD_TYPE=Release ' . - '-DBUILD_TESTING=OFF ' . - '-DBUILD_SHARED_LIBS=OFF ' . - '-DCMAKE_INSTALL_PREFIX=/ ' . - "-DCMAKE_INSTALL_LIBDIR={$lib} " . - "-DCMAKE_INSTALL_INCLUDEDIR={$include} " . - "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . - '..' - ) - ->exec("make -j{$this->builder->concurrency}") - ->exec("make install DESTDIR={$destdir}"); + UnixCMakeExecutor::create($this)->addConfigureArgs('-DBUILD_TESTING=OFF')->build(); } } diff --git a/src/SPC/builder/unix/library/libzip.php b/src/SPC/builder/unix/library/libzip.php index 5e2bd0d6..406be44f 100644 --- a/src/SPC/builder/unix/library/libzip.php +++ b/src/SPC/builder/unix/library/libzip.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait libzip { @@ -16,35 +16,21 @@ trait libzip */ protected function build(): void { - $extra = ''; - // lib:bzip2 - $extra .= $this->builder->getLib('bzip2') ? '-DENABLE_BZIP2=ON ' : '-DENABLE_BZIP2=OFF '; - // lib:xz - $extra .= $this->builder->getLib('xz') ? '-DENABLE_LZMA=ON ' : '-DENABLE_LZMA=OFF '; - // lib:zstd (disabled due to imagemagick link issue - $extra .= /* $this->builder->getLib('zstd') ? '-DENABLE_ZSTD=ON ' : */ '-DENABLE_ZSTD=OFF '; - // lib:openssl - $extra .= $this->builder->getLib('openssl') ? '-DENABLE_OPENSSL=ON ' : '-DENABLE_OPENSSL=OFF '; - - FileSystem::resetDir($this->source_dir . '/build'); - shell()->cd($this->source_dir . '/build') - ->exec( - 'cmake ' . - '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . - "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . - '-DCMAKE_BUILD_TYPE=Release ' . - '-DENABLE_GNUTLS=OFF ' . - '-DENABLE_MBEDTLS=OFF ' . - '-DBUILD_SHARED_LIBS=OFF ' . - '-DBUILD_DOC=OFF ' . - '-DBUILD_EXAMPLES=OFF ' . - '-DBUILD_REGRESS=OFF ' . - '-DBUILD_TOOLS=OFF ' . - $extra . - '..' + UnixCMakeExecutor::create($this) + ->optionalLib('bzip2', ...cmake_boolean_args('ENABLE_BZIP2')) + ->optionalLib('xz', ...cmake_boolean_args('ENABLE_LZMA')) + ->optionalLib('openssl', ...cmake_boolean_args('ENABLE_OPENSSL')) + ->addConfigureArgs( + '-DENABLE_GNUTLS=OFF', + '-DENABLE_MBEDTLS=OFF', + '-DBUILD_SHARED_LIBS=OFF', + '-DBUILD_DOC=OFF', + '-DBUILD_EXAMPLES=OFF', + '-DBUILD_REGRESS=OFF', + '-DBUILD_TOOLS=OFF', + '-DENABLE_ZSTD=OFF', ) - ->exec("make -j{$this->builder->concurrency}") - ->exec('make install'); + ->build(); $this->patchPkgconfPrefix(['libzip.pc'], PKGCONF_PATCH_PREFIX); } } diff --git a/src/SPC/builder/unix/library/mimalloc.php b/src/SPC/builder/unix/library/mimalloc.php index 40790a98..7655e321 100644 --- a/src/SPC/builder/unix/library/mimalloc.php +++ b/src/SPC/builder/unix/library/mimalloc.php @@ -4,35 +4,20 @@ declare(strict_types=1); namespace SPC\builder\unix\library; -use SPC\exception\FileSystemException; -use SPC\exception\RuntimeException; -use SPC\store\FileSystem; +use SPC\builder\unix\executor\UnixCMakeExecutor; trait mimalloc { - /** - * @throws RuntimeException - * @throws FileSystemException - */ protected function build(): void { - $args = ''; + $cmake = UnixCMakeExecutor::create($this) + ->addConfigureArgs( + '-DMI_BUILD_SHARED=OFF', + '-DMI_INSTALL_TOPLEVEL=ON' + ); if (getenv('SPC_LIBC') === 'musl') { - $args .= '-DMI_LIBC_MUSL=ON '; + $cmake->addConfigureArgs('-DMI_LIBC_MUSL=ON'); } - $args .= '-DMI_BUILD_SHARED=OFF '; - $args .= '-DMI_INSTALL_TOPLEVEL=ON '; - FileSystem::resetDir($this->source_dir . '/build'); - shell()->cd($this->source_dir . '/build') - ->execWithEnv( - 'cmake ' . - '-DCMAKE_INSTALL_PREFIX=' . BUILD_ROOT_PATH . ' ' . - "-DCMAKE_TOOLCHAIN_FILE={$this->builder->cmake_toolchain_file} " . - '-DCMAKE_BUILD_TYPE=Release ' . - $args . - '..' - ) - ->execWithEnv("make -j{$this->builder->concurrency}") - ->execWithEnv('make install'); + $cmake->build(); } } diff --git a/src/SPC/builder/unix/library/snappy.php b/src/SPC/builder/unix/library/snappy.php index f1b4c825..94d93372 100644 --- a/src/SPC/builder/unix/library/snappy.php +++ b/src/SPC/builder/unix/library/snappy.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait snappy { @@ -16,17 +16,12 @@ trait snappy */ protected function build(): void { - FileSystem::resetDir($this->source_dir . '/cmake/build'); - - shell()->cd($this->source_dir . '/cmake/build') - ->exec( - 'cmake ' . - "{$this->builder->makeCmakeArgs()} " . - '-DSNAPPY_BUILD_TESTS=OFF ' . - '-DSNAPPY_BUILD_BENCHMARKS=OFF ' . - '../..' + UnixCMakeExecutor::create($this) + ->setCMakeBuildDir("{$this->source_dir}/cmake/build") + ->addConfigureArgs( + '-DSNAPPY_BUILD_TESTS=OFF', + '-DSNAPPY_BUILD_BENCHMARKS=OFF', ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + ->build('../..'); } } diff --git a/src/SPC/builder/unix/library/tidy.php b/src/SPC/builder/unix/library/tidy.php index 31c851d1..ed143548 100644 --- a/src/SPC/builder/unix/library/tidy.php +++ b/src/SPC/builder/unix/library/tidy.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait tidy { @@ -16,17 +16,10 @@ trait tidy */ protected function build(): void { - FileSystem::resetDir($this->source_dir . '/build-dir'); - shell()->cd($this->source_dir . '/build-dir') - ->exec( - 'cmake ' . - "{$this->builder->makeCmakeArgs()} " . - '-DBUILD_SHARED_LIB=OFF ' . - '-DSUPPORT_CONSOLE_APP=OFF ' . - '..' - ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + UnixCMakeExecutor::create($this) + ->setCMakeBuildDir("{$this->source_dir}/build-dir") + ->addConfigureArgs('-DSUPPORT_CONSOLE_APP=OFF') + ->build(); $this->patchPkgconfPrefix(['tidy.pc']); } } diff --git a/src/SPC/builder/unix/library/zstd.php b/src/SPC/builder/unix/library/zstd.php index 1990f658..d081baae 100644 --- a/src/SPC/builder/unix/library/zstd.php +++ b/src/SPC/builder/unix/library/zstd.php @@ -4,9 +4,9 @@ declare(strict_types=1); namespace SPC\builder\unix\library; +use SPC\builder\unix\executor\UnixCMakeExecutor; use SPC\exception\FileSystemException; use SPC\exception\RuntimeException; -use SPC\store\FileSystem; trait zstd { @@ -16,17 +16,13 @@ trait zstd */ protected function build(): void { - FileSystem::resetDir($this->source_dir . '/build/cmake/build'); - shell()->cd($this->source_dir . '/build/cmake/build') - ->exec( - 'cmake ' . - "{$this->builder->makeCmakeArgs()} " . - '-DZSTD_BUILD_STATIC=ON ' . - '-DZSTD_BUILD_SHARED=OFF ' . - '..' + UnixCMakeExecutor::create($this) + ->setCMakeBuildDir("{$this->source_dir}/build/cmake/build") + ->addConfigureArgs( + '-DZSTD_BUILD_STATIC=ON', + '-DZSTD_BUILD_SHARED=OFF', ) - ->exec("cmake --build . -j {$this->builder->concurrency}") - ->exec('make install'); + ->build(); $this->patchPkgconfPrefix(['libzstd.pc']); } }