123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- use Symfony\Component\Intl\Data\Bundle\Reader\JsonBundleReader;
- use Symfony\Component\Intl\Data\Bundle\Writer\JsonBundleWriter;
- use Symfony\Component\Intl\Data\Generator\CurrencyDataGenerator;
- use Symfony\Component\Intl\Data\Generator\GeneratorConfig;
- use Symfony\Component\Intl\Data\Generator\LanguageDataGenerator;
- use Symfony\Component\Intl\Data\Generator\LocaleDataGenerator;
- use Symfony\Component\Intl\Data\Generator\RegionDataGenerator;
- use Symfony\Component\Intl\Data\Generator\ScriptDataGenerator;
- use Symfony\Component\Intl\Data\Provider\LanguageDataProvider;
- use Symfony\Component\Intl\Data\Provider\RegionDataProvider;
- use Symfony\Component\Intl\Data\Provider\ScriptDataProvider;
- use Symfony\Component\Intl\Intl;
- use Symfony\Component\Intl\Data\Bundle\Compiler\GenrbCompiler;
- use Symfony\Component\Intl\Data\Bundle\Reader\BundleEntryReader;
- use Symfony\Component\Intl\Locale;
- use Symfony\Component\Intl\Util\IcuVersion;
- use Symfony\Component\Intl\Util\SvnRepository;
- use Symfony\Component\Filesystem\Filesystem;
- require_once __DIR__.'/common.php';
- require_once __DIR__.'/autoload.php';
- $argc = $_SERVER['argc'];
- $argv = $_SERVER['argv'];
- if ($argc > 3 || 2 === $argc && '-h' === $argv[1]) {
- bailout(<<<'MESSAGE'
- Usage: php update-data.php <path/to/icu/source> <path/to/icu/build>
- Updates the ICU data for Symfony to the latest version of ICU.
- If you downloaded the SVN repository before, you can pass the path to the
- repository source in the first optional argument.
- If you also built the repository before, you can pass the directory where that
- build is stored in the second parameter. The build directory needs to contain
- the subdirectories bin/ and lib/.
- For running this script, the intl extension must be loaded and all vendors
- must have been installed through composer:
- composer install
- MESSAGE
- );
- }
- echo LINE;
- echo centered('ICU Resource Bundle Compilation')."\n";
- echo LINE;
- if (!Intl::isExtensionLoaded()) {
- bailout('The intl extension for PHP is not installed.');
- }
- $filesystem = new Filesystem();
- $urls = parse_ini_file(__DIR__.'/icu.ini');
- echo "icu.ini parsed. Available versions:\n";
- $maxVersion = 0;
- foreach ($urls as $urlVersion => $url) {
- $maxVersion = IcuVersion::compare($maxVersion, $urlVersion, '<')
- ? $urlVersion
- : $maxVersion;
- echo " $urlVersion\n";
- }
- $shortIcuVersion = strip_minor_versions($maxVersion);
- if ($argc >= 2) {
- $sourceDir = $argv[1];
- $svn = new SvnRepository($sourceDir);
- echo "Using existing SVN repository at {$sourceDir}.\n";
- } else {
- echo "Starting SVN checkout for version $shortIcuVersion. This may take a while...\n";
- $sourceDir = sys_get_temp_dir().'/icu-data/'.$shortIcuVersion.'/source';
- $svn = SvnRepository::download($urls[$shortIcuVersion], $sourceDir);
- echo "SVN checkout to {$sourceDir} complete.\n";
- }
- if ($argc >= 3) {
- $buildDir = $argv[2];
- } else {
- // Always build genrb so that we can determine the ICU version of the
- // download by running genrb --version
- echo "Building genrb.\n";
- cd($sourceDir);
- echo "Running configure...\n";
- $buildDir = sys_get_temp_dir().'/icu-data/'.$shortIcuVersion.'/build';
- $filesystem->remove($buildDir);
- $filesystem->mkdir($buildDir);
- run('./configure --prefix='.$buildDir.' 2>&1');
- echo "Running make...\n";
- // If the directory "lib" does not exist in the download, create it or we
- // will run into problems when building libicuuc.so.
- $filesystem->mkdir($sourceDir.'/lib');
- // If the directory "bin" does not exist in the download, create it or we
- // will run into problems when building genrb.
- $filesystem->mkdir($sourceDir.'/bin');
- echo '[1/6] libicudata.so...';
- cd($sourceDir.'/stubdata');
- run('make 2>&1 && make install 2>&1');
- echo " ok.\n";
- echo '[2/6] libicuuc.so...';
- cd($sourceDir.'/common');
- run('make 2>&1 && make install 2>&1');
- echo " ok.\n";
- echo '[3/6] libicui18n.so...';
- cd($sourceDir.'/i18n');
- run('make 2>&1 && make install 2>&1');
- echo " ok.\n";
- echo '[4/6] libicutu.so...';
- cd($sourceDir.'/tools/toolutil');
- run('make 2>&1 && make install 2>&1');
- echo " ok.\n";
- echo '[5/6] libicuio.so...';
- cd($sourceDir.'/io');
- run('make 2>&1 && make install 2>&1');
- echo " ok.\n";
- echo '[6/6] genrb...';
- cd($sourceDir.'/tools/genrb');
- run('make 2>&1 && make install 2>&1');
- echo " ok.\n";
- }
- $genrb = $buildDir.'/bin/genrb';
- $genrbEnv = 'LD_LIBRARY_PATH='.$buildDir.'/lib ';
- echo "Using $genrb.\n";
- $icuVersionInDownload = get_icu_version_from_genrb($genrbEnv.' '.$genrb);
- echo "Preparing resource bundle compilation (version $icuVersionInDownload)...\n";
- $compiler = new GenrbCompiler($genrb, $genrbEnv);
- $config = new GeneratorConfig($sourceDir.'/data', $icuVersionInDownload);
- $baseDir = dirname(__DIR__).'/data';
- //$txtDir = $baseDir.'/txt';
- $jsonDir = $baseDir;
- //$phpDir = $baseDir.'/'.Intl::PHP;
- //$resDir = $baseDir.'/'.Intl::RB_V2;
- $targetDirs = array($jsonDir/*, $resDir*/);
- $workingDirs = array($jsonDir/*, $txtDir, $resDir*/);
- //$config->addBundleWriter($txtDir, new TextBundleWriter());
- $config->addBundleWriter($jsonDir, new JsonBundleWriter());
- echo "Starting resource bundle compilation. This may take a while...\n";
- $filesystem->remove($workingDirs);
- foreach ($workingDirs as $targetDir) {
- $filesystem->mkdir(array(
- $targetDir.'/'.Intl::CURRENCY_DIR,
- $targetDir.'/'.Intl::LANGUAGE_DIR,
- $targetDir.'/'.Intl::LOCALE_DIR,
- $targetDir.'/'.Intl::REGION_DIR,
- $targetDir.'/'.Intl::SCRIPT_DIR,
- ));
- }
- // We don't want to use fallback to English during generation
- Locale::setDefaultFallback(null);
- echo "Generating language data...\n";
- $generator = new LanguageDataGenerator($compiler, Intl::LANGUAGE_DIR);
- $generator->generateData($config);
- //echo "Compiling...\n";
- //
- //$compiler->compile($txtDir.'/'.Intl::LANGUAGE_DIR, $resDir.'/'.Intl::LANGUAGE_DIR);
- echo "Generating script data...\n";
- $generator = new ScriptDataGenerator($compiler, Intl::SCRIPT_DIR);
- $generator->generateData($config);
- //echo "Compiling...\n";
- //
- //$compiler->compile($txtDir.'/'.Intl::SCRIPT_DIR, $resDir.'/'.Intl::SCRIPT_DIR);
- echo "Generating region data...\n";
- $generator = new RegionDataGenerator($compiler, Intl::REGION_DIR);
- $generator->generateData($config);
- //echo "Compiling...\n";
- //
- //$compiler->compile($txtDir.'/'.Intl::REGION_DIR, $resDir.'/'.Intl::REGION_DIR);
- echo "Generating currency data...\n";
- $generator = new CurrencyDataGenerator($compiler, Intl::CURRENCY_DIR);
- $generator->generateData($config);
- //echo "Compiling...\n";
- //
- //$compiler->compile($txtDir.'/'.Intl::CURRENCY_DIR, $resDir.'/'.Intl::CURRENCY_DIR);
- echo "Generating locale data...\n";
- $reader = new BundleEntryReader(new JsonBundleReader());
- $generator = new LocaleDataGenerator(
- Intl::LOCALE_DIR,
- new LanguageDataProvider($jsonDir.'/'.Intl::LANGUAGE_DIR, $reader),
- new ScriptDataProvider($jsonDir.'/'.Intl::SCRIPT_DIR, $reader),
- new RegionDataProvider($jsonDir.'/'.Intl::REGION_DIR, $reader)
- );
- $generator->generateData($config);
- //echo "Compiling...\n";
- //
- //$compiler->compile($txtDir.'/'.Intl::LOCALE_DIR, $resDir.'/'.Intl::LOCALE_DIR);
- //
- //$filesystem->remove($txtDir);
- echo "Resource bundle compilation complete.\n";
- $svnInfo = <<<SVN_INFO
- SVN information
- ===============
- URL: {$svn->getUrl()}
- Revision: {$svn->getLastCommit()->getRevision()}
- Author: {$svn->getLastCommit()->getAuthor()}
- Date: {$svn->getLastCommit()->getDate()}
- SVN_INFO;
- foreach ($targetDirs as $targetDir) {
- $svnInfoFile = $targetDir.'/svn-info.txt';
- file_put_contents($svnInfoFile, $svnInfo);
- echo "Wrote $svnInfoFile.\n";
- $versionFile = $targetDir.'/version.txt';
- file_put_contents($versionFile, "$icuVersionInDownload\n");
- echo "Wrote $versionFile.\n";
- }
- echo "Done.\n";
|