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_vector& | run (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:

- cmt_deps_builder.h
- cmt_deps_builder.cxx