55df551f1c
X-SVN-Rev: 19756
360 lines
12 KiB
Perl
Executable File
360 lines
12 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
# ********************************************************************
|
|
# * COPYRIGHT:
|
|
# * Copyright (c) 2002-2006, International Business Machines Corporation and
|
|
# * others. All Rights Reserved.
|
|
# ********************************************************************
|
|
|
|
# Script to generate the icudata.jar and testdata.jar files. This file is
|
|
# part of icu4j. It is checked into CVS. It is generated from
|
|
# locale data in the icu4c project. See usage() notes (below)
|
|
# for more information.
|
|
|
|
# This script requires perl. For Win32, I recommend www.activestate.com.
|
|
|
|
# Ram Viswanadha
|
|
# copied heavily from genrbjar.pl
|
|
use File::Find;
|
|
use File::Basename;
|
|
use IO::File;
|
|
use Cwd;
|
|
use File::Copy;
|
|
use Getopt::Long;
|
|
use File::Path;
|
|
use File::Copy;
|
|
use Cwd;
|
|
use Cwd 'abs_path';
|
|
|
|
main();
|
|
|
|
#------------------------------------------------------------------
|
|
sub main(){
|
|
|
|
GetOptions(
|
|
"--icu-root=s" => \$icuRootDir,
|
|
"--jar=s" => \$jarDir,
|
|
"--icu4j-root=s" => \$icu4jDir,
|
|
"--version=s" => \$version,
|
|
"--verbose" => \$verbose,
|
|
"--help" => \$help
|
|
);
|
|
$cwd = abs_path(getcwd);
|
|
|
|
if($help){
|
|
usage();
|
|
}
|
|
unless (defined $icuRootDir){
|
|
$icuRootDir =abs_path($cwd."/../../..");
|
|
}
|
|
unless (defined $icu4jDir){
|
|
$icu4jDir =abs_path($icuRootDir."/../icu4j");
|
|
}
|
|
unless (defined $jarDir){
|
|
if(defined $ENV{'JAVA_HOME'}){
|
|
$jarDir=$ENV{'JAVA_HOME'}."/bin";
|
|
}else{
|
|
print("ERROR: JAVA_HOME enviroment variable undefined and --jar argument not specifed.\n");
|
|
usage();
|
|
}
|
|
}
|
|
|
|
$platform = getPlatform();
|
|
$icuBinDir = $icuRootDir;
|
|
|
|
$path=$ENV{'PATH'};
|
|
|
|
if(($platform eq "cygwin") || ($platform eq "linux")){
|
|
$icuBinDir .= "/source/bin";
|
|
$icuLibDir = abs_path($icuBinDir."/../lib");
|
|
$path .=":$icuBinDir:$icuLibDir";
|
|
|
|
$libpath = $ENV{'LD_LIBRARY_PATH'}.":$icuLibDir";
|
|
$ENV{'LD_LIBRARY_PATH'} = $libpath;
|
|
|
|
#print ("##### LD_LIBRARY_PATH = $ENV{'LD_LIBRARY_PATH'}\n");
|
|
|
|
}elsif($platform eq "aix"){
|
|
|
|
$icuBinDir .= "/source/bin";
|
|
$icuLibDir = abs_path($icuBinDir."/../lib");
|
|
$path .=":$icuBinDir:$icuLibDir";
|
|
|
|
$libpath = $ENV{'LIBPATH'}.":$icuLibDir";
|
|
$ENV{'LIBPATH'} = $libpath;
|
|
#print ("##### LIBPATH = $ENV{'LIBPATH'}\n");
|
|
}elsif($platform eq "darwin"){
|
|
$icuBinDir .= "/source/bin";
|
|
$icuLibDir = abs_path($icuBinDir."/../lib");
|
|
$path .=":$icuBinDir:$icuLibDir";
|
|
|
|
$libpath = $ENV{'DYLD_LIBRARY_PATH'}.":$icuLibDir";
|
|
$ENV{'DYLD_LIBRARY_PATH'} = $libpath;
|
|
|
|
}elsif($platform eq "MSWin32"){
|
|
$icuBinDir =$icuRootDir."/bin";
|
|
$path .=$icuBinDir;
|
|
|
|
}
|
|
$ENV{'PATH'} = $path;
|
|
#print ("##### PATH = $ENV{'PATH'}\n");
|
|
# TODO add more platforms and test on Linux and Unix
|
|
|
|
$icuBuildDir =$icuRootDir."/source/data/out/build";
|
|
$icuTestDataDir =$icuRootDir."/source/test/testdata/out/build/";
|
|
|
|
# now build ICU
|
|
buildICU($platform, $icuRootDir, $icuTestDataDir, $verbose);
|
|
|
|
#figure out the version and endianess
|
|
unless (defined $version){
|
|
($version, $endian) = getVersion();
|
|
#print "#################### $version, $endian ######\n";
|
|
}
|
|
|
|
$icuswap = $icuBinDir."/icuswap -tb";
|
|
$tempDir = $cwd."/temp";
|
|
$version =~ s/\.//;
|
|
$icu4jImpl = "com/ibm/icu/impl/data/";
|
|
$icu4jDataDir = $icu4jImpl."/icudt".$version."b";
|
|
$icu4jDevDataDir = "com/ibm/icu/dev/data/";
|
|
$icu4jTestDataDir = "$icu4jDevDataDir/testdata";
|
|
|
|
$icuDataDir =$icuBuildDir."/icudt".$version.checkPlatformEndianess();
|
|
|
|
convertData($icuDataDir, $icuswap, $tempDir, $icu4jDataDir, $verbose);
|
|
#convertData($icuDataDir."/coll/", $icuswap, $tempDir, $icu4jDataDir."/coll");
|
|
createJar("$jarDir/jar", "icudata.jar", $tempDir, $icu4jDataDir, $verbose);
|
|
|
|
convertTestData($icuTestDataDir, $icuswap, $tempDir, $icu4jTestDataDir, $verbose);
|
|
createJar("$jarDir/jar", "testdata.jar", $tempDir, $icu4jTestDataDir, $verbose);
|
|
copyData($icu4jDir, $icu4jImpl, $icu4jDevDataDir, $tempDir, $verbose);
|
|
}
|
|
|
|
#-----------------------------------------------------------------------
|
|
sub buildICU{
|
|
local($platform, $icuRootDir, $icuTestDataDir, $verbose) = @_;
|
|
$icuSrcDir = $icuRootDir."/source";
|
|
$icuSrcDataDir = $icuSrcDir."/data";
|
|
|
|
chdir($icuSrcDir);
|
|
# clean the data directories
|
|
unlink($icuBuildDir."../");
|
|
unlink($icuTestDataDir."../");
|
|
|
|
if(($platform eq "cygwin")||($platform eq "darwin")||($platform eq "linux")){
|
|
# make all in ICU
|
|
cmd("make all", $verbose);
|
|
chdir($icuSrcDataDir);
|
|
cmd("make uni-core-data", $verbose);
|
|
chdir($icuTestDataDir."../../");
|
|
#print($icuTestDataDir."../../\n");
|
|
cmd("make", $verbose);
|
|
}elsif($platform eq "aix"){
|
|
# make all in ICU
|
|
cmd("gmake all", $verbose);
|
|
chdir($icuSrcDataDir);
|
|
cmd("gmake uni-core-data", $verbose);
|
|
chdir($icuTestDataDir."../../");
|
|
cmd("gmake", $verbose);
|
|
}elsif($platform eq "MSWin32"){
|
|
#devenv.com $projectFileName \/build $configurationName > \"$cLogFile\" 2>&1
|
|
cmd("devenv.com allinone/allinone.sln /useenv /build Debug", $verbose);
|
|
# build required data. this is required coz building icu will not build all the data
|
|
chdir($icuSrcDataDir);
|
|
cmd("NMAKE /f makedata.mak ICUMAKE=\"$icuSrcDataDir\" CFG=debug uni-core-data", $verbose);
|
|
|
|
}else{
|
|
print "ERROR: Could not build ICU unknown platform $platform. \n";
|
|
exit(-1);
|
|
}
|
|
|
|
chdir($cwd);
|
|
}
|
|
#-----------------------------------------------------------------------
|
|
sub getVersion{
|
|
my @list;
|
|
opendir(DIR,$icuBuildDir);
|
|
|
|
@list = readdir(DIR);
|
|
closedir(DIR);
|
|
|
|
if(scalar(@list)>3){
|
|
print("ERROR: More than 1 directory in build. Can't decide the version");
|
|
exit(-1);
|
|
}
|
|
foreach $item (@list){
|
|
next if($item eq "." || $item eq "..");
|
|
my ($ver, $end) =$item =~ m/icudt(.*)(l|b|e)$/;
|
|
return $ver,$end;
|
|
}
|
|
}
|
|
|
|
#-----------------------------------------------------------------------
|
|
sub getPlatform{
|
|
$platform = $^O;
|
|
return $platform;
|
|
}
|
|
#-----------------------------------------------------------------------
|
|
sub createJar{
|
|
local($jar, $jarFile, $tempDir, $dirToJar, $verbose) = @_;
|
|
chdir($tempDir);
|
|
$command="";
|
|
print "INFO: Creating $jarFile\n";
|
|
if(defined $verbose){
|
|
$command = "$jar cvf $jarFile -C $tempDir $dirToJar";
|
|
}else{
|
|
$command = "$jar cf $jarFile -C $tempDir $dirToJar";
|
|
}
|
|
|
|
cmd($command, $verbose);
|
|
}
|
|
#-----------------------------------------------------------------------
|
|
sub checkPlatformEndianess {
|
|
my $is_big_endian = unpack("h*", pack("s", 1)) =~ /01/;
|
|
if ($is_big_endian) {
|
|
return "b";
|
|
}else{
|
|
return "l";
|
|
}
|
|
}
|
|
#-----------------------------------------------------------------------
|
|
sub copyData{
|
|
local($icu4jDir, $icu4jImpl, $icu4jDevDataDir, $tempDir) =@_;
|
|
print("INFO: Copying $tempDir/icudata.jar to $icu4jDir/src/$icu4jImpl\n");
|
|
copy("$tempDir/icudata.jar", "$icu4jDir/src/$icu4jImpl");
|
|
print("INFO: Copying $tempDir/testdata.jar $icu4jDir/src/$icu4jDevDataDir\n");
|
|
copy("$tempDir/testdata.jar","$icu4jDir/src/$icu4jDevDataDir");
|
|
}
|
|
#-----------------------------------------------------------------------
|
|
sub convertData{
|
|
local($icuDataDir, $icuswap, $tempDir, $icu4jDataDir) =@_;
|
|
my $dir = $tempDir."/".$icu4jDataDir;
|
|
# create the temp directory
|
|
mkpath($dir) ;
|
|
# cd to the temp directory
|
|
chdir($tempDir);
|
|
my $endian = checkPlatformEndianess();
|
|
my @list;
|
|
opendir(DIR,$icuDataDir);
|
|
#print $icuDataDir;
|
|
@list = readdir(DIR);
|
|
closedir(DIR);
|
|
my $op = $icuswap;
|
|
#print "####### $endian ############\n";
|
|
if($endian eq "l"){
|
|
print "INFO: {Command: $op $icuDataDir/*.*}\n";
|
|
}else{
|
|
print "INFO: {Command: copy($icuDataDir/*.*, $tempDir/$icu4jDataDir/*)}\n";
|
|
}
|
|
|
|
$i=0;
|
|
# now convert
|
|
foreach $item (@list){
|
|
next if($item eq "." || $item eq "..");
|
|
# next if($item =~ /^t_.*$\.res/ ||$item =~ /^translit_.*$\.res/ ||
|
|
# $item=~/$\.crs/ || $item=~ /$\.txt/ ||
|
|
# $item=~/icudata\.res/ || $item=~/$\.exp/ || $item=~/$\.lib/ ||
|
|
# $item=~/$\.obj/ || $item=~/$\.lst/);
|
|
next if($item =~ /^t_.*$\.res/ ||$item =~ /^translit_.*$\.res/ || $item =~ /$\.cnv/ ||
|
|
$item=~/$\.crs/ || $item=~ /$\.txt/ ||
|
|
$item=~/icudata\.res/ || $item=~/$\.exp/ || $item=~/$\.lib/ || $item=~/$\.obj/ ||
|
|
$item=~/cnvalias\.icu/ || $item=~/$\.lst/);
|
|
if(-d "$icuDataDir/$item"){
|
|
convertData("$icuDataDir/$item/", $icuswap, $tempDir, "$icu4jDataDir/$item/");
|
|
next;
|
|
}
|
|
if($endian eq "l"){
|
|
$command = $icuswap." $icuDataDir/$item $tempDir/$icu4jDataDir/$item";
|
|
cmd($command, $verbose);
|
|
}else{
|
|
$rc = copy("$icuDataDir/$item", "$tempDir/$icu4jDataDir/$item");
|
|
if($rc==1){
|
|
#die "ERROR: Could not copy $icuDataDir/$item to $tempDir/$icu4jDataDir/$item, $!";
|
|
}
|
|
}
|
|
|
|
}
|
|
chdir("..");
|
|
print "INFO: DONE\n";
|
|
}
|
|
#-----------------------------------------------------------------------
|
|
sub convertTestData{
|
|
local($icuDataDir, $icuswap, $tempDir, $icu4jDataDir) =@_;
|
|
my $dir = $tempDir."/".$icu4jDataDir;
|
|
# create the temp directory
|
|
mkpath($dir);
|
|
# cd to the temp directory
|
|
chdir($tempDir);
|
|
my $op = $icuswap;
|
|
print "INFO: {Command: $op $icuDataDir/*.*}\n";
|
|
my @list;
|
|
opendir(DIR,$icuDataDir) or die "ERROR: Could not open the $icuDataDir directory for reading $!";
|
|
#print $icuDataDir;
|
|
@list = readdir(DIR);
|
|
closedir(DIR);
|
|
my $endian = checkPlatformEndianess();
|
|
$i=0;
|
|
# now convert
|
|
foreach $item (@list){
|
|
next if($item eq "." || $item eq "..");
|
|
next if($item =~ /$\.cnv/ || item=~/$\.crs/ || $item=~ /$\.txt/ ||
|
|
$item=~/$\.exp/ || $item=~/$\.lib/ || $item=~/$\.obj/ ||
|
|
$item=~/$\.mak/ || $item=~/test\.icu/ || $item=~/$\.lst/);
|
|
$file = $item;
|
|
$file =~ s/testdata_//g;
|
|
if($endian eq "l"){
|
|
$command = "$icuswap $icuDataDir/$item $tempDir/$icu4jDataDir/$file";
|
|
cmd($command, $verbose);
|
|
}else{
|
|
#print("Copying $icuDataDir/$item $tempDir/$icu4jDataDir/$file\n");
|
|
copy("$icuDataDir/$item", "$tempDir/$icu4jDataDir/$file");
|
|
}
|
|
|
|
|
|
}
|
|
chdir("..");
|
|
print "INFO: DONE\n";
|
|
}
|
|
#------------------------------------------------------------------------------------------------
|
|
sub cmd {
|
|
my $cmd = shift;
|
|
my $verbose = shift;
|
|
my $prompt = shift;
|
|
|
|
$prompt = "Command: $cmd.." unless ($prompt);
|
|
if(defined $verbose){
|
|
print $prompt."\n";
|
|
}
|
|
system($cmd);
|
|
my $exit_value = $? >> 8;
|
|
#my $signal_num = $? & 127;
|
|
#my $dumped_core = $? & 128;
|
|
if ($exit_value == 0) {
|
|
if(defined $verbose){
|
|
print "ok\n";
|
|
}
|
|
} else {
|
|
++$errCount;
|
|
print "ERROR: Execution of $prompt returned ($exit_value)\n";
|
|
exit(1);
|
|
}
|
|
}
|
|
#-----------------------------------------------------------------------
|
|
sub usage {
|
|
print << "END";
|
|
Usage:
|
|
gendtjar.pl
|
|
Options:
|
|
--icu-root=<directory where icu4c lives>
|
|
--jar=<directory where jar.exe lives>
|
|
--icu4j-root=<directory>
|
|
--version=<ICU4C version>
|
|
--verbose
|
|
--help
|
|
e.g:
|
|
gendtjar.pl --icu-root=\\work\\icu --jar=\\jdk1.4.1\\bin --icu4j-root=\\work\\icu4j --version=3.0
|
|
END
|
|
exit(0);
|
|
}
|
|
|