blob: bfd58e0a05dffdcc14f8a99c8a7b56beda194e9f [file] [log] [blame]
#!/usr/bin/perl
# ********************************************************************
# * COPYRIGHT:
# * Copyright (c) 2002-2009, 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
#
# 6/25/08 - Modified to better handle cygwin paths - Brian Rower
#
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";
$icuTestDataSrcDir =$icuRootDir."/source/test/testdata/";
$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";
}
$icupkg = $icuBinDir."/icupkg -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";
$icu4jMainDataDir = "main/shared/data";
$icuDataDir =$icuBuildDir."/icudt".$version.checkPlatformEndianess();
#remove the stale directories
unlink($tempDir);
convertData($icuDataDir, $icupkg, $tempDir, $icu4jDataDir, $verbose);
#convertData($icuDataDir."/coll/", $icupkg, $tempDir, $icu4jDataDir."/coll");
createJar("\"$jarDir/jar\"", "icudata.jar", $tempDir, $icu4jDataDir, $verbose);
convertTestData($icuTestDataDir, $icupkg, $tempDir, $icu4jTestDataDir, $verbose);
createJar("\"$jarDir/jar\"", "testdata.jar", $tempDir, $icu4jTestDataDir, $verbose);
copyData($icu4jDir, $icu4jMainDataDir, $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);
if(chdir($icuTestDataSrcDir)){
print("Invoking make in directory $icuTestDataSrcDir\n");
cmd("make JAVA_OUT_DIR=\"$icu4jDir/main/tests/core/src/com/ibm/icu/dev/test/util/\" all java-output", $verbose);
}else{
die "Could not cd to $icuTestDataSrcDir\n";
}
}elsif($platform eq "aix"){
# make all in ICU
cmd("gmake all", $verbose);
chdir($icuSrcDataDir);
cmd("gmake uni-core-data", $verbose);
chdir($icuTestDataDir."../../");
cmd("gmake JAVA_OUT_DIR=\"$icu4jDir/main/tests/core/src/com/ibm/icu/dev/test/util/\" all java-output", $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);
print "WARNING: Don't know how to build java-output on $platform. \n";
}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($platform eq "cygwin") {
#make sure the given path is a cygwin path not a windows path
$jar = `cygpath -au $jar`;
chop($jar);
#added by Brian Rower 6/25/08
#The following code deals with spaces in the path
if(index($jar, "/ ") > 0)
{
$jar =~ s/[\/]\s/\\ /g;
}
elsif(index($jar, " ") > 0)
{
$jar =~ s/\s/\\ /g;
}
$tempDir = `cygpath -aw $tempDir`;
chop($tempDir);
$tempDir =~ s/\\/\\\\/g;
}
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, $icu4jMainDataDir, $tempDir) =@_;
print("INFO: Copying $tempDir/icudata.jar to $icu4jDir/$icu4jMainDataDir\n");
mkpath("$icu4jDir/$icu4jMainDataDir");
copy("$tempDir/icudata.jar", "$icu4jDir/$icu4jMainDataDir");
print("INFO: Copying $tempDir/testdata.jar $icu4jDir/$icu4jMainDataDir\n");
copy("$tempDir/testdata.jar","$icu4jDir/$icu4jMainDataDir");
}
#-----------------------------------------------------------------------
sub convertData{
local($icuDataDir, $icupkg, $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 = $icupkg;
#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=~/$\.crs/ || $item=~ /$\.txt/ ||
$item=~/icudata\.res/ || $item=~/$\.exp/ || $item=~/$\.lib/ || $item=~/$\.obj/ ||
$item=~/$\.lst/);
if(-d "$icuDataDir/$item"){
convertData("$icuDataDir/$item/", $icupkg, $tempDir, "$icu4jDataDir/$item/");
next;
}
if($endian eq "l"){
$command = $icupkg." $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, $icupkg, $tempDir, $icu4jDataDir) =@_;
my $dir = $tempDir."/".$icu4jDataDir;
# create the temp directory
mkpath($dir);
# cd to the temp directory
chdir($tempDir);
my $op = $icupkg;
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=~/$\.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 = "$icupkg $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);
}