Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

DepsBuilder Class Reference

#include <cmt_deps_builder.h>

List of all members.

Public Methods

void clear ()
void add (const cmt_string& path, const cmt_string& substitution)
void add_includes (const Use& use)
CmtSystem::cmt_string_vectorrun (const cmt_string& file_name)

Private Attributes

CmtSystem::cmt_string_vector m_include_paths
CmtSystem::cmt_string_vector m_substitutions
CmtSystem::cmt_string_vector m_deps
CmtSystem::cmt_string_vector m_all_deps


Member Function Documentation

void DepsBuilder::add ( const cmt_string & path,
const cmt_string & substitution )
 

Definition at line 624 of file cmt_deps_builder.cxx.

Referenced by MakefileGenerator::prepare_use_context().

00626 {
00627   if (path[path.size () - 1] == CmtSystem::file_separator ())
00628     {
00629       cmt_string p = path;
00630       p.erase (path.size () - 1);
00631       m_include_paths.push_back (p);
00632     }
00633   else
00634     {
00635       m_include_paths.push_back (path);
00636     }
00637 
00638   m_substitutions.push_back (substitution);
00639 }

void DepsBuilder::add_includes ( const Use & use )
 

Definition at line 642 of file cmt_deps_builder.cxx.

Referenced by MakefileGenerator::prepare_use_context().

00644 {
00645   const Include::IncludeVector& includes = use.includes;
00646   int include_number;
00647 
00648   for (include_number = 0;
00649        include_number < includes.size ();
00650        include_number++)
00651     {
00652       const Include& include = includes[include_number];
00653 
00654       cmt_string temp = include.name;
00655       cmt_string pattern;
00656       cmt_string name;
00657       char end_pattern;
00658 
00659       int start = 0;
00660 
00661       for (;;)
00662         {
00663           int begin;
00664 
00665           begin = temp.find (start, "${");
00666           if (begin != cmt_string::npos)
00667             {
00668               end_pattern = '}';
00669             }
00670           else
00671             {
00672               begin = temp.find (start, "$(");
00673               if (begin != cmt_string::npos)
00674                 {
00675                   end_pattern = ')';
00676                 }
00677               else
00678                 {
00679                   break;
00680                 }
00681             }
00682 
00683           start = begin + 2;
00684 
00685           int end;
00686           end = temp.find (start, end_pattern);
00687           if (end == cmt_string::npos) break;
00688           if (end < begin) break;
00689           start = end + 1;
00690 
00691           temp.substr (begin, end - begin + 1, pattern);
00692           temp.substr (begin + 2, end - begin - 2, name);
00693 
00694           Symbol* macro = Symbol::find (name);
00695           if (macro != 0)
00696             {
00697               cmt_string value = macro->resolve_macro_value ();
00698               value += CmtSystem::file_separator ();
00699               temp.replace_all (pattern, value);
00700             }
00701           else
00702             {
00703               cmt_string value = CmtSystem::getenv (name);
00704               value += CmtSystem::file_separator ();
00705               temp.replace_all (pattern, value);
00706             }
00707         }
00708       add (temp, include.name);
00709     }
00710 }

void DepsBuilder::clear ( )
 

Definition at line 616 of file cmt_deps_builder.cxx.

Referenced by MakefileGenerator::prepare_use_context().

00618 {
00619   m_include_paths.clear ();
00620   m_substitutions.clear ();
00621 }

CmtSystem::cmt_string_vector & DepsBuilder::run ( const cmt_string & file_name )
 

Definition at line 713 of file cmt_deps_builder.cxx.

00715 {
00716   m_deps.clear ();
00717   m_all_deps.clear ();
00718 
00719   cmt_string preprocessor;
00720   Symbol* macro = Symbol::find ("preprocessor_command");
00721   if (macro != 0)
00722     {
00723       preprocessor = macro->resolve_macro_value ();
00724     }
00725 
00726   if (preprocessor == "")
00727     {
00728         //
00729         //   Since no preprocessor command is defined,
00730         // we use the internal mechanism provided here.
00731         //
00732       cmt_string new_dir;
00733 
00734       CmtSystem::dirname (file_name, new_dir);
00735 
00736       build_deps (file_name,
00737                   new_dir,
00738                   0,
00739                   m_include_paths,
00740                   m_substitutions,
00741                   m_all_deps,
00742                   m_deps);
00743     }
00744   else
00745     {
00746         //
00747         //  An external preprocessor command is defined. We expect it
00748         // to follow a "standard" syntax for its output, ie:
00749         //   o It starts with:
00750         //       <module>.o: ...
00751         //   o There may be many lines with trailing back-slashes
00752         //   o All entries are space-separated
00753         //   o One of the entries is the source file name itself
00754         //
00755         //  The preprocessor command expects the list of -I options
00756         // (resolved from the "includes" macro) and the list of 
00757         // -D/-U options (resolved from the "*_pp_*flags" macros)
00758         //
00759 
00760         //
00761         // Building the complete command (still the pp_*flags are
00762         // missing)
00763         //
00764       preprocessor += " ";
00765       macro = Symbol::find ("includes");
00766       preprocessor += macro->resolve_macro_value ();
00767       preprocessor += " ";
00768       preprocessor += file_name;
00769       
00770       cmt_string output;
00771       
00772       CmtSystem::execute (preprocessor, output);
00773 
00774         //
00775         // Make the output as one single big line.
00776         //
00777 
00778       output.replace_all ("\n", " ");
00779       output.replace_all ("\\ ", " ");
00780       
00781       CmtSystem::cmt_string_vector files;
00782       
00783       CmtSystem::split (output, " \t", files);
00784 
00785         //
00786         // Analyze each entry
00787         //
00788       
00789       for (int i = 1; i < files.size (); i++)
00790         {
00791           const cmt_string& file = files[i];
00792           if (file == file_name) continue;
00793           
00794           cmt_string dir;
00795           cmt_string name;
00796           cmt_string full_name;
00797           
00798           CmtSystem::dirname (file, dir);
00799 
00800             //
00801             // Only declared include_paths will be taken into account
00802             // Others are considered as system include paths.
00803             //
00804           
00805           for (int j = 0; j < m_include_paths.size (); j++)
00806             {
00807               const cmt_string& p = m_include_paths[j];
00808               if (dir == p)
00809                 {
00810                   CmtSystem::basename (file, name);
00811                   full_name = m_substitutions[j];
00812                   full_name += name;
00813 
00814                     //
00815                     // We add in the "m_deps" list the symbolic form
00816                     // of the path rather that the expanded one.
00817                     //
00818                   
00819                   m_deps.push_back (full_name);
00820                   
00821                   break;
00822                 }
00823             }
00824         }
00825     }
00826 
00827   return (m_deps);
00828 }


Member Data Documentation

CmtSystem::cmt_string_vector DepsBuilder::m_all_deps [private]
 

Definition at line 22 of file cmt_deps_builder.h.

CmtSystem::cmt_string_vector DepsBuilder::m_deps [private]
 

Definition at line 21 of file cmt_deps_builder.h.

CmtSystem::cmt_string_vector DepsBuilder::m_include_paths [private]
 

Definition at line 18 of file cmt_deps_builder.h.

CmtSystem::cmt_string_vector DepsBuilder::m_substitutions [private]
 

Definition at line 19 of file cmt_deps_builder.h.


The documentation for this class was generated from the following files:
Generated at Thu May 16 16:27:48 2002 for CMT by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000