diff -r 000000000000 -r b26acd06ea60 sdkcreationmw/sdkbuild/sdk_build.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sdkcreationmw/sdkbuild/sdk_build.pl Mon Mar 08 12:09:11 2010 +0530 @@ -0,0 +1,1512 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +#! /usr/bin/perl +# +# Series 60 SDK build script. +# +# Reads the configuration from sdk_build.conf file located in the same +# directory as the build script. The comments in the configuration file +# descripe its format. +# +# The important feature of this script is that it's not only part of the +# nightly build, but also part of the SDK development environment. +# +# First, it re-generates the diffs after developer has +# modified a platform file. It uses the diff utility +# provided by the Symbian build environment (as opposed +# to taking it from the PATH, be it MKS Toolkit, cygwin +# or whatever else you may have installed). That makes +# sure that the diff is produced in a standard format. +# Also, if the diff didn't really change (the script will +# ignore non-essential changes in the diff, such as time +# stamps in the header) the diff file in platform_mod +# doesn't get updated. +# +# Second, the developers can (and do) re-run this script in +# their work area, and that will produce the same result as +# when it runs on top of a clean build area. Maybe not 100% +# the same, but accurate enough to provide, say 95% guarantee +# that if the build compiles on the developer's machine, it +# will do the same in the nightly build. That will help us +# to avoid broken builds. +# +# Third, the script has minimal dependency on the +# environment (i.e. environment variables, where the +# CodeWarrior/VisualStudio/Perl are installed, etc.) +# A typical problem of the build scripts is that they +# make too many assumptions about the environment, and +# it's only a matter of time when one build script starts +# conflicting with another. Most developers build multiple +# products on their machines. I've been in the situations +# when one development environment breaks another. Very +# frustrating and inefficient. +# + +use Cwd; +use File::Copy; +use File::Temp; +use File::Path; +use File::Find; +use FindBin; +use Env qw(JAVA_HOME EPOCROOT BUILD_ROOT MWCIncludes PATH); + +push (@INC, $FindBin::RealBin); + +require "sdk_env.pl"; + +MAIN:{ + ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime (); + +# Log levels +$LOG_DEBUG = 2; +$LOG_VERBOSE = 1; +$LOG_NORMAL = 0; +$LOG_QUIET = -1; +$LOG_SILENT = -2; + +# Build types +$BUILD_TYPE_CPP = 1; +$BUILD_TYPE_MIDP = 2; +$BUILD_TYPE_ALL = 3; + +# Editable configuration +$LOGLEVEL = $LOG_NORMAL; +$DO_PATCH = 0; +$DO_DIFF = 0; +$BUILD_PLATFORM = 0; +$BUILD_JAVA = 0; +$BUILD_SDK = 0; +$LOG = 0; +$CLEAN = 0; +$REBUILD = 0; +$BUILD_TYPE = $BUILD_TYPE_ALL; +$CHECK_BUILD = 0; +$DO_UNPATCH = 0; +$FINALIZE_S60EX = 0; + +# Non-edtable configuration +$FS = '/'; # File separator +$PS = ';'; # Path separator +@PLATFORMS = ("winscw"); +@VARIANTS = ("udeb", "urel"); +@SDK_MODULES = ( + "NMIT", + # "sdkcommonutils", + "msgsimulation", + "xrpcrt", + "wsock", + "scard", +# "MIDP", later needs to be enabled + "emumenubar", + "bluetoothdriver", + #"Tools", + # "AsyStub" +); + +$PATCH_LIST_FNAME = "sdk_build.conf"; +$PLATFORM = get_plat_name (); +$SDK_PROJ_NAME = "PublicSDK/sdkcreationmw"; +$PATCH_DIR = "$SDK_PROJ_NAME/sdkplatformupdates/"; +$BUILD_SCRIPTS_DIR = $BUILD_ROOT . "$SDK_PROJ_NAME/sdkbuild"; +$S60_TOOLS_DIR = $BUILD_ROOT . "$SDK_PROJ_NAME/sdkruntimes"; +$BACKUP_PREFIX = ".#"; +$PATCH_EXT = "diff"; +$DIED_MSG = "ERROR!"; +$WARNING = "WARNING:"; +$NOTE = "NOTE:"; +$NULL_NAME = "NULL"; + +$patch_list_path = "$BUILD_ROOT$PATCH_DIR/$PATCH_LIST_FNAME"; +$TMP_CONF = "$BUILD_SCRIPTS_DIR/__tmp.conf"; + +$DIFF_EXE = "$BUILD_SCRIPTS_DIR/diff.exe"; +$PATCH_EXE = "$BUILD_SCRIPTS_DIR/patch.exe"; +$REDIFF_CMD = "$DIFF_EXE -N -c5"; + +$LOG_FILE = sprintf ("sdk_build-%d%02d%02d_%02d-%02d-%02d.log", + $year + 1900, $mon + 1, $mday, $hour, $min, $sec); + +# Define Java build configuration +$JAVA_SRC_ROOT = "${BUILD_ROOT}PublicSDK/sdkcreationmw/sdkconnectivityfw/emuconnectmanager/epdt_java"; +$JAVA_BUILD_DIR = "${JAVA_SRC_ROOT}"; +$JAVA_DIST_DIR = "${JAVA_SRC_ROOT}/build/ecmt"; +$JAVA_TARGET_DIR = "${BUILD_ROOT}epoc32/tools/ecmt"; +@JAVA_CLEAN_DIRS = ( + "$JAVA_TARGET_DIR/config", + "$JAVA_TARGET_DIR/language", + "$JAVA_TARGET_DIR/lib", + "$JAVA_TARGET_DIR/log", + "$JAVA_TARGET_DIR/plugins" +); + + +# parse the command line + parse_cmd_line (@ARGV); + + $BUILD_ROOT = $ENV{BUILD_ROOT}; + $EPOCROOT = $ENV{EPOCROOT}; + + @bld_info = (); + if ($LOG && !(open (LOG_FH, "> $LOG_FILE"))) { + warn "Could'n open log file $LOG_FILE. Logging is turned OFF.\n"; + $LOG = 0; + } + + # Make sure that the required executables are there + if (!-e $DIFF_EXE) { + err ($DIFF_EXE . " is missing"); + exit 1; + } + + if (!-e $PATCH_EXE) { + err ($PATCH_EXE . " is missing"); + exit 1; + } + + msg ("Build script started at " . localtime()); + msg ("Cmd line: $0 @ARGV"); + + open PATCH_LIST, $patch_list_path or die "$DIED_MSG Could not find $patch_list_path!"; + + if ($DO_PATCH) { + + # IMPORTANT! SDK now maintains two startup-lists, which both are modified + # versions of the original one, but patched differently. To achieve this + # we have to first make a copy of the original list. The copy is made of + # .orig, if such exists - if not (i.e. very first patch), then from then + # original file. + # Unfortunately there is no simple way to do this without hardcoding. + # + #$starter_path = "${BUILD_ROOT}sf/os/devicesrv/sysstatemgmt/starter/starterserver/data"; + #$starter_list = "starter.rss"; + #$starter_list2 = "starter_full.rss"; + + #if (not -e "$starter_path/$starter_list2") { + # dbg ("making a copy of the startup-list"); + # if (-e "$starter_path/$starter_list.orig") { + # copy_or_die ("$starter_path/$starter_list.orig", "$starter_path/$starter_list2"); + # } else { + # copy_or_die ("$starter_path/$starter_list", "$starter_path/$starter_list2"); + # } + # } + #else { + # dbg ("full startup-list already exists"); + # } + + # This starter is commented by Dhanvantri For Integration + # $starter_non_critical_path = "${BUILD_ROOT}sf/os/devicesrv/sysstatemgmt/starter/starterserver/data"; + # $starter_non_critical_list = "starter_non_critical_1.rss"; + # $starter_non_critical_list2 = "starter_non_critical_1_full.rss"; + + # if (not -e "$starter_non_critical_path/$starter_non_critical_list2") { + # dbg ("making a copy of the startup-list"); + # if (-e "$starter_non_critical_path/$starter_non_critical_list.orig") { + # copy_or_die ("$starter_non_critical_path/$starter_non_critical_list.orig", "$starter_non_critical_path/$starter_non_critical_list2"); + # } else { + # copy_or_die ("$starter_non_critical_path/$starter_non_critical_list", "$starter_non_critical_path/$starter_non_critical_list2"); + # } + # } + # else { + # dbg ("full startup-list for non critical section already exists"); + #} + } + + # Collect full path names for all pathes. + @all_patches = find_all ("$BUILD_ROOT$PATCH_DIR"); + $lineno = 0; + while () { + $lineno++; + chomp; + # Input lines might end in backslashes to indicate continuation + if (s/\\$//) { + $_ .= ; + redo unless eof; + } + + s/\#.*$//; # Get rid of the comments + next if (/^\s*$/); # Skip empty lines + my @fdata = split /:/; # Split the input line + foreach (@fdata) { # Ignore spaces before and after delimiters + s/^\s+//; + s/\s+$//; + } + + my $path = shift @fdata; + next if ($path eq ""); + + # The first field is a name of the patch file. + # By default it's "diff" + my $relative_path = $path; + my $patch_file = get_patch_fname ($path, @all_patches); + + if ($patch_file eq "") { + $patch_file = "$BUILD_ROOT" . "$PATCH_DIR" . "$path.$PATCH_EXT"; + dbg ("Looking for: $patch_file"); + if (not -e $patch_file) { + # This means that there is an entry in the patch list file + # but there is no actual patch file under patch dir. + # If so skip the line. The exception is DO_DIFF case since do_diff + # can create patch files. + if ($DO_DIFF) { + $patch_file = ""; + } + else { + msg("$WARNING $PATCH_LIST_FNAME:$lineno: Missing patch file for $path"); + next; + } + } + } + else { + $patch_file .= ".$PATCH_EXT"; + } + + # This shouldn't happen: there is a patch file name but no name for file + # to be patched. If so skip this line. + next if ($path eq ""); + $path = "$BUILD_ROOT" . $path; + + if ($LOGLEVEL >= $LOG_VERBOSE) { + if (-e "$patch_file") { + dbg ("patch file: $patch_file"); + } else { + dbg ("patch file does not exist: $patch_file"); + } + dbg ("fdata: @fdata"); + } + + # Diff'ing files only. It will generate new "diff" files. + if ($DO_DIFF) { + chdir_or_die ($BUILD_ROOT); + do_diff ($path, $patch_file); + next; + } + + # Patch platform files + if ($DO_PATCH) { + my $res_file = $patch_file; + $res_file =~ s/\.$PATCH_EXT$//; + + # Make a backup copy of the current version of the patched file. + if (-e $path) { + my $backup_path = get_last_backup_path ($path); + if (!run("$DIFF_EXE $res_file $path", $NULL_NAME)) { + dbg("$path is identical to $res_file"); + } + elsif (-e $backup_path && + !run("$DIFF_EXE $backup_path $path", $NULL_NAME)) { + dbg("$path is identical to $backup_path"); + } else { + # file has changed, create a backup copy + my $backup_path = get_new_backup_path ($path); + dbg ("backup to $backup_path"); + copy ("$path", "$backup_path") or + msg("$WARNING failed to copy $path -> $backup_path"); + } + } + + # If patch file does not exist, patch means a copy + if (-e "$patch_file") { + patch_files ($path, $patch_file); + } else { + copy_or_die ($res_file, $path); + msg ("Copied $path"); + } + } + + + if ($DO_UNPATCH) { + do_unpatch($path, $patch_file); + } + + # Process build info + if ($#fdata >= 0) { + if ($BUILD_PLATFORM || $CHECK_BUILD) { + process_bld_info ($path, @fdata); + } + } + } + + close PATCH_LIST; + + # if temp conf-file was used (i.e. -t option given), remove tmp-file + if ($patch_list_path == $TMP_CONF) { + dbg("deleting $TMP_CONF"); + unlink $TMP_CONF; + } + + # Build Java first + if ($BUILD_JAVA) { + build_java (); + } + + # build SDK modules + # NOTE: some of the hooks in the platform code depend on the headers + # exported by, for example, MsgRelay module + if ($BUILD_SDK) { + foreach $m (@SDK_MODULES) { + if ($m =~ m/^wsock$/i) { + # hack to make EXPORT work reliably + my $now = time; + my $esk = "$S60_TOOLS_DIR/wsock/data/wsock.esk"; + dbg ("touching $esk"); + utime ($now, $now, $esk) or msg ("$WARNING couldn't touch $esk\n"); + } + # the rest is a standard procedure for all modules + build_series60_tools_component ($m); + } + } + + if ($BUILD_PLATFORM) { + dbg ("Build info: @bld_info"); + do_platform_build (@bld_info); + } + + #rebuild Java Subsystem in S60 (System AMS) except for C++ SDK + if($BUILD_PLATFORM && $BUILD_TYPE != $BUILD_TYPE_CPP){ + dbg ("Building java platform:"); + do_java_platform_build(); + } + + if ($CHECK_BUILD) { + foreach $m (@SDK_MODULES) { + check_series60_tools_component ($m); + } + dbg ("Build info: @bld_info"); + check_platform_build (@bld_info); + } + + if($FINALIZE_S60EX && $BUILD_TYPE != $BUILD_TYPE_MIDP){ + dbg ("Finalizing S60 C++ examples:"); + do_s60ex_finalizing(); + #TODO: Cleaning may not be required for 9.l check and add components in the below function + #do_s60_rndtools_cleaning(); + } + + + msg ("Build script finished at " . localtime()); + close ($LOG_FH) if $LOG; +} + +# ======================================================================= + sub usage +# ======================================================================= + { + print "Usage: sdk_build [-p | --patch] [-d | --diff] [-u | --unpatch]\ + [-b | --build] [-m | --module [mod]] [-a | --all]\ + [-r | --rebuild] [-c | --clean] [-e | -- err] [-l | --log]\ + [-s | --silent] [-q | --quiet] [-v | --verbose]\ + [-f | --config ] [-h | --help]\ + [-t | --target ]\ + [--env] [--midp] [--cpp] [--udeb] [--urel] [--s60ex]\ +Options:\ + -p, --patch patch the platform files\ + -d, --diff diff the platform files and update patches\ + -u, --unpatch undo patches and return platform to it's original state\ + -b, --build build patched platform modules (implies -p)\ + -m, --module [mod] build SDK modules (or one module if specified)\ + -j, --java build Java mofules (EcmtManager, ...)\ + -a, --all build everything (implies -b, -p, -m and -j)\ + -r, --rebuild do complete rebuild rather than incremental build\ + -c, --clean delete the output and intermediate files\ + -e, --err check build errors\ + -l, --log create log file in the current directory\ + -q, --quiet be quiet\ + -s, --silent be completely silent\ + -v, --verbose be verbose (repeatable)\ + -f, --config use instead of patches/$PATCH_LIST_FNAME\ + -t, --target patch/diff/unpatch a single target: \ + -h, --help print this help message and exit\ + --midp MIDP build (don't build C++ specific components)\ + --cpp C++ build (don't build MIDP specific components)\ + --udeb only build debug (UDEB) targets\ + --urel only build release (UREL) targets\ + --s60ex finalize S60 C++ example applications\ + --env print (some) build environment and exit\n"; + } + +# ======================================================================= + sub parse_cmd_line +# ======================================================================= + { + if ($#_ < 0) { + usage (); + exit; + } else { + $CONF_FILE_GIVEN = 0; + $TARGET_FILE_GIVEN = 0; + my $n = $#_ + 1; # total number of options + my $u = 0; # number of unknown options + while(defined (@_[0])) { + my $arg = shift; + if ($arg eq "-v" || $arg eq "--verbose") { $LOGLEVEL++; } + elsif ($arg eq "--env") { + $LOGLEVEL = $LOG_VERBOSE; + dbg("Environment variables:\n JAVA_HOME: $ENV{JAVA_HOME}\n EPOCROOT: $ENV{EPOCROOT}\n BUILD_ROOT: $ENV{BUILD_ROOT}\n MWCIncludes: $ENV{MWCIncludes}\n PATH: $ENV{PATH}\n INCLUDE: $ENV{INCLUDE}\n LIB: $ENV{LIB}\n"); + exit; + } + elsif ($arg eq "--midp") { + if ($BUILD_TYPE == $BUILD_TYPE_CPP) { + err ("--midp and --cpp options are mutually exclusive"); + exit 1; + } + $BUILD_TYPE = $BUILD_TYPE_MIDP; + } + elsif ($arg eq "--cpp" || $arg eq "--c++") { + if ($BUILD_TYPE == $BUILD_TYPE_MIDP) { + err ("--midp and --cpp options are mutually exclusive"); + exit 1; + } + $BUILD_TYPE = $BUILD_TYPE_CPP; + } + elsif ($arg eq "--udeb") { @VARIANTS = ("udeb"); } + elsif ($arg eq "--urel") { @VARIANTS = ("urel"); } + elsif ($arg eq "-m" || $arg eq "--module" ) { + $BUILD_SDK = 1; + if ($DO_DIFF) { + err ("--diff and --module options are mutually exclusive"); + exit 1; + } + # optional module name + if (defined(@_[0])) { + my $mod = @_[0]; + if (!($mod =~ m/^-/)) { + @SDK_MODULES = (shift); + } + } + } + elsif ($arg eq "-b" || $arg eq "--build" ) { + $BUILD_PLATFORM = 1; + if (!$DO_UNPATCH) { + $DO_PATCH = 1; + } + if ($DO_DIFF) { + err ("--diff and --build options are mutually exclusive"); + exit 1; + } + } + elsif ($arg eq "-p" || $arg eq "--patch" ) { + $DO_PATCH = 1; + if ($DO_DIFF) { + err ("--diff and --patch options are mutually exclusive"); + exit 1; + } + if ($DO_UNPATCH) { + err ("--patch and --unpatch options are mutually exclusive"); + exit 1; + } + } + elsif ($arg eq "-u" || $arg eq "--unpatch") { + $DO_UNPATCH = 1; + if ($DO_DIFF) { + err ("--diff and --unpatch options are mutually exclusive"); + exit 1; + } + if ($BUILD_PLATFORM) { + $DO_PATCH = 0; + } + if ($DO_PATCH) { + err("--patch and --unpatch options are mutually exclusive"); + exit 1; + } + } + elsif ($arg eq "-d" || $arg eq "--diff") { + $DO_DIFF = 1; + if ($BUILD_PLATFORM) { + err ("--diff and --build options are mutually exclusive"); + exit 1; + } + if ($DO_PATCH) { + err ("--diff and --patch options are mutually exclusive"); + exit 1; + } + if ($DO_UNPATCH) { + err ("--diff and --unpatch options are mutually exclusive"); + exit 1; + } + } + elsif ($arg eq "-l" || $arg eq "--log") { $LOG = 1; } + elsif ($arg eq "-q" || $arg eq "--quiet") { $LOGLEVEL = $LOG_QUIET; } + elsif ($arg eq "-s" || $arg eq "--silent") { $LOGLEVEL = $LOG_SILENT; } + elsif ($arg eq "-j" || $arg eq "--java") { $BUILD_JAVA = 1; } + elsif ($arg eq "-a" || $arg eq "--all") { + $BUILD_PLATFORM = 1; + $BUILD_JAVA = 1; + $BUILD_SDK = 1; + $DO_PATCH = 1; + if ($DO_DIFF) { + err ("--diff and --all options are mutually exclusive"); + exit 1; + } + if ($DO_UNPATCH) { + err ("--all and --unpatch options are mutually exclusive"); + exit 1; + } + } + elsif ($arg eq "-r" || $arg eq "--rebuild") { $REBUILD = 1; } + elsif ($arg eq "-c" || $arg eq "--clean") { $CLEAN = 1; } + elsif ($arg eq "-e" || $arg eq "--err") { $CHECK_BUILD = 1; } + elsif ($arg eq "-h" || $arg eq "--help" ) { usage (); exit; } + elsif ($arg eq "-f" || $arg eq "--config" ) { + $CONF_FILE_GIVEN = 1; + if ($TARGET_FILE_GIVEN) { + err ("--config and --target options are mutually exclusive"); + exit 1; + } + if (defined(@_[0])) { + $patch_list_path = shift; + } + else { + err ("-f should follow the filename"); + exit 1; + } + } + elsif ($arg eq "-t" || $arg eq "--target") { + $TARGET_FILE_GIVEN = 1; + if ($CONF_FILE_GIVEN) { + err ("--config and --target options are mutually exclusive"); + exit 1; + } + if ($BUILD_PLATFORM) { + err ("--target can only be used with --patch, --unpatch or --diff"); + exit 1; + } + if (defined(@_[0])) { + # patch or diff target-file given. create a temporary config-file + # note, makes sense only when doing just patch, unpatch or diff + # operation. + my $tmp_file = shift; + system("echo $tmp_file > $TMP_CONF"); + $patch_list_path = $TMP_CONF; + } + else { + err ("--target should follow the path to the patched file"); + exit 1; + } + } + elsif ($arg eq "--s60ex") { $FINALIZE_S60EX = 1; } + else { + warn "unrecognized commang line option $arg\n"; + $u++; + } + } + if ($n == $u) { + # not a single valid option + usage (); + exit; + } + if ($CHECK_BUILD) { + $BUILD_SDK = 0; + $BUILD_PLATFORM = 0; + $DO_PATCH = 0; + $BUILD_JAVA = 0; + } + } + } + + +# ======================================================================= +# Builds Java part of the SDK. +# ======================================================================= + sub build_java +# ======================================================================= + { + if ($REBUILD || $CLEAN) { + chdir_or_die ($JAVA_SRC_ROOT); + for $i (0 .. $#JAVA_CLEAN_DIRS) { + $dir = $JAVA_CLEAN_DIRS[$i]; + dbg ("Deleting $dir"); + rmtree($dir); + } + + chdir_or_die ($JAVA_BUILD_DIR); + run_build_cmd ("ant clean"); + + } + + if (!$CLEAN) { + chdir_or_die ($JAVA_BUILD_DIR); + my $epdt_target = "build"; + if ($BUILD_TYPE == $BUILD_TYPE_MIDP) { + $epdt_target = "midp"; + } elsif ($BUILD_TYPE == $BUILD_TYPE_CPP) { + $epdt_target = "cpp"; + } + run_build_cmd ("ant " . $epdt_target); + xcopy ($JAVA_DIST_DIR, $JAVA_TARGET_DIR); + + if ($BUILD_TYPE == $BUILD_TYPE_MIDP || + $BUILD_TYPE == $BUILD_TYPE_ALL) { + open(DUMMY_FH, ">","${JAVA_TARGET_DIR}\\MIDP.txt"); + + if(!copy("${BUILD_ROOT}\\sdkcreationmw\\sdkcomponents\\Common_Patch\\epoc32\\data\\sdk_info.properties", + "${BUILD_ROOT}\\epoc32\\data\\sdk_info.properties")) + { + msg("Couldn't copy file sdk_info.properties\n"); + msg($!); + } + + + } + + } + } + +# ======================================================================= + sub do_diff +# ======================================================================= + { + my $path = shift; + my $patch_file = shift; + my $relative_path; + my $relative_orig; + + ($relative_path = $path) =~ s/^([A-Za-z])\:$FS//g; + $relative_orig = $relative_path . ".orig"; + if (! -e $relative_path) { + msg ("$WARNING Missing $relative_path. No diff was done."); + return; + } + + if ($patch_file eq "") { + # if don't have patch file yet. Pehaps we running diff for a first time. + $patch_file = $PATCH_DIR . $relative_path . ".$PATCH_EXT"; + dbg ("patch_file is empty. New patch_file is $patch_file"); + my $patch_dir = get_dir_name ($patch_file); + if (! -e $patch_dir) { + mkpath ($patch_dir) or die "Couldn't create $patch_dir: $@"; + } + } + $patch_file =~ s/^([A-Za-z])\:$FS//g; + my $result_file; + ($result_file = $patch_file) =~ s/\.$PATCH_EXT$//; + my $esc_path; + ($esc_path = $relative_path) =~ s/([\\\/\.])/\\$1/g; + my $ignore_match = "\"^[\\*-][\\*-][\\*-] $esc_path\""; + my $tmp_file = $patch_dir . $BACKUP_PREFIX . + File::Temp::mktemp (get_fname ($patch_file) . "XXXXX"); + my $cmd = $REDIFF_CMD . " $relative_orig $relative_path"; + my $res = 0; + my $derr = 1; + + if (-e "$relative_orig") { + $res = 1; + dbg ("working on $relative_path"); + run ($cmd, $tmp_file); + if (-e $patch_file) { + # Let's see if we got a different patch file that we already have. + # We don't want to just replace patch file we have with new one + # because source save might be too picky about changing time stamp + # and if new and old patch file are equal we will keep the old one. + $res = run ("$DIFF_EXE -N -I $ignore_match $tmp_file $patch_file", + $NULL_NAME); + } + + if ($res == 2) { + die "$DIED_MSG Couldn't diff $tmp_file and $patch_file\n"; + } + elsif ($res == 1) { + # New patch file is differerent so replace old patch file + # with new one. + msg ("Diffing $relative_path"); + chmod 666, $patch_file; + rename "$tmp_file", "$patch_file"; + } + else { + unlink $tmp_file; + } + } + + # check, if resulted .diff-file is zero-size. If so, abort. + # (either patch is obsolete or you manually messed things up) + if (-e $patch_file && not -s "$patch_file") { + die "$DIED_MSG $patch_file size is 0!\nCheck the patch!\n"; + } + + $derr = run ("$DIFF_EXE $relative_path $result_file", $NULL_NAME); + dbg ("derr: $derr, res: $res"); + if ($res == 1 || $derr > 0) { + # Patch files are different so the result file has to be updated. + if (-e "$relative_orig") { + # This is normal condition, no need to display this message + # unless verbose output is on + dbg ("Copying $relative_path to $result_file"); + } else { + # Or we don't have .orig file, so we just want to copy plat. file + # to patch dir. In that case issue a normal message + msg ("Copying $relative_path to $result_file"); + } + copy ($relative_path, $result_file); + chmod 666, $result_file; + } + else { + msg ("Checking $relative_path ..."); + } + } + + +# ======================================================================= + sub patch_files +# ======================================================================= + { + my $path = shift; + my $patch_file = shift; + + # remove read-only bits from all the files in the dir of the file-to-be-patched + my $tmp_dir = get_dir_name ($path); + my $cmd = "attrib -r /s /d $tmp_dir*.*"; + dbg($cmd); + system($cmd); + + my ($p_err, $d_err) = do_patch ($path, $patch_file); + my $res_file; + + ($res_file = $patch_file) =~ s/\.$PATCH_EXT$//; + + if ($p_err == 0) { + msg ("Patched $path"); + if ($d_err == 2) { + die "$DIED_MSG PATCH RESULT: Diff failed while comparing $path and $res_file\n"; + } + elsif ($d_err == 1) { + msg ("$WARNING PATCH RESULT: $path does not match $res_file\n"); + } + else { + dbg ("PATCH RESULT: res $p_err, diff res: $d_err. Proceeding"); + } + + # additionally check, if .diff-file is zero-size. If so, print a note. + # (either patch is obsolete or you manually messed things up) + # note, that we still continue. + if (not -s "$patch_file") { + msg ("$NOTE $patch_file size is 0!\nCheck the patch!\n"); + } + } + elsif ($p_err == -1) { + die "$DIED_MSG PATCH FAILED: Couldn't start the patch command!\n"; + } + else { + die "$DIED_MSG PATCH FAILED for $path!\n"; + } + } + + +# ======================================================================= + sub chdir_to_build_specific_dir +# ======================================================================= + { + my $dir; + if ($BUILD_TYPE == $BUILD_TYPE_MIDP) { + $dir = "midp"; + } elsif ($BUILD_TYPE == $BUILD_TYPE_CPP) { + $dir = "cpp"; + } else { + return; + } + + if (-f "$dir/bld.inf") { + chdir $dir; + } + } + +# ======================================================================= + sub do_platform_build +# ======================================================================= + { + # Build patched platform modules + foreach $b (@bld_info) { + my @modules = split /,/, $b; + my $group_dir = shift @modules; + chdir_or_die ("$BUILD_ROOT$group_dir"); + dbg ("Building in $BUILD_ROOT$group_dir"); + run ("cmd /c bldmake.bat bldfiles"); + + #modules are optional + if(@modules>0) + { + foreach $m (@modules) + { + build_module ($m); + } + } + else + { + build_module(''); + } + } + } + +# ======================================================================= + sub do_java_platform_build +# ======================================================================= + { + # Build java system ams + my $java_group_dir = "sf/app/java/group"; + chdir_or_die ("$BUILD_ROOT$java_group_dir"); + dbg ("Building in $BUILD_ROOT$java_group_dir"); + run ("cmd /c bldmake.bat bldfiles"); + run ("cmd /c abld.bat export"); + run ("cmd /c pbuild build winscw udeb midp2ams"); + run ("cmd /c pbuild build winscw udeb wma"); + run ("cmd /c pbuild build winscw udeb multimedia11"); + + my $s60ex_dir = $BUILD_ROOT . "$SDK_PROJ_NAME/sdkexamples/javaexamples"; + chdir_or_die ($s60ex_dir); + + run_build_cmd("ant IAPInfoMIDlet eSWTMIDlet SystemProperties"); + run_build_cmd("ant copy_documentation"); + $cmd = "unzip -o \\\\filerblr\\SP\\AM\\DT_SDK\\SDK_BIS\\Repository\\Java_API\\IAPInfoMIDlet_doc.zip -d Z\:\\PublicSDK\\sdkcreationmw\\sdkexamples\\javaexamples\\dist\\examples\\IAPInfoMIDlet"; + print ($cmd."\n"); system ($cmd); + $cmd = "unzip -o \\\\filerblr\\SP\\AM\\DT_SDK\\SDK_BIS\\Repository\\Java_API\\eSWTMIDlet_doc.zip -d Z\:\\PublicSDK\\sdkcreationmw\\sdkexamples\\javaexamples\\dist\\examples\\eSWTMIDlet"; + print ($cmd."\n"); system ($cmd); + $cmd = "unzip -o \\\\filerblr\\SP\\AM\\DT_SDK\\SDK_BIS\\Repository\\Java_API\\SystemPropertiesMidlet_doc.zip -d Z\:\\PublicSDK\\sdkcreationmw\\sdkexamples\\javaexamples\\dist\\examples\\SystemProperties"; + print ($cmd."\n"); system ($cmd); + system("copy /V Z\:\\PublicSDK\\sdkcreationmw\\sdkexamples\\javaexamples\\examples\\examples.html Z\:\\PublicSDK\\sdkcreationmw\\sdkexamples\\javaexamples\\dist\\examples"); + system("copy /V \\\\filerblr\\SP\\AM\\DT_SDK\\SDK_BIS\\Repository\\Java_API\\build.xml Z\:\\PublicSDK\\sdkcreationmw\\sdkexamples\\javaexamples\\dist\\examples\\IAPInfoMIDlet\\targets"); + } + +# ======================================================================= + sub check_platform_build +# ======================================================================= + { + foreach $b (@bld_info) { + my @modules = split /,/, $b; + my $group_dir = shift @modules; + if (!chdir ("$BUILD_ROOT$group_dir")) { + msg ("$DIED_MSG missing $BUILD_ROOT$group_dir!!!!!!!!"); + return; + }; + #modules are optional + if(@modules>0) + { + foreach $m (@modules) + { + check_module_build ($m); + } + } + else + { + check_module_build (''); + } + + } + } + + +# ======================================================================= + sub check_module_build +# ======================================================================= + { + my $dir = getcwd; + my $module = shift; + dbg ("Checking $dir"); + foreach $t (@PLATFORMS) { + if (!-e "ABLD.BAT") { + run ("cmd /c bldmake.bat bldfiles"); + } + run ("cmd /c abld.bat build -c $t $module"); + } + } + + +# ======================================================================= + sub build_series60_tools_component +# ======================================================================= + { + my $name = shift; + my $dir = "$S60_TOOLS_DIR/$name/group"; + chdir_or_die ($dir); + chdir_to_build_specific_dir (); + dbg ("Building in " . getcwd); + run ("cmd /c bldmake.bat bldfiles"); + run ("cmd /c abld.bat export"); + run ("cmd /c abld.bat makefile"); + foreach $bt (@VARIANTS) { + if($REBUILD || $CLEAN) { + run_build_cmd ( "cmd /c abld.bat clean $bt"); + } + if (!$CLEAN) { + run_build_cmd ( "cmd /c abld.bat -k build $bt"); + } + } + } + + +# ======================================================================= + sub check_series60_tools_component +# ======================================================================= + { + my $name = shift; + my $dir = "$S60_TOOLS_DIR/$name/group"; + if (!chdir ($dir)) { + msg ("$DIED_MSG Missing $dir!!!!!!!!"); + return; + }; + chdir_to_build_specific_dir (); + dbg ("Checking " . getcwd); + if (!-e "ABLD.BAT") { + run ("cmd /c bldmake.bat bldfiles"); + } + run ("cmd /c abld.bat build -c"); + } + + +# ======================================================================= + sub build_module +# ======================================================================= + { + my $module = shift; + + foreach $t (@PLATFORMS) { + if (!$CLEAN) + { + run_build_cmd ( "cmd /c abld.bat makefile $t $module"); + } + foreach $bt (@VARIANTS) + { + if($REBUILD || $CLEAN) + { + run_build_cmd ( "cmd /c abld.bat clean $t $bt $module"); + } + if (!$CLEAN) + { + run_build_cmd ( "cmd /c abld.bat -k build $t $bt $module"); + } + } + } + } + + +# ======================================================================= + sub do_patch +# ======================================================================= + { + my $dest = shift; + my $patch_file = shift; + my $res_file; + my $perr = 0; + my $derr = 0; + my $silent = ($LOGLEVEL > $LOG_NORMAL) ? "" : "-s"; + + ($res_file = $patch_file) =~ s/\.diff$//; + + # Overwrite the destination file with the .orig file. If .orig file + # is not found, assume that it's the very first patch and create the + # .orig file + if (-e "$dest.orig") { + copy_or_die ("$dest.orig", "$dest"); + } else { + dbg ("creating new orig file $dest.orig"); + copy_or_die ("$dest", "$dest.orig"); + } + + $perr = run ("$PATCH_EXE $silent -d $BUILD_ROOT -p0 -N --ignore-whitespace --no-backup-if-mismatch -i $patch_file $dest"); + dbg ("PATCH: error $perr"); + + if ($perr == 0) { + if ($LOGLEVEL >= $LOG_VERBOSE) { + $derr = run ("$DIFF_EXE $dest $res_file"); + } + else { + $derr = run ("$DIFF_EXE $dest $res_file", $NULL_NAME); + } + dbg ("Diff for $dest and $res_file returned $derr"); + } + return ($perr, $derr); + } + + +# ======================================================================= + sub do_unpatch +# ======================================================================= + { + my $dest = shift; + my $patch_file = shift; + my $backup_path = get_first_backup_path($dest); + my $res_file = $patch_file; + $res_file =~ s/\.$PATCH_EXT$//; + + # try to restore the original version + if (-e "$dest.orig") { + # there is a "orig file", so just rename "orig" back to $dest + msg("restoring $dest from \".orig\"..."); + copy_or_die("$dest.orig", "$dest"); + } + elsif (-e "$backup_path") { + # there is no ".orig" file but there is backup file, + # restore from there. + msg("Restoring $dest from backup file."); + copy_or_die("$backup_path", "$dest"); + } + elsif (!-e $patch_file && + !run("$DIFF_EXE $dest $res_file", $NULL_NAME)) { + # there are no .orig and backup files and the result + # file ($res_file) is the same as in the platform ($dest). + # This is most likely the file that was copied to the platform, + # so remove it. + msg("Removing current copy of $dest"); + unlink $dest; + } + + } + + +# ======================================================================= + sub process_bld_info +# ======================================================================= + { + my $file = shift; + my $idx = 0; + + foreach $b (@_) { + @bld_data = split /,/, $b; + $bld_inf_path = shift @bld_data; + + die "$DIED_MSG Dir. name for bld.inf is empty. Line: $b\n" if $bld_inf_path eq ""; + + # Get the index of the $bld_info element that starts with $bld_inf_path. + $idx = bld_info_arr_idx ($bld_inf_path); + + if ($idx < 0) { + # There is no such entry in the $bld_info, so just add entire line. + push (@bld_info, $b); + } else { + # There is an entry that starts with $bld_inf_path, so just add + # modules that are not there to the $idx-th line (element of $bld_info) + @bld_data_idx = split /,/, $bld_info[$idx]; + shift @bld_data_idx; + + foreach $m (@bld_data) { + $bld_info[$idx] =~ s/\,$m\,/\,/g; + $bld_info[$idx] =~ s/\,$m$//g; + $bld_info[$idx] .= ",$m"; + } + } + } + } + + +# ======================================================================= + sub bld_info_arr_idx +# ======================================================================= + { + my $val = shift; + my $idx = 0; + + for ($idx = 0; $idx < $#bld_info + 1; $idx++) { + last if ($bld_info[$idx] =~ m/^$val\,/); + } + + if ($idx == $#bld_info + 1) {$idx = -1;} + return $idx; + } + + +# ======================================================================= + sub get_last_backup_path +# ======================================================================= + { + my $orig_path = shift; + my $new_ver = get_last_file_ver ($orig_path); + my $dir = get_dir_name ($orig_path); + my $fname = get_fname ($orig_path); + my $backup_path = $dir . $BACKUP_PREFIX . $fname . ".$new_ver"; + return $backup_path; + } + +# ======================================================================= + sub get_first_backup_path +# ======================================================================= + { + my $orig_path = shift; + my $dir = get_dir_name ($orig_path); + my $fname = get_fname ($orig_path); + my $backup_path = $dir . $BACKUP_PREFIX . $fname . ".1"; + return $backup_path; + } + + +# ======================================================================= + sub get_new_backup_path +# ======================================================================= + { + my $orig_path = shift; + my $new_ver = get_last_file_ver ($orig_path) + 1; + my $dir = get_dir_name ($orig_path); + my $fname = get_fname ($orig_path); + my $backup_path = $dir . $BACKUP_PREFIX . $fname . ".$new_ver"; + return $backup_path; + } + + +# ======================================================================= + sub get_last_file_ver +# ======================================================================= +# Assupmtion: if file name is "foo.cpp" the n-th version of this file would be +# in the same directory and would have name "#foo.cpp.n" + { + my $path = shift; + my $dir = get_dir_name ($path); + my $fname = get_fname ($path); + my $basename = get_basename ($fname); + my $postfix = 0; + + if ($dir eq "") {$dir = "."} + opendir (DIR, $dir); + @flist = grep {/^$BACKUP_PREFIX$basename.*\..*\.[0-9]+$/} readdir (DIR); + closedir DIR; + + if ($#flist + 1 > 0) { + foreach $f (@flist) { + my $p = unpack ("A*", get_ext ($f)); + $postfix = $p if $postfix < $p; + } + } + return $postfix; + } + + +# ======================================================================== + sub get_basename +# ======================================================================== + { + my $orig_name = shift; + my $basename; + ($basename = $orig_name) =~ s/\..*$//g; + return $basename; + } + + +# ======================================================================== + sub get_ext +# ======================================================================== + { + my $orig_name = shift; + my $ext; + ($ext = $orig_name) =~ s/^.*\.//g; + return $ext; + } + + +# ======================================================================= + sub get_fname +# ======================================================================= + { + my $orig_name = shift; + my $dir = get_dir_name ($orig_name); + my $fname; + ($fname = $orig_name) =~ s/\\/\//g; + $fname =~ s/^$dir//g; + return $fname; + } + + +# ======================================================================= + sub get_dir_name +# ======================================================================= + { + my $orig_name = shift; + my $dir_name; + ($dir_name = $orig_name) =~ s/\\/\//g; + $dir_name =~ s/[^\/]+$//g; + return $dir_name; + } + + +# ======================================================================= + sub err +# =======================================================================/ + { + my $m = "ERROR: @_[0]\n"; + print $m; + print LOG_FH $m if $LOG; + exit 1; + } + + +# ======================================================================= + sub quiet +# =======================================================================/ + { + if ($LOGLEVEL => $LOG_QUIET) { + my $m = "*** @_[0]\n"; + print $m; + print LOG_FH $m if $LOG; + } + } + + +# ======================================================================= + sub msg +# =======================================================================/ + { + if ($LOGLEVEL >= $LOG_NORMAL) { + my $m = "*** @_[0]\n"; + print $m; + print LOG_FH $m if $LOG; + } + } + + +# ======================================================================= + sub dbg +# ======================================================================= + { + if ($LOGLEVEL >= $LOG_VERBOSE) { + my $dbg_msg = "=== @_[0]\n"; + print $dbg_msg; + print LOG_FH $dbg_msg if $LOG; + } + } + + +# ======================================================================= + sub noisy +# ======================================================================= + { + if ($LOGLEVEL > $LOG_VERBOSE) { + my $m = "=== @_[0]\n"; + print $m; + print LOG_FH $m if $LOG; + } + } + + +# ======================================================================= + sub run_build_cmd +# ======================================================================= + { + my $cmd = shift; + if ($LOGLEVEL >= $LOG_NORMAL) { + my $dir = getcwd; + msg ("***********************************************************"); + msg ("* DIR: $dir"); + msg ("* BUILD: $cmd"); + msg ("***********************************************************"); + } else { + msg ($cmd); + } + my $err = run ($cmd); + dbg ("$cmd returned $err"); + return $err; + } + + +# ======================================================================= + sub run +# ======================================================================= + { + my $cmd = shift; + my $out_name = shift; + my $close_out = 0; + my $out; + + dbg ("Running: $cmd"); + if (defined($out_name)) { + if ($out_name eq $NULL_NAME) { + # no output desired + undef $out; + } else { + open OUT, "> $out_name" or + die "$DIED_MSG $cmd couldn't write to output $out_name!!!\n"; + $out = OUT; + $close_out = 1; + } + } elsif ($LOGLEVEL <= $LOG_SILENT) { + # output supressed by log level + undef $out; + } else { + $out = STDOUT; + } + + open CHILD, "$cmd 2>&1|" or die "$DIED_MSG $cmd Err: $!"; + while () { + if (defined ($out)) { + print $out $_; + print LOG_FH $_ if $LOG; + } + } + close CHILD; + close $out if $close_out; + noisy ("return code " . ($? >> 8)); + return $? >> 8; + } + + +# ======================================================================= +# Changes the current direcctory, dies on error +# ======================================================================= + sub chdir_or_die +# ======================================================================= + { + my $dir = shift; + dbg ("chdir $dir"); + chdir $dir or die "$DIED_MSG $dir: $!"; + } + + +# ======================================================================= +# Copies a file, dies on error +# ======================================================================= + sub copy_or_die +# ======================================================================= + { + my $src = shift; + my $dest = shift; + dbg ("copying $src -> $dest"); + #if the file exists, rename it to .orig_X - safer than overwriting + #note: if we neither rename nor remove existing $dest, copy gives + #fatal error + if(-e $dest) + { + my $i = 1; + while(-e "$dest.orig_$i") + { + $i++; + } + move($dest, "$dest.orig_$i"); + } + copy ($src, $dest) or + die "$DIED_MSG : failed to copy $src -> $dest: $!"; + } + + + +# ======================================================================= +# +# Recursive copy +# +# Copies a folder, its sub folders & files therein. +# Paramter 1: Source folder path. +# Paramter 2: Destination folder path. +# +# ======================================================================= + sub xcopy +# ======================================================================= + { + my ($CopyFrom,$CopyTo) = @_; + my ($src,$RelativePath,$dest); + + # Make sure that the source directory exists, create the top level + # destination directory + if (-d $CopyFrom) { + eval { mkpath($CopyTo) }; + if ($@) { + err("Couldn't create $_[0]: $@"); + exit(1); + } + } else { + err("Directory $CopyFrom does not exist"); + return; + } + + dbg("Copying $CopyFrom -> $CopyTo"); + + # Traverse file tree (highest level directory first) + find(sub{ + $src=$File::Find::name; + $RelativePath=$src; + $RelativePath=~s/^\Q$CopyFrom\E//; + $dest=$CopyTo.$RelativePath; + if (-f $src) { # Copy file + noisy ("$dest"); + if (!copy($src,$dest)) { + err("Couldn't copy $src: $@"); + } + } else { # Make a duplicate directory if necessary + unless($dest eq '..'||$dest eq '.') { + unless(-e $dest) { + noisy ("Creating $dest"); + mkdir($dest,0775); + } + } + } + },$CopyFrom); + } + + +# ======================================================================== + sub get_patch_fname +# ======================================================================== + { + my $patch_name = shift; + my $res; + + foreach $f (@_) { + if ($f =~ m/$patch_name$/i) { + $res = $f; + last; + } + } + return $res; + } + + +# ======================================================================== + sub find_all +# ======================================================================== + { + my $base_dir = shift; + my @flist = (); + + find (sub { + if (-f $File::Find::name) { + push (@flist, $File::Find::name); + } + }, $base_dir); + + return @flist + } + +# ======================================================================== + sub get_plat_name +# ======================================================================== + { + return "3.0"; + } + +# ======================================================================== + sub do_s60ex_finalizing +# ======================================================================== + { + my $s60ex_dir = $BUILD_ROOT . "$SDK_PROJ_NAME/ExamplesCpp/build"; + chdir_or_die ($s60ex_dir); + run ("cmd /c finalize.bat"); + } + +# ======================================================================== +sub do_s60_rndtools_cleaning +# ======================================================================== + { + # List of tools that needs to be make cleaned to remove "rnd tools" from emulator menu + print "\n \n ======== Start Clean RnD Tools==========="; + @rndtools_cleandirs = qw ( s:/s60/tools/commontools/group s:/s60/tools/performancetools/group s:/s60/tools/nettools/ConnTest/group s:/ppd_sw/rd_sw/prism_rnd/group s:/ppd_sw/rd_sw/btproxy_rnd/group s:/ppd_sw/rd_sw/bappeaprofiler/group s:/ppd_sw/rd_sw/analyzetool/group s:/ppd_sw/rd_sw/hti/src/HtiAdmin/group s:/ppd_sw/rd_sw/hti/src/HtiAutoStart/group s:/ppd_sw/rd_sw/hti/src/HtiCommPlugins/HtiBtCommPlugin/group s:/ppd_sw/rd_sw/hti/src/HtiCommPlugins/HtiIPCommPlugin/group s:/ppd_sw/rd_sw/hti/src/HtiCommPlugins/HtiIsaCommPlugin/HtiIsaCommEcomPlugin/group s:/ppd_sw/rd_sw/hti/src/HtiCommPlugins/HtiIsaCommPlugin/HtiIsaCommServer/group s:/ppd_sw/rd_sw/hti/src/HtiCommPlugins/HtiSerialCommPlugin/group s:/ppd_sw/rd_sw/hti/src/HtiCommPlugins/HtiTraceCommPlugin/HtiTraceCommEcomPlugin/group s:/ppd_sw/rd_sw/hti/src/HtiCommPlugins/HtiTraceCommPlugin/HtiTraceCommServer/group s:/ppd_sw/rd_sw/hti/src/HtiCommPlugins/HtiUsbSerialCommPlugin/group s:/ppd_sw/rd_sw/hti/src/HtiDeviceReboot s:/ppd_sw/rd_sw/hti/src/HtiFileHlp s:/ppd_sw/rd_sw/hti/src/HtiFramework/group s:/ppd_sw/rd_sw/hti/src/HtiWatchDog s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiAppServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiAudioServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiEchoServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiFtpServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiIpProxyServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiIsiMsgServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiKeyEventServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiMessagesServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiPIMServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiScreenshotServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiStifTfServicePlugin/group s:/ppd_sw/rd_sw/hti/src/HtiServicePlugins/HtiSysInfoServicePlugin/group s:/ppd_sw/cs_salo_domain/aiemailplugin/group s:/s60/mw/securityservices/iaupdate/IAD/group ); + + # Make clean to remove "rnd tools" from emulator: suggestion given by pf team + foreach my $rndtools_cleandirs ( @rndtools_cleandirs ) + { + print "\n\n=== Clean up of rnd tools: $rndtools_cleandirs\n\n ==="; + chdir $rndtools_cleandirs or print " WARNING: Can chdir to $rndtools_cleandirs: $!"; + + $cmd = "call bldmake bldfiles"; + system ($cmd); #==0 or print ($cmd."\n\n"); + + $cmd = "call abld makefile"; + system ($cmd); #==0 or print ($cmd."\n\n"); + + $cmd = "call abld reallyclean"; + system ($cmd); #==0 or print ($cmd."\n\n"); + } + }