getBuilder()->getBuildRootPath()}"; if ($installer->getLibraryPackage('openssl')) { $arg .= " --with-event-openssl={$this->getBuilder()->getBuildRootPath()}"; } if ($installer->getPhpExtensionPackage('ext-sockets')) { $arg .= ' --enable-event-sockets'; } else { $arg .= ' --disable-event-sockets'; } return $arg; } #[BeforeStage('php', [php::class, 'makeForUnix'], 'ext-event')] #[PatchDescription('Prevent event extension compile error on macOS')] #[PatchDescription('Patch libevent http_connection.c to use a const peer address')] public function patchBeforeMake(PackageInstaller $installer): void { $php_src = $installer->getTargetPackage('php')->getSourceDir(); // Prevent event extension compile error on macOS if (SystemTarget::getTargetOS() === 'Darwin') { FileSystem::replaceFileRegex("{$php_src}/main/php_config.h", '/^#define HAVE_OPENPTY 1$/m', ''); } $this->patchLibeventConstPeer("{$php_src}/ext/event"); } #[BeforeStage('ext-event', [PhpExtensionPackage::class, 'makeForUnix'])] #[PatchDescription('Patch libevent http_connection.c to use a const peer address')] public function patchBeforeSharedMake(PhpExtensionPackage $pkg): void { $this->patchLibeventConstPeer($pkg->getSourceDir()); } private function patchLibeventConstPeer(string $event_source_dir): bool { $file = "{$event_source_dir}/php8/classes/http_connection.c"; if (!is_file($file)) { return false; } // libevent >= 2.2 changed evhttp_connection_get_peer()'s // address arg to `const char **` $header = $this->getBuilder()->getBuildRootPath() . '/include/event2/http.h'; $isConst = is_file($header) && preg_match('/evhttp_connection_get_peer\s*\([^;]*\bconst\s+char\s*\*\*\s*address/s', file_get_contents($header)) === 1; return (bool) ($isConst ? FileSystem::replaceFileRegex($file, '/^\tchar \*address;$/m', "\tconst char *address;") : FileSystem::replaceFileRegex($file, '/^\tconst char \*address;$/m', "\tchar *address;")); } }