diff g23m/nds_generatemakefile.pl @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/nds_generatemakefile.pl	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,452 @@
+#!perl -w
+#-------------------------------------------------------------------------------
+#  Project :      Nice Delivery System
+#  Module  :      nds_generate_makefile
+#-------------------------------------------------------------------------------
+#  Copyright:     2003 Texas Instruments Deutschland GmbH
+#                 2004 Texas Instruments France SA
+#                 All rights reserved. 
+# 
+#                 This file is confidential and a trade secret of Texas 
+#                 Instruments.
+#                 The receipt of or possession of this file does not convey 
+#                 any rights to reproduce or disclose its contents or to 
+#                 manufacture, use, or sell anything it may describe, in 
+#                 whole, or in part, without the specific written consent of 
+#                 Texas Instruments Framce SA. 
+#-------------------------------------------------------------------------------
+#  Authors :      jr  Joachim Richter
+#                 mo  Martin Osieka
+#                 ib  Isabelle Biffi
+#-------------------------------------------------------------------------------
+#  Versions:      2.0  ib
+#-------------------------------------------------------------------------------
+
+
+use strict;
+use File::Copy;
+use File::Find;
+use File::Spec;
+use Cwd;
+use Getopt::Long qw(:config pass_through);
+
+
+#-------------------------------------------------------------------------------
+# Variables
+#-------------------------------------------------------------------------------
+
+my $command;
+
+# makefile file name
+my $makeFile;
+
+# do not only store the drive in $current_drive, but rather store the path
+# to the current dir (necessary to work directly on V:\<view>\...)
+my $current_drive = cwd;
+$current_drive =~ s|[\\/][^\\/]+$||;
+
+# specifies whether output is being redirected (logged to a file) or not
+my $outerr_redirected;
+
+# command line options 
+my $o_file;
+my $o_logfile = "report.txt";
+my $o_shell = 0;
+my $o_help = 0;
+# my $o_dlvcfg = "dlv_cfg0";
+my $o_dlvcfg = "";
+my $dlv_cfg_path = "system\\busyb\\deliverydefs\\";
+my $dlv_cfg;
+
+# make pass-through options
+my $make_opt;
+
+
+#-------------------------------------------------------------------------------
+# Main Program
+#-------------------------------------------------------------------------------
+
+# parse command line, passing through all unknown options to make
+parse_command_line();
+
+# logging is enabled by default (unless $o_shell is set, done by option "-s")
+if (!$o_shell)
+{
+    # attempt to redirect STDOUT+STDERR
+    $outerr_redirected = redirect_output();
+}
+else
+{
+    # do not redirect output, it is being sent to shell
+    $outerr_redirected = 0;
+}
+
+# ib 
+my $build_message = "\nStarting generate makefile for configuration " . $o_file . ".
+REDIRECT_PLACEHOLDER
+\n";
+
+if ($outerr_redirected)
+{
+    $build_message =~ s/REDIRECT_PLACEHOLDER/output is being logged to $o_logfile,/;
+    print CONSOLE_OUT $build_message;
+}
+else
+{
+    $build_message =~ s/REDIRECT_PLACEHOLDER/output is not being logged!/;
+    print $build_message;
+}
+step__check_environment (1);
+&step__update_busyb_makefile (2, "system/unbusy_g23m.ini");
+
+# restore redirected STDOUT+STDERR, if necessary 
+restore_redirection()
+    if $outerr_redirected;
+
+
+exit 0;
+
+
+#-------------------------------------------------------------------------------
+# SUBROUTINES
+#-------------------------------------------------------------------------------
+
+
+#-------------------------------------------------------------------------------
+# parses the command line, sets global $o_* variables to all specified options,
+# checks which options/parameters are passed through to make or ABC
+#-------------------------------------------------------------------------------
+sub parse_command_line
+{
+    GetOptions (
+        "file=s"=>\$o_file,
+        "log=s"=>\$o_logfile,
+        "shell"=>\$o_shell,
+        "dlv=s"=>\$o_dlvcfg,
+        "help|?" =>\$o_help);
+    
+    if ($o_help)
+    {
+        usage();
+        exit 0;
+    }
+    
+    # determine make/BuSyB pass-through options from @ARGV
+    $make_opt = "";
+    foreach (@ARGV)
+    {
+            # make/BuSyB pass-through option: all else
+            $make_opt .= " " . $_;
+    }
+    
+    # sanity checks: 
+    # due to enabled 'pass_through' and 'permute' of GetOptions(),
+    # some busyb.pl options may end up in other option parameters instead 
+    # e.g. if options which require a parameter are specified w/o any parameter: 
+    # "... -m", or "... -m -l", ...
+    foreach ($o_file, $o_logfile)
+    {
+        # check all options which should take a parameter 
+        # if they actually contain another option and no parameter
+        if (defined($_) and /^-/)
+        {
+            print "\nERROR: Option missing mandatory parameter!\n\n";
+            usage();
+            exit 1;
+        }
+    }
+    foreach ("-f", "-l")
+    {
+        # check if the pass-through options to make contain on of the busyb.pl
+        # options
+        if ($make_opt =~ /$_/i)
+        {
+            print "\nERROR: Option missing mandatory parameter!\n\n";
+            usage();
+            exit 1;
+        }
+    }
+    
+    if (!$o_file)
+    {
+        print "\nERROR: No input/configuration file specified with \"-f file\"!\n\n";
+        usage();
+        exit 1;
+    }
+    die "\nERROR: Input/configuration file \"" . $o_file . "\" not found, aborting"
+        unless -e $o_file;
+    # replace backslash with slash in filename
+    $o_file =~ s:\\:/:g;
+
+    
+    if ($o_dlvcfg)
+    {
+        $dlv_cfg=$dlv_cfg_path.$o_dlvcfg.".xml";
+        die "\nERROR: delivery configuration file \"" . $dlv_cfg . "\" not found, aborting"
+            unless -e $dlv_cfg;
+        # replace backslash with slash in filename
+        $dlv_cfg =~ s:\\:/:g;
+    }
+}
+
+
+
+
+
+
+
+
+#-------------------------------------------------------------------------------
+# print short usage notes
+#-------------------------------------------------------------------------------
+sub usage
+{
+    print "\nUSAGE:
+    perl xxx.pl -f XML-File [OPTIONS] 
+
+Generate makefile for building Chipset software
+Logging all output to report.txt by default.
+
+OPTIONS:
+    -l LOGFILE    log to LOGFILE (default is report.txt)
+    -S            output to current shell, no logging to report.txt
+    -dlv DLVCFG   delivery configuration, dlv_cfg0 by default
+
+EXAMPLES:
+    perl busyb.pl -f system\\busyb\\productdefs\\sample.xml
+    perl busyb.pl -f system\\busyb\\productdefs\\sample.xml -dlv dlvcfg2
+";
+}
+
+
+#-------------------------------------------------------------------------------
+# print current step to STDOUT (usually redirected to report.txt) and
+# additionally to CONSOLE_OUT
+#-------------------------------------------------------------------------------
+sub print_status
+{
+    print "\n----------------------------------------------------------------";
+    print "\n$_[0]\n";
+    print "----------------------------------------------------------------\n\n";
+    
+    print CONSOLE_OUT "$_[0]\n"
+        if $outerr_redirected;
+}
+
+
+
+#-------------------------------------------------------------------------------
+# Check/Initialize some necessary env. variables:
+# - %PATH must contain gpf/bin, gpf/tools/bin, chipsetsw/system (in that order)
+# - %PATH* variables must only contain slashes (no backslashes, semicolons)
+#-------------------------------------------------------------------------------
+sub init_environment
+{
+    my $current_drive_winformat = $current_drive;
+    $current_drive_winformat =~ s:/:\\:g;
+
+    # check if all necessary paths are in %PATH, add them if not (this removes
+    # the dependency on initvars.bat)
+    if (!($ENV{'PATH'} =~ m:[\\/]chipsetsw[\\/]system:))
+    {
+        # add \chipsetsw\system to %PATH (should be third)
+        $ENV{'PATH'} = "$current_drive_winformat\\chipsetsw\\system;" . $ENV{'PATH'};
+        print "%PATH   : \"$current_drive_winformat\\chipsetsw\\system\" + %PATH\n";
+    }
+
+    if (!($ENV{'PATH'} =~ m:[\\/]gpf[\\/]tools[\\/]bin:))
+    {
+        # add \gpf\tools\bin to %PATH (should be second)
+        $ENV{'PATH'} = "$current_drive_winformat\\gpf\\tools\\bin;" . $ENV{'PATH'};
+        print "%PATH   : \"$current_drive_winformat\\gpf\\tools\\bin\" + %PATH\n";
+    }
+
+    if (!($ENV{'PATH'} =~ m:[\\/]gpf[\\/]bin:))
+    {
+        # add \gpf\bin to %PATH (should be first)
+        $ENV{'PATH'} = "$current_drive_winformat\\gpf\\bin;" . $ENV{'PATH'};
+        print "%PATH   : \"$current_drive_winformat\\gpf\\bin\" + %PATH\n";
+    }
+
+    # check correct setting of environment variables for TI compiler and linker
+    # PATH_CC_1_22e=C:\tools\TMS4701x_1.22e\NT
+    die "\nERROR: environment variable %PATH_CC_1_22e must be set!\n"
+      unless exists($ENV{'PATH_CC_1_22e'});
+    $ENV{'PATH_CC_1_22e'} =~ s|\\|/|g;
+    $ENV{'PATH_CC_1_22e'} =~ s|;.*||;
+    print "%PATH_CC_1_22e  : \"" . $ENV{'PATH_CC_1_22e'} . "\"\n";
+    
+    
+    # PATH_LNK_1_9902=C:\tools\vislink_1.9902
+    die "\nERROR: environment variable %PATH_LNK_1_9902 must be set!\n"
+      unless exists($ENV{'PATH_LNK_1_9902'});
+    $ENV{'PATH_LNK_1_9902'} =~ s|\\|/|g;
+    $ENV{'PATH_LNK_1_9902'} =~ s|;.*||;
+    print "%PATH_LNK_1_9902  : \"" . $ENV{'PATH_LNK_1_9902'} . "\"\n";
+    
+
+} # init_environment
+
+
+#-------------------------------------------------------------------------------
+# Check for gnumake availability, returns gnumake depending or die
+#-------------------------------------------------------------------------------
+sub check_gnumake_available
+{
+    my ($rc) = int (system("gnumake -ver > NUL 2>&1") / 256);
+    if(!$rc == 0){
+      die "\nERROR: No make gnumake tool found, aborting";
+    }
+}
+
+#-------------------------------------------------------------------------------
+# Check if Java is installed (in the path), return version string of Java.
+#-------------------------------------------------------------------------------
+sub determine_java_version
+{
+    my $java_ver = `java -version 2>&1`;
+    if ($? == 0)
+    {
+        # only keep the first line of java version string and remove "java", if present
+        $java_ver =~ s/\n.*$//s;
+        $java_ver =~ s/\s*java\s*//;
+        print "Java    : " . $java_ver . "\n";
+    }
+    else
+    {
+        die "\nERROR: Java not found (not installed or not in the path), aborting";
+    }
+}
+
+
+sub step__check_environment
+{
+    print_status ($_[0] . ". Checking environment");
+
+    # create the makefile filename
+    # param  = system\productdefs\sample.xml
+    # o_file = system/productdefs/sample.xml
+#     print_status ($_[0] . " 1 " .$makeFile);
+#     print_status ($_[0] . " 2 " .$o_file);
+#     print_status ($_[2] . " 3 " .$o_dlvcfg);
+   
+    $makeFile = (File::Spec->splitpath($o_file))[2];
+    $makeFile =~ s/(\.xml)$//;
+    if ($o_dlvcfg)
+    {
+        $makeFile =$makeFile."_".$o_dlvcfg;
+    }
+    $makeFile =$makeFile.".mak";
+
+    # initialize necessary env. variables (%PATH, %C_DIR)
+    init_environment();
+    check_gnumake_available();
+    determine_java_version();
+
+}
+
+
+#-------------------------------------------------------------------------------
+# update BuSyB makefile, if necessary; takes an additional second parameter
+# to specify the BuSyB .ini file
+#-------------------------------------------------------------------------------
+sub step__update_busyb_makefile
+{
+
+    my $temp_xml = "dlv_mak.xml";
+    open( MSL_FD,">$temp_xml")
+        or die "ERROR: Can't open file \"$temp_xml\" ($!), aborting";
+
+    print MSL_FD "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+    print MSL_FD "<configDef name=\"dlv_mak\" description=\"\" reference=\"\">\n";
+    print MSL_FD "<property include=\"$o_file\"/>\n";
+
+    if ($o_dlvcfg)
+    {
+        print MSL_FD "<property include=\"$dlv_cfg\"/>\n";
+    }
+    print MSL_FD "</configDef>\n";
+
+    close( MSL_FD)
+        or die "ERROR: Can't close file \"$temp_xml\" ($!), aborting";
+
+    use constant UBB_MAKETOOL => "gnumake ";
+    use constant UBB_UPDATE_MAKE => "-f system/nds_update_makefile.mak ";
+
+    print_status ($_[0] . ". Generate BuSyB makefile ($makeFile)");
+#    $command = UBB_MAKETOOL.UBB_UPDATE_MAKE." MFILE=$makeFile XMLFILE=$o_file";
+    $command = UBB_MAKETOOL.UBB_UPDATE_MAKE." MFILE=$makeFile XMLFILE=$temp_xml";
+    print "$command\n\n";
+
+    system($command) == 0
+        or die "ERROR: Can't create makefile \"$makeFile\" ($!), aborting";
+    print "\n";
+
+    $command = "rm $temp_xml";
+    print "$command\n\n";
+   system($command) == 0
+       or die "ERROR: Can't remove temporary file \"$temp_xml\" ($!), aborting";
+    
+}
+
+
+#-------------------------------------------------------------------------------
+# redirect STDOUT+STDERR to $o_logfile, return 1 if redirection successful or
+# 0 if redirection failed
+#-------------------------------------------------------------------------------
+sub redirect_output
+{
+    my $redirected = 1;
+
+    open (CONSOLE_OUT, ">&STDOUT");
+    open (CONSOLE_ERR, ">&STDERR");
+
+    open (STDOUT, '>', $o_logfile)
+        or $redirected = 0;
+    open (STDERR, ">&STDOUT")
+        or $redirected = 0;
+
+    if ($redirected)
+    {
+        # make output unbuffered
+        select (STDERR); $| = 1;
+        select (STDOUT); $| = 1;
+
+        # install signal handler function for die()
+        $SIG{__DIE__} = \&die_handler
+          or print CONSOLE_ERR "WARNING: Could not install die() signal handler,
+                console output may be corrupted when exiting with an error!\n";
+    }
+    else
+    {
+        # redirection failed: use old STDOUT+STDERR
+        restore_redirection();
+        print "WARNING: Could not redirect STDOUT+STDERR to " . $o_logfile . ", not logging output!\n";
+    }
+    return $redirected;
+}
+
+
+#-------------------------------------------------------------------------------
+# close logging to $o_logfile and restore old STDOUT+STDERR
+# (pointing to console)
+#-------------------------------------------------------------------------------
+sub restore_redirection
+{
+    # restore redirected STDOUT+STDERR
+    close (STDOUT);
+    close (STDERR);
+    open (STDOUT, ">&CONSOLE_OUT");
+    open (STDERR, ">&CONSOLE_ERR");    
+}
+
+
+#-------------------------------------------------------------------------------
+# print die() error message, to also log it to $o_logfile and then restore
+# the STDOUT+STDERR redirection
+#-------------------------------------------------------------------------------
+sub die_handler
+{
+    print STDERR $_[0];
+    restore_redirection();
+}