diff --git a/src/parser/xhpast/bin/PhutilXHPASTBinary.php b/src/parser/xhpast/bin/PhutilXHPASTBinary.php index 5d88fdd..d5092a6 100644 --- a/src/parser/xhpast/bin/PhutilXHPASTBinary.php +++ b/src/parser/xhpast/bin/PhutilXHPASTBinary.php @@ -1,134 +1,134 @@ <?php final class PhutilXHPASTBinary extends Phobject { /** * The expected XHPAST version. * * This is the version that would be obtained with an up-to-date XHPAST * build. The //actual// XHPAST build version may vary. */ const EXPECTED_VERSION = '7.0.2'; /** * The XHPAST build version. * * Cache the result from @{method:getVersion} to prevent excessive calls to * @{function:execx}. */ private static $version; /** * Builds XHPAST automatically. * * Attempts to build the XHPAST binary automatically. * * @return void */ public static function build() { if (Filesystem::binaryExists('gmake')) { $command = 'gmake'; } else { $command = 'make'; } $root = phutil_get_library_root('phutil'); $path = Filesystem::resolvePath($root.'/../support/xhpast'); // Run the build. execx( '%s -C %s %Ls', $command, $path, array('SKIP_PARSER=1', 'SKIP_SCANNER=1', 'clean', 'all', 'install')); + self::$version = null; + // Test the binary. if (!self::isAvailable()) { throw new Exception(pht('%s is broken.', 'xhpast')); } - - self::$version = null; } /** * Returns human-readable instructions for building XHPAST. * * @return string */ public static function getBuildInstructions() { $root = phutil_get_library_root('phutil'); $make = Filesystem::resolvePath($root.'/../scripts/build_xhpast.php'); return phutil_console_format( "%s:\n\n \$ %s\n", pht( "Your version of '%s' is unbuilt or out of date. Run this ". "script to build it.", 'xhpast'), $make); } /** * Constructs an @{class:ExecFuture} for XHPAST. * * @param wild Data to pass to the future. * @return ExecFuture */ public static function getParserFuture($data) { if (!self::isAvailable()) { try { // Try to build XHPAST automatically. If we can't then just ask the // user to build it themselves. self::build(); } catch (CommandException $ex) { throw new PhutilProxyException(self::getBuildInstructions(), $ex); } } $future = new ExecFuture('%s', self::getPath()); $future->write($data); return $future; } /** * Returns the path to the XHPAST binary. * * @return string */ public static function getPath() { if (phutil_is_windows()) { return dirname(__FILE__).'\\xhpast.exe'; } return dirname(__FILE__).'/xhpast'; } /** * Returns the XHPAST version. * * @return string */ public static function getVersion() { if (self::$version === null) { $bin = self::getPath(); if (Filesystem::pathExists($bin)) { list($err, $stdout) = exec_manual('%s --version', $bin); if (!$err) { self::$version = trim($stdout); } } } return self::$version; } /** * Checks if XHPAST is built and up-to-date. * * @return bool */ public static function isAvailable() { return self::getVersion() == self::EXPECTED_VERSION; } }