--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/analyzetool/commandlineengine/src/CATProject.cpp Thu May 27 14:26:55 2010 +0300
@@ -0,0 +1,2413 @@
+/*
+* 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: Class representing a project.
+*
+*/
+
+
+#include "../inc/CATProject.h"
+#include "../inc/CATModule2.h"
+#include "../inc/CATParseTraceFile.h"
+#include "../inc/CATDatParser.h"
+
+//dbghelp.dll version function.
+extern int showDbgHelpVersionInfo( bool showVersion );
+
+// ----------------------------------------------------------------------------
+// CATProject::CATProject()
+// ----------------------------------------------------------------------------
+CATProject::CATProject()
+{
+ LOG_FUNC_ENTRY("CATProject::CATProject");
+
+ m_bUninstrumented = true;
+ m_bAbldTest = false;
+
+ // Use windows api to acquire current directory info.
+ GetCurrentDirectory( MAX_LINE_LENGTH, m_cCurrentDir );
+
+ m_eBuildSystem = SBS_V1;
+ m_eBuildType = UDEB;
+ m_eLoggingMode = TRACE;
+ m_eMode = NOT_DEFINED;
+
+ m_iLoggingLevel = 3;
+
+ m_pAnalyzer = 0;
+
+ m_sBinaryTarget = "";
+ m_sBuildCommand = "";
+ m_sDataFile = "";
+ m_sDataFileOutput = "";
+ m_sDataFileTemp = "";
+ m_sEpocRoot = "\\";
+ m_sMakeFile = "";
+ m_sPlatform = "";
+ m_sS60FileName = "";
+ m_sTargetModule = "";
+ m_sVariant = "";
+
+ m_vRomSymbolFiles.clear();
+ m_vModules.clear();
+ m_vStaticLibraries.clear();
+ m_vTargetModules.clear();
+ m_vUnsupportedModules.clear();
+}
+
+// ----------------------------------------------------------------------------
+// CATProject::~CATProject()
+// ----------------------------------------------------------------------------
+CATProject::~CATProject()
+{
+ LOG_FUNC_ENTRY("CATProject::~CATProject");
+
+ CleanModuleVectors();
+
+ // Delete analyzer
+ if ( m_pAnalyzer )
+ delete m_pAnalyzer;
+
+ // Temporary datafile
+ if ( !m_sDataFileTemp.empty() )
+ {
+ if ( FileExists( m_sDataFileTemp.c_str() ) )
+ FileDelete( m_sDataFileTemp, false );
+ }
+}
+
+bool CATProject::SetArguments( ARGUMENTS& arguments )
+{
+ LOG_FUNC_ENTRY("CATProject::SetArguments");
+ bool bRet = true;
+
+ //Project mode.
+ if( arguments.eHookSwitch == HOOK_INTERNAL )
+ {
+ SetMode( CATProject::COMPILE );
+ SetLoggingMode( CATProject::FILE );
+ }
+ else if ( arguments.eHookSwitch == HOOK_EXTERNAL )
+ {
+ SetMode( CATProject::COMPILE );
+ SetLoggingMode( CATProject::TRACE );
+ }
+ else if ( arguments.eHookSwitch == HOOK_EXTERNAL_FAST )
+ {
+ SetMode( CATProject::COMPILE );
+ SetLoggingMode( CATProject::TRACE_FAST );
+ }
+ /* Extension*/
+ else if ( arguments.eHookSwitch == HOOK_EXTENSION_INTERNAL )
+ {
+ SetMode( CATProject::INSTRUMENT );
+ SetLoggingMode( CATProject::FILE );
+ }
+ else if ( arguments.eHookSwitch == HOOK_EXTENSION_EXTERNAL )
+ {
+ SetMode( CATProject::INSTRUMENT );
+ SetLoggingMode( CATProject::TRACE );
+ }
+ else if ( arguments.eHookSwitch == HOOK_EXTENSION_EXTERNAL_FAST )
+ {
+ SetMode( CATProject::INSTRUMENT );
+ SetLoggingMode( CATProject::TRACE_FAST );
+ }
+ else if ( arguments.eHookSwitch == HOOK_EXTENSION_UNINSTRUMENT )
+ {
+ SetMode( CATProject::UNINSTRUMENT );
+ }
+ else if ( arguments.eHookSwitch == HOOK_EXTENSION_FAILED )
+ {
+ SetMode( CATProject::UNINSTRUMENT_FAILED );
+ }
+ //Return if uninstrumenting because no other arguments are set.
+ if ( GetMode() == CATProject::UNINSTRUMENT
+ || GetMode() == CATProject::UNINSTRUMENT_FAILED )
+ {
+ return bRet;
+ }
+
+ // No build / instrument.
+ if ( arguments.HOOK.bNoBuild )
+ SetMode( CATProject::INSTRUMENT_CONSOLE );
+
+ // Call stack sizes
+ SetAllocCallStackSize( arguments.HOOK.iAllocCallStackSize );
+ SetFreeCallStackSize( arguments.HOOK.iFreeCallStackSize );
+
+ //Build system.
+ if ( arguments.HOOK.iBuildSystem == 1 )
+ SetBuildSystem( CATProject::SBS_V1 );
+ else if ( arguments.HOOK.iBuildSystem == 2 )
+ SetBuildSystem( CATProject::SBS_V2 );
+
+ //Test module build only
+ if ( arguments.HOOK.bAbldTest == true )
+ m_bAbldTest = true;
+
+ //Platform.
+ if ( !_stricmp( arguments.HOOK.sPlatform.c_str(), "armv5" ) )
+ SetPlatform( arguments.HOOK.sPlatform );
+ else if ( !_stricmp( arguments.HOOK.sPlatform.c_str(), "gcce" ) )
+ SetPlatform( arguments.HOOK.sPlatform );
+ else if ( !_stricmp( arguments.HOOK.sPlatform.c_str(), "winscw" ) )
+ SetPlatform( arguments.HOOK.sPlatform );
+ else
+ {
+ LOG_STRING( "Error, no supported platform specified (armv5/gcce/winscw).");
+ bRet = false;
+ }
+
+ //BuildType.
+ if ( !_stricmp( arguments.HOOK.sBuildType.c_str(), "urel" ) )
+ SetBuildType( CATProject::UREL );
+ else if ( !_stricmp( arguments.HOOK.sBuildType.c_str(), "udeb" ) )
+ SetBuildType( CATProject::UDEB );
+ else
+ {
+ LOG_STRING( "Error, no build type specified.");
+ bRet = false;
+ }
+
+ //Internal data file.
+ if ( arguments.HOOK.bDataFileName )
+ SetS60FileName( arguments.HOOK.sDataFileName );
+
+ //Build command.
+ if ( arguments.HOOK.sBuildCmd.empty() && (
+ GetMode() == CATProject::COMPILE ||
+ GetMode() == CATProject::INSTRUMENT ||
+ GetMode() == CATProject::INSTRUMENT_CONSOLE
+ ))
+ {
+ cout << AT_MSG << "Error, no build command specified." << endl;
+ bRet = false;
+ }
+
+ SetBuildCommand( arguments.HOOK.sBuildCmd );
+
+ //Variant.
+ SetVariant( arguments.HOOK.sFeatureVariant );
+
+ //Target programs.
+ SetTargetModules( arguments.HOOK.vTargetPrograms );
+
+ return bRet;
+}
+
+void CATProject::CleanModuleVectors()
+{
+ LOG_FUNC_ENTRY("CATProject::CleanModuleVectors");
+ // delete modules from vector.
+ for( size_t i = 0; i < m_vModules.size() ; i++ )
+ delete m_vModules[i];
+ m_vModules.clear();
+
+ // Delete modules from vector (unsupported).
+ for( size_t i = 0; i < m_vUnsupportedModules.size() ; i++ )
+ delete m_vUnsupportedModules[i];
+ m_vUnsupportedModules.clear();
+
+ // Delete modules from static library vector.
+ for( size_t i = 0; i < m_vStaticLibraries.size() ; i++ )
+ delete m_vStaticLibraries[i];
+ m_vStaticLibraries.clear();
+}
+// ----------------------------------------------------------------------------
+// CATProject::Run
+// ----------------------------------------------------------------------------
+int CATProject::Run()
+{
+ LOG_FUNC_ENTRY("CATProject::Run");
+ int iReturnCode = 0;
+ switch( m_eMode )
+ {
+ case COMPILE:
+ // Run compile
+ iReturnCode = RunCompile();
+ if ( iReturnCode == AT_RETURN_CODE::READ_MAKEFILE_ERROR
+ || iReturnCode == AT_RETURN_CODE::KERNEL_SIDE_MODULE_ERROR
+ || iReturnCode == AT_RETURN_CODE::INVALID_MMP_DEFINED )
+ {
+ DeleteTemporaryDirs();
+ DirDelete( AT_TEMP_DIR, true );
+ }
+ else
+ {
+ DisplayCompileSummary();
+ DisplayBuildSummary();
+ }
+ break;
+ case CLEAN:
+ iReturnCode = RunClean();
+ break;
+ case ANALYZE:
+ iReturnCode = RunAnalyze();
+ break;
+ case INSTRUMENT:
+ iReturnCode = RunInstrument();
+ break;
+ case INSTRUMENT_CONSOLE:
+ iReturnCode = RunInstrumentConsole();
+ if ( iReturnCode == AT_RETURN_CODE::READ_MAKEFILE_ERROR
+ || iReturnCode == AT_RETURN_CODE::KERNEL_SIDE_MODULE_ERROR )
+ {
+ DeleteTemporaryDirs();
+ DirDelete( AT_TEMP_DIR, true );
+ }
+ else
+ {
+ DisplayBuildSummary();
+ }
+ break;
+ case UNINSTRUMENT:
+ iReturnCode = RunUninstrument();
+ // Show summary
+ DisplayCompileSummary();
+ DisplayBuildSummary();
+ break;
+ case UNINSTRUMENT_CONSOLE:
+ iReturnCode = RunUninstrumentConsole();
+ // Show summary
+ DisplayCompileSummary();
+ DisplayBuildSummary();
+ break;
+ case UNINSTRUMENT_FAILED:
+ iReturnCode = RunUninstrumentFailed();
+ // Display message
+ cout << AT_MSG << "Build aborted, because project contains compile error(s)."
+ << endl;
+ break;
+ default:
+ cout << AT_MSG << "Error, mode not supported / implemented." << endl;
+ break;
+ }
+ // Error messages
+ switch( iReturnCode )
+ {
+ case AT_RETURN_CODE::MAKEFILE_ERROR:
+ cout << AT_MSG << "Error, creating/reading makefiles." << endl;
+ break;
+ case AT_RETURN_CODE::COMPILE_ERROR:
+ cout << AT_MSG << "Error, compiling project." << endl;
+ break;
+ case AT_RETURN_CODE::UNKNOWN:
+ cout << AT_MSG << "Error, unknown." << endl;
+ break;
+ case AT_RETURN_CODE::WRONG_DATA_FILE_VERSION:
+ cout << AT_MSG << "unable to analyze the data file.\n";
+ cout << AT_MSG << "wrong data file version.\n";
+ break;
+ case AT_RETURN_CODE::INVALID_DATA_FILE:
+ cout << AT_MSG << "Error, invalid datafile." << endl;
+ break;
+ case AT_RETURN_CODE::RELEASABLES_ERROR:
+ cout << AT_MSG << "Error, copying releasable(s)." << endl;
+ break;
+ case AT_RETURN_CODE::RESTORE_MODULES_ERROR:
+ cout << AT_MSG << "Error, restoring mmp file(s)." << endl;
+ break;
+ case AT_RETURN_CODE::CREATING_TEMP_CPP_ERROR:
+ cout << AT_MSG << "Error, creating temporary cpp file(s)." << endl;
+ break;
+ case AT_RETURN_CODE::CLEANING_TEMP_ERROR:
+ cout << AT_MSG << "Error, cleaning temporary dir(s)." << endl;
+ break;
+ case AT_RETURN_CODE::READ_MAKEFILE_ERROR:
+ cout << AT_MSG << "Error, reading makefile." << endl;
+ break;
+ case AT_RETURN_CODE::MODIFY_MODULES_ERROR:
+ cout << AT_MSG << "Error, modifying mmp file(s)." << endl;
+ break;
+ case AT_RETURN_CODE::INVALID_MMP_DEFINED:
+ break;
+ case AT_RETURN_CODE::WRITE_ATTRIBUTES_ERROR:
+ cout << AT_MSG << "Error, writing attributes." << endl;
+ break;
+ case AT_RETURN_CODE::READ_ATTRIBUTES_ERROR:
+ cout << AT_MSG << "Error, reading project configuration. Instrument project again." << endl;
+ break;
+ case AT_RETURN_CODE::EMPTY_DATA_FILE:
+ cout << AT_MSG << "Error, no data to be analyzed." << endl;
+ break;
+ case AT_RETURN_CODE::NO_SUPPORTED_MODULES_ERROR:
+ cout << AT_MSG << "Error, no modules found with supported target type." << endl;
+ break;
+ case AT_RETURN_CODE::KERNEL_SIDE_MODULE_ERROR:
+ cout << AT_MSG << "Error, kernel side component found component. Build/instrument aborted." << endl;
+ break;
+ }
+ return iReturnCode;
+}
+// ----------------------------------------------------------------------------
+// CATProject::RunRecoveryAndExit()
+// Restore modules quick and exit. Used when user wants to kill/end process.
+// ----------------------------------------------------------------------------
+int CATProject::RunRecoveryAndExit()
+{
+ LOG_FUNC_ENTRY("CATProject::RunRecoveryAndExit");
+ cout << AT_MSG << "Error, user requested exit." << endl;
+ VerifyAndRecoverModules();
+ DeleteTemporaryDirs();
+ DirDelete( AT_TEMP_DIR, true );
+ cout << AT_MSG << "Exit." << endl;
+ return AT_RETURN_CODE::USER_ISSUED_EXIT;
+}
+
+// ----------------------------------------------------------------------------
+// CATProject::IsUninstrumented()
+// Reads projects configuration file if it exists.
+// Return false in case the data contains information that project is
+// uninstrumented. Otherwise returns always true.
+// ----------------------------------------------------------------------------
+bool CATProject::IsUninstrumented()
+{
+ LOG_FUNC_ENTRY("CATProject::IsUninstrumented");
+ string sCfgFile( AT_TEMP_DIR );
+ sCfgFile.append( "\\" );
+ sCfgFile.append( AT_PROJECT_ATTRIBUTES_FILE_NAME );
+ if ( ! FileExists( sCfgFile.c_str() ) )
+ return true;
+ if( !ReadAttributes() )
+ {
+ LOG_STRING( "Error, reading project.cfg file." );
+ return false;
+ }
+ return m_bUninstrumented;
+}
+
+// ----------------------------------------------------------------------------
+// CATProject::RunCompile()
+// Helper functions to run different modes.
+// ----------------------------------------------------------------------------
+int CATProject::RunCompile()
+{
+ LOG_FUNC_ENTRY("CATProject::RunCompile");
+ // Store attributes
+ if( ! MakeTempDirIfNotExist() )
+ return AT_RETURN_CODE::WRITE_ATTRIBUTES_ERROR;
+ if ( ! WriteAttributes() )
+ return AT_RETURN_CODE::WRITE_ATTRIBUTES_ERROR;
+ // Create makefile
+ if ( ! CreateMakeFile() )
+ return AT_RETURN_CODE::MAKEFILE_ERROR;
+ // Read makefile to get project attributes
+ if ( ! ReadMakeFile() )
+ return AT_RETURN_CODE::READ_MAKEFILE_ERROR;
+ // Filter unsupported
+ FilterModules();
+ // Check that we have some "valid" modules to hook
+ if ( m_vModules.size() == 0 &&( m_vUnsupportedModules.size() > 0 || m_vStaticLibraries.size() > 0 ) )
+ return AT_RETURN_CODE::NO_SUPPORTED_MODULES_ERROR;
+ // Check is possible target module defined in project
+ if ( ! IsTargetModuleInProject() )
+ return AT_RETURN_CODE::INVALID_MMP_DEFINED;
+ // Clean temporary dirs of modules
+ if ( ! CleanTemporaryDirs() )
+ return AT_RETURN_CODE::CLEANING_TEMP_ERROR;
+ // Create temporary cpps for modulse
+ if (! CreateTemporaryCpps() )
+ return AT_RETURN_CODE::CREATING_TEMP_CPP_ERROR;
+ // Hook modules
+ if (! ModifyModules() )
+ return AT_RETURN_CODE::MODIFY_MODULES_ERROR;
+ // Compile all
+ // Return code
+ int iRetCode = AT_RETURN_CODE::OK;
+ // Compile
+ if ( ! Compile() )
+ iRetCode = AT_RETURN_CODE::COMPILE_ERROR;
+ // Listings
+ if (! CreateListings() )
+ iRetCode = AT_RETURN_CODE::COMPILE_ERROR;
+ // Releasables
+ if (! CopyReleasables() )
+ iRetCode = AT_RETURN_CODE::RELEASABLES_ERROR;
+ // Restore "unhook" modules
+ if (! RestoreModules() )
+ iRetCode = AT_RETURN_CODE::RESTORE_MODULES_ERROR;
+ // Return error code OK
+ return iRetCode;
+}
+
+int CATProject::RunClean()
+{
+ LOG_FUNC_ENTRY("CATProject::RunClean");
+ int iRetCode = AT_RETURN_CODE::OK;
+ bool bNothingFound = true;
+ // Read attributes.
+ if ( ReadAttributes() )
+ {
+ bNothingFound = false;
+ if ( m_eBuildSystem == SBS_V1 )
+ InitSbs1MakeFileWithPathToTemp();
+ // Read makefile to get project attributes
+ if( ReadMakeFile() )
+ {
+ // Filter unsupported
+ FilterModules();
+ // Restore modules to make sure no changes left
+ if( VerifyAndRecoverModules() )
+ {
+ // Run reallyclean
+ switch ( m_eBuildSystem )
+ {
+ case SBS_V1:
+ RunReallyCleanSbs1();
+ break;
+ case SBS_V2:
+ RunReallyCleanSbs2();
+ break;
+ default:
+ break;
+ }
+ // Delete temporary dirs of modules
+ if(! DeleteTemporaryDirs() )
+ {
+
+ }
+ }
+ else
+ {
+
+ }
+ }
+ }
+ // Projects
+ if ( ! DirDelete( AT_TEMP_DIR, true ) )
+ {
+
+ }
+ else
+ bNothingFound = false;
+
+ if ( bNothingFound )
+ cout << AT_MSG << "Nothing found to clean." << endl;
+ else
+ cout << AT_MSG << "Cleaning done." << endl;
+ return iRetCode;
+}
+
+int CATProject::RunAnalyze()
+{
+ LOG_FUNC_ENTRY("CATProject::RunAnalyze");
+
+ // Parse data file if it is trace.
+ if ( !IsDataFile( m_sDataFile ) )
+ {
+ m_sDataFileTemp.clear();
+ m_sDataFileTemp.append( m_sDataFile );
+ m_sDataFileTemp.append( ".atool" );
+ cout << AT_MSG << "Parsing trace file..." << endl;
+ CATParseTraceFile Parser;
+ if ( ! Parser.StartParse( m_sDataFile.c_str(), m_sDataFileTemp.c_str() ) )
+ {
+ return AT_RETURN_CODE::EMPTY_DATA_FILE;
+ }
+ m_sDataFile = m_sDataFileTemp;
+ }
+
+ // Init makefile member for this run mode.
+ if ( m_eBuildSystem == SBS_V1 )
+ InitSbs1MakeFileWithPathToTemp();
+ // Read makefile to get project attributes
+ if( ! ReadMakeFile() )
+ {
+ cout << AT_MSG << "Error, cannot find project build with AnalyzeTool." << endl;
+ }
+ else
+ FilterModules();
+
+ #ifndef ADDR2LINE
+ // Initialize modules locating code lines.
+ for( size_t i = 0 ; i < m_vModules.size() ; i++ )
+ {
+ m_vModules.at(i)->InitializeAddressToLine();
+ }
+ #endif
+
+ // Create analyzer
+ m_pAnalyzer = new CATDatParser( &m_vModules );
+
+ // Pass some info from project if it "exists" to analyzer.
+ if ( m_vModules.size() > 0 )
+ {
+ // Pass platform.
+ m_pAnalyzer->SetProjectPlatform( m_sPlatform );
+ // Pass build type.
+ m_pAnalyzer->SetProjectBuildType( m_eBuildType );
+ }
+
+ // Set file.
+ m_pAnalyzer->SetInputFile( m_sDataFile );
+
+ // Set rom symbol file.
+ m_pAnalyzer->SetRomSymbolFiles( m_vRomSymbolFiles );
+
+ // Set output file if specified
+ if ( ! m_sDataFileOutput.empty() )
+ {
+ m_pAnalyzer->SetOutputFile( m_sDataFileOutput );
+ }
+ // Set log level
+ m_pAnalyzer->SetLogLevel( m_iLoggingLevel );
+
+ // Analyze
+ return m_pAnalyzer->Analyze();
+}
+
+int CATProject::RunInstrument()
+{
+ LOG_FUNC_ENTRY("CATProject::RunInstrument");
+ // Store attributes
+ if( ! MakeTempDirIfNotExist() )
+ return AT_RETURN_CODE::WRITE_ATTRIBUTES_ERROR;
+ if ( ! WriteAttributes() )
+ return AT_RETURN_CODE::WRITE_ATTRIBUTES_ERROR;
+ if ( m_eBuildSystem == SBS_V1 )
+ {
+ // Initialize level 1 make file member.
+ if ( ! InitSbs1MakeFileWithPath() )
+ return AT_RETURN_CODE::MAKEFILE_ERROR;
+ // Copy it to temporary folder.
+ CopyMakeFileSbs1ToTemporaryFolder();
+ // Run export.
+ if( ! RunExportSbs1() )
+ return AT_RETURN_CODE::MAKEFILE_ERROR;
+ // Create level 2 makefiles.
+ if ( ! CreateMakeFileSbs1Level2() )
+ return AT_RETURN_CODE::MAKEFILE_ERROR;
+ }
+ else if ( m_eBuildSystem == SBS_V2 )
+ {
+ // Create makefile only when using SBS v.2
+ if ( ! CreateMakeFile() )
+ return AT_RETURN_CODE::MAKEFILE_ERROR;
+ }
+ else
+ {
+ return AT_RETURN_CODE::UNKNOWN;
+ }
+ // Read makefile to get project attributes
+ if ( ! ReadMakeFile() )
+ return AT_RETURN_CODE::READ_MAKEFILE_ERROR;
+ // Filter unsupported
+ FilterModules();
+ // Check that we have some "valid" modules to hook
+ if ( m_vModules.size() == 0 &&( m_vUnsupportedModules.size() > 0 || m_vStaticLibraries.size() > 0 ) )
+ return AT_RETURN_CODE::NO_SUPPORTED_MODULES_ERROR;
+
+ // Clean temporary dirs of modules
+ if ( ! CleanTemporaryDirs() )
+ return AT_RETURN_CODE::CLEANING_TEMP_ERROR;
+ // Create temporary cpps for modulse
+ if (! CreateTemporaryCpps() )
+ return AT_RETURN_CODE::CREATING_TEMP_CPP_ERROR;
+ // Hook modules
+ if (! ModifyModules() )
+ return AT_RETURN_CODE::MODIFY_MODULES_ERROR;
+ return AT_RETURN_CODE::OK;
+}
+
+int CATProject::RunInstrumentConsole()
+{
+ LOG_FUNC_ENTRY("CATProject::RunInstrumentConsole");
+ if( ! MakeTempDirIfNotExist() )
+ return AT_RETURN_CODE::UNKNOWN;
+ // Store attributes
+ m_bUninstrumented = false;
+ if ( ! WriteAttributes() )
+ return AT_RETURN_CODE::WRITE_ATTRIBUTES_ERROR;
+ // Create makefile
+ if ( ! CreateMakeFile() )
+ return AT_RETURN_CODE::MAKEFILE_ERROR;
+ // Read makefile to get project attributes
+ if ( ! ReadMakeFile() )
+ return AT_RETURN_CODE::READ_MAKEFILE_ERROR;
+ // Filter unsupported
+ FilterModules();
+ // Check that we have some "valid" modules to hook
+ if ( m_vModules.size() == 0 &&( m_vUnsupportedModules.size() > 0 || m_vStaticLibraries.size() > 0 ) )
+ return AT_RETURN_CODE::NO_SUPPORTED_MODULES_ERROR;
+
+ // Clean temporary dirs of modules
+ if ( ! CleanTemporaryDirs() )
+ return AT_RETURN_CODE::CLEANING_TEMP_ERROR;
+ // Create temporary cpps for modulse
+ if (! CreateTemporaryCpps() )
+ return AT_RETURN_CODE::CREATING_TEMP_CPP_ERROR;
+ // Hook modules
+ if (! ModifyModules() )
+ return AT_RETURN_CODE::MODIFY_MODULES_ERROR;
+ // Run Reallyclean when using abld.
+ if ( m_eBuildSystem == SBS_V1 )
+ RunReallyCleanSbs1();
+ return AT_RETURN_CODE::OK;
+}
+
+int CATProject::RunUninstrument()
+{
+ LOG_FUNC_ENTRY("CATProject::RunUninstrument");
+ // Read attributes.
+ if ( ! ReadAttributes() )
+ return AT_RETURN_CODE::READ_ATTRIBUTES_ERROR;
+ // Init makefile member for this run mode.
+ if ( m_eBuildSystem == SBS_V1 )
+ InitSbs1MakeFileWithPathToTemp();
+ // Read makefile to get project attributes
+ if ( ! ReadMakeFile() )
+ return AT_RETURN_CODE::READ_MAKEFILE_ERROR;
+ // Filter unsupported
+ FilterModules();
+ // Check that we have some "valid" modules to hook
+ if ( m_vModules.size() == 0 &&( m_vUnsupportedModules.size() > 0 || m_vStaticLibraries.size() > 0 ) )
+ return AT_RETURN_CODE::NO_SUPPORTED_MODULES_ERROR;
+ // Create lst files
+ if (! CreateListings() )
+ return AT_RETURN_CODE::COMPILE_ERROR;
+ // Copy releasables of modules
+ if (! CopyReleasables() )
+ return AT_RETURN_CODE::RELEASABLES_ERROR;
+ // Restore "unhook" modules
+ if (! RestoreModules() )
+ return AT_RETURN_CODE::RESTORE_MODULES_ERROR;
+ // Return error code OK
+ return AT_RETURN_CODE::OK;
+}
+
+int CATProject::RunUninstrumentConsole()
+{
+ LOG_FUNC_ENTRY("CATProject::RunUninstrumentConsole");
+ int iErrorCode = AT_RETURN_CODE::OK;
+ // Read attributes
+ if ( ReadAttributes() )
+ {
+ // Init makefile member for this run mode.
+ if ( m_eBuildSystem == SBS_V1 )
+ InitSbs1MakeFileWithPathToTemp();
+ // Read makefile to get project attributes
+ if( ReadMakeFile() )
+ {
+ // Filter unsupported
+ FilterModules();
+ // Create lst files
+ CreateListings();
+ if (! CopyReleasables() )
+ iErrorCode = AT_RETURN_CODE::RELEASABLES_ERROR;
+ }
+ else
+ iErrorCode = AT_RETURN_CODE::READ_MAKEFILE_ERROR;
+ // Change state to uninstrumented and write status
+ m_bUninstrumented = true;
+ if ( ! WriteAttributes() )
+ iErrorCode = AT_RETURN_CODE::WRITE_ATTRIBUTES_ERROR;
+ }
+ else
+ {
+ iErrorCode = AT_RETURN_CODE::READ_ATTRIBUTES_ERROR;
+ }
+ return iErrorCode;
+}
+
+int CATProject::RunUninstrumentFailed()
+{
+ LOG_FUNC_ENTRY("CATProject::RunUninstrumentFailed");
+ // Read attributes.
+ if ( ! ReadAttributes() )
+ return AT_RETURN_CODE::READ_ATTRIBUTES_ERROR;
+ // Init makefile member for this run mode.
+ if ( m_eBuildSystem == SBS_V1 )
+ InitSbs1MakeFileWithPathToTemp();
+ // Read makefile to get project attributes
+ if( ReadMakeFile() )
+ {
+ // Filter modules
+ FilterModules();
+ // Restore modules to make sure no changes left
+ if( RestoreModules() )
+ {
+ // Delete temporary dirs of modules
+ if(! DeleteTemporaryDirs() )
+ {
+
+ }
+
+ }
+ else
+ {
+
+ }
+ }
+ else
+ {
+
+ }
+ // Projects
+ if ( ! DirDelete( AT_TEMP_DIR, true ) )
+ {
+
+ }
+ return AT_RETURN_CODE::OK;
+}
+
+// ----------------------------------------------------------------------------
+// Main Functions
+// ----------------------------------------------------------------------------
+void CATProject::DisplayCompileSummary()
+{
+ LOG_FUNC_ENTRY("CATProject::DisplayCompileSummary");
+ cout << AT_BUILD_SUMMARY_HEADER;
+ // Supported modules
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ {
+ // Successful
+ if ( m_vModules.at(i)->GetErrors().empty() )
+ {
+ // Create build complete file for Carbide xtension
+ m_vModules.at(i)->CreateBuildCompleteFile();
+ cout << AT_BUILD_SUMMARY_INSTRUMENTED_BUILD_COMPLETE
+ << GetPathOrFileName( true, m_vModules.at(i)->GetMmpFile() )
+ << endl
+ << AT_BUILD_SUMMARY_TARGET
+ << m_vModules.at(i)->GetBinaryName()
+ << endl;
+ // Datafiles
+ // Use module data file name if project's data file not defined.
+ if ( m_eLoggingMode == CATProject::FILE
+ && m_vModules.at(i)->GetTargetType().compare("exe") == 0 )
+ {
+ if ( m_sS60FileName.empty() )
+ cout << AT_BUILD_SUMMARY_DATA_FILE_NAME
+ << m_vModules.at(i)->GetS60FileName()
+ << endl;
+ else
+ cout << AT_BUILD_SUMMARY_DATA_FILE_NAME
+ << m_sS60FileName
+ << endl;
+ }
+ }
+ else
+ {
+ // Failed
+ cout << AT_BUILD_SUMMARY_FAILED
+ << GetPathOrFileName( true, m_vModules.at(i)->GetMmpFile() )
+ << endl
+ << AT_BUILD_SUMMARY_TARGET
+ << m_vModules.at(i)->GetBinaryName()
+ << endl;
+ // Print errors.
+ cout << AT_BUILD_SUMMARY_ERRORS
+ << m_vModules.at(i)->GetErrors()
+ << endl;
+ }
+ }
+
+ // Static libraries
+ for( size_t i = 0; i < m_vStaticLibraries.size(); i++ )
+ {
+ if ( m_vStaticLibraries.at(i)->GetErrors().empty() )
+ {
+ cout << AT_BUILD_SUMMARY_NORMAL_BUILD_COMPLETE
+ << GetPathOrFileName( true, m_vStaticLibraries.at(i)->GetMmpFile())
+ << endl
+ << AT_BUILD_SUMMARY_TARGET
+ << m_vStaticLibraries.at(i)->GetBinaryName()
+ << endl
+ << AT_BUILD_SUMMARY_STATIC_LIBRARY
+ << endl;
+
+ }
+ else
+ {
+ // Failed
+ cout << AT_BUILD_SUMMARY_FAILED
+ << GetPathOrFileName( true, m_vStaticLibraries.at(i)->GetMmpFile() )
+ << endl
+ << AT_BUILD_SUMMARY_TARGET
+ << m_vStaticLibraries.at(i)->GetBinaryName()
+ << endl;
+ // Print errors.
+ cout << AT_BUILD_SUMMARY_ERRORS
+ << m_vStaticLibraries.at(i)->GetErrors()
+ << endl;
+ }
+ }
+
+ // Unsupported modules
+ for( size_t i = 0; i < m_vUnsupportedModules.size(); i++ )
+ {
+ cout << AT_BUILD_SUMMARY_NORMAL_BUILD_COMPLETE
+ << GetPathOrFileName( true, m_vUnsupportedModules.at(i)->GetMmpFile() )
+ << endl
+ << AT_BUILD_SUMMARY_TARGET
+ << m_vUnsupportedModules.at(i)->GetBinaryName()
+ << endl;
+ cout << m_vUnsupportedModules.at(i)->GetCompileInfoText() << endl;
+ }
+}
+
+void CATProject::DisplayBuildSummary( void )
+{
+ LOG_FUNC_ENTRY("CATProject::DisplayBuildSummary");
+ cout << endl;
+ // Build information
+ cout << AT_BUILD_SUMMARY_BUILD_TYPE << GetBuildTypeString() << endl;
+ // Platform
+ cout << AT_BUILD_SUMMARY_BUILD_PLATFORM << m_sPlatform << endl;
+ // Possible variant
+ if ( ! m_sVariant.empty() )
+ cout << AT_BUILD_SUMMARY_BUILD_VARIANT << m_sVariant << endl;
+ // Logging mode
+ cout << AT_BUILD_SUMMARY_LOGGING_MODE;
+ if ( m_eLoggingMode == FILE )
+ cout << AT_BUILD_SUMMARY_FILE;
+ else if ( m_eLoggingMode == TRACE )
+ cout << AT_BUILD_SUMMARY_TRACE;
+ else if ( m_eLoggingMode == TRACE_FAST )
+ cout << AT_BUILD_SUMMARY_TRACE_FAST;
+ cout << endl;
+ // Call stack sizes
+ cout << AT_BUILD_SUMMARY_ALLOC_CALL_STACK_SIZE
+ << m_iAllocCallStackSize
+ << endl;
+ cout << AT_BUILD_SUMMARY_FREE_CALL_STACK_SIZE
+ << m_iFreeCallStackSize
+ << endl;
+
+ if(!_stricmp(m_sPlatform.c_str(), ("winscw")))
+ {
+ //print version info only when version is not up-to-date
+ cout << endl;
+ showDbgHelpVersionInfo( false );
+ }
+}
+
+bool CATProject::CreateMakeFile()
+{
+ switch ( m_eBuildSystem )
+ {
+ case SBS_V1:
+ if( ! CreateMakeFileSbs1() )
+ return false;
+ // Copy main make file.
+ if( ! CopyMakeFileSbs1ToTemporaryFolder() )
+ return false;
+ // Run export.
+ if( ! RunExportSbs1() )
+ return false;
+ // Create level 2 makefiles.
+ if( ! CreateMakeFileSbs1Level2() )
+ return false;
+ return true;
+ case SBS_V2:
+ return CreateMakeFileSbs2();
+ default:
+ return false;
+ }
+}
+
+bool CATProject::CreateMakeFileSbs1()
+{
+ LOG_FUNC_ENTRY("CATProject::CreateMakeFileSbs1");
+
+ // If variant defined check does it exist.
+ if( ! m_sVariant.empty() )
+ {
+ if ( ! CheckVariant( m_sEpocRoot, m_sVariant ) )
+ {
+ cout << INVALID_VARIANT_ERROR;
+ if ( IsDefaultVariant( m_sEpocRoot ) )
+ {
+ m_sVariant = "default";
+ cout << USING_DEFAULT_VARIANT_MESSAGE;
+ if ( ! WriteAttributes() )
+ return false;
+ }
+ else
+ {
+ cout << NO_DEFAULT_VARIANT_ERROR;
+ return false;
+ }
+ }
+ }
+
+ // Create level 1 make file.
+ string sCmd( "bldmake bldfiles " );
+ sCmd.append( m_sPlatform );
+ cout << AT_MSG_SYSTEM_CALL << sCmd << endl;
+ (void)system( sCmd.c_str() );
+ return InitSbs1MakeFileWithPath();
+}
+
+bool CATProject::CopyMakeFileSbs1ToTemporaryFolder()
+{
+ LOG_FUNC_ENTRY("CATProject::CopyMakeFileSbs1ToTemporaryFolder");
+ // Check that temporary dir exists if not create it.
+ if ( ! MakeTempDirIfNotExist() )
+ return false;
+ // Copy makefile to temporary directory
+ string sMakeFileInTemp( AT_TEMP_DIR );
+ sMakeFileInTemp.append( "\\" );
+ sMakeFileInTemp.append( AT_LEVEL_1_MAKEFILE_NAME );
+ if ( ! FileCopyToPath( m_sMakeFile, sMakeFileInTemp ) )
+ return false;
+ return true;
+
+}
+
+bool CATProject::RunReallyCleanSbs1()
+{
+ LOG_FUNC_ENTRY("CATProject::RunReallyCleanSbs1");
+ // Check that abld.bat has been made.
+ if ( ! FileExists( "abld.bat" ) )
+ return false;
+ // Run reallyclean.
+ string sCmd;
+ if ( m_bAbldTest )
+ sCmd = "abld test reallyclean ";
+ else
+ sCmd = "abld reallyclean ";
+ sCmd.append( m_sPlatform );
+ if ( ! m_sVariant.empty() )
+ {
+ sCmd.append( "." );
+ sCmd.append( m_sVariant );
+ }
+ sCmd.append( " " );
+ sCmd.append( GetBuildTypeString() );
+ if ( m_vTargetModules.size() > 1 )
+ {
+ RunAbldCommandToAllTargets( sCmd );
+ }
+ else
+ {
+ AddTargetModuleIfDefined( sCmd );
+ cout << AT_MSG_SYSTEM_CALL << sCmd << endl;
+ (void) system( sCmd.c_str() );
+ }
+ return true;
+}
+
+bool CATProject::RunReallyCleanSbs2()
+{
+ LOG_FUNC_ENTRY("CATProject::RunReallyCleanSbs2");
+ string sCmd("");
+ if ( m_sBuildCommand.empty() )
+ {
+ // If no build command defined (not found in project.cfg).
+ sCmd.append( RAPTOR_CMD_BASE );;
+ sCmd.append( m_sPlatform );
+ sCmd.append( "_" );
+ sCmd.append( GetBuildTypeString() );
+ if ( ! m_sVariant.empty() )
+ {
+ sCmd.append( "." );
+ sCmd.append( m_sVariant );
+ }
+ sCmd.append( RAPTOR_REALLYCLEAN_LOG );
+ AddTargetModuleIfDefined( sCmd );
+ sCmd.append( " REALLYCLEAN" );
+ }
+ else
+ {
+ // When build command set use it.
+ sCmd.append( m_sBuildCommand );
+ sCmd.append( RAPTOR_REALLYCLEAN_LOG );
+ sCmd.append( " REALLYCLEAN" );
+ }
+ cout << AT_MSG_SYSTEM_CALL << sCmd << endl;
+ int iRet = (int)system( sCmd.c_str() );
+ if ( iRet == 0 )
+ return true;
+ return false;
+}
+
+bool CATProject::RunExportSbs1()
+{
+ LOG_FUNC_ENTRY("CATProject::RunExportSbs1");
+ // Run export.
+ string sCmd;
+ if ( m_bAbldTest )
+ sCmd = "abld test export";
+ else
+ sCmd = "abld export";
+ cout << AT_MSG_SYSTEM_CALL << sCmd << endl;
+ (void) system( sCmd.c_str() );
+ return true;
+}
+
+bool CATProject::CreateMakeFileSbs1Level2()
+{
+ LOG_FUNC_ENTRY("CATProject::CreateMakeFileSbs1Level2");
+ // Create level 2 makefiles.
+
+ string sCmd;
+
+ if ( m_bAbldTest )
+ sCmd ="abld test makefile ";
+ else
+ sCmd ="abld makefile ";
+
+ sCmd.append( m_sPlatform );
+ if ( ! m_sVariant.empty() )
+ {
+ sCmd.append( "." );
+ sCmd.append( m_sVariant );
+ }
+
+ // Check if multiple targets defined and sbs 1.
+ if ( m_vTargetModules.size() > 1 )
+ {
+ RunAbldCommandToAllTargets( sCmd );
+ }
+ else
+ {
+ AddTargetModuleIfDefined( sCmd );
+ cout << AT_MSG_SYSTEM_CALL << sCmd << endl;
+ (void) system( sCmd.c_str() );
+ }
+ return true;
+}
+
+bool CATProject::CreateMakeFileSbs2()
+{
+ LOG_FUNC_ENTRY("CATProject::CreateMakeFileSbs2");
+ // Delete build directory if it exists before creating new makefiles.
+ if ( DirectoryExists( "atool_temp\\build" ) )
+ DirDelete( "atool_temp\\build", true );
+ // Create command to create makefiles.
+ string sCmd( m_sBuildCommand );
+ sCmd.append( " " );
+ sCmd.append( RAPTOR_MAKEFILE_SWITCH );
+ sCmd.append( " " );
+ sCmd.append( RAPTOR_NOBUILD_SWITCH );
+ cout << AT_MSG_SYSTEM_CALL << sCmd << endl;
+ int iRet = (int)system( sCmd.c_str() );
+ if ( iRet == 0 )
+ return true;
+ return false;
+}
+
+bool CATProject::ReadMakeFile()
+{
+ // Clean modules before reading.
+ CleanModuleVectors();
+ if ( m_eBuildSystem == SBS_V1 )
+ {
+ // Read level 1 makefile which contains module name and makefiles.
+ if( ! ReadMakeFileSbs1Level1() )
+ return false;
+ // Read level 2 makefiles.
+ vector<CATModule2*>::iterator it;
+ // If we are compiling or etc... we need to create temporary directories.
+ if ( m_eMode == COMPILE || m_eMode == INSTRUMENT || m_eMode == INSTRUMENT_CONSOLE )
+ {
+ // Read make makefiles from /epoc32/build... and create temporary directory.
+ bool bLevel2 = true;
+ for( it = m_vModules.begin(); it != m_vModules.end() ; it ++ )
+ {
+ if( ! (*it)->CreateTemporaryDirectory() )
+ return false;
+ if( ! (*it)->ReadMakeFile() )
+ {
+ bLevel2 = false;
+ break;
+ }
+ }
+ // If failed reading modules from level 2 makefiles.
+ if ( ! bLevel2 )
+ {
+ // Clean modules.
+ CleanModuleVectors();
+ // Try use default variant if it exists.
+ if ( CheckVariant( m_sEpocRoot, "default" ) )
+ {
+ m_sVariant = "default";
+ cout << USING_DEFAULT_VARIANT_MESSAGE;
+ if ( ! WriteAttributes() )
+ return false;
+ if ( ! InitSbs1MakeFileWithPath() )
+ return false;
+ if ( ! ReadMakeFileSbs1Level1() )
+ return false;
+ for( it = m_vModules.begin(); it != m_vModules.end() ; it ++ )
+ {
+ if( ! (*it)->CreateTemporaryDirectory() )
+ return false;
+ if( ! (*it)->ReadMakeFile() )
+ return false;
+ }
+
+ }
+ }
+ }
+ else
+ {
+ // Read make files from temporary directories.
+ for( it = m_vModules.begin(); it != m_vModules.end() ; it ++ )
+ {
+ if ( ! (*it)->ReadMakeFileFromTemp() )
+ return false;
+ }
+ }
+ return true;
+ }
+ else if ( m_eBuildSystem == SBS_V2 )
+ {
+ // Read make file.
+ if( ! ReadMakeFileSbs2() )
+ return false;
+ // Create module temporary directories if we are compiling or etc...
+ if ( m_eMode == COMPILE || m_eMode == INSTRUMENT || m_eMode == INSTRUMENT_CONSOLE )
+ {
+ for( vector<CATModule2*>::iterator it = m_vModules.begin(); it < m_vModules.end(); it++ )
+ (*it)->CreateTemporaryDirectory();
+ for( vector<CATModule2*>::iterator it = m_vStaticLibraries.begin(); it < m_vStaticLibraries.end(); it++ )
+ (*it)->CreateTemporaryDirectory();
+ }
+ }
+ return true;
+}
+
+bool CATProject::ReadMakeFileSbs1Level1()
+{
+ LOG_FUNC_ENTRY("CATProject::ReadMakeFileSbs1Level1");
+
+ bool bRet = false;
+
+ //Try to open makefile
+ ifstream in;
+ in.open( m_sMakeFile.c_str() );
+
+ //File open ok?
+ if( !in.good() )
+ {
+ printf( "Can not open file: %s\n", m_sMakeFile.c_str() );
+ in.close();
+ return bRet;
+ }
+
+ // Add also these so "compatible with sbs2".
+ // Releasables path (binaries).
+ string sReleasePath( m_sEpocRoot );
+ // add trailing '\' if root path is missing it
+ if ( sReleasePath.size() < 1 )
+ sReleasePath.append( "\\" );
+ else if ( sReleasePath.at( sReleasePath.length() -1 ) != '\\' )
+ sReleasePath.append( "\\" );
+ sReleasePath.append( "epoc32\\release" );
+ string sFullVariantPath( m_sPlatform );
+ sFullVariantPath.append( "\\" );
+ sFullVariantPath.append( GetBuildTypeString() );
+
+ char cTemp[MAX_LINE_LENGTH];
+ bool bContinueSearch = true;
+ bool bMmpInfoFound = false;
+ CATModule2* pModule = 0;
+ string sTempLineFromFile;
+ string sMmpFileSearchString;
+ if ( m_bAbldTest )
+ sMmpFileSearchString = MMPTESTFILE_SEARCH_STRING;
+ else
+ sMmpFileSearchString = MMPFILE_SEARCH_STRING;
+ do
+ {
+ // get line from file
+ in.getline( cTemp, MAX_LINE_LENGTH );
+ sTempLineFromFile.clear();
+ sTempLineFromFile.append( cTemp );
+
+ //Search makefile string
+ if( sTempLineFromFile.find( MAKEFILE_SEARCH_STRING ) != string::npos )
+ {
+ bMmpInfoFound = true;
+ if( sTempLineFromFile.find( sMmpFileSearchString ) != string::npos )
+ {
+ bRet = true;
+ //Parse mmp path + mmp filename
+ sTempLineFromFile.erase( 0, sTempLineFromFile.find_first_of("\"") );
+ sTempLineFromFile.erase( 0, 1 );
+
+ string sPath = sTempLineFromFile.substr(0, sTempLineFromFile.find_first_of("\"") );
+
+ sPath = ChangeSlashToBackSlash( sPath );
+ //Remove text "bld.inf"
+ sPath.erase( (sPath.find_last_of( "\\" ) + 1) , string::npos );
+
+ string sFileName = sTempLineFromFile.substr( (sTempLineFromFile.find( sMmpFileSearchString ) + sMmpFileSearchString.length() + 3), string::npos );
+ sFileName = ChangeSlashToBackSlash( sFileName );
+ sFileName = sFileName.substr( 0, sFileName.find_first_of("\"") );
+
+ // Append .mmp to filename if it does not exist
+ if ( sFileName.find(".mmp") == string::npos )
+ sFileName.append(".mmp");
+
+ //Insert drive letter
+ sPath.insert(0, string( m_cCurrentDir).substr(0,2) );
+
+ //Insert mmp file to the end
+ sPath.append( sFileName );
+
+ ChangeToLower( sPath );
+
+ // If target programs defined find from those or do not
+ // add module to vector.
+ bool bAddToVector = true;
+ if ( m_vTargetModules.size() > 0 )
+ {
+ bAddToVector = false;
+ vector<string>::iterator it;
+ for( it = m_vTargetModules.begin() ; it != m_vTargetModules.end() ; it++ )
+ {
+ string sFind( *it );
+ sFind.insert( 0, "\\" );
+ if ( sPath.find( sFind ) != string::npos )
+ {
+ bAddToVector = true;
+ break;
+ }
+ }
+ }
+
+ if ( bAddToVector )
+ {
+ pModule = new CATModule2();
+ pModule->SetMmpFile( sPath );
+ pModule->SetVariantType( GetBuildTypeString() );
+ pModule->SetVariantPlatform( m_sPlatform );
+ pModule->SetReleasePath( sReleasePath );
+ pModule->SetFullVariantPath( sFullVariantPath );
+ pModule->SetBuildSystem( SBS_V1 );
+ m_vModules.push_back( pModule );
+ }
+ }
+ }
+ else if( bMmpInfoFound )
+ //Do not continue search if mmp info lines are all handled
+ bContinueSearch = false;
+ if( !in.good() )
+ bContinueSearch = false;
+ }
+ while( bContinueSearch );
+
+ bContinueSearch = true;
+
+ //Search MAKEFILES for invidual modules
+ do
+ {
+ in.getline( cTemp, MAX_LINE_LENGTH );
+ sTempLineFromFile.clear();
+ sTempLineFromFile.append( cTemp );
+ // find the lines 'MAKEFILE[modulename]_FILES'
+ if( (sTempLineFromFile.find( "MAKEFILE" ) == 0) && (sTempLineFromFile.find( "_FILES" ) != string::npos) )
+ {
+ //Math the makefile line with one of our modules
+ for( size_t i = 0 ; i < m_vModules.size() ; i++ )
+ {
+ //Create name
+ string sMakeFile( "MAKEFILE" );
+ string sTempMmpFile( RemovePathAndExt( m_vModules.at(i)->GetMmpFile(), true ) );
+ ChangeToUpper( sTempMmpFile );
+ sMakeFile.append( sTempMmpFile );
+ sMakeFile.append( "_FILES" );
+ // matched
+ if( sTempLineFromFile.find( sMakeFile ) != string::npos )
+ {
+ //parse the makefile name from line
+ in.getline( cTemp, MAX_LINE_LENGTH );
+ sTempLineFromFile.clear();
+ sTempLineFromFile.append( cTemp );
+ //Remove character "\""
+ sTempLineFromFile.erase( 0, ( sTempLineFromFile.find_first_of("\"") + 1 ) );
+ // in winscw last part is '" \' and on armd '"' so remove all after last '"'
+ sTempLineFromFile.erase( sTempLineFromFile.find_last_of("\""), sTempLineFromFile.size() );
+ // Set correct makefile for module
+ m_vModules.at( i )->SetMakeFile( sTempLineFromFile );
+ // break
+ break;
+ } // If mathed to mmp
+ } // End of mmp file loop
+ } // found lines 'MAKEFILE[modulename]_FILES'
+ if( !in.good() )
+ bContinueSearch = false;
+ }
+ while( bContinueSearch );
+ in.close();
+ return bRet;
+}
+
+bool CATProject::ReadMakeFileSbs2( void )
+{
+ LOG_FUNC_ENTRY("CATProject::ReadMakeFileSbs2(void)");
+ // File is by default named make_build.default but when building specific layer
+ // make_build_LAYERNAME.default is produced by Raptor.
+ // So find makefile(s) and read them.
+ vector<string> vMakeFiles = DirList( "atool_temp\\build\\", false, true );
+ bool bRet = true;
+ for( vector<string>::iterator it = vMakeFiles.begin(); it != vMakeFiles.end() ; it++ )
+ {
+ // Recognize multiple makefiles.
+ if ( it->find("make_build_") != string::npos && it->find(".default") != string::npos )
+ {
+ if ( ! ReadMakeFileSbs2( *it ) )
+ bRet = false;
+ }
+ // Single makefile.
+ else if ( it->find( "make_build.default" ) != string::npos )
+ {
+ if ( ! ReadMakeFileSbs2( *it ) )
+ bRet = false;
+ }
+ }
+ // We got some modules?
+ if ( m_vModules.size() == 0 )
+ bRet = false;
+ return bRet;
+}
+
+bool CATProject::ReadMakeFileSbs2( string& sMakeFile )
+{
+ LOG_FUNC_ENTRY("CATProject::ReadMakeFileSbs2(string)");
+ try {
+ // Open file
+ ifstream in;
+ in.open( sMakeFile.c_str() , ios_base::in );
+ // Check that open ok
+ if ( ! in.good() )
+ {
+ cout << AT_MSG << "Error, opening file "
+ << RAPTOR_MAKEFILE << endl;
+ in.close();
+ return false;
+ }
+ // Source line from file
+ string sSourceLine;
+ // Module pointer
+ CATModule2* pModule = 0;
+ // Are we looking for module attributes
+ bool bFindAttributes = false;
+ // Until end of file
+ while( in.good() )
+ {
+ // Get new line from file
+ string sLine;
+ getline(in, sLine);
+ // New module
+ if ( sLine.find( RAPTOR_PROJECT_META ) == 0 )
+ {
+ // Remove project_meta from line
+ sLine.erase(0, strlen( RAPTOR_PROJECT_META ) );
+ LOG_STRING("Found module: " << sLine );
+ // Check is name empty
+ // This seems to happen when sbs2 "wraps" i.e. mifconv to a module type item
+ if ( sLine.empty() )
+ {
+ LOG_STRING("skipping empty module");
+ // Skip it
+ continue;
+ }
+ // If module add it to vector
+ if ( pModule )
+ {
+ // Add sources,
+ pModule->AddSources( sSourceLine );
+ // Build system.
+ pModule->SetBuildSystem( SBS_V1 );
+ // Push to vector.
+ m_vModules.push_back( pModule );
+ }
+ // New module
+ pModule = new CATModule2();
+ // Clear sourceline
+ sSourceLine.clear();
+ // Set modules mmp with path
+
+ if ( ! pModule->SetMmpFile( sLine ) )
+ {
+ // Fatal error setting mmp file
+ in.close();
+ return false;
+ }
+ // Find attributes on
+ bFindAttributes = true;
+ // Get new line from file
+ getline(in, sLine);
+ }
+ // If attribute finding on
+ if ( bFindAttributes )
+ {
+ // Pickup modules attributes
+ if ( sLine.find ( RAPTOR_SOURCE ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_SOURCE ) );
+ sSourceLine = sLine;
+ }
+ else if ( sLine.find ( RAPTOR_TARGET ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_TARGET ) );
+ pModule->SetTarget( sLine );
+ }
+ else if ( sLine.find ( RAPTOR_TARGETYPE ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_TARGETYPE ));
+ pModule->SetTargetType( sLine );
+ }
+ else if ( sLine.find( RAPTOR_REQUESTEDTARGETEXT ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_REQUESTEDTARGETEXT ) );
+ pModule->SetRequestedTargetExt( sLine );
+ }
+ else if ( sLine.find ( RAPTOR_VARIANTPLATFORM ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_VARIANTPLATFORM ));
+ pModule->SetVariantPlatform( sLine );
+ }
+ else if ( sLine.find ( RAPTOR_VARIANTTYPE ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_VARIANTTYPE ));
+ pModule->SetVariantType( sLine );
+ }
+ else if ( sLine.find ( RAPTOR_FEATUREVARIANT ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_FEATUREVARIANT ));
+ pModule->SetFeatureVariant( sLine );
+ }
+ else if ( sLine.find ( RAPTOR_FEATUREVARIANTNAME ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_FEATUREVARIANTNAME ));
+ pModule->SetFeatureVariantName( sLine );
+ }
+ else if ( sLine.find ( RAPTOR_RELEASEPATH ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_RELEASEPATH ));
+ pModule->SetReleasePath( sLine );
+ }
+ else if ( sLine.find ( RAPTOR_FULLVARIANTPATH ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_FULLVARIANTPATH ));
+ pModule->SetFullVariantPath( sLine );
+ }
+ else if ( sLine.find ( RAPTOR_COMPILE_DEFINITIONS ) == 0 )
+ {
+ sLine.erase(0, strlen( RAPTOR_COMPILE_DEFINITIONS ) );
+ pModule->SetCompileDefinitions( sLine );
+ }
+ }
+ } // while in.good()
+ // Add last module if n number of modules found
+ if ( pModule )
+ {
+ if ( ! pModule->GetTarget().empty() )
+ {
+ // Add sources
+ pModule->AddSources( sSourceLine );
+ // Build system.
+ pModule->SetBuildSystem( SBS_V1 );
+ // Push back to vector
+ m_vModules.push_back( pModule );
+ }
+ }
+ // Close file
+ in.close();
+ return true;
+ } // try.
+ catch(...)
+ {
+ LOG_STRING("Unexpected exception reading sbs 2 makefile");
+ return false;
+ }
+}
+bool CATProject::CreateTemporaryDirectories()
+{
+ LOG_FUNC_ENTRY("CATProject::CreateTemporaryDirectories");
+ bool bRet = true;
+ for( size_t i = 0 ; i < m_vModules.size(); i++)
+ {
+ if( ! m_vModules.at(i)->CreateTemporaryDirectory() )
+ bRet = false;
+ }
+ for( size_t i = 0 ; i < m_vStaticLibraries.size(); i++)
+ {
+ if( ! m_vStaticLibraries.at(i)->CreateTemporaryDirectory() )
+ bRet = false;
+ }
+ return bRet;
+
+}
+
+bool CATProject::CreateTemporaryCpps()
+{
+ LOG_FUNC_ENTRY("CATProject::CreateTemporaryCpps");
+ bool bRet = true;
+ for( size_t i = 0 ; i < m_vModules.size(); i++)
+ {
+ if( ! m_vModules.at(i)->CreateTempCpp(
+ m_sS60FileName, m_eLoggingMode, m_eBuildType, m_iAllocCallStackSize, m_iFreeCallStackSize ) )
+ bRet = false;
+ }
+ return bRet;
+}
+
+bool CATProject::FilterModules()
+{
+ LOG_FUNC_ENTRY("CATProject::FilterModules");
+ vector<CATModule2*>::iterator it;
+ // Loop thru modules.
+ it = m_vModules.begin();
+ while( it != m_vModules.end() )
+ {
+ // Get target type of module to separate string (will be modified).
+ string sTargetType = (*it)->GetTargetType();
+ // Modules compile definitions.
+ string sCompileDefinition = (*it)->GetCompileDefinitions();
+ // Check is it supported.
+ if ( !IsTargetTypeSupported( sTargetType) )
+ {
+ (*it)->SetCompileInfoText( AT_UNSUPPORTED_TARGET_TYPE );
+ // Not supported add to not supported vector.
+ m_vUnsupportedModules.push_back( *it );
+ // Erase cell.
+ it = m_vModules.erase( it );
+ }
+ // Check if its static library
+ else if ( _stricmp( sTargetType.c_str(), "lib" ) == 0 )
+ {
+ // Static librarie move to their vector.
+ m_vStaticLibraries.push_back( *it );
+ // Erase cell.
+ it = m_vModules.erase( it );
+
+ }
+ else if ( sCompileDefinition.find( KERNEL_MODE_COMPILE_DEFINITION ) != string::npos )
+ {
+ (*it)->SetCompileInfoText( AT_UNSUPPORTED_COMPILE_DEFINITION );
+ // Not supported add to not supported vector.
+ m_vUnsupportedModules.push_back( *it );
+ // Erase cell.
+ it = m_vModules.erase( it );
+ }
+ else
+ it++;
+ }
+ return true;
+}
+
+bool CATProject::ModifyModules()
+{
+ LOG_FUNC_ENTRY("CATProject::ModifyModules");
+ bool bRet = true;
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ {
+ if (! m_vModules.at(i)->ModifyMmp() )
+ bRet = false;
+ }
+ for( size_t i = 0; i < m_vStaticLibraries.size(); i++ )
+ {
+ if (! m_vStaticLibraries.at(i)->ModifyMmp() )
+ bRet = false;
+ }
+ return bRet;
+}
+
+bool CATProject::RestoreModules()
+{
+ LOG_FUNC_ENTRY("CATProject::RestoreModules");
+ bool bRet = true;
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ {
+ if (! m_vModules.at(i)->RestoreMmp() )
+ bRet = false;
+ }
+ for( size_t i = 0; i < m_vStaticLibraries.size(); i++ )
+ {
+ if (! m_vStaticLibraries.at(i)->RestoreMmp() )
+ bRet = false;
+ }
+ return bRet;
+}
+
+bool CATProject::VerifyAndRecoverModules()
+{
+ LOG_FUNC_ENTRY("CATProject::VerifyAndRecoverModules");
+ bool bRet = true;
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ {
+ if (! m_vModules.at(i)->VerifyAndRecoverMmp() )
+ bRet = false;
+ }
+ for( size_t i = 0; i < m_vStaticLibraries.size(); i++ )
+ {
+ if (! m_vStaticLibraries.at(i)->VerifyAndRecoverMmp() )
+ bRet = false;
+ }
+ return bRet;
+}
+bool CATProject::Compile()
+{
+ switch ( m_eBuildSystem )
+ {
+ case SBS_V1:
+ // Run Reallyclean.
+ if( ! RunReallyCleanSbs1() )
+ return false;
+ return CompileSbs1();
+ case SBS_V2:
+ return CompileSbs2();
+ default:
+ return false;
+ }
+}
+
+bool CATProject::CompileSbs1()
+{
+ LOG_FUNC_ENTRY("CATProject::CompileSbs1");
+ string sCommand("");
+ if ( m_sBuildCommand.empty() )
+ {
+ sCommand = "abld build";
+ // -debug if urel
+ if ( m_eBuildType == UREL )
+ sCommand.append( " -debug" );
+
+ // No variant
+ if ( m_sVariant.empty() )
+ {
+ sCommand.append( " " );
+ sCommand.append( m_sPlatform );
+ }
+ else
+ {
+ // Add variant
+ sCommand.append( " " );
+ sCommand.append( m_sPlatform );
+ sCommand.append( "." );
+ sCommand.append( m_sVariant );
+ }
+
+ // urel vs udeb
+ sCommand.append( " " );
+ sCommand.append( GetBuildTypeString() );
+
+ // Possible target module
+ AddTargetModuleIfDefined( sCommand );
+ }
+ // Check that build command contains -debug switch if sbs v.1 used
+ else if ( ! m_sBuildCommand.empty()
+ && m_eBuildType == UREL
+ && m_eBuildSystem == SBS_V1
+ && m_sBuildCommand.find( "-debug" ) == string::npos )
+ {
+ // Find correct index to insert -debug switch
+ size_t iPos = m_sBuildCommand.find( "build" );
+ if ( iPos != string::npos )
+ {
+ sCommand = m_sBuildCommand;
+ sCommand.insert( iPos+5, " -debug" );
+ }
+ else
+ {
+ LOG_STRING("Overwriting given build command to add -debug switch. Original command is: " << m_sBuildCommand );
+ if ( m_bAbldTest )
+ sCommand = "abld test build -debug ";
+ else
+ sCommand = "abld build -debug ";
+ // No variant
+ if ( m_sVariant.empty() )
+ {
+ sCommand.append( m_sPlatform );
+ }
+ else
+ {
+ // Add variant
+ sCommand.append( m_sPlatform );
+ sCommand.append( "." );
+ sCommand.append( m_sVariant );
+ }
+
+ // urel vs udeb
+ sCommand.append( " " );
+ sCommand.append( GetBuildTypeString() );
+ // Possible target module
+ AddTargetModuleIfDefined( sCommand );
+ }
+ }
+ else
+ sCommand = m_sBuildCommand;
+ // Run command
+ cout << AT_MSG_SYSTEM_CALL << sCommand << endl;
+ (void)system( sCommand.c_str() );
+ return true;
+}
+
+bool CATProject::CompileSbs2()
+{
+ LOG_FUNC_ENTRY("CATProject::CompileSbs2");
+ // Create command to compile with raptor
+ string sCmd( m_sBuildCommand );
+ sCmd.append( RAPTOR_BUILD_LOG );
+ cout << AT_MSG_SYSTEM_CALL << sCmd << endl;
+ int iRet = (int)system( sCmd.c_str() );
+ if ( iRet == 0 )
+ return true;
+ return false;
+}
+
+bool CATProject::CreateListings()
+{
+ // Create listings if no addr2line defined
+ #ifndef ADDR2LINE
+ if ( _stricmp( m_sPlatform.c_str(), "armv5" ) == 0 )
+ {
+ switch ( m_eBuildSystem )
+ {
+ case SBS_V1:
+ return CreateListingsSbs1();
+ case SBS_V2:
+ return CreateListingsSbs2();
+ default:
+ return false;
+ }
+ }
+ #endif
+ return true;
+}
+
+bool CATProject::CreateListingsSbs1()
+{
+ LOG_FUNC_ENTRY("CATProject::CreateListingsSbs1");
+ string sCommand;
+ if ( m_bAbldTest )
+ sCommand = "abld test listing ";
+ else
+ sCommand = "abld listing ";
+
+ // Listing
+ if ( m_sVariant.empty() )
+ {
+ // No variant
+ sCommand.append( m_sPlatform );
+ }
+ else
+ {
+ // Use specified variant
+ sCommand.append( m_sPlatform );
+ sCommand.append( "." );
+ sCommand.append( m_sVariant );
+ }
+ // udeb vs urel
+ sCommand.append( " " );
+ sCommand.append( GetBuildTypeString() );
+
+ if ( m_vTargetModules.size() > 1 )
+ {
+ RunAbldCommandToAllTargets( sCommand );
+ }
+ else
+ {
+ AddTargetModuleIfDefined( sCommand );
+ cout << AT_MSG_SYSTEM_CALL << sCommand << endl;
+ (void)system( sCommand.c_str() );
+ }
+ return true;
+}
+
+bool CATProject::CreateListingsSbs2()
+{
+ LOG_FUNC_ENTRY("CATProject::CreateListingsSbs2");
+ string sCmd( m_sBuildCommand );
+ sCmd.append( RAPTOR_LISTING_LOG );
+ sCmd.append( " LISTING");
+ cout << AT_MSG_SYSTEM_CALL << sCmd << endl;
+ int iRet = (int)system( sCmd.c_str() );
+ if ( iRet == 0 )
+ return true;
+ return false;
+}
+
+bool CATProject::CopyReleasables()
+{
+ bool bRet = true;
+ LOG_FUNC_ENTRY("CATProject::CopyReleasables");
+ // Only copy releasables on armv5 platform and no addr2line defined.
+ #ifndef ADDR2LINE
+ if ( _stricmp( m_sPlatform.c_str(), "armv5" ) == 0 )
+ {
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ {
+ if ( ! m_vModules.at(i)->CopyReleasables() )
+ bRet = false;
+ }
+ // Static libraries lst files.
+ // First create directory for them (delete old one if exists).
+ if ( ! DirectoryExists( AT_TEMP_LST_DIR ) )
+ {
+ DirCreate( AT_TEMP_LST_DIR, true );
+ }
+ else
+ {
+ DirDelete( AT_TEMP_LST_DIR, true );
+ DirCreate( AT_TEMP_LST_DIR, true );
+ }
+ for ( size_t i = 0 ; i < m_vStaticLibraries.size(); i ++ )
+ {
+ if( ! m_vStaticLibraries.at(i)->CopyLstFilesToDir( AT_TEMP_LST_DIR ) )
+ bRet = false;
+ }
+
+ // Delete lst files from all type of modules in project.
+ // Ignoring errors because different modules might use same source/lst files.
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ m_vModules.at(i)->DeleteLstFilesFromSrc();
+ for ( size_t i = 0 ; i < m_vUnsupportedModules.size(); i ++ )
+ m_vUnsupportedModules.at(i)->DeleteLstFilesFromSrc();
+ for ( size_t i = 0 ; i < m_vStaticLibraries.size(); i ++ )
+ m_vStaticLibraries.at(i)->DeleteLstFilesFromSrc();
+
+ return bRet;
+ }
+ #endif
+ // When addr2line defined and used we use symbol and map file(s).
+ #ifdef ADDR2LINE
+ if ( _stricmp( m_sPlatform.c_str(), "armv5" ) == 0 )
+ {
+ // Verify that module(s) symbol file(s) exist
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ {
+ // Check symbol file.
+ if ( ! m_vModules.at(i)->SymbolFileExist() )
+ bRet = false;
+ // Check map file.
+ if ( ! m_vModules.at(i)->MapFileExist() )
+ bRet = false;
+ }
+ }
+ #endif
+ // Platform winscw.
+ else if ( _stricmp( m_sPlatform.c_str(), "winscw" ) == 0 )
+ {
+ // Verify that module(s) binaries exist
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ {
+ if ( ! m_vModules.at(i)->BinaryFileExist() )
+ bRet = false;
+ }
+ // For static libraries binary/target is same as their library.
+ for ( size_t i = 0 ; i < m_vStaticLibraries.size(); i ++ )
+ if ( ! m_vStaticLibraries.at(i)->BinaryFileExist() )
+ bRet = false;
+ }
+ // Platform gcce.
+ else if ( _stricmp( m_sPlatform.c_str(), "gcce" ) == 0 )
+ {
+ // Verify that module(s) symbol file(s) exist
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ {
+ // Check symbol file.
+ if ( ! m_vModules.at(i)->SymbolFileExist() )
+ bRet = false;
+ }
+ }
+ return bRet;
+}
+
+// ----------------------------------------------------------------------------
+// Write project's (user) attributes to a file under temp folder
+// ----------------------------------------------------------------------------
+bool CATProject::WriteAttributes() const
+{
+ LOG_FUNC_ENTRY("CATProject::WriteAttributes");
+ // File to write to
+ string sOutFile( AT_TEMP_DIR );
+ sOutFile.append( "\\" );
+ sOutFile.append( AT_PROJECT_ATTRIBUTES_FILE_NAME );
+ // Open file truncate if exists
+ ofstream out( sOutFile.c_str(), ios_base::trunc );
+ // Check file opened successfully
+ if ( ! out.good() )
+ return false;
+ // Write attributes line by line
+ out << m_bUninstrumented << endl; // Is project instrumented
+ // Sbs version
+ if ( m_eBuildSystem == CATProject::SBS_V2 )
+ out << "SBS_2" << endl;
+ else
+ out << "SBS_1" << endl;
+ out << endl; // Reserved for possible binary data
+ out << m_sPlatform << endl;
+ out << m_sVariant << endl;
+ out << m_eLoggingMode << endl;
+ out << m_eBuildType << endl;
+ out << m_sS60FileName << endl;
+ out << m_iAllocCallStackSize << endl;
+ out << m_iFreeCallStackSize << endl;
+ for ( size_t i = 0 ; i < m_vTargetModules.size() ; i++ )
+ out << m_vTargetModules.at(i) << AT_PROJECT_ATTRIBUTES_SEPARATOR;
+ out << endl;
+ out << m_sBuildCommand << endl;
+ out.close();
+ return true;
+}
+// ----------------------------------------------------------------------------
+// Reads project's (user) attributes to a file under temp folder
+// ----------------------------------------------------------------------------
+bool CATProject::ReadAttributes()
+{
+ LOG_FUNC_ENTRY("CATProject::ReadAttributes");
+ // File to read on
+ string sInFile( AT_TEMP_DIR );
+ sInFile.append( "\\" );
+ sInFile.append( AT_PROJECT_ATTRIBUTES_FILE_NAME );
+ // Open file
+ ifstream in( sInFile.c_str() );
+ // Check file opened successfully
+ if ( ! in.good() )
+ return false;
+ // Read attributes
+ char cLine[ MAX_LINE_LENGTH ];
+ string sLine;
+ in.getline( cLine, MAX_LINE_LENGTH );
+ int iValue = atoi( cLine );
+ if ( iValue == 1 )
+ m_bUninstrumented = true;
+ else
+ m_bUninstrumented = false;
+ // Sbs version
+ in.getline( cLine, MAX_LINE_LENGTH ); string sBuildSystem = string( cLine );
+ if ( sBuildSystem.compare( "SBS_1" ) == 0 )
+ m_eBuildSystem = CATProject::SBS_V1;
+ else if ( sBuildSystem.compare( "SBS_2" ) == 0 )
+ m_eBuildSystem = CATProject::SBS_V2;
+ else {
+ LOG_STRING("Error invalid build system defined in project.cfg");
+ m_eBuildSystem = CATProject::SBS_V1;
+ }
+ in.getline( cLine, MAX_LINE_LENGTH ); // reserverd for possible binary timestamp or similar
+ in.getline( cLine, MAX_LINE_LENGTH ); m_sPlatform = string( cLine );
+ in.getline( cLine, MAX_LINE_LENGTH ); m_sVariant = string( cLine );
+ in.getline( cLine, MAX_LINE_LENGTH ); m_eLoggingMode = atoi( cLine );
+ in.getline( cLine, MAX_LINE_LENGTH ); m_eBuildType = atoi( cLine );
+ in.getline( cLine, MAX_LINE_LENGTH ); m_sS60FileName = string( cLine );
+ in.getline( cLine, MAX_LINE_LENGTH ); m_iAllocCallStackSize = atoi( cLine );
+ in.getline( cLine, MAX_LINE_LENGTH ); m_iFreeCallStackSize = atoi( cLine );
+ in.getline( cLine, MAX_LINE_LENGTH ); sLine = cLine;
+ size_t iSpot = sLine.find( AT_PROJECT_ATTRIBUTES_SEPARATOR );
+ while ( iSpot != string::npos )
+ {
+ string sTarget = sLine.substr(0, iSpot );
+ m_vTargetModules.push_back( sTarget );
+ sLine.erase(0, iSpot + AT_PROJECT_ATTRIBUTES_SEPARATOR.size() );
+ iSpot = sLine.find( AT_PROJECT_ATTRIBUTES_SEPARATOR );
+ }
+ in.getline( cLine, MAX_LINE_LENGTH ); m_sBuildCommand = cLine;
+ in.close();
+ return true;
+}
+
+// ----------------------------------------------------------------------------
+// Creates atool_temp directory to current folder if does not exist
+// ----------------------------------------------------------------------------
+bool CATProject::MakeTempDirIfNotExist()
+{
+ LOG_FUNC_ENTRY("CATProject::MakeTempDirIfNotExist");
+ if ( ! DirectoryExists( AT_TEMP_DIR ) )
+ {
+ if( !CreateDirectory( AT_TEMP_DIR , NULL ) )
+ {
+ return false;
+ }
+ }
+ return true;
+}
+// ----------------------------------------------------------------------------
+// Utilities
+// ----------------------------------------------------------------------------
+
+bool CATProject::RunAbldCommandToAllTargets( const string& sCommand )
+{
+ LOG_FUNC_ENTRY("CATProject::RunAbldCommandToAllTargets");
+
+ // Check for space at the commands end.
+ string sSystemCall( sCommand );
+ if ( *(sSystemCall.rbegin()) != ' ' )
+ sSystemCall.append( " " );
+
+ // Loop calls.
+ bool bRet = true;
+ for ( vector<string>::iterator it = m_vTargetModules.begin(); it < m_vTargetModules.end(); it++ )
+ {
+ string sCall( sSystemCall );
+ sCall.append( RemovePathAndExt( *it, true ) );
+ cout << AT_MSG_SYSTEM_CALL << sCall << endl;
+ if ( (int) system( sCall.c_str() ) != 0 )
+ bRet = false;
+ }
+ return bRet;
+}
+
+void CATProject::AddTargetModuleIfDefined( string& sCmd )
+{
+ LOG_FUNC_ENTRY("CATProject::AddTargetModuleIfDefined");
+ // Do we have target modules defined
+ if ( m_vTargetModules.size() > 0 )
+ {
+ switch( m_eBuildSystem )
+ {
+ case SBS_V1:
+ // Add first target modules name without extension to build cmd.
+ sCmd.append( " " );
+ sCmd.append( RemovePathAndExt( m_vTargetModules.at( 0 ), true ) );
+ break;
+ case SBS_V2:
+ // Add all target modules to build command using raptor switch '-p'.
+ for( size_t i = 0 ; i < m_vTargetModules.size() ; i++ )
+ {
+ LOG_STRING("Adding :" << m_vTargetModules.at( i ) );
+ sCmd.append( " -p " );
+ sCmd.append( m_vTargetModules.at( i ) );
+ }
+ break;
+ }
+ }
+}
+
+bool CATProject::IsTargetModuleInProject() const
+{
+ LOG_FUNC_ENTRY("CATProject::IsTargetModuleInProject");
+ vector<CATModule2*>::const_iterator modules;
+ vector<CATModule2*>::const_iterator staticModules;
+ vector<string>::const_iterator targets;
+ bool bRet = true;
+ // Do we have target modules defined
+ if ( m_vTargetModules.size() > 0 )
+ {
+ // Sbs version 1 support only single target module.
+ if ( m_eBuildSystem == SBS_V1 )
+ {
+ // Try to find module from project.
+ bRet = false;
+ string sTarget = m_vTargetModules.at(0);
+ for( modules = m_vModules.begin() ; modules != m_vModules.end() ; modules++ )
+ {
+ if( (*modules)->GetMmpFile().find( sTarget ) != string::npos )
+ {
+ // Found it return true.
+ bRet = true;
+ break;
+ }
+ }
+ for( staticModules = m_vStaticLibraries.begin(); staticModules != m_vStaticLibraries.end(); staticModules++ )
+ {
+ if( (*staticModules)->GetMmpFile().find( sTarget ) != string::npos )
+ {
+ bRet = true;
+ break;
+ }
+ }
+ if ( ! bRet )
+ {
+ // Not found display error message.
+ cout << AT_MSG << "Error, " << sTarget << " not defined in project." << endl;
+ }
+ }
+ // Sbs version 2 supports multiple target modules.
+ else if ( m_eBuildSystem == SBS_V2 )
+ {
+ // Check that all targets are defined in project.
+ for( targets = m_vTargetModules.begin(); targets != m_vTargetModules.end() ; targets++ )
+ {
+ // Found iterated target?
+ bool bFound = false;
+ for ( modules = m_vModules.begin() ; modules != m_vModules.end() ; modules++ )
+ {
+ if( (*modules)->GetMmpFile().find( *targets ) != string::npos )
+ {
+ // yes.
+ bFound = true;
+ break;
+ }
+ }
+ for( staticModules = m_vStaticLibraries.begin(); staticModules != m_vStaticLibraries.end(); staticModules++ )
+ {
+ if( (*staticModules)->GetMmpFile().find( *targets ) != string::npos )
+ {
+ bFound = true;
+ break;
+ }
+ }
+ if ( ! bFound )
+ {
+ // Display error when not found and set return value false.
+ bRet = false;
+ cout << AT_MSG << "Error, " << targets->c_str() << " not defined in project." << endl;
+ }
+ }
+ }
+ }
+ return bRet;
+}
+
+string CATProject::GetBuildTypeString()
+{
+ LOG_LOW_FUNC_ENTRY("CATProject::GetBuildTypeString");
+ // Return build type as lowercase string
+ switch( m_eBuildType )
+ {
+ case UDEB:
+ return string("udeb");
+ case UREL:
+ return string("urel");
+ default:
+ return "";
+ }
+}
+
+string CATProject::GetBuildTypeString( int eType )
+{
+ LOG_LOW_FUNC_ENTRY("CATProject::GetBuildTypeString( int eType )");
+ // Return build type as lowercase string
+ switch( eType )
+ {
+ case UDEB:
+ return string("udeb");
+ case UREL:
+ return string("urel");
+ default:
+ return string("unknown");
+ }
+}
+
+bool CATProject::CleanTemporaryDirs()
+{
+ LOG_FUNC_ENTRY("CATProject::CleanTemporaryDirs");
+ bool bRet = true;
+ // Modules
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ {
+ if ( ! m_vModules.at(i)->CleanTemporaryDir() )
+ bRet = false;
+ }
+ for( size_t i = 0; i < m_vStaticLibraries.size(); i++ )
+ {
+ if ( ! m_vStaticLibraries.at(i)->CleanTemporaryDir() )
+ bRet = false;
+ }
+ // Projects
+ vector<string> vFileList = DirList( AT_TEMP_DIR, false , true );
+ vector<string>::iterator it2 = vFileList.begin();
+ // Size of constant table
+ int iCount = sizeof( TEMP_EXTENSION_NO_DELETE ) / sizeof( string );
+ while ( it2 != vFileList.end() )
+ {
+ // Get extension and compare it to list
+ bool bDelete = true;
+ string sExtension = GetExtension( *it2 );
+ ChangeToLower( sExtension );
+ for ( int i = 0 ; i < iCount ; i++ )
+ {
+ if( sExtension.compare( TEMP_EXTENSION_NO_DELETE[i] ) == 0 )
+ {
+ bDelete = false;
+ break;
+ }
+ }
+ if ( bDelete )
+ {
+ // Delete file
+ if ( ! FileDelete( *it2, true ) )
+ bRet = false;
+ }
+ // Increment
+ it2++;
+ }
+ return bRet;
+}
+
+bool CATProject::DeleteTemporaryDirs()
+{
+ LOG_FUNC_ENTRY("CATProject::DeleteTemporaryDirs");
+ bool bRet = true;
+ // Modules
+ for( size_t i = 0; i < m_vModules.size(); i++ )
+ {
+ if (! m_vModules.at(i)->DeleteTemporaryDir() )
+ bRet = false;
+ }
+ for( size_t i = 0; i < m_vStaticLibraries.size(); i++ )
+ {
+ if (! m_vStaticLibraries.at(i)->DeleteTemporaryDir() )
+ bRet = false;
+ }
+ return bRet;
+}
+
+bool CATProject::InitSbs1MakeFileWithPathToTemp()
+{
+ LOG_FUNC_ENTRY("CATProject::InitSbs1MakeFileWithPathToTemp");
+ // Use temporary folder
+ m_sMakeFile.clear();
+ m_sMakeFile.append( AT_TEMP_DIR );
+ m_sMakeFile.append( "\\" );
+ m_sMakeFile.append( AT_LEVEL_1_MAKEFILE_NAME );
+ // At end check does it exist, return the result.
+ return FileExists( m_sMakeFile.c_str() );
+}
+
+bool CATProject::InitSbs1MakeFileWithPath()
+{
+ LOG_FUNC_ENTRY("CATProject::InitMakeFileWithPath");
+ if ( m_sEpocRoot.empty() )
+ {
+ LOG_STRING("Error, epocroot is not set.");
+ return false;
+ }
+ m_sMakeFile.clear();
+ m_sMakeFile.append( m_sEpocRoot );
+ if( *m_sMakeFile.rbegin() != '\\' )
+ m_sMakeFile.append( "\\" );
+ m_sMakeFile.append( "epoc32\\build\\" );
+ // Add current directory to path (first remove driveletter).
+ string sCurrentDir( m_cCurrentDir );
+ if ( sCurrentDir.length() < 3 )
+ {
+ LOG_STRING("Error, current dir invalid.");
+ return false;
+ }
+ sCurrentDir.erase(0,3);
+ m_sMakeFile.append( sCurrentDir );
+ m_sMakeFile.append( "\\" );
+ // Platform
+ string sPlatInUpper( m_sPlatform);
+ ChangeToUpper( sPlatInUpper );
+ m_sMakeFile.append( sPlatInUpper );
+ // Possible variant
+ if ( m_sVariant.empty() )
+ {
+ // Test modules only?
+ if ( m_bAbldTest )
+ m_sMakeFile.append( "TEST" );
+ m_sMakeFile.append( "." );
+ m_sMakeFile.append( "MAKE" );
+ }
+ else
+ {
+ m_sMakeFile.append( "." );
+ m_sMakeFile.append( m_sVariant );
+ // Test modules only?
+ if ( m_bAbldTest )
+ m_sMakeFile.append( "TEST" );
+ m_sMakeFile.append( ".MAKE" );
+ }
+ // At end check does it exist, return the result.
+ return FileExists( m_sMakeFile.c_str() );
+}
+
+// ----------------------------------------------------------------------------
+// Get & Sets
+// ----------------------------------------------------------------------------
+void CATProject::SetBuildSystem( BUILD_SYSTEM eSystem )
+{
+ LOG_FUNC_ENTRY("CATProject::SetBuildSystem");
+ m_eBuildSystem = eSystem;
+}
+void CATProject::SetMode( PROJECT_MODE eMode )
+{
+ LOG_FUNC_ENTRY("CATProject::SetMode");
+ m_eMode = eMode;
+}
+int CATProject::GetMode() const
+{
+ LOG_LOW_FUNC_ENTRY("CATProject::GetMode");
+ return m_eMode;
+}
+void CATProject::SetEpocRoot( const string& sEpocRoot )
+{
+ LOG_FUNC_ENTRY("CATProject::SetEpocRoot");
+ m_sEpocRoot = sEpocRoot;
+}
+void CATProject::SetPlatform( const string& sPlatform )
+{
+ LOG_FUNC_ENTRY("CATProject::SetPlatform");
+ m_sPlatform = sPlatform;
+}
+void CATProject::SetVariant( const string& sVariant )
+{
+ LOG_FUNC_ENTRY("CATProject::SetVariant");
+ m_sVariant = sVariant;
+}
+void CATProject::SetLoggingMode( LOGGING_MODE eLoggingMode)
+{
+ LOG_FUNC_ENTRY("CATProject::SetLoggingMode");
+ m_eLoggingMode = eLoggingMode;
+}
+void CATProject::SetAllocCallStackSize( int iAllocCallStackSize )
+{
+ m_iAllocCallStackSize = iAllocCallStackSize;
+}
+void CATProject::SetFreeCallStackSize( int iFreeCallStackSize )
+{
+ m_iFreeCallStackSize = iFreeCallStackSize;
+}
+void CATProject::SetBuildType( BUILD_TYPE eType )
+{
+ LOG_FUNC_ENTRY("CATProject::SetBuildType");
+ m_eBuildType = eType;
+}
+void CATProject::SetS60FileName( const string& sFileName)
+{
+ LOG_FUNC_ENTRY("CATProject::SetS60FileName");
+ m_sS60FileName = sFileName;
+}
+void CATProject::SetRomSymbolFiles(const vector<string>& vRomSymbolFiles)
+{
+ LOG_FUNC_ENTRY("CATProject::SetRomSymbolFiles");
+ m_vRomSymbolFiles = vRomSymbolFiles;
+}
+void CATProject::SetTargetModule(const string& sTargetModule)
+{
+ LOG_FUNC_ENTRY("CATProject::SetTargetModule");
+ m_sTargetModule = sTargetModule;
+ ChangeToLower( m_sTargetModule);
+}
+void CATProject::SetBinaryTarget(const string& sBinaryTarget)
+{
+ LOG_FUNC_ENTRY("CATProject::SetBinaryTarget");
+ m_sBinaryTarget = sBinaryTarget;
+ ChangeToLower( m_sBinaryTarget );
+}
+void CATProject::SetDataFile( const string& sDataFile )
+{
+ LOG_FUNC_ENTRY("CATProject::SetDataFile");
+ m_sDataFile = sDataFile;
+}
+void CATProject::SetLogLevel( int iLogLevel )
+{
+ LOG_FUNC_ENTRY("CATProject::SetLogLevel");
+ m_iLoggingLevel = iLogLevel;
+}
+void CATProject::SetDataFileOutput( const string& sDataFileOutput )
+{
+ LOG_FUNC_ENTRY("CATProject::SetDataFileOutput");
+ m_sDataFileOutput = sDataFileOutput;
+}
+void CATProject::SetTargetModules( const vector<string>& vTargetModules )
+{
+ LOG_FUNC_ENTRY("CATProject::SetTargetModules");
+ m_vTargetModules = vTargetModules;
+}
+void CATProject::SetBuildCommand( const string& sBuildCommand )
+{
+ LOG_FUNC_ENTRY("CATProject::SetBuildCommand");
+ m_sBuildCommand = sBuildCommand;
+}
+// End of file