blob: e2d302b82199ad1be38bbe7a12922541f7a56416 [file] [log] [blame]
#!/usr/bin/env perl
#
# Copyright Statement:
# --------------------
# This software is protected by Copyright and the information contained
# herein is confidential. The software may not be copied and the information
# contained herein may not be used or disclosed except with the written
# permission of MediaTek Inc. (C) 2005
#
# BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
# NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
# SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
#
# BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
# LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
#
# THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
# WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
# LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
# RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
# THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
#
BEGIN {
push @INC, '.';
}
$ENV{'PERL_USE_UNSAFE_INC'} = 1;
# let Python NOT try to write .pyc files.
$ENV{'PYTHONDONTWRITEBYTECODE'} = 1;
require v5.8.6;
BEGIN { push @INC, './'};
use Cwd;
use File::Copy;
use File::Path;
use File::Basename;
use if ($^O eq "MSWin32"), Win32API::Registry => qw(:ALL);
if ($^O ne "MSWin32") {
$ENV{"NUMBER_OF_PROCESSORS"} = `cat /proc/cpuinfo | grep 'processor' | wc -l | tr -d '\n'`;
}
# for mbis start stamp
# get submit to queue epoch time
my $submit_to_queue_time_string = "";
if ($ENV{'SUBMIT_TO_QUEUE_GMT_TIMESTAMP'})
{
my ($sec, $min, $hour, $mday, $mon, $year) = gmtime($ENV{'SUBMIT_TO_QUEUE_GMT_TIMESTAMP'}+28800);
$submit_to_queue_time_string = sprintf("%4.4d.%2.2d.%2.2d.%2.2d.%2.2d.%2.2d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
}
# get epoch timestamp
$build_time_sec = time;
# convert to GMT+8 time
($sec, $min, $hour, $mday, $mon, $year) = gmtime($build_time_sec+28800);
$build_time_string = sprintf("%4.4d.%2.2d.%2.2d.%2.2d.%2.2d.%2.2d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
$core_root = "pcore";
$plat = "";
@arguments = ();
$project = "";
$action = "";
$m_in_lsf = 0;
$local_q = 0;
@mOpts = ();
$fullOpts = "";
$level = "";
$relDir = "";
$ini = "build/make.ini";
$myMF = "build.mak";
$enINI = 1;
($#ARGV < 0) && &Usage;
(($#ARGV < 1) && ($enINI == 0)) && &Usage;
my $newMoDIS = 0;
my $bypassMoDIS = 0;
my $atMoDIS = 0;
my $newUESim = 0;
my $pureMoDIS = 0;
my $packMoDIS = 0;
my $chk_cmd = 0;
my $parallel_module_build = "NONE";
my $concatenate_proj_mak = "";
my $modisDir = "";
my $target_option = "";
$eutran_mode_support = "";
$dummyvm = 0;
#mbis default enable
$mbis = "tools/mbis.pl";
$arg_mbis_en = "FALSE";
$arg_mbis_en_obj_log = "FALSE";
$arg_mbis_en_save_log = "FALSE";
$mbis_arg_exist = 0;
$mbis_en = "FALSE";
$mbis_en_obj_log = "FALSE";
$mbis_en_save_log = "FALSE";
@mbis_arg = ();
if ($^O eq "MSWin32") {
if ($ENV{'LTE_DOMAIN'} eq "TRUE") {
$mbis_conf_file = "\\\\mtklwafs01\\moly\\wcpsm\\config\\mbis_conf.ini";
}
else {
$mbis_conf_file = "\\\\glbfs14\\sw_releases\\mbis\\scripts\\MBIS_conf.ini";
}
}
$mbis_conf_file = "/mtkeda/wcpsm/mbis/config/mbis_conf.ini" if($^O eq "linux");
@orgARGVwithFlavor = ();
$mbis_num_proc = 0;
$mbis_target_build_with_Modis = 0;
@actions = qw(errc_gen new update remake clean codegen emiclean emigen sysgen sys_auto_gen sys_mem_gen ckmemlayout drv_feature_check c,r c,u scan check_scan check check_dep remake_dep update_dep clean_codegen slim_codegen slim_update genlog elfpatch cksysdrv nvram_auto_gen cust_menu_tree_check genmoduleinfo gendummylis gendummysym umts_gen asngen asngen_l4 asnregen slim_mcddll lte_mcddll eas_gen memquery cga mcddll_update update_dsp);
@orgARGV = @ARGV;
@orgARGVwithFlavor = @orgARGV;
$flavor = "DEFAULT";
$localq_disk = "z:";
$makeFolder = "make/common/";
$projMakeFolder = "make/projects/";
$OSversion = $^O;
if ($^O eq "MSWin32") {
$makeCmd = "tools/make.exe";
} else {
$makeCmd = "make";
}
if ($ENV{'MTK_INTERNAL'} eq 'TRUE') {
# MTK_INTERNAL is a internal environment flag
} elsif (($ENV{'USERDOMAIN'} =~ /MTK|PMT|MBJ|MSZ|MTI|WISE|MEDIATEK|MWS|GCN|APJ/i) && ($ENV{'USERDNSDOMAIN'} =~ /MEDIATEK\.INC/i)) {
warn "Current user is from MTK internal, but the environment MTK_INTERNAL != TRUE\nPlease check ! Build script will continue after 30 sec.\n";
sleep 30;
$ENV{'MTK_INTERNAL'} = 'TRUE';
}
if (($ENV{'MTK_INTERNAL'} eq 'TRUE') && (-e "mtk_tools/Internal_function.pm")) {
require mtk_tools::Internal_function;
}
$no_pcibt = "FALSE";
$no_ltelib = "FALSE";
$no_ltecgen = "FALSE";
$no_dsp = "FALSE";
$update_dsp = "FALSE";
$deterministic = "FALSE";
$no_warning_as_error = "FALSE";
$VarioationProj_name = "";
$force_getlte = "FALSE";
$ota_name = "DEFAULT";
$tareget_options = "";
$ccache_dir = "";
$ccache_size = "";
$ccache_basedir = "";
$chk_rel_pkg = "";
$check_fo_license = "FALSE";
$license_info = "DEFAULT";
$cust_lic = "DEFAULT";
$smart = 0;
if(($ENV{'REDIRECT_OUT_DIR'} eq 'TRUE') && (defined $ENV{'OUT_DIR'})) {
print "ENV REDIRECT_OUT_DIR = $ENV{'REDIRECT_OUT_DIR'}\n";
print "OUT_DIR = $ENV{'OUT_DIR'}\n";
print "Trigger CF TO LOCAL success\n";
print "Prepare to create OUT folder and link...\n";
system("mkdir -p $ENV{'OUT_DIR'}/build") if (!-d "$ENV{'OUT_DIR'}/build");
system("mkdir -p $ENV{'OUT_DIR'}/build_internal") if (!-d "$ENV{'OUT_DIR'}/build_internal");
system("ln -sf $ENV{'OUT_DIR'}/build build");
system("ln -sf $ENV{'OUT_DIR'}/build_internal build_internal");
print "Prepare to create OUT folder and link...Done\n";
}
while ($#ARGV != -1) {
if ($ARGV[0] =~ /-bullseye$/i) {
$target_option .= " BULLSEYE_CONFIG=TRUE ";
$ENV{'COVBUILDZONE'}="$$";
} elsif ($ARGV[0] =~ /-bullseye=(.*)/i) {
$target_option .= " BULLSEYE_CONFIG=TRUE BULLSEYE_COVFILE=\"$1\" ";
} elsif ($ARGV[0] =~ /-clang7$/i) {
$target_option .= " CLANG_VER=7.0.0 ";
} elsif ($ARGV[0] =~ /-llvm-coverage$/i) {
$target_option .= " LLVM_COVERAGE=TRUE ";
} elsif ($ARGV[0] =~ /-modis/i) {
$newMoDIS = 1;
} elsif ($ARGV[0] =~ /-forcemodis/i) {
$bypassMoDIS = -1;
} elsif ($ARGV[0] =~ /-puremodis/i) {
$pureMoDIS = 1;
} elsif ($ARGV[0] =~ /-no_puremodis/i) {
$pureMoDIS = -1;
} elsif ($ARGV[0] =~ /-packmodis/i) {
$packMoDIS = 1;
} elsif ($ARGV[0] =~ /-no_packmodis/i) {
$packMoDIS = -1;
} elsif ($ARGV[0] =~ /-uesim/i) {
$newUESim = 1;
} elsif ($ARGV[0] =~ /-release/i) {
$modisDir = "Release";
} elsif ($ARGV[0] =~ /-debug/i) {
$modisDir = "Debug";
} elsif ($ARGV[0] =~ /-h/i) {
&Usage;
} elsif ($ARGV[0] =~ /^-(o|op|opt)=(.*)$/i) {
$fullOpts = $2;
$fullOpts =~ s/,/ /g;
} elsif ($ARGV[0] =~ /-lsf/i) {
$m_in_lsf = 1;
} elsif ($ARGV[0] =~ /-no_lsf/i) {
$not_enter_lsf = 1;
} elsif ($ARGV[0] =~ /-localq/i) {
$local_q = 1;
} elsif ($ARGV[0] =~ /-localpath/i) {
$local_p = 1;
} elsif ($ARGV[0] =~ /-disable_autotcm/i) {
$disable_autotcm = "TRUE";
} elsif ($ARGV[0] =~ /-klocwork/i) {
$RUN_KLOCWORK = 1;
} elsif ($ARGV[0] =~ /-disk=(.*)/i) {
$localq_disk = $1;
} elsif ($ARGV[0] =~ /^-mbis=(.*)$/i) {
# mbis get argument
@mbis_arg = split(",", $1);
&mbis_parse_arg;
} elsif ($ARGV[0] =~ /-no_cgen/i) {
$target_option .= " REMAKE_WITH_CGEN=FALSE ";
} elsif ($ARGV[0] =~ /(-parallel|-pll)/i) {
if ($^O ne "MSWin32") {
$parallel_module_build="TRUE";
$target_option .= " PARALLEL=$parallel_module_build";
}
} elsif ($ARGV[0] =~ /(-no_parallel|-no_pll)/i) {
if ($^O ne "MSWin32") {
$parallel_module_build="FALSE";
$target_option .= " PARALLEL=$parallel_module_build";
}
} elsif ($ARGV[0] =~ /-dbld/i) {
#Add for daily build
$daily_build = 1;
} elsif ($ARGV[0] =~ /(-no_pcibt|-no_pc)\b/i) {
$no_pcibt = "TRUE";
} elsif ($ARGV[0] =~ /(-all_pcibt|-all_pc)\b/i) {
$all_pcibt = "TRUE";
} elsif ($ARGV[0] =~ /(-no_dsp)\b/i) {
$no_dsp = "TRUE";
} elsif ($ARGV[0] =~ /(-no_w)\b/i) {
$no_warning_as_error = "TRUE";
} elsif ($ARGV[0] =~ /(-ota_name)=(.*)$/i) {
$ota_name = $2;
} elsif ($ARGV[0] =~ /-no_ltelib/i) {
$no_ltelib = "TRUE";
$no_ltecgen = "TRUE";
} elsif($ARGV[0] =~ /^-test=(.*)$/i){
$VarioationProj_name = $1;
$VarioationProj_fullPath = "make/common/variation/${VarioationProj_name}.mak";
&cktheMF($VarioationProj_fullPath);
} elsif($ARGV[0] =~ /^-rel=(.*)$/i){
$chk_rel_pkg = $1;
} elsif ($ARGV[0] =~ /-force_getlte/i) {
$force_getlte = "TRUE";
} elsif ($ARGV[0] =~ /-smart/i) {
$smart = 1;
#$target_options .= " SMART_CHECK=TRUE ";
} elsif ($ARGV[0] =~ /(-checkFO_license)=(.*)$/i) {
$check_fo_license = "TRUE";
$license_info = $2;
} elsif ($ARGV[0] =~ /(-cust_lic)=(.*)$/i) {
$cust_lic = $2;
} elsif($ARGV[0] =~ /(-ccache_dir|-c_dir)=(.*)$/i){
$ccache_dir = $2;
mkpath($ccache_dir) or die "[make.pl][Error:] Can Not create $ccache_dir! $!" if(!-d "$ccache_dir");
$target_options .= " CCACHE_DIR=$ccache_dir";
} elsif($ARGV[0] =~ /(-ccache_size|-c_size)=(.*)$/i){
$ccache_size = $2;
$target_options .= " CCACHE_SIZE=$ccache_size";
} elsif($ARGV[0] =~ /(-ccache_basedir|-c_bd)=(.*)$/i){
$ccache_basedir = $2;
$target_options .= " CCACHE_BASEDIR=$ccache_basedir";
} elsif ($ARGV[0] =~ /^-no_dep$/i) {
$target_option .= " NO_DEP=TRUE";
} elsif ($ARGV[0] =~ /^-deterministic$/i) {
$determinism = "TRUE";
$target_option .= " DETERMINISTIC=TRUE";
}
else {
if($ARGV[0] =~ /(.+)\.mak/i) {
$project_makefile = $1;
if ($^O ne "MSWin32") {
if ($project_makefile =~ /^make\/projects\/(\S+)/) {
$project_makefile = $1;
}
}
writeMakeINI();
shift(@ARGV);
}
if (($project_makefile eq "") && ($enINI == 1) && (-e $ini)) {
open (FILE_HANDLE, "<$ini") or die "cannot open $ini\n";
while (<FILE_HANDLE>) {
if (/^(\S+)\s*=\s*(\S+)/) {
$keyname = $1;
$${keyname} = $2;
}
}
print "project_makefile=$project_makefile\n";
close FILE_HANDLE;
}
if($project_makefile =~ /\W/) {
($project_name,$flavor) = split (/\W/, $project_makefile);
}
else {
$project_name = $project_makefile;
}
print "project_name = $project_name\n";
print "flavor = $flavor\n";
($project_makefile eq "") && (die "Unrecognized \"$ARGV[0]\" or \"$ARGV[1]\"\nOr try $myCmd -h\n");
if ($#ARGV != -1) {
if ($ARGV[0] =~ /^[ucrUCR]$/) {
($action = "clean") if ($ARGV[0] =~ /^[cC]$/);
($action = "update") if ($ARGV[0] =~ /^[uU]$/);
($action = "remake") if ($ARGV[0] =~ /^[rR]$/);
shift(@ARGV);
@arguments = @ARGV;
@ARGV = ();
last;
} else {
if ($ENV{'MTK_INTERNAL'} eq 'TRUE') {
unshift(@actions, "bm_new", "bm_remake", "bm_update", "find", "ckmake");
unshift(@actions, "cmmgen");
unshift(@actions, "cfggen","ckmemlayout2");
}
if ((-d "MoDIS_VC9/MoDIS_lib") || (-d "mtk_rel/${original_project_name}/${original_flavor}/MODIS/MoDIS_lib")) {
unshift(@actions, "new_modis", "sys_mem_gen_modis", "new_uesim", "sys_mem_gen_uesim");
unshift(@actions, "gen_modis", "gen_uesim") if (-e "MoDIS_VC9/createMoDIS.pl");
unshift(@actions, "codegen_modis", "clean_codegen_modis", "umts_gen_modis", "codegen_uesim", "clean_codegen_uesim", "umts_gen_uesim", "distclean_modis", "distclean_uesim");
unshift(@actions, "remake_modis", "clean_modis", "update_modis", "remake_uesim", "clean_uesim", "update_uesim");
unshift(@actions, "c,r_modis", "c,u_modis", "c,r_uesim", "c,u_uesim");
unshift(@actions, "scan_modis");
if ($^O eq "MSWin32") {
unshift(@actions, "ap_modis", "ap_uesim");
}
}
foreach $act (@actions) {
if (lc($ARGV[0]) eq $act) {
$action = $act;
if (($act eq "bm_update") || ($act eq "bm_remake")) {
($action = "update") if ($act eq "bm_update");
($action = "remake") if ($act eq "bm_remake");
if ( $fullOpts !~ /-k/) {
($fullOpts eq "") ? ($fullOpts = "-k") : ($fullOpts .= " -k");
}
}
shift(@ARGV);
@arguments = @ARGV;
@ARGV = ();
last;
}
}
}
}
($action eq "") && (die "Unrecognized \"$ARGV[0]\"\nLack off one of (@actions)\nOr try $myCmd -h\n");
($#ARGV != -1) && (die "Unrecognized \"@ARGV\"\nPlease check again or try $myCmd -h\n");
last;
}
shift(@ARGV);
}
(!-d "make")&&(die "Folder \"make\" does NOT exist!\nPlease help to check.\n");
if(($ENV{'REDIRECT_OUT_DIR'} eq 'TRUE') && (defined $ENV{'OUT_DIR'})) {
$hostname = `hostname`;
system("perl -e \"print \'COMPUTERNAME=$hostname\';\" > \"${project_makefile}_cf.log\"");
}
$ENV{"PCIBT_NO_STOP"} = "TRUE" if ($action =~ /^(bm_new|bm_update|bm_remake)$/i);
$ENV{"CHK_RELPKG_ALL"} = "TRUE" if ($all_pcibt eq "TRUE");
$ENV{"DISABLE_AUTOTCM"} = "TRUE" if ($disable_autotcm eq "TRUE");
$update_dsp = "TRUE" if ($action =~ /update_dsp/);
my $check_obj_file = "";
my $obj_path;
if ($action !~ /_(modis|uesim)$/i) {
$obj_path = "./build/${project_name}/$flavor/bin/obj";
} else {
if ($action =~ /_(modis)$/i){
$obj_path = "./build/${project_name}/$flavor/MoDIS";
} elsif ($action =~ /_(uesim)$/i){
$obj_path = "./build/${project_name}/$flavor/UESim";
}
}
if($^O eq "linux"){
$check_obj_file = `find $obj_path -type f -name \"*.obj\"` if (-d "$obj_path");
}
if ($smart){
if ($check_obj_file eq "") {
print "Cannot find any object file under \"$obj_path\", start clean_new!\n";
$smart = 0;
} else {
print "Can find object files under \"$obj_path\", start smart_new!\n";
$target_options .= " SMART_CHECK=TRUE ";
}
}
if (($action !~ /_(modis|uesim)$/i) && ($action =~ /new|c,r|remake/i) && ($^O eq "MSWin32")) {
print "[Error:] Target build on Windows is not avaliable, please use the linux server to build Target!!\n";
exit 1;
}
if (($action =~ /^(new|rel)_(modis|uesim)$/i) || (($action =~ /^(bm_)?new$/i) && ($newMoDIS || $newUESim))) {
if ($pureMoDIS == 0) {
print "Auto turn on -puremodis when make $action\n";
$pureMoDIS = 1;
}
if ($^O ne "MSWin32") {
if($parallel_module_build eq "NONE") {
print "Auto turn on build modules in parallel (-pll) on Linux.\n";
$parallel_module_build = "TRUE";
$target_option .= " PARALLEL=$parallel_module_build";
}
}
}
# turn on building modules in parallel
if (($action eq "new" || $action eq "bm_new") && (-e "make/common/parallel.mak")) {
if($parallel_module_build eq "NONE") {
print "Auto turn on build modules in parallel (-pll) on Linux.\n";
$parallel_module_build = "TRUE";
$target_option .= " PARALLEL=$parallel_module_build";
}
}
if ((-e "mtk_tools/Perl") && ($] >= 5.008006)) {
use lib "mtk_tools/Perl";
use Net::SMTP;
}
if (($local_q == 1) && ($local_p != 1)) {
chomp(my $cwd = cwd());
$cwd =~ s/\//\\/g;
system("subst $localq_disk $cwd");
chdir("$localq_disk");
print "cwd = $cwd\n";
}
chomp($cwd = getcwd());
if ($cwd =~ /\s+/) {
$arrow = $cwd;
$arrow =~ s/\s/\^/g;
$arrow =~ s/[^\^]/ /g;
print "\n$cwd\n";
print "$arrow\n";
print "Space is not a legal character for a folder name.\nPlease check it !!\n";
exit 1;
}
sub cktheMF {
$the_makefile = $_[0];
(!-e $the_makefile) && (die "$the_makefile does NOT exist!\nPlease help to check.\n");
open (FILE_HANDLE, "<$the_makefile") or die "Cannot open $the_makefile. Please check if the file is READ-ONLY or not exists.\n";
while (<FILE_HANDLE>) {
if (/^(\w+)\b\s*=\s*(\S+)/) {
$keyname = lc($1);
$${keyname} = $2;
}
}
close FILE_HANDLE;
return 0;
}
# read the feature option from variation load makefile (ex: flavor)
if ($VarioationProj_name ne "") {
&cktheMF($VarioationProj_fullPath);
}
my $projectFolder = "build/${project_name}/$flavor";
if ($chk_cmd == 1) {
print "\n$projectFolder\n";
exit 0;
}
$original_projectFolder = $projectFolder;
writeMakeINI();
$tmpFolder = "$projectFolder/tmp";
if ($action =~ /_(modis|uesim)$/i) {
if ((-d "$projectFolder/MoDIS") && ($action =~ /new_modis/i) && ($m_in_lsf != 1) && (!$smart)) {
rmtree("$projectFolder/MoDIS");
}
if ((-d "$projectFolder/UESim") && ($action =~ /new_uesim/i) && ($m_in_lsf != 1) && (!$smart)) {
rmtree("$projectFolder/UESim");
}
($projectFolder, $tmpFolder) = &MoDIS_xgen_check($action);
}
if (($action eq "new" || $action eq "bm_new" ) && (!$smart)) {
if (-d "$projectFolder") {
opendir(DIR, $projectFolder) or die "Couldn't open directory, $!";
while ($file = readdir DIR) {
if ($file ne "." && $file ne ".." && $file ne "MoDIS" && $file ne "UESim") {
print "Clean folder : $projectFolder/$file \n";
rmtree("$projectFolder/$file");
}
}
closedir DIR;
}
my $buildInternalFolder = "build_internal/${project_name}/$flavor";
if (-d "$buildInternalFolder") {
opendir(DIR, $buildInternalFolder) or die "Couldn't open directory, $!";
while ($file = readdir DIR) {
if ($file ne "." && $file ne ".." && $file ne "MoDIS" && $file ne "UESim") {
print "Clean folder : $buildInternalFolder/$file \n";
rmtree("$buildInternalFolder/$file");
}
}
closedir DIR;
}
}
my @sm_logs=glob("$projectFolder/bin/log/smart_log* $projectFolder/UESim/_BUILD_XGEN/bin/log/smart_log* $projectFolder/MoDIS/_BUILD_XGEN/bin/log/smart_log*");
unlink @sm_logs or die "Error: Cannot remove smart log files, please check!\n" if(@sm_logs);
$tk_md_cus = "";
$plat = "NONE";
$targetFolder = "$projectFolder/bin";
$logFolder = "$targetFolder/log";
$enFile = "${makeFolder}${project_name}_en.def";
$disFile = "${makeFolder}${project_name}_dis.def";
$theVerno = "make/common/Verno.bld";
$toolsFolder = "tools/";
$MTKtoolsFolder = "mtk_tools/";
$ori_prj_make_full_path = "${projMakeFolder}${project_makefile}.mak";
$theMF = $ori_prj_make_full_path;
&cktheMF($theMF);
if(defined $modem_spec && $modem_spec ne "NONE") {
$theMF_modem = "make/common/modem_spec/${modem_spec}.mak";
&cktheMF($theMF_modem);
}
my $tk_md_cus_full_path;
if (($tk_md_cus ne "") && ($tk_md_cus ne "NONE")) {
$tk_md_cus_full_path = "make/projects/tk_md_cus/${tk_md_cus}.mak";
if (-e "$tk_md_cus_full_path") {
&cktheMF($tk_md_cus_full_path);
} else {
print ("Error: TK_MD_CUS \"$tk_md_cus_full_path\" file does not exist in codebase, please check!\n");
exit 1;
}
}
if ($eutran_mode_support eq "NONE") {
$no_ltelib = "TRUE";
$no_ltecgen = "TRUE";
}
my $action_flag = "TARGET";
$action_flag = "UESIM" if ($action =~ /_(uesim)$/i);
$action_flag = "MODIS" if ($action =~ /_(modis)$/i);
if (($force_getlte eq "TRUE") && (-e "mtk_rel/$project_name/$flavor/$action_flag/label.ini.LTE")) {
unlink("mtk_rel/$project_name/$flavor/$action_flag/label.ini.LTE") or die "[make.pl][Error:] mtk_rel/$project_name/$flavor/$action_flag/label.ini.LTE $!";
print "Remove mtk_rel/$project_name/$flavor/$action_flag/label.ini.LTE successful\n";
}
if ((-e "label.ini") && (!-d "make/common/rel/mpd/5g") && ($no_ltelib eq "FALSE") && ($no_ltecgen eq "FALSE") && ($flavor!~ /BASIC/i) &&
(($action =~ /getusr/i) || ($action =~ /new/i) || ($action =~ /update/i) || ($action =~ /remake/i) || ($action =~ /codegen/i) || ($action =~ /c,u/i) || ($action =~/c,r/i))) {
if (-e "mtk_tools/USR/LTEUSR_Initial.pl") {
$result = system("perl mtk_tools/USR/LTEUSR_Initial.pl $project_name $flavor $action_flag $smart");
exit 1 if ($result);
} else {
die "[Error:] mtk_tools/USR/LTEUSR_Initial.pl is not exist!!\n";
}
die "[Error:] mtk_rel/$project_name/$flavor/$action_flag/MoDIS_lib is not exist, $project_name($flavor) can't build modis!!\n" if (($action =~ /_(modis)$/i) && (!-d "mtk_rel/$project_name/$flavor/$action_flag/MoDIS_lib"));
die "[Error:] mtk_rel/$project_name/$flavor/$action_flag/UESim_lib is not exist, $project_name($flavor) can't build uesim!!\n" if (($action =~ /_(uesim)$/i) && (!-d "mtk_rel/$project_name/$flavor/$action_flag/UESim_lib"));
die "[Error:] mtk_rel/$project_name/$flavor/$action_flag/lib is not exist, $project_name($flavor) can't build target!!\n" if (($action !~ /_(uesim|modis)$/i) && (!-d "mtk_rel/$project_name/$flavor/$action_flag/lib"));
}
if ((-e "label.ini") && ($no_dsp eq "FALSE") && ($^O ne "MSWin32") && ($action !~ /_(modis|uesim)$/) &&
(($action =~ /getusr/i) || ($action =~ /new/i) || ($action =~ /update/i) || ($action =~ /remake/i) || ($action =~ /codegen/i) || ($action =~ /c,u/i) || ($action =~/c,r/i))){
if (-e "mtk_tools/USR/DSPUSR_Initial.pl") {
$result = system("perl mtk_tools/USR/DSPUSR_Initial.pl $project_name $flavor $dsp_project $dsp_flavor");
exit 1 if ($result);
} else {
die "[Error:] mtk_tools/USR/DSPUSR_Initial.pl is not exist!!\n";
}
die "[Error:] mtk_rel/$project_name/$flavor/dsp_rel is not exist, $project_name($flavor) can't build target!!\n" if (($action !~ /_(uesim|modis)$/i) && (!-d "mtk_rel/$project_name/$flavor/dsp_rel"));
}
# to prevent redundant dsp_package.log
if ($no_dsp eq "TRUE") {
system ("rm -f $projectFolder/bin/log/dsp_package.log") if (-e "$projectFolder/bin/log/dsp_package.log");
}
if ((-e "label.ini") && (!-e "make/common/rel/hq/USR.txt")&&
(($action =~ /getusr/i) || ($action =~ /new/i) || ($action =~ /update/i) || ($action =~ /remake/i) || ($action =~ /codegen/i) || ($action =~ /c,u/i) || ($action =~/c,r/i))){
if (-e "mtk_tools/USR/CBrUSR_Initial.pl") {
$result = system("perl mtk_tools/USR/CBrUSR_Initial.pl $project_name $flavor $original_flavor $action_flag $smart");
exit 1 if ($result);
} else {
die "[Error:] mtk_tools/USR/CBrUSR_Initial.pl is not exist!!\n";
}
die "[Error:] mtk_rel/$project_name/$flavor/$action_flag/MoDIS_lib is not exist, $project_name($flavor) can't build modis!!\n" if (($action =~ /_(modis)$/i) && (!-d "mtk_rel/$project_name/$flavor/$action_flag/MoDIS_lib"));
die "[Error:] mtk_rel/$project_name/$flavor/$action_flag/UESim_lib is not exist, $project_name($flavor) can't build uesim!!\n" if (($action =~ /_(uesim)$/i) && (!-d "mtk_rel/$project_name/$flavor/$action_flag/UESim_lib"));
die "[Error:] mtk_rel/$project_name/$flavor/$action_flag/lib is not exist, $project_name($flavor) can't build target!!\n" if (($action !~ /_(uesim|modis)$/i) && (!-d "mtk_rel/$project_name/$flavor/$action_flag/lib"));
}
if ((-e "label.ini") && (-e "make/common/rel/hq/USR.txt")&& (!-d "make/common/rel/mpd")&&
(($action =~ /getusr/i) || ($action =~ /new/i) || ($action =~ /update/i) || ($action =~ /remake/i) || ($action =~ /codegen/i) || ($action =~ /c,u/i) || ($action =~/c,r/i))){
if (-e "mtk_tools/USR/SwUSR_Initial.pl") {
$result = system("perl mtk_tools/USR/SwUSR_Initial.pl $project_name $flavor $action_flag $smart");
exit 1 if ($result);
} else {
die "[Error:] mtk_tools/USR/CBrUSR_Initial.pl is not exist!!\n";
}
die "[Error:] mtk_rel/$project_name/$flavor/$action_flag/MoDIS_lib is not exist, $project_name($flavor) can't build modis!!\n" if (($action =~ /_(modis)$/i) && (!-d "mtk_rel/$project_name/$flavor/$action_flag/MoDIS_lib"));
die "[Error:] mtk_rel/$project_name/$flavor/$action_flag/UESim_lib is not exist, $project_name($flavor) can't build uesim!!\n" if (($action =~ /_(uesim)$/i) && (!-d "mtk_rel/$project_name/$flavor/$action_flag/UESim_lib"));
die "[Error:] mtk_rel/$project_name/$flavor/$action_flag/lib is not exist, $project_name($flavor) can't build target!!\n" if (($action !~ /_(uesim|modis)$/i) && (!-d "mtk_rel/$project_name/$flavor/$action_flag/lib"));
}
my @delTempFile = glob("$tmpFolder/*.*");
#unlink(@delTempFile) or die "[make.pl][Error:] Remove failed @delTempFile $!" if(@delTempFile); #mark for smart new
unlink("$tmpFolder/~buildinfo.tmp") or die "[make.pl][Error:] Remove failed $tmpFolder/~buildinfo.tmp $!" if(-e "$tmpFolder/~buildinfo.tmp");
unlink("$tmpFolder/~remakemod.tmp") or die "[make.pl][Error:] Remove failed $tmpFolder/~remakemod.tmp $!" if(-e "$tmpFolder/~remakemod.tmp");
unlink("$tmpFolder/~cleanmod.tmp") or die "[make.pl][Error:] Remove failed $tmpFolder/~cleanmod.tmp $!" if(-e "$tmpFolder/~cleanmod.tmp");
unlink("$tmpFolder/~updatemod.tmp") or die "[make.pl][Error:] Remove failed $tmpFolder/~updatemod.tmp $!" if(-e "$tmpFolder/~updatemod.tmp");
unlink("$tmpFolder/~scanmod.tmp") or die "[make.pl][Error:] Remove failed $tmpFolder/~scanmod.tmp $!" if(-e "$tmpFolder/~scanmod.tmp");
mkpath($tmpFolder) or die "[make.pl][Error:] Can Not create $tmpFolder! $!" if(!-d "$tmpFolder");
mkpath($logFolder) or die "[make.pl][Error:] Can Not create $logFolder! $!" if(!-d "$logFolder");
mkpath($targetFolder) or die "[make.pl][Error:] Can Not create $targetFolder! $!" if(!-d "$targetFolder");
if(-e "make/common/rel/hq/USR.txt")
{
my $rel_err_msg = "";
my $output_file = "$targetFolder/all_mod_rel.mak";
unlink $output_file or die "[make.pl][Error:] Remove failed $output_file" if(-e $output_file);
$rel_err_msg .= `perl ./mtk_tools/USR/genModuleRel.pl REL_CR $output_file`;
$rel_err_msg .= `perl ./mtk_tools/USR/genModuleRel.pl REL_SUB $output_file`;
#Check if module's MPD/Custom rel definition is duplicate
if (($rel_err_msg ne "") && ($no_pcibt ne "TRUE"))
{
print "$rel_err_msg";
print "Please refer http://wiki/display/MOLY/How+to+add+a+new+module for rel setting.\n";
exit 1;
}
}
# generate custom.bld
&genCustombld();
# smybol link to central tool chain if it's in MTK_INTERNAL
my $central_compiler_path = "/mtkoss/imgtec/gcc-mips-mti-elf.2016.05-08/4.9.2/linux";
my $compiler_path = "./tools/GCC/MIPS/4.9.2";
if ($compiler_ver eq "MIPS_GCCV6"){
$central_compiler_path = "/mtkoss/imgtec/gcc-mips-mti-elf.2017.10-08/6.3.0/linux";
$compiler_path = "./tools/GCC/MIPS/6.3.0";
if ($compiler_isa eq "NANOMIPS"){
$central_compiler_path = "/mtkoss/imgtec/gcc-nanomips-elf.2019.03-06/6.3.0/linux";
$compiler_path = "./tools/GCC/NANOMIPS/6.3.0";
}
} elsif ($compiler_ver eq "MIPS_GCCV4"){
$central_compiler_path = "/mtkoss/imgtec/gcc-mips-mti-elf.2016.05-08/4.9.2/linux";
$compiler_path = "./tools/GCC/MIPS/4.9.2";
}
if(-l "$compiler_path/linux") {
$exist_symlink_path = readlink("$compiler_path/linux");
if($exist_symlink_path ne "$central_compiler_path") {
system("rm -f $compiler_path/linux");
}
}
if(!-l "$compiler_path/linux" && !-d "$compiler_path/linux" && -d "$central_compiler_path") {
mkpath("$compiler_path") if(!-d "$compiler_path");
system("ln -s $central_compiler_path $compiler_path");
}
if ($action =~ /_(modis|uesim)$/ && !-d "$projectFolder/vs2017_header" && $^O eq "linux") {
print "Create vs2017 symbolic link ...\n";
system("./mtk_tools/vs2017/gen_symbolic.sh $projectFolder/vs2017_header 2>/dev/null");
}
# concatenate the project makefiles and the result is placed on build/$project/$flavorn/bin.
# In here, the gen_concatenate_proj target does NOT do PCIBT.
$concatenate_proj_mak = "${targetFolder}/~${project_makefile}.mak";
my $gen_concate_option = "";
my $modis_config = "FALSE";
$gen_concate_option = $target_option;
if ($action =~ /_(modis|uesim)$/i) {
$gen_concate_option .= " MODIS_CONFIG=TRUE";
$modis_config = "TRUE";
}
$gen_concate_option .= " NO_PCIBT=TRUE";
#backup log files for smart build
if (($smart) && ($^O ne "MSWin32")) {
my $backup_logFolder = "${logFolder}_bak";
my $move_log_file = "$backup_logFolder/log_move.log";
mkdir("$backup_logFolder") if (!-d "$backup_logFolder");
system("rm -f $move_log_file") if (-e "$move_log_file");
opendir(DIR, $logFolder) or die "Couldn't open directory, $!";
while ($file = readdir DIR) {
if ($file ne "." && $file ne ".." ) {
system("echo Move log files from $logFolder to $backup_logFolder: $file >> $move_log_file");
#print "Move log files from $logFolder to $backup_logFolder: $file\n";
if (-d "$logFolder/$file") {
system ("cp -pr $logFolder/$file $backup_logFolder");
system ("rm -rf $logFolder/$file");
} else {
if ($file =~ /info(.*)\.log/) {
system ("cp -p $logFolder/$file $backup_logFolder");
} else {
system ("mv $logFolder/$file $backup_logFolder");
}
}
}
}
closedir DIR;
}
my $return_code = system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options \"VARIATION_PROJ=$VarioationProj_name\" $gen_concate_option gen_concatenate_proj");
die "Error: concatenate project makefiles failed." if(($return_code >> 8) ne 0);
(!-e $concatenate_proj_mak) && (die "$concatenate_proj_mak does NOT exist!\nPlease help to check.\n");
print "concatenate_proj_mak = $concatenate_proj_mak\n";
$theMF = $concatenate_proj_mak;
&cktheMF($theMF);
exit 0 if($action eq "getusr");
#add oriaction to store original action
my $oriaction = $action;
# for initial mbis config
&mbis_init;
&mbis_start_probe;
# mbis options
system("echo MBIS_EN=$mbis_en >> $tmpFolder/~buildinfo.tmp");
system("echo MBIS_EN_OBJ_LOG=$mbis_en_obj_log >> $tmpFolder/~buildinfo.tmp");
system("echo NO_LTELIB=$no_ltelib >> $tmpFolder/~buildinfo.tmp");
system("echo NO_LTECGEN=$no_ltecgen >> $tmpFolder/~buildinfo.tmp");
system("echo NO_PCIBT=$no_pcibt >> $tmpFolder/~buildinfo.tmp");
system("echo MCF_OTA_NAME=$ota_name >> $tmpFolder/~buildinfo.tmp");
system("echo MODIS_CONFIG=$modis_config >> $tmpFolder/~buildinfo.tmp");
system("echo NO_DSP=$no_dsp >> $tmpFolder/~buildinfo.tmp");
system("echo NO_WARNING_AS_ERROR=$no_warning_as_error >> $tmpFolder/~buildinfo.tmp");
system("echo CHECK_FO_LICENSE=$check_fo_license >> $tmpFolder/~buildinfo.tmp");
system("echo LICENSE_INFO=$license_info >> $tmpFolder/~buildinfo.tmp");
system("echo CUST_LIC=$cust_lic >> $tmpFolder/~buildinfo.tmp");
system("echo VARIATION_PROJ=$VarioationProj_name >> $tmpFolder/~buildinfo.tmp");
system("echo ORIACTION=$action >> $tmpFolder/~buildinfo.tmp");
system("echo SRC_MAX_PACKAGE=$chk_rel_pkg >> $tmpFolder/~buildinfo.tmp");
if (($action ne "ckmake") && ($action ne "drv_feature_check")) {
if ($m_in_lsf != 1) {
# Before executing actions, dump environment information to the build.log
system("echo USERNAME=$ENV{'USERNAME'} > $targetFolder/build.log");
system("perl -e \"print \'START TIME=\';\" >> $targetFolder/build.log");
system("perl tools/time.pl -n >> $targetFolder/build.log");
}
}
# Get network path
open (FILE_HANDLE, ">$tmpFolder/~net_path.tmp") or die "Cannot open $tmpFolder/~net_path.tmp";
if ($ENV{'MTK_INTERNAL'} eq 'TRUE') {
$net_path = &get_net_path;
print FILE_HANDLE "NET_PATH = $net_path\n";
}
close FILE_HANDLE;
if(-e $theVerno) {
open (FILE_HANDLE, "<$theVerno") or die "cannot open $theVerno\n";
while (<FILE_HANDLE>) {
if ((/^([^\#]*)\#?.*/) && ($1 =~ /^(\w+)\s*=\s*(.*\S)\s*$/)) {
$keyname = lc($1);
$${keyname} = uc($2);
}
}
close FILE_HANDLE;
}
die "Please define VERNO in project makefile or $theVerno." if($verno eq "");
if ($verno =~ /\s+/) {
$arrow = $verno;
$arrow =~ s/\s/\^/g;
$arrow =~ s/[^\^]/ /g;
print "\n$verno\n";
print "$arrow\n";
print "Space is not a legal character for VERNO name.\nPlease check it !!\n\n";
exit 1;
}
# Get custom_release value
open (FILE_HANDLE, "<make/common/Custom.bld") or die "Cannot open make/common/Custom.bld\n";
while (<FILE_HANDLE>) {
if (/^(\S+)\s*=\s*(\S+)/) {
$keyname = lc($1);
if(defined($${keyname}) && $${keyname} ne ""){
next;
}
#defined($${keyname}) && warn "$1 redefined in $thefile!\n";
$${keyname} = uc($2);
}
}
close FILE_HANDLE;
# To check if FLAVOR length is less than 36 bytes
die "ERROR: FLAVOR name should be less than 36 characters.\n" if(length($flavor)>36);
die "ERROR: ORIGINAL_PROJECT_NAME name should be less than 128 characters.\n" if(length($original_project_name)>128);
die "ERROR: ORIGINAL_FLAVOR name should be less than 36 characters.\n" if(length($original_flavor)>36);
die "ERROR: ORIGINAL_VERNO name should be less than 64 characters.\n" if(defined $original_verno && length($original_verno)>64);
if ($^O ne "MSWin32") {
@tools_Dirs = qw(tools/);
} else {
@tools_Dirs = qw(tools/ tools/MinGW tools/MSYS);
}
push (@tools_file,$makeCmd);
foreach $tools_Dirs (@tools_Dirs) {
if (!-d $tools_Dirs) {
warn "$tools_Dirs folder does NOT exist!\n";
&cp_3rdpartyTool;
}
}
foreach $tools_file (@tools_file) {
if (!-e $tools_file) {
warn "$tools_file does NOT exist!\n";
&cp_3rdpartyTool;
}
}
my $strBypassMoDIS = 0;
my $notify_list;
if ($^O eq "MSWin32") {
if ($ENV{'LTE_DOMAIN'} eq "TRUE") {
$notify_list = "\\\\mtklwafs01\\moly\\wcpsm\\config\\bm_conf.ini";
} else {
$notify_list = "\\\\glbfs14\\sw_releases\\3rd_party\\Scripts\\BM_conf.ini";
}
}
$notify_list = "/mtkeda/wcpsm/bm/config/bm_conf.ini" if($^O eq "linux");
if (($ENV{'MTK_INTERNAL'} eq 'TRUE') && (-e "$notify_list")) {
%BM_conf = iniToHash($notify_list);
if ($bypassMoDIS > -1) {
$strBypassMoDIS = $BM_conf{'MODIS_RULE'}->{'MODIS_BYPASS'};
}
}
if ($ENV{"NUMBER_OF_PROCESSORS"} > 1) {
$PROCESS_NUM = $ENV{"NUMBER_OF_PROCESSORS"};
if($fullOpts !~ /-j/) {
($fullOpts eq "") ? ($fullOpts = "-j$PROCESS_NUM") : ($fullOpts .= " -j$PROCESS_NUM");
}
if ($mbis_en eq "TRUE") {
$mbis_num_proc = $PROCESS_NUM;
}
}
if ($m_in_lsf == 1) {
die "NOT IN LSF SERVER!\n" if ($ENV{"LS_ADMINNAME"} eq "");
$computerName = $ENV{"COMPUTERNAME"};
if ($local_q != 1) {
system("echo set LAST_SUBMITTED_CF=$computerName > build/last_cf.log");
$ENV{"TMP"} = "e:\\temp";
$ENV{"TEMP"} = "e:\\temp";
mkdir("e:/temp") if (!-d "e:/temp");
}
$ENV{"INLSF"} = $computerName;
}
if ($bypassMoDIS > -1) {
$bypassMoDIS = int(eval($strBypassMoDIS));
}
if ($ENV{COMPUTERNAME} =~ /mtks(cf|ib)/i) {
$m_in_lsf = 1;
}
if (($m_in_lsf == 0) && ($not_enter_lsf != 1)) {
if ($action =~ /^(bm_new|bm_update|bm_remake)$/i) {
system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options drv_feature_check") && exit 1;
}
if (($action =~ /new/i) && ($action !~ /new_viti/i) && ($ENV{"SESSIONNAME"} ne "") &&
($ENV{"LSF_BINDIR"} ne "") && ($project !~ /BASIC/i) && ($project !~ /L1S/i) && ($project !~ /UDVT/i) && ($ENV{'MTK_INTERNAL'} eq 'TRUE')) {
chomp($cwd = cwd());
if ($cwd =~ /^[abg-z]/i) {
&pre_gen() if (($pureMoDIS == 1) || ((lc($action) ne "new_modis") && (lc($action) ne "new_uesim")));
$env_last_S_CF = "";
$lastSC = "build/last_cf.log";
if ((-e $lastSC) && (open(LOGF, "${lastSC}"))) {
while (<LOGF>) {
if (/set LAST_SUBMITTED_CF=(\S+)/) {
$env_last_S_CF = $1;
last;
}
}
close(LOGF);
}
if ($mbis_en eq "TRUE") {
$mbis_time = time;
system("echo T_S,DISPATCH_CF,P,$mbis_time >>$ENV{MBIS_BUILD_TIME_TMP}");
}
my $result = 0;
if ($env_last_S_CF eq "") {
$result = system("bsub -I \"perl $net_path\\m_cp2lsf.pl\" \"$net_path\" @orgARGV");
} else {
if (($output = `bhosts ${env_last_S_CF} mtkcf 2>&1`) =~ / Bad host name, host group name or cluster name/) {
$result = system("bsub -I \"perl $net_path\\m_cp2lsf.pl\" \"$net_path\" @orgARGV");
} else {
$result = system("bsub -I -m \"${env_last_S_CF}+2 mtkcf+1\" \"perl $net_path\\m_cp2lsf.pl\" \"$net_path\" @orgARGV");
}
}
&writeINI;
exit $result >> 8;
} else {
# make new in local E: driver
if (($ENV{"SESSIONNAME"} ne "") && ($ENV{"LSF_BINDIR"} ne "") && ($compiler eq "RVCT") && ($ENV{'MTK_INTERNAL'} eq 'TRUE')) {
&localq;
}
}
}
}
if ($action eq "c,r") {
@theAct = qw(clean remake);
} elsif ($action eq "c,u") {
@theAct = qw(clean update);
} elsif ($action eq "c,r_modis") {
@theAct = ("clean_modis remake_modis");
} elsif ($action eq "c,u_modis") {
@theAct = ("clean_modis update_modis");
} elsif ($action eq "c,r_uesim") {
@theAct = ("clean_uesim remake_uesim");
} elsif ($action eq "c,u_uesim") {
@theAct = ("clean_uesim update_uesim");
} else {
@theAct = ($action);
}
if ($newMoDIS == 1) {
# make sure set $mbis_target_build_with_Modis should be after localq
$mbis_target_build_with_Modis = 1;
if ($action =~ /^c,r(_modis|_uesim)?$/) {
push(@theAct, "clean_modis remake_modis");
} elsif ($action =~ /^c,u(_modis|_uesim)?$/) {
push(@theAct, "clean_modis update_modis");
} else {
my $action2 = $action;
$action2 =~ s/_(modis|uesim)$//ig;
push(@theAct, $action2 . "_modis");
}
}
if ($newUESim == 1) {
$mbis_target_build_with_Modis = 1;
if ($action =~ /^c,r(_modis|_uesim)?$/) {
push(@theAct, "clean_uesim remake_uesim");
} elsif ($action =~ /^c,u(_modis|_uesim)?$/) {
push(@theAct, "clean_uesim update_uesim");
} else {
my $action2 = $action;
$action2 =~ s/_(modis|uesim)$//ig;
push(@theAct, $action2 . "_uesim");
}
}
if (($action ne "ckmake") && ($action ne "drv_feature_check")) {
# Before executing actions, dump environment information to the build.log
if(-e "./SubReleaseConfig.ini") {
print "copy ./SubReleaseConfig.ini $targetFolder";
copy("./SubReleaseConfig.ini", $targetFolder);
}
system("perl -e \"print \'BUILD START TIME=\';\" >> $targetFolder/build.log");
system("perl tools/time.pl -n >> $targetFolder/build.log");
system("echo NUMBER_OF_PROCESSORS=$ENV{\"NUMBER_OF_PROCESSORS\"} >>$targetFolder/build.log");
&mbis_info_probe;
}
# check current working folder length
# if it is too long, it will cause build error. The max length is defined 90 characters.
chomp($cwd = cwd());
$len = length($cwd);
$folder_limit = 90;
if($^O eq "MSWin32" && $len > $folder_limit) {
if ($cwd =~ /.+\\(.+)/) {
$folder_name = $1;
}
print "Folder: $cwd\n";
print "Warning: The folder length from $folder_name($len characters) exceeds $folder_limit characters. Please reduce folder lengths!\n";
system("echo Warning: The folder path from $folder_name($len characters) exceeds $folder_limit characters. > $tmpFolder/~path_length.tmp");
}
my $result = 0;
my %saw;
@theAct = grep (!$saw{$_}++, @theAct);
foreach my $action (@theAct) {
$ENV{"ACTION"} = $action;
if ($action =~ /_(modis|uesim)$/i) {
($projectFolder, $tmpFolder) = &MoDIS_xgen_check($action);
}
&gen_buildinfo_tmp;
if ($action =~ /\b(clean)_(modis|uesim)\b/) {
if ($#arguments != -1) {
system("echo DO_CLEAN_MODULE=TRUE > $tmpFolder/~cleanmod.tmp");
system("echo CLEAN_MODS=@arguments >> $tmpFolder/~cleanmod.tmp");
}
}
if ($action eq "clean") {
if ($#arguments != -1) {
system("echo DO_CLEAN_MODULE=TRUE > $tmpFolder/~cleanmod.tmp");
system("echo CLEAN_MODS=@arguments >> $tmpFolder/~cleanmod.tmp");
system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options cleanmod");
} else {
system("echo DO_CLEAN_MODULE=FALSE > $tmpFolder/~cleanmod.tmp");
system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options cleanall");
}
} elsif (($action eq "remake") || ($action =~ /\b(remake)_(modis|uesim)\b/)) {
if ($#arguments != -1) {
system("echo DO_REMAKE_MODULE=TRUE > $tmpFolder/~remakemod.tmp");
system("echo REMAKE_MODS=@arguments >> $tmpFolder/~remakemod.tmp");
system("echo L_REMAKE_MODS=@l1core_arguments >> $tmpFolder/~remakemod.tmp");
}
} elsif (($action eq "update") || ($action =~ /\b(gen|update)_(modis|uesim)\b/)) {
if ($#arguments != -1) {
system("echo DO_UPDATE_MODULE=TRUE > $tmpFolder/~updatemod.tmp");
system("echo UPDATE_MODS=@arguments >> $tmpFolder/~updatemod.tmp");
}
} elsif (($action eq "scan") || ($action =~ /\b(scan)_(modis|uesim)\b/)) {
if ($#arguments != -1) {
system("echo DO_SCAN_MODULE=TRUE > $tmpFolder/~scanmod.tmp");
system("echo SCAN_MODS=@arguments >> $tmpFolder/~scanmod.tmp");
}
} elsif (($action eq "new") || ($action eq "bm_new") || ($action eq "codegen") || ($action =~ /_(modis|uesim)\b/)) {
# empty here to run through BT switch
} elsif ($action eq "check_scan") {
if ($#arguments != -1) {
system("echo DO_SCAN_MODULE=TRUE > $tmpFolder/~scanmod.tmp");
system("echo SCAN_MODS=@arguments >> $tmpFolder/~scanmod.tmp");
}
system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options CHECK_SCAN=TRUE scan");
} elsif ($action eq "check") {
system("perl ${toolsFolder}parse_comp_err.pl $projectFolder FALSE $tmpFolder TRUE");
} elsif ($action eq "check_dep") {
&Usage if (!@arguments);
&writeINI;
system("perl tools/GetDepMod.pl ./ \"$theMF\" $project_name $flavor @arguments") && exit 1;
exit 0;
} elsif ($action =~ /update_dep|remake_dep/i) {
&Usage if (!@arguments);
print "Scanning dependency modules...\n";
my $output;
if (($output = `perl tools/GetDepMod.pl ./ \"$theMF\" $project_name $flavor @arguments 2>&1`) =~ /=+DEPENDENCY MODULE\(S\)=+\n(.*)\n/) {
@arguments = split(/\s+/,$1);
$action = "update" if ($action eq "update_dep");
$action = "remake" if ($action eq "remake_dep");
print "The following module(s) will be rebuilt!\n";
print "===========================================================\n";
print "@arguments","\n";
print "===========================================================\n";
redo; # redo to generate ${makeFolder}~remakemod.tmp
} else {
print $output;
&writeINI;
exit 1;
}
} elsif ($action eq "memquery") {
#invoke memquery according to SINGLE_CORE_ONLY feature option defined in project makefile respectively
if ($#arguments != -1) {
system("echo \"@arguments\" > $tmpFolder/~memquery.tmp");
}
system("${makeCmd} -f ${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options memquery");
} else {
if ($action !~ /^ckmake$/i) {
$result = system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options $target_option ckmake");
die "Error: ckmake failed!!!\n" if($result != 0);
}
$result = system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options $target_option $action");
if($result != 0) {
&error_handle;
} else{
&mbis_success if ($mbis_en eq "TRUE");
if (($custom_release eq "FALSE") && ($ENV{'MTK_INTERNAL'} eq 'TRUE')&& (-e "mtk_tools\\Internal_function.pm")) {
die "AAPMC parser Error!!!\n" if ($result != 0)
}
}
next;
}
if (($action eq "remake") || ($action eq "update") || ($action eq "new") || ($action eq "bm_new") || ($action eq "scan") || ($action eq "codegen") || ($action =~ /^new_(modis|uesim)$/i)) {
$result = system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options $target_option ckmake");
die "Error: ckmake failed!!!\n" if($result != 0);
}
if (($action eq "remake") || ($action eq "update") || ($action eq "new") || ($action eq "bm_new") || ($action eq "scan")) {
if ($action eq "bm_new") {
system("echo BM_NEW=TRUE >> $tmpFolder/~buildinfo.tmp");
#Add for daily build
if ($daily_build){
system("echo DAILY_BUILD=TRUE >> $tmpFolder/~buildinfo.tmp");
}
$result = system("${makeCmd} -f${makeFolder}${myMF} -k -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options $target_option new");
} else {
$result = system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options $target_option $action");
}
if ($result == 0) {
if (($custom_release eq "FALSE") && ($ENV{'MTK_INTERNAL'} eq 'TRUE')&& (-e "mtk_tools\\Internal_function.pm")) {
$result = &AAPMC::Parse_AAPMCLog($AAPMCLOG,$project_name,$flavor,"$theMF");
die "AAPMC parser Error!!!\n" if ($result != 0)
}
&mbis_success if ($mbis_en eq "TRUE");
} else {
system("perl $mbis -i SUCCESSFUL_BUILD,0") if ($mbis_en eq "TRUE");
&error_handle;
}
last if ($mbis_target_build_with_Modis != 1);
} elsif ($action =~ /_(modis|uesim)\b/) {
$result = &MoDIS_build_process($action);
} elsif ($action eq "codegen") {
$result = system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options code_generate");
#mbis end probe
if ($result == 0) {
&mbis_success if ($mbis_en eq "TRUE");
}
}
if ($result != 0) {
system("perl $mbis -i SUCCESSFUL_BUILD,0") if ($mbis_en eq "TRUE");
print "Failed in $action\n";
last;
}
}
# [Linux] temporarily add
unlink("nul") if($^O eq "linux" && -e "nul");
unlink("NUL") if($^O eq "linux" && -e "NUL");
&writeINI;
if (($m_in_lsf != 1) && ($mbis_target_build_with_Modis == 1)) {
&mbis_end_probe;
}
#die "make.pl\n" if ($result != 0);
exit $result >> 8;
sub MoDIS_build_process {
my $modis_action = shift @_;
my $modis_result = 0;
if ($bypassMoDIS < 1) {
system("perl $mbis -t T_S,M_TOTAL,M_P") if ($mbis_en eq "TRUE");
my $modis_option = $target_option . " MODIS_CONFIG=TRUE PARTIAL_SOURCE=FALSE";
if (($modisDir ne "") && ($modisDir ne "undef")) {
$modis_option .= " MODIS_MODE=$modisDir";
} else {
$modisDir = "undef";
}
$modis_action =~ s/\b(bm)_//ig;
if ($modis_action =~ /_uesim\b/) {
$modis_action =~ s/_uesim\b/_modis/g;
$modis_option .= " UE_SIMULATOR=TRUE";
}
my $modis_cwd = cwd();
$modis_cwd =~ s/\//\\/g if ($^O eq "MSWin32");
my $modis_subst = "";
if (($^O eq "MSWin32") && ($modis_action !~ /^(gen|clean|scan|ap|at|rel)_(modis|uesim)$/i)) {
foreach my $disk (k..z) {
if (system("subst $disk: $modis_cwd\\.. >NUL 2>&1") == 0) {
$modis_subst = $disk;
last;
}
}
if ($modis_subst ne "") {
print "MoDIS subst disk for $modis_cwd is $modis_subst:\n";
chdir("$modis_subst:\\mcu\\");
} else {
warn "Warning: Execute subst for MoDIS fail !\n";
}
}
$modis_action = "new $modis_action" if ($pureMoDIS == 1);
$modis_action = "bullseye_config new $modis_action" if (($modis_option =~/BULLSEYE_CONFIG=TRUE/) && ($pureMoDIS == 1));
$modis_result = system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options $modis_option $modis_action");
chdir($modis_cwd);
system("subst $modis_subst: /D >NUL") if ($modis_subst ne "");
if ($modis_result == 0) {
if ($modis_action =~ /\b(new|remake|update)_(modis|uesim)\b/) {
system("perl $mbis -i SUCCESSFUL_BUILD,1") if ($mbis_en eq "TRUE");
#rel_atMoDIS
}
if (($modis_action eq "at_modis") || ($atMoDIS == 1)) {
chdir("$modis_cwd\\MoDIS_VC9");
$modis_result = system("perl modisAutoTest.pl at_modis $modisDir ..\\$theMF ..\\$theVerno");
chdir("$modis_cwd");
}
}
system("perl $mbis -t T_E,M_TOTAL,M_P") if ($mbis_en eq "TRUE");
} else {
print "Skip $modis_action for MoDIS\n";
$modis_result = 9 << 8;
}
return $modis_result;
}
sub MoDIS_xgen_check {
my $modis_action = shift @_;
my $result_projectFolder = "build/${project_name}/$flavor";
my $result_tmpFolder = "$result_projectFolder/tmp";
if ($modis_action =~ /_(modis|uesim)$/i) {
my $flag_packMoDIS = $packMoDIS;
my $path_packMoDIS;
$path_packMoDIS = "MoDIS" if ($modis_action =~ /_(modis)$/i);
$path_packMoDIS = "UESim" if ($modis_action =~ /_(uesim)$/i);
$path_packMoDIS .= "/_BUILD_XGEN";
if ($modis_action =~ /_(modis|uesim)$/i) {
if (($pureMoDIS != -1) && ($packMoDIS != -1)) {
$flag_packMoDIS = 1;
}
}
elsif ($pureMoDIS == 1) {
die "Error: -puremodis cannot be used with make $modis_action\n";
}
if ($flag_packMoDIS == 0) {
if (-d "$result_projectFolder/$path_packMoDIS") {
print "Auto turn on -packmodis when $result_projectFolder/$path_packMoDIS is found\n";
$flag_packMoDIS = 1;
}
}
if ($flag_packMoDIS == 1) {
$result_projectFolder .= "/" . $path_packMoDIS;
$target_option =~ s/\bPROJDIR=\S+//g;
$target_option .= " PROJDIR=./$result_projectFolder";
$result_tmpFolder = "$result_projectFolder/tmp";
if ($result_projectFolder ne $projectFolder) {
mkpath($result_projectFolder) if (! -d $result_projectFolder);
foreach my $file (glob "$projectFolder/*") {
next if (-d $file);
copy($file, $result_projectFolder);
}
}
if ($result_tmpFolder ne $tmpFolder) {
mkpath($result_tmpFolder) if (! -d $result_tmpFolder);
foreach my $file (glob "$tmpFolder/*") {
next if (-d $file);
copy($file, $result_tmpFolder);
}
}
}
}
return ($result_projectFolder, $result_tmpFolder);
}
#usage:
# my %hash=iniToHash('/tmp/myini.ini');
# print $hash{'TITLE'}->{'Name'},"\n";
#
sub iniToHash {
open(MYINI, $_[0]);
my %hash;
my $hashref;
while(<MYINI>) {
next if ((/^\s*$/) || (/^\s*#/));
if (/^\s*\[(.+)\]/) {
$hashref = $hash{$1} ||= {};
} elsif (/^\s*(\S+)\s*=\s*(.+)\s*$/) {
$hashref->{$1} = $2;
} elsif (/^\s*(\S+)\s*\+=\s*(.+)\s*$/) {
$hashref->{$1} = $hashref->{$1} . " $2";
}
}
close MYINI;
return %hash;
}
sub CurrTimeStr {
my($sec, $min, $hour, $mday, $mon, $year) = localtime(time);
return (sprintf "%4.4d/%2.2d/%2.2d %2.2d:%2.2d", $year+1900, $mon+1, $mday, $hour, $min);
}
sub cp_3rdpartyTool {
if ($ENV{'MTK_INTERNAL'} eq 'TRUE') {
if (-e "tools/thirdParties.pl") {
print("perl tools/thirdParties.pl -cp \n");
system("perl tools/thirdParties.pl -cp");
} else {
warn "tools/thirdParties.pl does NOT exist!\n";
exit 1;
}
} else {
warn "Lack off thirdParties tools!\n";
warn "Please refer to document: SOP_Third_Party_Package_Installation!\n";
exit 1;
}
}
sub Usage {
warn << "__END_OF_USAGE";
Usage:
./m ["project makefile"] action [modules]|file1[ file2[ ...]] | \@files
or ./m ["make/projects/project makefile"] action [modules]|file1[ file2[ ...]] | \@files
Description:
project makefile = ELBRUS_FPGA(flavor).mak (ELBRUS_FPGA(FLAVOR) project)
= ...
action = new (codegen, clean, update, remake) (default)
= update or u (scan, compile, link)
= slim_update (scan, compile, link without generating mcddll)
= remake or r (compile, link)
= clean or c (clean)
= c,u (clean and update)
= c,r (clean and remake)
= codegen (codegen)
= slim_codegen (codegen without generating mcddll)
= mcddll_update (codegen and generate mcddll)
= slim_mcddll (generate mcddll without codegen)
= emigen (emigen)
= emiclean (emiclean)
module(s) = modules name (kal, verno, ...)
=> OPTIONAL when action is one of (clean c remake r update u c,r c,u)
Example:
./m "ELBRUS_FPGA(LWTG).mak" new
./m "ELBRUS_FPGA(LWTG).mak" c,u custom
./m "make/projects/ELBRUS_FPGA(LWTG).mak" r drv custom
__END_OF_USAGE
exit 1;
}
sub writeINI {
&writeMakeINI();
if (($action ne "ckmake") && ($action ne "drv_feature_check")) {
system("echo LOCAL_MACHINE=%COMPUTERNAME% >>$targetFolder/build.log");
system("echo PROJECT_NAME=$project_name>>$targetFolder/build.log");
system("echo PLATFORM=$plat>>$targetFolder/build.log");
system("echo FLAVOR=$flavor>>$targetFolder/build.log");
system("echo VERNO=$verno>>$targetFolder/build.log");
system("echo ARMLMD_LICENSE_FILE=%ARMLMD_LICENSE_FILE%>>$targetFolder/build.log");
system("perl tools/init/echo.pl -n COMMAND=make \"@orgARGV\">>$targetFolder/build.log");
system("perl -e \"print \'BUILD END TIME=\'\">>$targetFolder/build.log");
system("perl tools/time.pl -n>>$targetFolder/build.log");
$time_num=time;
#mbis end probe
# to aviod be called twice when enable lsf
if (($m_in_lsf != 1)&&($mbis_target_build_with_Modis != 1)) {
&mbis_end_probe;
}
}
}
sub writeMakeINI {
mkpath("build") if(!-d "build");
if ($enINI == 1) {
open (FILE_HANDLE, ">$ini") or die "cannot open $ini\n";
print FILE_HANDLE "project_makefile = $project_makefile\n";
print FILE_HANDLE "project_folder = ". $original_projectFolder."\n";
close FILE_HANDLE;
}
}
sub pre_gen {
print "pre gen\n";
if(defined($level) && ($level =~ /VENDOR/i)) {
print "Skip pre_gen for vendor release.\n";
return 0;
}
print "Before submitting into CF machines, pre-check the Makefile, sys_auto_gen\n";
$ENV{"ACTION"} = "sys_auto_gen";
my @f = glob("$tmpFolder/~*.tmp *.d");
if(@f) {
unlink(@f) or die "Remove failed $!";
}
&gen_buildinfo_tmp;
if( ($action eq "new_modis") or ($action eq "new_uesim")) {
$target_option .= " MODIS_CONFIG=TRUE";
}
$preTestResult = system("${makeCmd} -f${makeFolder}${myMF} -r -R CORE_ROOT=$core_root PROJECT_NAME=$project_name \"PROJECT_MAKEFILE=$theMF\" FLAVOR=$flavor $target_options $target_option sys_auto_gen");
if ($preTestResult != 0) {
&writeINI;
exit 1;
}
print "Pass pre-check for Makefile and sys_auto_gen\n";
}
sub localq {
my ($islocalpath) = @_;
my $result = 0;
print "Check if localq is available .... ";
unlink("$logFolder/localq.log") if (-e "$logFolder/localq.log");
system("bhosts $ENV{\"COMPUTERNAME\"} >$logFolder/localq.log 2>nul");
open(LOCALQ, "$logFolder/localq.log") || die "Can not open $logFolder/localq.log!";
while (<LOCALQ>) {
next if ($_ =~ /HOST_NAME/ig);
$_ =~ /(\S+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/ig;
$STATUS = $2;
$MAX = $4;
$NJOBS = $5;
}
close LOCALQ;
if (($NJOBS < $MAX) && ($STATUS =~ /ok/ig)) {
print "YES\n";
print "Enter the local queue.\n";
if (($action =~ /new/i) && ((($action ne "new_modis") && ($action ne "new_uesim")) || ($pureMoDIS == 1))) {
&pre_gen();
}
if ($islocalpath ne "") {
if ($RUN_KLOCWORK eq 1) {
print "bsub -q localq -m $ENV{\"COMPUTERNAME\"} -I kwinject --detach Cgen.exe,DrvGen.exe -T kwinject.trace perl make.pl -lsf -localq -localpath @orgARGV\n";
$result = system("bsub -q localq -m $ENV{\"COMPUTERNAME\"} -I kwinject --detach Cgen.exe,DrvGen.exe -T kwinject.trace perl make.pl -lsf -localq -localpath @orgARGV");
} else {
print "bsub -q localq -m $ENV{\"COMPUTERNAME\"} -I perl make.pl -lsf -localq -localpath @orgARGV\n";
$result = system("bsub -q localq -m $ENV{\"COMPUTERNAME\"} -I perl make.pl -lsf -localq -localpath @orgARGV");
}
} else {
if ($RUN_KLOCWORK eq 1) {
print "bsub -q localq -m $ENV{\"COMPUTERNAME\"} -I kwinject --detach Cgen.exe,DrvGen.exe -T kwinject.trace perl make.pl -lsf -localq @orgARGV\n";
$result = system("bsub -q localq -m $ENV{\"COMPUTERNAME\"} -I kwinject --detach Cgen.exe,DrvGen.exe -T kwinject.trace perl make.pl -lsf -localq @orgARGV");
} else {
print "bsub -q localq -m $ENV{\"COMPUTERNAME\"} -I perl make.pl -lsf -localq @orgARGV\n";
$result = system("bsub -q localq -m $ENV{\"COMPUTERNAME\"} -I perl make.pl -lsf -localq @orgARGV");
}
}
&writeINI;
exit $result >> 8;
} else {
print "NO\n";
}
}
sub get_net_path {
my $path;
my $current_path = cwd();
if ($^O eq "MSWin32") {
$current_path =~ s/\//\\/g;
if ($current_path=~/^([ABDG-Z]:)(.*)/i) {
my $disk = $1;
my $folder = $2;
$folder =~ s/\\$//;
my @disk = `net use $disk`;
if ($#disk != -1) {
$disk[1]=~/\s+(\\\\.*)\s*$/;
$path = $1.$folder;
} else {
@disk = `subst`;
my $subst_folder;
foreach my $subdisk (@disk) {
$subdisk =~ s/\s*$//;
if ($subdisk =~ /($disk.*)\s*\=\>\s*(.*)/i){
$subst_folder= $2;
$subst_folder =~ s/://;
}
}
if ($subst_folder =~ /^UNC\\(.+)/) {
$path = "\\\\".$1;
} else {
if ($subst_folder ne "") {
$path = "\\\\".$ENV{"COMPUTERNAME"}."\\".$subst_folder.$folder;
} else {
$path = "\\\\".$ENV{"COMPUTERNAME"}."\\".$disk.$folder;
}
}
}
} elsif ($current_path=~/^([CEF]):(.*)/i) {
my $disk = $1;
my $folder = $2;
if ($ENV{"USERNAME"} =~ /wcxbm/ig) {
$path = "\\\\".$ENV{"COMPUTERNAME"}."\\".$disk."\$\$".$folder;
} else {
$path = "\\\\".$ENV{"COMPUTERNAME"}."\\".$disk.$folder;
}
}
} else {
$path = $current_path;
}
$path =~ s/://g;
print "path=$path\n";
return $path;
}
sub mbis_start_probe {
my $mbis_log_folder;
if ($mbis_en eq "TRUE") {
if (!defined($ENV{"MBIS_BUILD_TIME_TMP"}) || !defined($ENV{"MBIS_BUILD_TIME_LOG"}) || !defined($ENV{"MBIS_BUILD_INFO_LOG"})) {
$mbis_log_folder = "$logFolder/mbis";
if (!-d "$mbis_log_folder") {
mkpath($mbis_log_folder) or die "Create Folder $mbis_log_folder Faild $!";
} else {
# delete last log file
if ($mbis_en_save_log ne "TRUE") {
my @f = glob("$mbis_log_folder/*.log");
unlink(@f) or die "Remove failed $!" if(@f);
my @f = glob("$mbis_log_folder/*.tmp");
unlink(@f) or die "Remove failed $!" if(@f);
}
}
if (!defined($ENV{MBIS_BUILD_TIME_TMP})) {
$ENV{MBIS_BUILD_TIME_TMP} = $mbis_log_folder . "/". $build_time_string . "_" . "mbis" . "_" . "time" . ".tmp";
#set title of mbis time tmp file
system("echo Time Stamp,Item Name,Type,Time>>$ENV{MBIS_BUILD_TIME_TMP}");
system("echo T_S,TOTAL,A,$build_time_sec >>$ENV{MBIS_BUILD_TIME_TMP}");
}
if (!defined($ENV{MBIS_BUILD_TIME_LOG})) {
$ENV{MBIS_BUILD_TIME_LOG} = $mbis_log_folder . "/". $build_time_string . "_" . "mbis" . "_" . "time" . ".log";
#set title of mbis time tmp file
system("echo Item Name,Type,Start Time,End Time,Duration Time>>$ENV{MBIS_BUILD_TIME_LOG}");
}
if (!defined($ENV{MBIS_BUILD_INFO_LOG})) {
$ENV{MBIS_BUILD_INFO_LOG} = $mbis_log_folder . "/". $build_time_string . "_" . "mbis" . "_" . "info" . ".log";
#set title of mbis time tmp file
system("echo Information Name,Information Content>>$ENV{MBIS_BUILD_INFO_LOG}");
system("echo SUBMIT_TO_QUEUE_DATETIME,$submit_to_queue_time_string>>$ENV{MBIS_BUILD_INFO_LOG}") if ($submit_to_queue_time_string ne "");
system("echo BUILD_START_DATATIME,$build_time_string>>$ENV{MBIS_BUILD_INFO_LOG}");
}
system("perl $mbis -s \"@orgARGVwithFlavor\"");
}
} else {
# MBIS_BUILD_TIME_TMP must not be null for makefile expand the command
$ENV{MBIS_BUILD_TIME_TMP}=tmp;
}
}
sub mbis_info_probe {
if ($mbis_en eq "TRUE") {
if (($ENV{'MTK_INTERNAL'} eq 'TRUE') && (-e "$mbis_conf_file")) {
%mbis_conf = iniToHash($mbis_conf_file);
$pilot_bm_list = $mbis_conf{'INIT_CONF'}->{'BM_LIST'};
if ($pilot_bm_list =~ /$ENV{USERNAME}/i) {
system("perl $mbis -i BM_BUILD,1");
} else {
system("perl $mbis -i BM_BUILD,0");
}
}
$cur_path=cwd();
system("perl $mbis -i BUILD_FOLDER,\"$cur_path\"");
if($^O eq" MSWin32") {
system("perl $mbis -i BUILD_MACHINE,$ENV{COMPUTERNAME}");
} else {
$hostname = `hostname`;
system("perl $mbis -i BUILD_MACHINE,$hostname");
system("perl $mbis -i BUILD_USER,$ENV{USER}");
}
system("perl $mbis -i CUSTOM_RELEASE,$custom_release");
if ($mbis_num_proc == 0) {
$mbis_num_proc = $ENV{"NUMBER_OF_PROCESSORS"};
}
system("perl $mbis -i NUMBER_OF_PROCESSORS,$mbis_num_proc");
system("perl $mbis -i LSF,$m_in_lsf");
system("perl $mbis -i COMPILER,$compiler");
system("perl $mbis -i USER,$ENV{USERNAME}");
system("perl $mbis -i PROJECT_NAME,$project_name");
system("perl $mbis -i FLAVOR,$flavor");
system("perl $mbis -i VERNO,$verno");
system("perl $mbis -i PLATFORM,$plat");
system("perl $mbis -i PID,$$");
if (-e "make/common/rel/mpd/5g") {
system("perl $mbis -i CODEBASE,MPD_5G");
}
elsif (-e "make/common/rel/mpd/4g") {
system("perl $mbis -i CODEBASE,MPD_4G");
}
elsif (-e "make/common/rel/mpd/common") {
system("perl $mbis -i CODEBASE,MPD_23G");
}
elsif (-e "make/common/rel/hq/USR.txt") {
system("perl $mbis -i CODEBASE,SWRD");
}
else {
system("perl $mbis -i CODEBASE,RELEASE");
if (-d "make/common/rel/sub_ps") {
system("perl $mbis -i REL_PACKAGE,SUB_PS");
}
else {
system("perl $mbis -i REL_PACKAGE,SUB_L4");
}
}
if (-e "dailybuild.txt") {
system("perl $mbis -i DAILY_BUILD_PRODUCER,1");
} else {
system("perl $mbis -i DAILY_BUILD_PRODUCER,0");
}
if (-e "ewsprebuild.txt") {
system("perl $mbis -i EWS_PREBUILD_PRODUCER,1");
} else {
system("perl $mbis -i EWS_PREBUILD_PRODUCER,0");
}
my @folder_cnt = <./build/*/*>;
my $fld_cnt = 0;
foreach (@folder_cnt) {
$fld_cnt ++ if(-d "$_");
}
system("perl $mbis -i NUMBER_OF_PROJECT_FOLDER,$fld_cnt");
}
}
sub mbis_end_probe {
if ($mbis_en eq "TRUE") {
system("perl $mbis -e");
# transfer mbis when in mpd domain
if (-e "make/common/rel/mpd") {
if (-e "/mtkeda/wcpsm/utilities/UploadToMPDShare/upload_to_mpdshare") {
my $upload_folder = sprintf("%4.4d.%2.2d.%2.2d", $year+1900, $mon+1, $mday);
system("/mtkeda/wcpsm/utilities/UploadToMPDShare/upload_to_mpdshare \"$logFolder/mbis/*_time.tmp\" \"/901.SM_MBIS_LOG/original_data/$upload_folder/\" 1>/dev/null 2>&1 &");
system("/mtkeda/wcpsm/utilities/UploadToMPDShare/upload_to_mpdshare \"$logFolder/mbis/*_info.log\" \"/901.SM_MBIS_LOG/original_data/$upload_folder/\" 1>/dev/null 2>&1 &");
}
}
}
}
sub mbis_parse_arg {
$mbis_arg_exist = 1;
foreach $arg (@mbis_arg) {
if ($arg =~ /^en_mbis$/i) {
$arg_mbis_en = "TRUE";
} elsif ($arg =~ /^dis_mbis$/i) {
$arg_mbis_en = "FALSE";
} elsif ($arg =~ /^dis_obj$/i) {
$arg_mbis_en_obj_log = "FALSE";
} elsif ($arg =~ /^en_obj$/i) {
$arg_mbis_en_obj_log = "TRUE";
} elsif ($arg =~ /^save_log$/i) {
$arg_mbis_en_save_log = "TRUE";
} else {
# with error command
$mbis_arg_exist = 0;
return ;
}
}
if ($arg_mbis_en ne "TRUE") {
$arg_mbis_en_obj_log = "FALSE";
$arg_mbis_en_save_log = "FALSE";
}
}
sub mbis_init {
if (($ENV{'MTK_INTERNAL'} eq 'TRUE') && (-e "$mbis_conf_file")) {
%mbis_conf = iniToHash($mbis_conf_file);
$mbis_bm_list = $mbis_conf{'INIT_CONF'}->{'BM_LIST'};
$mbis_project_list = $mbis_conf{'INIT_CONF'}->{'PROJECT_LIST'};
@mbis_project_array=split /,/, $mbis_project_list;
$mbis_en = $mbis_conf{'INIT_CONF'}->{'EN_ALL_PROJECT'};
$mbis_en_obj_log = $mbis_conf{'INIT_CONF'}->{'EN_OBJ_LOG'};
# force all project enable mbis
# enable obj log for BM only
if ($mbis_en eq "TRUE") {
# check bm list
if ($mbis_bm_list =~ /$ENV{USERNAME}/i) {
$mbis_en = "TRUE";
$mbis_en_obj_log = "TRUE";
} else {
$mbis_en = "TRUE";
$mbis_en_obj_log = "FALSE";
}
}
# deal with mbis option from arg
if ($mbis_en eq "TRUE") {
print("MBIS init enable\n");
if ($mbis_en_obj_log eq "TRUE") {
print("MBIS obj log enable\n");
}
if ($mbis_arg_exist == 1) {
$mbis_en = $arg_mbis_en;
$mbis_en_obj_log = $arg_mbis_en_obj_log;
$mbis_en_save_log = $arg_mbis_en_save_log;
if ($mbis_en eq "TRUE") {
print("MBIS arg enable\n");
} else {
print("MBIS arg disable\n");
}
}
} else {
$mbis_en_obj_log = "FALSE";
$mbis_en_save_log = "FALSE";
print("MBIS init disable\n");
}
}
}
sub mbis_success {
my $build_custom_folder;
my @files;
my $elfname;
my $elfsize;
# get elf size
$build_custom_folder = "$targetFolder";
opendir (DIR, $build_custom_folder) or die "no folder : $build_custom_folder";
my @files = grep {/^$project_name.*\.elf$/} readdir DIR;
close DIR;
if (@files == 1) {
$elfname = pop @files;
# add elf file name
system("perl $mbis -i ELF_FILE,$elfname");
$elfsize = -s "$build_custom_folder\\$elfname";
# add elf file size
system("perl $mbis -i ELF_SIZE,$elfsize");
}
# add success flag
system("perl $mbis -i SUCCESSFUL_BUILD,1");
}
sub error_handle {
my $build_folder = "$targetFolder";
opendir (DIR, $build_folder) or die "no folder : $build_folder\n";
my @files = grep {/.+\.bin$/} readdir DIR;
close DIR;
my $flag = 0;
foreach (@files) {
next if($_ =~ /BOOTLOADER/i);
my $bin_file = $build_folder."/$_";
if (-d "$bin_file") {
rmtree($bin_file);
$flag = 1;
} elsif(-e "$bin_file") {
unlink($bin_file) or die "Remove failed $!";
$flag = 1;
}
}
unlink("$build_folder/dep/postgen_dep/cp_dsp_files.det") if (-e "$build_folder/dep/postgen_dep/cp_dsp_files.det");
print "Some errors happened during the build process. Delete the binary file\n" if($flag);
# [Linux] temporarily add
unlink("nul") if($^O eq "linux" && -e "nul");
unlink("NUL") if($^O eq "linux" && -e "NUL");
&writeINI;
exit 1;
}
sub genCustombld {
$bldPathName = "$projectFolder/Custom.bld";
if(-e "make/common/rel/hq/USR.txt") {
$bldValue = "FALSE";
} else {
$bldValue = "TRUE";
}
if(-e $bldPathName) {
open BLDFILE,"<$projectFolder/Custom.bld" or die "Can not open $projectFolder/Custom.bld";
while(<BLDFILE>) {
if(/CUSTOM_RELEASE = $bldValue/) {
close BLDFILE;
return 0;
}
}
close BLDFILE;
}
open BLDFILE,">$projectFolder/Custom.bld" or die "Can not open $projectFolder/Custom.bld";
print BLDFILE "CUSTOM_RELEASE = $bldValue\n";
close BLDFILE;
}
sub read_remake_mods {
my $file = $_[0];
my @value = "";
open (FILE_HANDLE, "<$file") or die "cannot open $file\n";
while (<FILE_HANDLE>) {
if (/^NEED_REMAKE_MODS\s*=\s*(.*)/) {
@value = $1;
}
}
return @value;
}
sub gen_buildinfo_tmp {
if (open FILE_HANDLE, ">$tmpFolder/~buildinfo.tmp") {
my $timeStr = &CurrTimeStr;
my $dbg_timeStr = $timeStr;
$dbg_timeStr =~ s/ /_/g;
$dbg_timeStr =~ s/:/_/g;
$dbg_timeStr =~ s/\//_/g;
print FILE_HANDLE "PROJECT_NAME=$project_name\n";
print FILE_HANDLE "FLAVOR=$flavor\n";
print FILE_HANDLE "ORIACTION=$oriaction\n";
print FILE_HANDLE "APLAT=$plat\n";
print FILE_HANDLE "CMD_ARGU=$fullOpts\n";
print FILE_HANDLE "BUILD_DATE_TIME=$timeStr\n";
# mbis options
print FILE_HANDLE "MBIS_EN=$mbis_en\n";
print FILE_HANDLE "MBIS_EN_OBJ_LOG=$mbis_en_obj_log\n";
print FILE_HANDLE "DBG_BUILD_DATE_TIME=$dbg_timeStr\n";
print FILE_HANDLE "NO_LTELIB=$no_ltelib\n";
print FILE_HANDLE "NO_LTECGEN=$no_ltecgen\n";
print FILE_HANDLE "NO_PCIBT=$no_pcibt\n";
print FILE_HANDLE "MCF_OTA_NAME=$ota_name\n";
print FILE_HANDLE "MODIS_CONFIG=$modis_config\n";
print FILE_HANDLE "NO_DSP=$no_dsp\n";
print FILE_HANDLE "NO_WARNING_AS_ERROR=$no_warning_as_error\n";
print FILE_HANDLE "CHECK_FO_LICENSE=$check_fo_license\n";
print FILE_HANDLE "LICENSE_INFO=$license_info\n";
print FILE_HANDLE "CUST_LIC=$cust_lic\n";
print FILE_HANDLE "VARIATION_PROJ=$VarioationProj_name\n";
print FILE_HANDLE "SRC_MAX_PACKAGE=$chk_rel_pkg\n";
print FILE_HANDLE "UPDATE_DSP=$update_dsp\n";
close FILE_HANDLE;
} else {
warn "Fail to write $tmpFolder/~buildinfo.tmp: $!\n";
}
}