srcanamdw/appdep/src/appdep.cpp
changeset 0 509e4801c378
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srcanamdw/appdep/src/appdep.cpp	Sat Jan 09 10:04:12 2010 +0530
@@ -0,0 +1,278 @@
+/*
+* Copyright (c) 2007 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:  Main entry of Appdep 
+*
+*/
+
+
+#include "appdep.hpp"
+
+// init globals
+bool _cl_use_gcc = false;
+bool _cl_use_gcce = false;
+bool _cl_use_rvct = false;
+bool _cl_generate_clean_cache = false;
+bool _cl_update_cache = false;
+bool _cl_use_libs = false;
+bool _cl_show_ordinals = false;
+bool _cl_use_udeb = false;
+bool _cl_print_debug = false;
+bool _some_cache_needs_update = false;
+
+string _cl_toolsdir = "";
+string _cl_cachedir = "";
+string _cl_releasedir = "";
+string _cl_targets = "";
+string _cl_cfiltloc = "";
+string _cl_outputfile = "";
+string _cl_configfile = "";
+string _cl_sisfiles = "";
+string _cl_usestaticdepstxt = "";
+string _cl_properties = "";
+string _cl_staticdeps = "";
+string _cl_dependson = "";
+string _cl_showfunctions = "";
+string _cl_usesfunction = "";
+
+string _gcc_nm_location = "";
+string _gcce_nm_location = "";
+string _gcce_readelf_location = "";
+string _gcce_cfilt_location = "";
+string _rvct_armar_location = "";
+string _rvct_fromelf_location = "";
+string _rvct_cfilt_location = "";
+string _petran_location = "";
+string _dumpsis_location = "";
+string _tempfile_location = "";
+string _target_mode = "";
+
+vector<target> _targets;
+vector<binary_info> _all_binary_infos;
+vector<import_library_info> _all_import_library_infos;
+vector<import_library_info> _changed_import_libraries;
+vector<string> _sisfiles;
+
+unsigned int _current_progress = 0;
+unsigned int _current_progress_percentage = 0;
+unsigned int _max_progress = 0;
+
+ofstream _outputf;
+
+int _CRT_glob = 0; // globbing not supported 
+
+// ----------------------------------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+    // parse command line arguments
+    ParseCommandLineParameters(argc, argv);
+
+    // read from StaticDependencies.txt if in use
+    if (!_cl_usestaticdepstxt.empty())
+    {
+        GetDataFromStaticDependenciesTxt();
+    }
+    
+    // otherwise do normal cache operations
+    else
+    {
+        // first do some checks
+        DoInitialChecksAndPreparations();
+        ParseTargets();
+
+        // checks for sis files if in use
+        if (!_cl_sisfiles.empty())
+            DoInitialChecksAndPreparationsForSisFiles(); 
+        
+        // try to read data from caches
+        if (!_cl_generate_clean_cache)
+        {
+            for (unsigned int i=0; i<_targets.size(); i++) // loop each target
+            {
+                if (_targets.at(i).cache_files_valid)
+                {
+                    ReadDataFromSymbolTablesCache(_targets.at(i));
+                    
+                    if (_targets.at(i).cache_files_valid)    
+                        ReadDataFromDependenciesCache(_targets.at(i));
+                    else
+                        _some_cache_needs_update = true;        
+                }
+                else
+                {
+                    _some_cache_needs_update = true;    
+                }
+            }         
+        }
+    }
+
+    // check if cache needs generation or update
+    if (_cl_generate_clean_cache || _cl_update_cache || _some_cache_needs_update)
+    {    
+        // before starting generating cache, we need more checks that user given params are correct
+        DoCacheGenerationChecksAndPreparations();
+
+
+        if (_cl_generate_clean_cache)
+            cerr << "Generating cache files at " << _cl_cachedir << " ";
+        else
+            cerr << "Updating cache files at " << _cl_cachedir << " ";        
+
+
+        // get lists of files from the directories
+        FindImportLibrariesAndBinariesFromReleases();
+
+
+        // init progress values    
+        if (_max_progress == 0)
+            _max_progress = 1;
+
+        if (_cl_print_debug)
+            cerr << endl;
+        else
+            ShowProgressInfo(_current_progress_percentage, _current_progress, _max_progress, true);
+
+
+        // get import libaries of each target and then write that data to the caches
+        for (unsigned int i=0; i<_targets.size(); i++) // loop each target
+        {
+            GetDataFromImportTables(_targets.at(i));
+            
+            // write data only if current file is not valid
+            if (!_targets.at(i).cache_files_valid)
+            {
+                WriteDataToSymbolTableCacheFile(_targets.at(i));
+            }
+
+            // append all data to common vector
+            for (unsigned int j=0; j<_targets.at(i).import_libraries.size(); j++)  // loop all binaries in one target
+            {
+               _all_import_library_infos.push_back(_targets.at(i).import_libraries.at(j));
+            }
+
+            // clear the original vector to save RAM since it is not needed anymore
+            _targets.at(i).import_libraries.clear();
+        }
+
+        // get dependency data and write it to the cache files
+        for (unsigned int i=0; i<_targets.size(); i++) // loop each target
+        {
+            GetDataFromBinaries(_targets.at(i));
+            
+            if (!_targets.at(i).cache_files_valid)  // only write cache if it needs updating
+            {
+                WriteDataToDependenciesCacheFile(_targets.at(i));    
+            }
+            
+        }
+
+        cerr << endl;
+    }
+    
+    // if sis files in use and not done any previous operations, some things must be done
+    else if (!_cl_sisfiles.empty()) 
+    {
+        // check Petran can be found
+        SetAndCheckPetranPath();
+
+        for (unsigned int i=0; i<_targets.size(); i++) // loop each target
+        {
+            // append all data to common vector
+            for (unsigned int j=0; j<_targets.at(i).import_libraries.size(); j++)  // loop all import libraries in one target
+            {
+               // get a binary info data
+               _all_import_library_infos.push_back(_targets.at(i).import_libraries.at(j));
+            }
+            
+            // clear the original vector to save RAM since it is not needed anymore
+            _targets.at(i).import_libraries.clear();
+        }
+    }    
+    
+    
+    // include sis files to analysis if in use
+    if (!_cl_sisfiles.empty())
+        AnalyseSisFiles();
+
+
+    // do the analysis
+    if (_cl_properties.empty() && _cl_staticdeps.empty() && _cl_dependson.empty() && _cl_showfunctions.empty() && _cl_usesfunction.empty())
+    {
+        cerr << "Nothing to do." << endl;    
+    }
+	else
+	{
+        // copy binary_info vectors to a single one
+        if (_cl_usestaticdepstxt.empty())
+        {
+            for (unsigned int i=0; i<_targets.size(); i++)  // loop all targets
+            {
+                for (unsigned int j=0; j<_targets.at(i).binaries.size(); j++)  // loop all binaries in one target
+                {
+                   // get a binary info data
+                   _all_binary_infos.push_back(_targets.at(i).binaries.at(j));
+                }
+                
+                // clear the original vector to save RAM
+                _targets.at(i).binaries.clear();
+            }            
+        }
+
+        if (!_cl_properties.empty())
+        {
+            // show properties of the binary file
+            DisplayProperties(_cl_properties);
+        } 
+
+        if (!_cl_staticdeps.empty())
+        {
+            // determine all static dependencies of selected component  
+            DisplayStaticDependencies(_cl_staticdeps);      
+        }        
+
+        if (!_cl_dependson.empty())
+        {
+            // list all components that depends on selected component
+            DisplayDependents(_cl_dependson);  
+        }  
+
+        if (!_cl_showfunctions.empty())
+        {
+            // determine all functions that are included / supported in selected component
+            DisplayFunctions(_cl_showfunctions);  
+        }  
+        
+        if (!_cl_usesfunction.empty())
+        {
+            // list all components that are using selected function   
+            DisplayUsesFunction(_cl_usesfunction);
+        }
+    }
+                
+     
+    // close output file
+    if (_outputf.is_open())
+    {   
+        _outputf.close();
+    }
+
+    // delete the temporary file
+    if (!_tempfile_location.empty())
+        RemoveFile(_tempfile_location);
+ 
+	return EXIT_NORMAL;
+}
+
+// ----------------------------------------------------------------------------------------------------------
+