source: CMT/v1r16p20040901/src/cmt_parser.cxx @ 1

Last change on this file since 1 was 1, checked in by arnault, 19 years ago

Import all tags

File size: 252.0 KB
Line 
1//-----------------------------------------------------------
2// Copyright Christian Arnault LAL-Orsay CNRS
3// arnault@lal.in2p3.fr
4// See the complete license in cmt_license.txt "http://www.cecill.info".
5//-----------------------------------------------------------
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10#include <ctype.h>
11
12//----------------------------------------------------------
13
14#include "cmt_parser.h"
15#include "cmt_version.h"
16
17#include "cmt_database.h"
18#include "cmt_include.h"
19#include "cmt_script.h"
20#include "cmt_generator.h"
21#include "cmt_system.h"
22#include "cmt.h"
23#include "cmt_error.h"
24#include "cmt_cvs.h"
25#include "cmt_lock.h"
26#include "cmt_triggers.h"
27#include "cmt_model.h"
28#include "cmt_awk.h"
29#include "cmt_syntax.h"
30#include "cmt_install_area.h"
31#include "cmt_cmtpath_pattern.h"
32#include "cmt_sequence.h"
33#include "cmt_map.h"
34#include "cmt_project.h"
35#include "cmt_log.h"
36
37//----------------------------------------------------------
38//
39//  Static object definitions for the Cmt class.
40//
41
42ActionType Cmt::m_action;
43ActionType Cmt::m_help_action;
44bool Cmt::m_build_nmake;
45cmt_string Cmt::m_cmt_config;
46cmt_string Cmt::m_cmt_root;
47cmt_string Cmt::m_cmt_home;
48cmt_string Cmt::m_cmt_user_context;
49cmt_string Cmt::m_cmt_site;
50cmt_string Cmt::m_cmt_version;
51int Cmt::m_current_build_strategy = DefaultBuildStrategy;
52int Cmt::m_current_setup_strategy = DefaultSetupStrategy;
53
54cmt_string Cmt::m_current_dir;
55cmt_string Cmt::m_current_package;
56cmt_string Cmt::m_current_config;
57cmt_string Cmt::m_current_path;
58cmt_string Cmt::m_current_prefix;
59cmt_string Cmt::m_current_cmtpath;
60cmt_string Cmt::m_current_offset;
61
62AccessMode Cmt::m_current_access = UserMode;
63CmtDirStyle Cmt::m_current_style = cmt_style;
64CmtStructuringStyle Cmt::m_current_structuring_style = with_version_directory;
65
66cmt_string Cmt::m_current_tag;
67cmt_string Cmt::m_current_target;
68cmt_string Cmt::m_current_version;
69
70cmt_string Cmt::m_extra_tags;
71
72cmt_string Cmt::m_configure_error;
73
74bool Cmt::m_debug;
75
76cmt_string Cmt::m_default_path;
77bool Cmt::m_quiet;
78bool Cmt::m_recursive;
79CmtScopeFilteringMode Cmt::m_scope_filtering_mode;
80bool Cmt::m_simulation;
81bool Cmt::m_standard_macros_done;
82//----------------------------------------------------------
83
84
85//----------------------------------------------------------
86//
87//   Utility classes
88//
89//----------------------------------------------------------
90
91
92
93/**
94 *  This PathScanner actor simply displays the package name/version/path
95 *  It is used by the cmt show packages operation
96 */
97class PackageViewer : public PathScanner::actor
98{
99public:
100  void run (const cmt_string& package,
101            const cmt_string& version,
102            const cmt_string& path);
103};
104
105
106/**
107 *  This PathScanner actor accumulates all found packages into a cmt_string_vector
108 *  It is used by the broadcast operation
109 */
110class PackageSelector : public PathScanner::actor
111{
112public:
113  PackageSelector (CmtSystem::cmt_string_vector& uses);
114  void run (const cmt_string& package,
115            const cmt_string& version,
116            const cmt_string& path);
117private:
118  CmtSystem::cmt_string_vector& m_uses;
119};
120
121
122
123/**
124 *  This PathScanner actor collects all packages clients of the specified one
125 *  It is used by the cmt show clients operation
126 */
127class ClientCollector : public PathScanner::actor
128{
129public:
130  ClientCollector (const cmt_string& package,
131                   const cmt_string& version);
132  void run (const cmt_string& package,
133            const cmt_string& version,
134            const cmt_string& path);
135  int count ();
136
137private:
138  const cmt_string& m_package;
139  const cmt_string& m_version;
140  int m_count;
141};
142
143
144//----------------------------------------------------------
145static int get_build_strategy ()
146{
147  Project* p = Project::get_current ();
148
149  int strategy = 0;
150
151  if (p == 0) strategy = Cmt::get_current_build_strategy ();
152  else strategy = p->get_build_strategy ();
153
154  return (strategy);
155}
156
157//----------------------------------------------------------
158static int get_setup_strategy ()
159{
160  Project* p = Project::get_current ();
161
162  int strategy = 0;
163
164  if (p == 0) strategy = Cmt::get_current_setup_strategy ();
165  else strategy = p->get_setup_strategy ();
166
167  return (strategy);
168}
169
170//----------------------------------------------------------
171void PackageViewer::run (const cmt_string& package,
172                         const cmt_string& version,
173                         const cmt_string& path)
174{
175  cout << package << " " << version << " " << path << endl;
176}
177
178//----------------------------------------------------------
179PackageSelector::PackageSelector (CmtSystem::cmt_string_vector& uses) : m_uses(uses)
180{
181}
182
183//----------------------------------------------------------
184void PackageSelector::run (const cmt_string& package,
185                           const cmt_string& version,
186                           const cmt_string& path)
187{
188  //
189  // this might be called on a package with no version directory.
190  // then simply the version argument is empty.
191  //
192
193  cmt_string r = CmtSystem::file_separator ();
194  r += "requirements";
195
196  cmt_string temp;
197
198  if (version == "")
199    {
200      temp = path;
201      //temp += CmtSystem::file_separator ();
202      //temp += package;
203      temp += CmtSystem::file_separator ();
204      temp += "cmt";
205      temp += r;
206     
207      if (!CmtSystem::test_file (temp)) return;
208    }
209  else
210    {
211      temp = path;
212      //temp += CmtSystem::file_separator ();
213      //temp += package;
214      temp += CmtSystem::file_separator ();
215      temp += version;
216      temp += CmtSystem::file_separator ();
217      temp += "cmt";
218      temp += r;
219     
220      if (!CmtSystem::test_file (temp))
221        {
222          temp = path;
223          //temp += CmtSystem::file_separator ();
224          //temp += package;
225          temp += CmtSystem::file_separator ();
226          temp += version;
227          temp += CmtSystem::file_separator ();
228          temp += "mgr";
229          temp += r;
230         
231          if (!CmtSystem::test_file (temp))
232            {
233              return;
234            }
235        }
236    }
237
238  temp.replace (r.c_str(), "");
239  cmt_string& use = m_uses.add ();
240  use = temp;
241}
242
243//----------------------------------------------------------
244ClientCollector::ClientCollector (const cmt_string& package,
245                                  const cmt_string& version) :
246  m_package (package), m_version (version), m_count (0)
247{
248}
249
250//----------------------------------------------------------
251void ClientCollector::run (const cmt_string& package,
252                           const cmt_string& version,
253                           const cmt_string& path)
254{
255  cmt_string dir = path;
256  dir += CmtSystem::file_separator ();
257  dir += package;
258  dir += CmtSystem::file_separator ();
259  if (version != "")
260    {
261      dir += version;
262      dir += CmtSystem::file_separator ();
263    }
264
265  cmt_string req;
266
267  req = dir;
268  req += "cmt";
269  req += CmtSystem::file_separator ();
270  req += "requirements";
271
272  cmt_string requirements;
273  cmt_string line;
274  CmtSystem::cmt_string_vector words;
275
276  if (CmtSystem::test_file (req))
277    {
278      requirements.read (req);
279    }
280  else
281    {
282      req = dir;
283      req += "mgr";
284      req += CmtSystem::file_separator ();
285      req += "requirements";
286      if (CmtSystem::test_file (req))
287        {
288          requirements.read (req);
289        }
290    }
291
292  if (requirements != "")
293    {
294      int pos = 0;
295      int max_pos = requirements.size ();
296
297      while (pos < max_pos)
298        {
299          int cr = requirements.find (pos, "\r\n");
300          int nl = requirements.find (pos, '\n');
301          int first = nl;
302          int length = 1;
303               
304          if (cr != cmt_string::npos)
305            {
306              if (nl == cmt_string::npos)
307                {
308                  first = cr;
309                  length = 2;
310                }
311              else
312                {
313                  first = (nl < cr) ? nl : cr;
314                  length = (nl < cr) ? 1 : 2;
315                }
316            }
317               
318          if (first == cmt_string::npos)
319            {
320              requirements.substr (pos, line);
321              pos = max_pos;
322            }
323          else if (first > pos)
324            {
325              requirements.substr (pos, first - pos, line);
326              pos = first + length;
327            }
328          else
329            {
330              line.erase (0);
331              pos += length;
332            }
333
334          CmtSystem::split (line, " \t", words);
335
336          if ((words.size () > 2) && (words[0] == "use")) 
337            {
338              if ((words[1] == m_package) && 
339                  ((words[2] == m_version) || (m_version == "")))
340                {
341                  cout << "# " << package << " " << version << " " << path;
342                  if (m_version == "")
343                    {
344                      cout << " (use version " << words[2] << ")";
345                    }
346                  cout << endl;
347                  m_count++;
348                }
349            }
350        }
351    }
352}
353
354//----------------------------------------------------------
355int ClientCollector::count ()
356{
357  return (m_count);
358}
359
360
361
362
363//----------------------------------------------------------
364//
365//   The Cmt methods
366//
367//----------------------------------------------------------
368
369
370
371/**
372 *   Append "CONFIG" to the prefix
373 */
374void Cmt::build_config (const cmt_string& prefix,
375                        cmt_string& config)
376{
377  /*
378    Building the config from <prefix>
379  */
380
381  config = prefix;
382  config += "CONFIG";
383}
384
385//----------------------------------------------------------
386void Cmt::build_makefile (const cmt_string& target)
387{
388  Constituent* constituent = 0;
389
390  if (target.size () > 0)
391    {
392      /*
393        Do genmake for one specific target.
394      */
395      constituent = Constituent::find (target);
396      if (constituent != 0)
397        {
398          constituent->build_makefile (m_simulation);
399        }
400    }
401  else
402    {
403      /*
404        Do genmake for all possible targets.
405      */
406      Constituent::build_all_makefiles (m_simulation);
407    }
408}
409
410//----------------------------------------------------------
411void Cmt::build_msdev_file (const cmt_string& target)
412{
413  Constituent* constituent = 0;
414
415  set_standard_macros ();
416
417  if (target != "")
418    {
419      /*
420        Do genmsdev for one specific target.
421      */
422      constituent = Constituent::find (target);
423      if (constituent != 0)
424        {
425          constituent->build_msdev_file (m_simulation);
426        }
427    }
428  else
429    {
430      /*
431        Do genmsdev for all possible targets.
432      */
433      Constituent::build_all_msdev_files (m_simulation);
434    }
435}
436
437/**
438   Visual Studio.net Support                                 
439*/
440void Cmt::build_vsnet_file (const cmt_string& target)       
441{                                                           
442  Constituent* constituent = 0;                             
443                                                             
444  set_standard_macros ();                                   
445                                                             
446  if (target != "")                                         
447    {                                                       
448      /*                                                     
449        Do genvsnet for one specific target.                 
450      */                                                     
451      constituent = Constituent::find (target);             
452      if (constituent != 0)                                 
453        {                                                   
454          constituent->build_vsnet_file (m_simulation);       
455        }                                                   
456    }                                                       
457  else                                                       
458    {                                                       
459      /*                                                     
460        Do genvsnet for all possible targets.               
461      */                                                     
462      Constituent::build_all_vsnet_files (m_simulation);       
463    }                                                       
464}                                                           
465
466//----------------------------------------------------------
467bool Cmt::build_nmake ()
468{
469  return (m_build_nmake);
470}
471
472//----------------------------------------------------------
473void Cmt::build_OS9_makefile (const cmt_string& target)
474{
475  build_makefile (target);
476}
477
478/**
479 *   Convert a package name to its upper case copy
480 */
481void Cmt::build_prefix (const cmt_string& package, cmt_string& prefix)
482{
483  int pos;
484  char c;
485
486  /*
487    Building the prefix from <package>
488  */
489
490  prefix = package;
491
492  for (pos = 0; pos < package.size (); pos++)
493    {
494      c = package[pos];
495      prefix[pos] = toupper (c);
496    }
497}
498
499//----------------------------------------------------------
500void Cmt::clear ()
501{
502  m_action         = action_none;
503  m_help_action    = action_none;
504  m_build_nmake    = false;
505  m_cmt_config     = "";
506  //m_cmt_path.clear ();
507  //m_cmt_path_pwds.clear ();
508  //m_cmt_path_sources.clear ();
509  m_cmt_root       = "";
510  m_cmt_version    = "";
511  m_current_build_strategy = DefaultBuildStrategy;
512  m_current_setup_strategy = DefaultSetupStrategy;
513  m_current_dir     = "";
514  m_current_package = "";
515  m_current_config  = "";
516  m_current_path    = "";
517  m_current_prefix  = "";
518  m_current_cmtpath = "";
519  m_current_offset  = "";
520
521  m_current_access   = DeveloperMode;
522
523  m_current_tag      = "";
524  m_current_target   = "";
525  m_current_version  = "";
526  m_default_path     = "";
527  m_quiet            = false;
528  m_recursive        = false;
529
530  m_scope_filtering_mode = default_filtering_mode;
531  m_simulation       = false;
532
533  m_standard_macros_done = false;
534
535  Database::clear ();
536  Include::clear_all ();
537  Script::clear_all ();
538  CmtError::clear ();
539}
540
541//----------------------------------------------------------
542void Cmt::configure ()
543{
544  static bool configured = false;
545
546  if (configured) return;
547
548  m_cmt_version   = "";
549  m_current_dir     = "";
550  m_current_package = "";
551  m_current_prefix  = "";
552  m_current_config  = "";
553  m_current_path    = "";
554  m_current_cmtpath = "";
555  m_current_offset  = "";
556
557  m_current_tag     = "";
558  m_current_version = "";
559
560  m_configure_error = "";
561
562  m_debug = false;
563  if (getenv ("CMTDEBUG") != 0) m_debug = true;
564
565  m_default_path    = "";
566
567  configure_default_path ();
568  configure_version_tag ();
569  configure_uname_tag ();
570  configure_hosttype_tag ();
571  configure_config_tag ();
572  configure_site_tag (0);
573  configure_home (0);
574  configure_current_dir ();
575  configure_current_package ();
576  configure_current_structuring_style ();
577
578  Use& use = Use::current();
579
580  use.set (m_current_package,
581           m_current_version,
582           m_current_path,
583           "",
584           "");
585
586  use.style = m_current_style;
587
588  use.change_path (m_current_path);
589
590  if (CmtError::has_pending_error ()) 
591    {
592      m_configure_error = CmtError::get_last_error ();
593    }
594}
595
596//----------------------------------------------------------
597void Cmt::configure_cmt_path (Use* use)
598{
599  cmt_string s;
600
601  Symbol* symbol = Symbol::find ("CMTPATH");
602  if (symbol != 0)
603    {
604      bool show_set_hidden = false;
605
606      if (Cmt::m_action == action_show_set)
607        {
608          show_set_hidden = true;
609          Cmt::m_action = action_none;
610        }
611
612      s = symbol->build_macro_value ();
613      Symbol::expand (s);
614
615      if (show_set_hidden)
616        {
617          show_set_hidden = false;
618          Cmt::m_action = action_show_set;
619        }
620    }
621
622  IProjectFactory& factory = ProjectFactory::instance ();
623  factory.reset ();
624
625  CmtSystem::get_cmt_paths (factory, s);
626  if (m_cmt_user_context != "") factory.create_project (m_cmt_user_context, "CMTUSERCONTEXT");
627  if (m_cmt_home != "") factory.create_project (m_cmt_home, "CMTHOME");
628}
629
630//----------------------------------------------------------
631void Cmt::configure_config_tag ()
632{
633  m_cmt_config = CmtSystem::get_cmt_config ();
634  if (m_cmt_config != "")
635    {
636      Tag* tag;
637
638      tag = Tag::add (m_cmt_config, PriorityConfig, "CMTCONFIG", 0);
639      tag->mark ();
640    }
641}
642
643//----------------------------------------------------------
644void Cmt::configure_current_cmtpath ()
645{
646  Use& current_use = Use::current ();
647
648  m_current_cmtpath = "";
649  m_current_offset = "";
650
651  m_current_cmtpath = Project::find_in_cmt_paths (current_use.path);
652
653  if (m_current_cmtpath != "")
654    {
655      static const cmt_string empty_string;
656      static const cmt_string fs = CmtSystem::file_separator ();
657
658      m_current_offset = current_use.path;
659
660      /**
661         try to remove this current CMTPATH entry from path.  This
662         has a meaning when the specified path already contains an
663         absolute path.
664      */
665     
666      m_current_offset.replace (m_current_cmtpath, empty_string);
667      if (m_current_offset[0] == CmtSystem::file_separator ())
668        {
669          // Just in case there is a part left after removing the cmtpath entry
670         
671          m_current_offset.replace (fs, empty_string);
672        }
673    }
674}
675
676class CmtMountFilterParser : public FAwk
677{
678public:
679
680  CmtMountFilterParser ()
681  {
682    reset ();
683  }
684
685  void reset ()
686  {
687    m_current_dir = CmtSystem::pwd ();
688    m_done = false;
689    m_prefix = "";
690  }
691
692  bool is_done () const
693  {
694    return (m_done);
695  }
696
697  const cmt_string& get_current_dir () const
698  {
699    return (m_current_dir);
700  }
701
702  void set_prefix (const cmt_string& prefix)
703  {
704    m_prefix = prefix;
705  }
706
707  void filter (const cmt_string& line)
708  {
709    //cout << "line=" << line << endl;
710
711    if (m_done) 
712      {
713        stop ();
714        return;
715      }
716
717    CmtSystem::cmt_string_vector words;
718
719    CmtSystem::split (line, " \t", words);
720
721    int requested = 2;
722
723    if (m_prefix != "")
724      {
725        requested++;
726      }
727
728    if (words.size () < requested) return;
729
730    int n = 0;
731
732    if (m_prefix != "")
733      {
734        if (words[n] != m_prefix) return;
735        n++;
736      }
737
738    cmt_string& path_name = words[n];
739    cmt_string& replacement = words[n+1];
740   
741    if (m_current_dir.find (path_name) != cmt_string::npos)
742      {
743        m_current_dir.replace (path_name, replacement);
744        m_done = true;
745        stop ();
746      }
747  }
748
749private:
750  bool m_done;
751  cmt_string m_prefix;
752  cmt_string m_current_dir;
753};
754
755//----------------------------------------------------------
756void Cmt::configure_current_dir ()
757{
758  cmt_string file_name;
759
760  /*
761    Building current_dir :
762
763    o we first get the physical value (using getwd)
764    o then this value is possibly filtered using the
765    cmt_mount_filter file.
766  */
767
768  CmtMountFilterParser mount_filter;
769
770  /**
771     First try with ${CMTROOT}/mgr/cmt_mount_filter
772     with no prefix on lines
773  */
774
775  file_name = m_default_path;
776  if (file_name != "")
777    {
778      file_name += CmtSystem::file_separator ();
779      file_name += "CMT";
780      file_name += CmtSystem::file_separator ();
781      file_name += m_cmt_version;
782      file_name += CmtSystem::file_separator ();
783      file_name += "mgr";
784      file_name += CmtSystem::file_separator ();
785    }
786
787  file_name += "cmt_mount_filter";
788
789  mount_filter.run (file_name);
790
791  /**
792     Now try with .cmtrc
793     with "mount_filter" keyword
794  */
795
796  mount_filter.set_prefix ("mount_filter");
797
798  mount_filter.run (".cmtrc");
799
800  /**
801     Now try with ${HOME}/.cmtrc
802     with "mount_filter" keyword
803  */
804
805  if (CmtSystem::get_home_directory (file_name))
806    {
807      file_name += CmtSystem::file_separator ();
808      file_name += ".cmtrc";
809      mount_filter.run (file_name);
810    }
811
812  m_current_dir = mount_filter.get_current_dir ();
813}
814
815//----------------------------------------------------------
816void Cmt::configure_current_package ()
817{
818  /*
819    Build current_package and current_prefix.
820
821    This is only possible if we are within the cmt/mgr branch of a
822    standard directory tree (i.e. <package>/<version>/cmt or mgr)
823  */
824
825  cmt_string req = "..";
826  req += CmtSystem::file_separator ();
827  req += "cmt";
828  req += CmtSystem::file_separator ();
829  req += "requirements";
830
831  if (CmtSystem::test_file (req))
832    {
833      m_current_style = cmt_style;
834    }
835  else
836    {
837      cmt_string req = "..";
838      req += CmtSystem::file_separator ();
839      req += "mgr";
840      req += CmtSystem::file_separator ();
841      req += "requirements";
842
843      if (CmtSystem::test_file (req))
844        {
845          m_current_style = mgr_style;
846        }
847      else
848        {
849          // This package is probably a standalone one
850          m_current_style = none_style;
851        }
852    }
853
854
855  if (m_current_style != none_style)
856    {
857      //
858      //  Here there is a ../cmt or ../mgr branch in front of us
859      //  and there is a requirements file there
860      //
861
862      cmt_string up_dir;
863      cmt_string up_branch;
864
865      CmtSystem::dirname (m_current_dir, up_dir);
866      CmtSystem::basename (up_dir, up_branch);
867
868      cmt_string version_file = "..";
869      version_file += CmtSystem::file_separator ();
870      version_file += "cmt";
871      version_file += CmtSystem::file_separator ();
872      version_file += "version.cmt";
873
874      if (CmtSystem::test_file (version_file))
875        {
876          //
877          // There is an explicit version descriptor. This one takes precedence
878          // and forces the structuring style to no directory
879          //
880
881          m_current_package = up_branch;
882          CmtSystem::dirname (up_dir, m_current_path);
883
884          if (m_current_version.read (version_file))
885            {
886              int pos;
887
888              pos = m_current_version.find ('\n');
889              if (pos != cmt_string::npos) m_current_version.erase (pos);
890              pos = m_current_version.find ('\r');
891              if (pos != cmt_string::npos) m_current_version.erase (pos);
892            }
893          else
894            {
895              m_current_version = "v*";
896            }
897
898          if (m_debug)
899            {
900              cout << "Cmt::configure_current_package>" << endl
901                   << " m_current_package " << m_current_package << endl
902                   << " m_current_version " << m_current_version << endl
903                   << " m_current_dir " << m_current_dir << endl
904                   << " pwd " << CmtSystem::pwd ()
905                   << endl;
906            }
907
908          m_current_style = no_version_style;
909        }
910      else if (CmtSystem::is_version_directory (up_branch))
911        {
912          // The up branch IS a version directory.
913
914          m_current_version = up_branch;
915          CmtSystem::dirname (up_dir, up_dir);
916          CmtSystem::basename (up_dir, m_current_package);
917          CmtSystem::dirname (up_dir, m_current_path);
918        }
919      else
920        {
921          // No version descriptor
922          // No version directory. The version is defaulted to v*
923 
924          CmtSystem::basename (up_dir, m_current_package);
925          m_current_version = "v*";
926          CmtSystem::dirname (up_dir, m_current_path);
927
928          m_current_style = no_version_style;
929        }
930
931      build_prefix (m_current_package, m_current_prefix);
932      build_config (m_current_prefix, m_current_config);
933    }
934  else
935    {
936      m_current_package = "cmt_standalone";
937      m_current_version = "";
938      m_current_path = m_current_dir;
939      build_prefix (m_current_package, m_current_prefix);
940      build_config (m_current_prefix, m_current_config);
941      m_current_style = none_style;
942    }
943
944  //cout << "configure_current_package> current style=" << m_current_style << endl;
945}
946
947//----------------------------------------------------------
948void Cmt::configure_current_structuring_style ()
949{
950  cmt_string s;
951
952  s = CmtSystem::getenv ("CMTSTRUCTURINGSTYLE");
953  if (s == "without_version_directory")
954    {
955      m_current_structuring_style = without_version_directory;
956    }
957}
958
959//----------------------------------------------------------
960void Cmt::configure_default_path ()
961{
962  m_default_path = CmtSystem::get_cmt_root ();
963  CmtSystem::get_cmt_version (m_cmt_version);
964  m_cmt_root = m_default_path;
965  m_cmt_root += CmtSystem::file_separator ();
966  m_cmt_root += "CMT";
967  m_cmt_root += CmtSystem::file_separator ();
968  m_cmt_root += m_cmt_version;
969}
970
971//----------------------------------------------------------
972void Cmt::configure_home (Use* use)
973{
974  m_cmt_home = "";
975
976  Symbol* symbol = Symbol::find ("CMTHOME");
977  if (symbol != 0)
978    {
979      m_cmt_home = symbol->build_macro_value ();
980      Symbol::expand (m_cmt_home);
981    }
982  else if (CmtSystem::testenv ("CMTHOME"))
983    {
984      m_cmt_home = CmtSystem::getenv ("CMTHOME");
985    }
986
987  if ((m_cmt_home != "") && !CmtSystem::test_directory (m_cmt_home))
988    {
989      m_cmt_home = "";
990    }
991
992  configure_user_context (0);
993}
994
995//----------------------------------------------------------
996void Cmt::configure_user_context (Use* use)
997{
998  m_cmt_user_context = "";
999
1000  Symbol* symbol = Symbol::find ("CMTUSERCONTEXT");
1001  if (symbol != 0)
1002    {
1003      m_cmt_user_context = symbol->build_macro_value ();
1004      Symbol::expand (m_cmt_user_context);
1005    }
1006  else if (CmtSystem::testenv ("CMTUSERCONTEXT"))
1007    {
1008      m_cmt_user_context = CmtSystem::getenv ("CMTUSERCONTEXT");
1009    }
1010
1011  if ((m_cmt_user_context != "") && !CmtSystem::test_directory (m_cmt_user_context))
1012    {
1013      m_cmt_user_context = "";
1014    }
1015
1016  if (m_debug) cout << "configure_user_context> user_context=" << m_cmt_user_context << endl;
1017
1018  configure_cmt_path (0);
1019}
1020
1021//----------------------------------------------------------
1022void Cmt::configure_hosttype_tag ()
1023{
1024  cmt_string hosttype;
1025
1026  CmtSystem::get_hosttype (hosttype);
1027
1028  if (hosttype != "")
1029    {
1030      Tag* tag;
1031
1032      tag = Tag::add (hosttype, PriorityUname, "HOSTTYPE", 0);
1033      tag->mark ();
1034    }
1035}
1036
1037//----------------------------------------------------------
1038void Cmt::configure_site_tag (Use* use)
1039{
1040  Symbol* symbol = Symbol::find ("CMTSITE");
1041  if (symbol != 0)
1042    {
1043      m_cmt_site = symbol->build_macro_value ();
1044      Symbol::expand (m_cmt_site);
1045    }
1046  else
1047    {
1048      m_cmt_site = CmtSystem::get_cmt_site ();
1049    }
1050
1051  if (m_cmt_site != "")
1052    {
1053      cmt_string s = "CMTSITE";
1054
1055      if (use != 0)
1056        {
1057          s += " in ";
1058        }
1059
1060      Tag* tag;
1061
1062      tag = Tag::add (m_cmt_site, PrioritySite, s, use);
1063      tag->mark ();
1064    }
1065}
1066
1067//----------------------------------------------------------
1068void Cmt::restore_all_tags (Use* use)
1069{
1070    //cerr << "restore_all_tags" << endl;
1071
1072  Cmt::configure_tags (use);
1073
1074    /*
1075      Then get existing extra tags
1076     */
1077
1078  if (CmtSystem::testenv ("CMTEXTRATAGS"))
1079    {
1080      cmt_string s = "CMTEXTRATAGS";
1081
1082      if (use != 0)
1083        {
1084          s += " in ";
1085        }
1086
1087      Tag* tag;
1088      CmtSystem::cmt_string_vector words;
1089     
1090      cmt_string tags = CmtSystem::getenv ("CMTEXTRATAGS");
1091     
1092      CmtSystem::split (tags, " \t,", words);
1093
1094      Cmt::m_extra_tags = ",";
1095     
1096      for (int i = 0; i < words.size (); i++)
1097        {
1098          const cmt_string& a = words[i];
1099
1100          Cmt::m_extra_tags += a;
1101          Cmt::m_extra_tags += ",";
1102         
1103          tag = Tag::add (a, PriorityUserTag, s, use);
1104         
1105          tag->mark ();
1106        }
1107    }
1108}
1109
1110//----------------------------------------------------------
1111void Cmt::configure_tags (Use* use)
1112{
1113  cmt_string config_tag;
1114
1115  Log;
1116
1117  //if (m_debug) cout << "configure_tags0> current_tag=" << m_current_tag << endl;
1118
1119  log << "current_tag=" << m_current_tag << log_endl;
1120
1121  Symbol* symbol = Symbol::find ("CMTCONFIG");
1122  if (symbol != 0)
1123    {
1124      bool show_set_hidden = false;
1125
1126      if (Cmt::m_action == action_show_set)
1127        {
1128          show_set_hidden = true;
1129          Cmt::m_action = action_none;
1130        }
1131
1132      config_tag = symbol->build_macro_value ();
1133      Symbol::expand (config_tag);
1134
1135      if (show_set_hidden)
1136        {
1137          show_set_hidden = false;
1138          Cmt::m_action = action_show_set;
1139        }
1140    }
1141  else if (CmtSystem::testenv ("CMTCONFIG"))
1142    {
1143      config_tag = CmtSystem::getenv ("CMTCONFIG");
1144    }
1145  else if (CmtSystem::testenv ("CMTBIN"))
1146    {
1147      config_tag = CmtSystem::getenv ("CMTBIN");
1148    }
1149
1150  if (config_tag == "")
1151    {
1152      CmtSystem::get_uname (config_tag);
1153    }
1154
1155  //if (m_debug) cout << "configure_tags> current_tag=" << m_current_tag << endl;
1156  log << "current_tag=" << m_current_tag << log_endl;
1157
1158  cmt_string s = "CMTCONFIG";
1159
1160  if (use != 0)
1161    {
1162      s += " in ";
1163    }
1164
1165  Tag* tag;
1166
1167  tag = Tag::add (config_tag, PriorityConfig, s, use);
1168  tag->mark ();
1169
1170    //m_current_tag = config_tag;
1171}
1172
1173//----------------------------------------------------------
1174void Cmt::configure_uname_tag ()
1175{
1176  cmt_string uname;
1177
1178  CmtSystem::get_uname (uname);
1179
1180  if (uname != "")
1181    {
1182      Tag* tag;
1183
1184      tag = Tag::add (uname, PriorityUname, "uname", 0);
1185      tag->mark ();
1186    }
1187}
1188
1189//----------------------------------------------------------
1190void Cmt::configure_version_tag ()
1191{
1192  int v = 0;
1193  int r = 0;
1194  int p = 0;
1195
1196  CmtSystem::is_version_directory (CMTVERSION, v, r, p);
1197
1198  Tag* tag;
1199
1200  static char temp[80];
1201
1202  sprintf (temp, "CMTv%d", v);
1203
1204  tag = Tag::add (temp, PriorityVersion, "CMTVERSION", 0);
1205  tag->mark ();
1206
1207  sprintf (temp, "CMTr%d", r);
1208
1209  tag = Tag::add (temp, PriorityVersion, "CMTVERSION", 0);
1210  tag->mark ();
1211
1212  sprintf (temp, "CMTp%d", p);
1213
1214  tag = Tag::add (temp, PriorityVersion, "CMTVERSION", 0);
1215  tag->mark ();
1216
1217}
1218
1219//----------------------------------------------------------
1220//
1221//   Actions
1222//
1223//----------------------------------------------------------
1224
1225class AwkActor : public Awk
1226{
1227public:
1228
1229  void filter (const cmt_string& line)
1230      {
1231        cout << line << endl;
1232      }
1233};
1234
1235//----------------------------------------------------------
1236void Cmt::do_awk (const CmtSystem::cmt_string_vector& arguments)
1237{
1238  if (arguments.size () < 1)
1239    {
1240      cerr << "#CMT> cmt awk <file> <pattern>" << endl;
1241      return;
1242    }
1243
1244  const cmt_string& file = arguments[0];
1245  const cmt_string& pattern = arguments[1];
1246  cmt_string text;
1247
1248  text.read (file);
1249
1250  static AwkActor a;
1251
1252  cmt_regexp exp (pattern);
1253
1254  a.run (text, exp);
1255}
1256
1257//----------------------------------------------------------
1258void Cmt::do_broadcast (const CmtSystem::cmt_string_vector& arguments,
1259                        int argc,
1260                        char* argv[])
1261{
1262  Use::UsePtrVector& Uses = Use::get_ordered_uses ();
1263
1264  CmtSystem::cmt_string_vector uses;
1265  CmtSystem::cmt_string_vector packages;
1266  CmtSystem::cmt_string_vector versions;
1267  CmtSystem::cmt_string_vector path_selections;
1268  CmtSystem::cmt_string_vector selections;
1269  CmtSystem::cmt_string_vector exclusions;
1270  cmt_string begin;
1271  cmt_string command;
1272  bool is_cmt = false;
1273  int first = 0;
1274  int i;
1275  bool ignore_errors = false;
1276  bool all_packages = false;
1277
1278  bool local = true;
1279
1280  for (i = 0; i < arguments.size (); i++)
1281    {
1282      const cmt_string& w = arguments[i];
1283
1284      if (command == "")
1285        {
1286          if (w.substr (0, 13) == "-all_packages")
1287            {
1288              local = false;
1289              all_packages = true;
1290            }
1291          else if (w.substr (0, 7) == "-depth=")
1292            {
1293              local = false;
1294
1295              cmt_string depth_str;
1296              int depth_value = 0;
1297                         
1298              w.substr (7, depth_str);
1299              if ((sscanf (depth_str.c_str (), "%d", &depth_value) < 1) ||
1300                  (depth_value < 1))
1301                {
1302                  // Syntax error
1303                  //  We shall restrict to packages found within
1304                  // the <depth_value> first elements of CMTPATH.
1305                  //  If CMTPATH is empty, nothing is selected.
1306                  // depth=1 is equivalent to local
1307                }
1308
1309              Project::fill_selection (depth_value, path_selections);
1310            }
1311          else if (w.substr (0, 9) == "-exclude=")
1312            {
1313              cmt_string exclusion;
1314
1315              w.substr (9, exclusion);
1316
1317              int size = exclusion.size ();
1318             
1319              if (size >= 2)
1320                {
1321                  if (((exclusion[0] == '"') && (exclusion[size - 1] == '"')) ||
1322                      ((exclusion[0] == '\'') && (exclusion[size - 1] == '\'')))
1323                    {
1324                      exclusion.erase (size - 1);
1325                      exclusion.erase (0, 1);
1326                    }
1327
1328                  CmtSystem::split (exclusion, " \t", exclusions);
1329                }
1330            }
1331          else if (w.substr (0, 7) == "-global")
1332            {
1333              path_selections.clear ();
1334
1335              local = false;
1336            }
1337          else if (w.substr (0, 6) == "-local")
1338            {
1339              local = true;
1340            }
1341          else if (w.substr (0, 8) == "-select=")
1342            {
1343              cmt_string selection;
1344
1345              w.substr (8, selection);
1346
1347              int size = selection.size ();
1348             
1349              if (size >= 2)
1350                {
1351                  if (((selection[0] == '"') && (selection[size - 1] == '"')) ||
1352                      ((selection[0] == '\'') && (selection[size - 1] == '\'')))
1353                    {
1354                      selection.erase (size - 1);
1355                      selection.erase (0, 1);
1356                    }
1357
1358                  CmtSystem::split (selection, " \t", selections);
1359                }
1360            }
1361          else if (w.substr (0, 7) == "-begin=")
1362            {
1363              w.substr (7, begin);
1364            }
1365          else
1366            {
1367              command = w;
1368            }
1369        }
1370      else
1371        {
1372          command += " ";
1373          command += w;
1374        }
1375
1376    }
1377
1378  if (local)
1379    {
1380      Project::fill_selection (1, path_selections);
1381    }
1382
1383  if (command[0] == '-')
1384    {
1385      ignore_errors = true;
1386      command.erase (0, 1);
1387    }
1388
1389  //if (command.substr (0, 3) == "cmt") is_cmt = true;
1390
1391  if (all_packages)
1392    {
1393      PackageSelector selector (uses);
1394      PathScanner scanner;
1395      Project::scan_paths (scanner, selector);
1396    }
1397  else
1398    {
1399      for (i = Uses.size () - 1; i >= 0; i--)
1400        {
1401          Use* use = Uses[i];
1402                 
1403          if (use->discarded) continue;
1404
1405          if (!use->located ())
1406            {
1407              if (!Cmt::m_quiet)
1408                {
1409                  cerr << "#CMT> package " << use->get_package_name () <<
1410                      " " << use->version << " " << use->path <<
1411                      " not found" <<
1412                      endl;
1413                }
1414            }
1415          else
1416            {
1417              if (use->get_package_name () != "CMT")
1418                {
1419                  cmt_string& s = uses.add ();
1420
1421                  use->get_full_path (s);
1422
1423                  s += CmtSystem::file_separator ();
1424                  if (use->style == mgr_style) s += "mgr";
1425                  else s += "cmt";
1426
1427                  cmt_string& v = versions.add ();
1428                  v = use->version;
1429
1430                  cmt_string& p = packages.add ();
1431                  p = use->get_package_name ();
1432
1433                  //cout << ">>> adding " << s << " to selection" << endl;
1434                }
1435            }
1436        }
1437         
1438      {
1439        cmt_string& s = uses.add ();
1440                 
1441        Use* use = &(Use::current ());
1442
1443        if (use->get_package_name ().find ("cmt_standalone") != cmt_string::npos)
1444          {
1445            s = CmtSystem::pwd ();
1446          }
1447        else
1448          {
1449            use->get_full_path (s);
1450
1451            s += CmtSystem::file_separator ();
1452                 
1453            if (use->style == mgr_style) s += "mgr";
1454            else s += "cmt";
1455          }
1456
1457        cmt_string& v = versions.add ();
1458        v = use->version;
1459
1460        cmt_string& p = packages.add ();
1461        p = use->get_package_name ();
1462
1463        //cout << ">>> adding current " << s << " to selection" << endl;
1464      }
1465    }
1466
1467  bool started = false;
1468
1469  if (begin == "") started = true;
1470
1471  Symbol::all_set ();
1472
1473  for (i = 0; i < uses.size (); i++)
1474    {
1475      const cmt_string& s = uses[i];
1476      const cmt_string& v = versions[i];
1477      const cmt_string& p = packages[i];
1478      cmt_string cmtpath;
1479
1480      bool ok = true;
1481      bool selected = true;
1482      bool excluded = false;
1483
1484      if (path_selections.size () > 0)
1485        {
1486          selected = false;
1487
1488          for (int j = 0; j < path_selections.size (); j++)
1489            {
1490              const cmt_string& sel = path_selections[j];
1491             
1492              if (s.find (sel) != cmt_string::npos) 
1493                {
1494                  cmtpath = sel;
1495                  selected = true;
1496                  break;
1497                }
1498            }
1499
1500          ok = selected;
1501        }
1502
1503      if (ok)
1504        {
1505          if (selections.size () > 0)
1506            {
1507              selected = false;
1508             
1509              for (int j = 0; j < selections.size (); j++)
1510                {
1511                  const cmt_string& sel = selections[j];
1512                 
1513                  if (s.find (sel) != cmt_string::npos) 
1514                    {
1515                      selected = true;
1516                      break;
1517                    }
1518                }
1519             
1520              ok = selected;
1521            }
1522        }
1523
1524      if (ok && !started)
1525        {
1526          if (s.find (begin) != cmt_string::npos)
1527            {
1528              started = true;
1529              ok = true;
1530            }
1531          else
1532            {
1533              ok = false;
1534            }
1535        }
1536
1537
1538      if (ok)
1539        {
1540          excluded = false;
1541
1542          for (int j = 0; j < exclusions.size (); j++)
1543            {
1544              const cmt_string& exc = exclusions[j];
1545             
1546              if (s.find (exc) != cmt_string::npos) 
1547                {
1548                  excluded = true;
1549                  break;
1550                }
1551            }
1552
1553          if (excluded) ok = false;
1554        }
1555
1556      if (!ok) 
1557        {
1558          continue;
1559        }
1560
1561
1562
1563      if (!CmtSystem::cd (s))
1564        {
1565          if (s.find ("cmt_standalone") != cmt_string::npos)
1566            {
1567              cerr << "#CMT> Currently not in a CMT package" << endl;
1568            }
1569          else
1570            {
1571              cerr << "#CMT> Cannot move to the package in " << s << " (" << i+1 << "/" 
1572                   << uses.size () << ")"<< endl;
1573            }
1574
1575          if (!ignore_errors) break;
1576
1577          continue;
1578        }
1579
1580      if (CmtLock::check () == CmtLock::locked_by_another_user)
1581        {
1582          cerr << "#CMT> Ignore locked package in " << s << " (" << i+1 << "/" 
1583               << uses.size () << ")" << endl;
1584          continue;
1585        }
1586
1587      if (cmtpath == "")
1588        {
1589          cmt_string sel = CmtSystem::pwd ();
1590          cmtpath = Project::find_in_cmt_paths (sel);
1591        }
1592
1593      cmt_string cmd = command;
1594      static const cmt_string version_template = "<version>";
1595      cmd.replace_all (version_template, v);
1596
1597      static const cmt_string package_template = "<package>";
1598      cmd.replace_all (package_template, p);
1599
1600      static const cmt_string cmtpath_template = "<package_cmtpath>";
1601      cmd.replace_all (cmtpath_template, cmtpath);
1602
1603      static const cmt_string offset_template = "<package_offset>";
1604
1605      static const cmt_string empty_string;
1606      static const cmt_string fs = CmtSystem::file_separator ();
1607      cmt_string offset = s;
1608      offset.replace (cmtpath, empty_string);
1609      if (offset[0] == CmtSystem::file_separator ())
1610        {
1611          offset.replace (fs, empty_string);
1612        }
1613      CmtSystem::dirname (offset, offset);
1614
1615      cmt_string n;
1616      CmtSystem::basename (offset, n);
1617      if (n == p)
1618        {
1619          CmtSystem::dirname (offset, offset);
1620        }
1621      else
1622        {
1623          CmtSystem::dirname (offset, offset);
1624          CmtSystem::dirname (offset, offset);
1625        }
1626
1627      cmd.replace_all (offset_template, offset);
1628
1629
1630      cout << "#--------------------------------------------------------------" << endl;
1631      cout << "# Now trying [" << cmd << "] in " << s << " (" << i+1 << "/" << uses.size () 
1632           << ")" << endl;
1633      cout << "#--------------------------------------------------------------" << endl;
1634
1635      if (is_cmt)
1636        {
1637          //
1638          //  There is a bug in the recursive use of the parser. Macros are not set correctly.
1639          //  Thus the recursive optimization is now discarded.
1640          //
1641          if (parser (cmd) != 0)
1642            {
1643              CmtError::set (CmtError::execution_error, cmd);
1644              break;
1645            }
1646        }
1647      else
1648        {
1649          int status = CmtSystem::execute (cmd);
1650
1651          //cerr << "do_broadcast> status=" << status << " ignore_errors=" << ignore_errors << endl;
1652
1653          if ((status != 0) && !ignore_errors)
1654              //if ((status != 0) && !ignore_errors)
1655            {
1656              if (status != 2) CmtError::set (CmtError::execution_error, cmd);
1657              break;
1658            }
1659        }
1660    }
1661}
1662
1663//----------------------------------------------------------
1664void Cmt::do_build_constituent_makefile (const CmtSystem::cmt_string_vector& arguments,
1665                                         int argc,
1666                                         char* argv[])
1667{
1668  if (CmtLock::check () == CmtLock::locked_by_another_user)
1669    {
1670      CmtError::set (CmtError::conflicting_lock, "build_constituent_makefile>");
1671      return;
1672    }
1673  if (arguments.size () > 0) 
1674    {
1675      set_standard_macros ();
1676      Generator::build_constituent_makefile (arguments[0]);
1677    }
1678}
1679
1680//----------------------------------------------------------
1681void Cmt::do_build_constituents_makefile (const CmtSystem::cmt_string_vector& arguments,
1682                                          int argc,
1683                                          char* argv[])
1684{
1685  if (CmtLock::check () == CmtLock::locked_by_another_user)
1686    {
1687      CmtError::set (CmtError::conflicting_lock, "build_constituents_makefile>");
1688      return;
1689    }
1690  set_standard_macros ();
1691
1692  Generator::build_constituents_makefile (m_current_package, arguments);
1693}
1694
1695//----------------------------------------------------------
1696void Cmt::do_build_dependencies (const CmtSystem::cmt_string_vector& arguments,
1697                                 int argc,
1698                                 char* argv[])
1699{
1700  if (CmtLock::check () == CmtLock::locked_by_another_user)
1701    {
1702      CmtError::set (CmtError::conflicting_lock, "build_dependencies>");
1703      return;
1704    }
1705  if (arguments.size () > 0)
1706    {
1707      set_standard_macros ();
1708
1709      while (argc > 0)
1710        {
1711          if (strcmp (argv[0], "dependencies") != 0)
1712            {
1713              argc--;
1714              argv++;
1715            }
1716          else
1717            {
1718              argc--;
1719              argv++;
1720              argc--;
1721              argv++;
1722
1723              Generator::build_dependencies (arguments[0], argc, argv);
1724
1725              break;
1726            }
1727        }
1728    }
1729}
1730
1731//----------------------------------------------------------
1732void Cmt::do_build_library_links ()
1733{
1734  cmt_string cmtinstallarea = "";
1735  cmt_string tag = "";
1736  cmt_string shlibsuffix;
1737  cmt_string symlinkcmd;
1738
1739  if (CmtLock::check () == CmtLock::locked_by_another_user)
1740    {
1741      CmtError::set (CmtError::conflicting_lock, "build_library_links>");
1742      return;
1743    }
1744
1745  set_standard_macros ();
1746
1747  Use::UsePtrVector& Uses = Use::get_ordered_uses ();
1748  Use& current_use = Use::current ();
1749  int i;
1750
1751  {
1752    Symbol* macro = Symbol::find ("shlibsuffix");
1753    if (macro == 0) return;
1754    shlibsuffix = macro->build_macro_value ();
1755    Symbol::expand (shlibsuffix);
1756  }
1757
1758  {
1759    Symbol* macro = Symbol::find ("cmt_symlink_command");
1760    if (macro != 0)
1761      {
1762        symlinkcmd = macro->build_macro_value ();
1763        Symbol::expand (symlinkcmd);
1764      }
1765  }
1766
1767  if ((get_build_strategy () & InstallAreaMask) == WithInstallArea)
1768    {
1769      const CmtInstallAreaMgr& ia_mgr = CmtInstallAreaMgr::instance ();
1770
1771      //cout << "#IA2>" << endl;
1772     
1773      cmt_string s1 = ia_mgr.get_installarea ();
1774
1775      {
1776        Symbol* symbol = Symbol::find ("CMTINSTALLAREA");
1777        if (symbol != 0)
1778          {
1779            s1 = symbol->build_macro_value ();
1780            Symbol::expand (s1);
1781          }
1782      }
1783
1784      cmtinstallarea = s1;
1785                 
1786      cmt_string s2;
1787
1788      {
1789        Symbol* macro = Symbol::find ("tag");
1790        if (macro != 0)
1791          {
1792            s2 = macro->build_macro_value ();
1793            Symbol::expand (s2);
1794          }
1795      }
1796
1797      tag = s2;
1798
1799      cmt_string s = s1;
1800      s += CmtSystem::file_separator ();
1801      s += s2;
1802      s += CmtSystem::file_separator ();
1803      s += "lib";
1804
1805      CmtSystem::mkdir (s);
1806    }
1807
1808  current_use.build_library_links (cmtinstallarea, tag, shlibsuffix, symlinkcmd);
1809
1810  for (i = 0; i < Uses.size (); i++)
1811    {
1812      Use* use = Uses[i];
1813
1814      if (use == 0) continue;
1815      if (use->discarded) continue;
1816
1817      if (use->get_package_name () == "CMT") continue;
1818      if (use->get_package_name () == current_use.get_package_name ()) continue;
1819
1820      use->build_library_links (cmtinstallarea, tag, shlibsuffix, symlinkcmd);
1821    }
1822}
1823
1824//----------------------------------------------------------
1825void Cmt::do_build_make_setup ()
1826{
1827  if (CmtLock::check () == CmtLock::locked_by_another_user)
1828    {
1829      CmtError::set (CmtError::conflicting_lock, "build_make_setup>");
1830      return;
1831    }
1832  set_standard_macros ();
1833  Generator::build_make_setup (m_current_package);
1834}
1835
1836//----------------------------------------------------------
1837void Cmt::do_build_msdev (const CmtSystem::cmt_string_vector& arguments)
1838{
1839  if (CmtLock::check () == CmtLock::locked_by_another_user)
1840    {
1841      CmtError::set (CmtError::conflicting_lock, "build_msdev>");
1842      return;
1843    }
1844
1845  if (true)
1846    {
1847      set_standard_macros ();
1848      if (arguments.size () > 0) build_msdev_file (arguments[0]);
1849      else build_msdev_file ("");
1850    }
1851}
1852
1853void Cmt::do_build_CMT_pacman ()
1854{
1855  cmt_string pacman_file;
1856
1857  pacman_file = m_cmt_root;
1858  pacman_file += CmtSystem::file_separator ();
1859  pacman_file += "mgr";
1860  pacman_file += CmtSystem::file_separator ();
1861  pacman_file += "CMT.pacman";
1862
1863  cmt_string pacman;
1864  cmt_string pattern = "<version>";
1865  cmt_string replacement = CMTVERSION;
1866
1867  pacman.read (pacman_file);
1868
1869  pacman.replace_all (pattern, replacement);
1870
1871  cout << pacman << endl;
1872}
1873
1874// Visual Studio.net Support                                                 
1875//----------------------------------------------------------                 
1876void Cmt::do_build_vsnet (const CmtSystem::cmt_string_vector& arguments)     
1877{                                                                           
1878  if (CmtLock::check () == CmtLock::locked_by_another_user)                 
1879    {                                                                       
1880      CmtError::set (CmtError::conflicting_lock, "build_vsnet>");           
1881      return;                                                               
1882    }                                                                       
1883                                                                             
1884  if (true)                                                                 
1885    {                                                                       
1886      set_standard_macros ();                                               
1887      if (arguments.size () > 0) build_vsnet_file (arguments[0]);           
1888      else build_vsnet_file ("");                                           
1889    }                                                                       
1890}                                                                           
1891
1892//----------------------------------------------------------
1893void Cmt::do_build_os9_makefile (const CmtSystem::cmt_string_vector& arguments)
1894{
1895  if (CmtLock::check () == CmtLock::locked_by_another_user)
1896    {
1897      CmtError::set (CmtError::conflicting_lock, "build_os9_makefile>");
1898      return;
1899    }
1900
1901  if (arguments.size () > 0) 
1902    {
1903      set_standard_macros ();
1904      build_OS9_makefile (arguments[0]);
1905    }
1906}
1907
1908//----------------------------------------------------------
1909void Cmt::do_build_prototype (const CmtSystem::cmt_string_vector& arguments)
1910{
1911  if (CmtLock::check () == CmtLock::locked_by_another_user)
1912    {
1913      CmtError::set (CmtError::conflicting_lock, "build_prototype>");
1914      return;
1915    }
1916
1917  if (arguments.size () > 0) 
1918    {
1919      set_standard_macros ();
1920      Generator::build_prototype (arguments[0]);
1921    }
1922}
1923
1924//----------------------------------------------------------
1925void Cmt::do_build_readme (const CmtSystem::cmt_string_vector& arguments)
1926{
1927  if (CmtLock::check () == CmtLock::locked_by_another_user)
1928    {
1929      CmtError::set (CmtError::conflicting_lock, "build_readme>");
1930      return;
1931    }
1932
1933  set_standard_macros ();
1934  Generator::build_readme (arguments);
1935}
1936
1937//----------------------------------------------------------
1938void Cmt::do_build_tag_makefile ()
1939{
1940  if (CmtLock::check () == CmtLock::locked_by_another_user)
1941    {
1942      CmtError::set (CmtError::conflicting_lock, "build_tag_makefile>");
1943      return;
1944    }
1945
1946  print_macros (Make);
1947}
1948
1949//----------------------------------------------------------
1950void Cmt::do_build_temporary_name ()
1951{
1952  cmt_string name = CmtSystem::get_temporary_name ();
1953  cout << name << endl;
1954}
1955
1956//----------------------------------------------------------
1957void Cmt::do_build_triggers (const CmtSystem::cmt_string_vector& arguments)
1958{
1959  if (CmtLock::check () == CmtLock::locked_by_another_user)
1960    {
1961      CmtError::set (CmtError::conflicting_lock, "build_tag_makefile>");
1962      return;
1963    }
1964
1965  if (arguments.size () > 0) 
1966    {
1967      set_standard_macros ();
1968      TriggerGenerator::run (arguments[0]);
1969    }
1970}
1971
1972//----------------------------------------------------------
1973void Cmt::do_build_windefs (const CmtSystem::cmt_string_vector& arguments)
1974{
1975  if (CmtLock::check () == CmtLock::locked_by_another_user)
1976    {
1977      CmtError::set (CmtError::conflicting_lock, "build_windefs>");
1978      return;
1979    }
1980
1981  if (arguments.size () > 0) 
1982    {
1983      set_standard_macros ();
1984      Generator::build_windefs (arguments[0]);
1985    }
1986}
1987
1988//----------------------------------------------------------
1989void Cmt::do_check_configuration ()
1990{
1991}
1992
1993//----------------------------------------------------------
1994void Cmt::do_check_files (const CmtSystem::cmt_string_vector& arguments)
1995{
1996  if (arguments.size () >= 2) 
1997    {
1998      cmt_string first_file = arguments[0];
1999      cmt_string second_file = arguments[1];
2000         
2001      if (first_file == "") return;
2002      if (second_file == "") return;
2003         
2004      CmtSystem::compare_and_update_files (first_file, second_file);
2005    }
2006}
2007
2008//----------------------------------------------------------
2009void Cmt::do_check_version (const CmtSystem::cmt_string_vector& arguments)
2010{
2011  if (arguments.size () > 0)
2012    {
2013      cmt_string name = arguments[0];
2014         
2015      if (name == "") return;
2016      int v = 0;
2017      int r = 0;
2018      int p = 0;
2019         
2020      bool ok = CmtSystem::is_version_directory (name, v, r, p);
2021         
2022      if (ok)
2023        {
2024          cout << "# " << name << " is version " << v << " release " << r << " patch " << p << endl;
2025        }
2026      else
2027        {
2028          cout << "# " << name << " is not a version tag" << endl;
2029        }
2030    }
2031}
2032
2033//----------------------------------------------------------
2034void Cmt::do_checkout (const CmtSystem::cmt_string_vector& arguments)
2035{
2036  Cvs::checkout (arguments);
2037}
2038
2039//----------------------------------------------------------
2040void Cmt::do_cleanup (PrintMode& mode)
2041{
2042  print_clean (mode);
2043}
2044
2045//----------------------------------------------------------
2046void Cmt::do_config ()
2047{
2048  if (CmtLock::check () == CmtLock::locked_by_another_user)
2049    {
2050      CmtError::set (CmtError::conflicting_lock, "config>");
2051      return;
2052    }
2053
2054    //Use::UsePtrVector& Uses = Use::get_ordered_uses ();
2055
2056  if (m_debug)
2057    {
2058      cout << "Cmt::do_config> " << endl;
2059      cout << "pwd " << CmtSystem::pwd () << endl;
2060      cout << "current_dir " << m_current_dir << endl;
2061      cout << "default_path " << m_default_path << endl;
2062      cout << "cmt config " <<
2063          m_current_package << " " <<
2064          m_current_version << " " <<
2065          m_current_path << endl;
2066    }
2067
2068  if (m_current_package == "CMT") return;
2069  if (m_current_package == "methods") return;
2070
2071  cmt_string branch;
2072
2073  CmtSystem::basename (m_current_dir, branch);
2074
2075  if ((branch != "mgr") && (branch != "cmt"))
2076    {
2077
2078        //
2079        // Here we are in a standalone package (ie completely unstructured)
2080        //
2081
2082      if (CmtSystem::test_file ("requirements"))
2083        {
2084          cout << "------------------------------------------" << endl;
2085          cout << "Configuring environment for standalone package." << endl;
2086          cout << "CMT version " << m_cmt_version << "." << endl;
2087          cout << "System is " << m_cmt_config << endl;
2088          cout << "------------------------------------------" << endl;
2089
2090          install_test_setup_scripts ();
2091          install_test_cleanup_scripts ();
2092
2093          Generator::build_default_makefile ();
2094        }
2095      else
2096        {
2097          cout << "==============================================" << endl;
2098          cout << "cmt config must be operated either upon "
2099            "an existing package" << endl;
2100          cout << " (ie. when a requirements file already exists)" << endl;
2101          cout << "   > cd ..." << endl;
2102          cout << "   > cmt config" << endl;
2103          cout << "or to create a new package" << endl;
2104          cout << "   > cmt config <package> <version> [<path>]" << endl;
2105          cout << "==============================================" << endl;
2106        }
2107
2108      return;
2109    }
2110
2111  configure_current_package ();
2112
2113  Generator::build_default_makefile ();
2114
2115  CmtSystem::cmt_string_vector makes;
2116  cmt_regexp expression ("[.]n?make(sav)?$");
2117
2118  CmtSystem::scan_dir (".", expression, makes);
2119
2120  if (makes.size () > 0)
2121    {
2122      cout << "Removing all previous make fragments from " << branch << endl;
2123
2124      for (int i = 0; i < makes.size (); i++)
2125        {
2126          const cmt_string& s = makes[i];
2127          CmtSystem::remove_file (s);
2128        }
2129    }
2130
2131  CmtSystem::cd ("..");
2132
2133  CmtSystem::scan_dir (m_cmt_config, expression, makes); 
2134   
2135  if (makes.size () > 0) 
2136    {
2137      cout << "Removing all previous make fragments from "
2138           << m_cmt_config << endl; 
2139
2140      for (int i = 0; i < makes.size (); i++) 
2141        { 
2142          const cmt_string& s = makes[i]; 
2143          CmtSystem::remove_file (s); 
2144        }   
2145    } 
2146
2147  /*
2148  // cout << "Try a cleanup of the installation area " << endl;
2149
2150    //
2151    //  Try a cleanup of the installation area
2152    //
2153  if ((get_build_strategy () & InstallAreaMask) == WithInstallArea)
2154    {
2155      CmtInstallAreaMgr& ia_mgr = CmtInstallAreaMgr::instance ();
2156
2157      //cout << "#IA3>" << endl;
2158
2159      if ((get_setup_strategy () & SetupCleanupMask) == SetupCleanup)
2160        {
2161          ia_mgr.config ();
2162        }
2163    }
2164  */
2165
2166  CmtSystem::cd (branch); 
2167
2168  Use& use = Use::current ();
2169
2170  use.set (m_current_package,
2171           m_current_version,
2172           m_current_path,
2173           "",
2174           "");
2175
2176  use.change_path (m_current_path);
2177  use.style     = m_current_style;
2178
2179  //cout << "do_config> current style=" << m_current_style << endl;
2180
2181  m_quiet = true;
2182
2183  if (!reach_current_package ())
2184    {
2185      cout << "Cannot read the requirements file" << endl;
2186      return;
2187    }
2188
2189  install_setup_scripts ();
2190  install_cleanup_scripts ();
2191
2192  CmtSystem::cd ("..");
2193
2194  Branch::BranchVector& branches = Branch::branches ();
2195
2196  int i;
2197
2198  for (i = 0; i < branches.size (); i++)
2199    {
2200      const Branch& branch = branches[i];
2201      const cmt_string& branch_name = branch.name ();
2202
2203      if (!CmtSystem::test_directory (branch_name))
2204        {
2205          if (!CmtSystem::mkdir (branch_name))
2206            {
2207              cout << "Cannot create the " << branch_name <<" branch" << endl;
2208            }
2209          else
2210            {
2211              cout << "Installing the " << branch_name << " directory" << endl;
2212            }
2213        }
2214      else
2215        {
2216          cout << branch_name << " directory already installed" << endl;
2217        }
2218    }
2219}
2220
2221//----------------------------------------------------------
2222void Cmt::do_create (const CmtSystem::cmt_string_vector& arguments)
2223{
2224  if (arguments.size () < 2) return;
2225
2226  const cmt_string& package = arguments[0];
2227  const cmt_string& version = arguments[1];
2228  cmt_string offset;
2229  if (arguments.size () >= 3) offset = arguments[2];
2230
2231  if (m_debug)
2232    {
2233      cout << "do_create>m_current_package=" << m_current_package << endl;
2234      cout << "do_create>package=" << package << endl;
2235    }
2236
2237    //if (m_current_package == "CMT") return;
2238    //if (m_current_package == "methods") return;
2239
2240  cmt_string the_path;
2241
2242  the_path = CmtSystem::pwd ();
2243
2244  if (offset != "")
2245    {
2246      if (!CmtSystem::absolute_path (offset))
2247        {
2248          // offset is really a relative offset
2249          the_path += CmtSystem::file_separator ();
2250          the_path += offset;
2251        }
2252      else // absolute path
2253        {
2254          the_path = offset;
2255        }
2256    }
2257
2258  CmtSystem::compress_path (the_path);
2259
2260  // Now 'the_path' contains the complete path where the package will be created
2261
2262  cout << "------------------------------------------" << endl;
2263  cout << "Configuring environment for package " << package <<
2264    " version " << version << "." << endl;
2265  cout << "CMT version " << m_cmt_version << "." << endl;
2266  cout << "Root set to " << the_path << "." << endl;
2267  cout << "System is " << m_cmt_config << endl;
2268  cout << "------------------------------------------" << endl;
2269
2270  if (!CmtSystem::test_directory (the_path))
2271    {
2272      if (!CmtSystem::mkdir (the_path))
2273        {
2274          cout << "Cannot create the path directory" << endl;
2275          return;
2276        }
2277      else
2278        {
2279          cout << "Installing the path directory" << endl;
2280        }
2281    }
2282
2283  CmtSystem::cd (the_path);
2284
2285  if (!CmtSystem::test_directory (package))
2286    {
2287      if (!CmtSystem::mkdir (package))
2288        {
2289          cout << "Cannot create the package directory" << endl;
2290          return;
2291        }
2292      else
2293        {
2294          cout << "Installing the package directory" << endl;
2295        }
2296    }
2297  else
2298    {
2299      cout << "Package directory already installed" << endl;
2300    }
2301
2302  CmtSystem::cd (package);
2303
2304  if (m_current_structuring_style == with_version_directory)
2305    {
2306      if (!CmtSystem::test_directory (version))
2307        {
2308          if (!CmtSystem::mkdir (version))
2309            {
2310              cout << "Cannot create the version directory" << endl;
2311              return;
2312            }
2313          else
2314            {
2315              cout << "Installing the version directory" << endl;
2316            }
2317        }
2318      else
2319        {
2320          cout << "Version directory already installed" << endl;
2321        }
2322
2323      CmtSystem::cd (version);
2324    }
2325  else
2326    {
2327      cout << "Version directory will not be created due to structuring style" << endl;
2328    }
2329
2330  if (!CmtSystem::test_directory ("cmt"))
2331    {
2332      if (!CmtSystem::test_directory ("mgr"))
2333        {
2334          if (!CmtSystem::mkdir ("cmt"))
2335            {
2336              cout << "Cannot create the cmt directory" << endl;
2337              return;
2338            }
2339          else
2340            {
2341              if (m_current_structuring_style == with_version_directory)
2342                {
2343                  m_current_style = cmt_style;
2344                }
2345              else
2346                {
2347                  m_current_style = no_version_style;
2348                }
2349
2350              cout << "Installing the cmt directory" << endl;
2351            }
2352        }
2353      else
2354        {
2355          if (m_current_structuring_style == with_version_directory)
2356            {
2357              m_current_style = mgr_style;
2358            }
2359          else
2360            {
2361              m_current_style = no_version_style;
2362            }
2363         
2364          cout << "Mgr directory already installed" << endl;
2365        }
2366    }
2367  else
2368    {
2369      if (m_current_structuring_style == with_version_directory)
2370        {
2371          m_current_style = cmt_style;
2372        }
2373      else
2374        {
2375          m_current_style = no_version_style;
2376        }
2377
2378      cout << "Cmt directory already installed" << endl;
2379    }
2380
2381  if (!CmtSystem::test_directory ("src"))
2382    {
2383      if (!CmtSystem::mkdir ("src"))
2384        {
2385          cout << "Cannot create the src directory" << endl;
2386          return;
2387        }
2388      else
2389        {
2390          cout << "Installing the src directory" << endl;
2391        }
2392    }
2393  else
2394    {
2395      cout << "src directory already installed" << endl;
2396    }
2397
2398  switch (m_current_style)
2399    {
2400    case cmt_style:
2401    case no_version_style:
2402      CmtSystem::cd ("cmt");
2403      break;
2404    case mgr_style:
2405      CmtSystem::cd ("mgr");
2406      break;
2407    }
2408
2409  Generator::build_default_makefile ();
2410
2411  if (!CmtSystem::test_file ("requirements"))
2412    {
2413      // create an empty requirement file.
2414      ofstream f ("requirements");
2415      if (f)
2416        {
2417          f << "package " << package << endl;
2418          f << endl;
2419          f.close ();
2420        }
2421    }
2422
2423  if (m_current_structuring_style == without_version_directory)
2424    {
2425      ofstream f ("version.cmt");
2426      if (f)
2427        {
2428          f << version << endl;
2429          f.close ();
2430        }
2431    }
2432
2433  m_current_package = package;
2434  m_current_version = version;
2435  m_current_path    = the_path;
2436  m_current_dir     = CmtSystem::pwd ();
2437
2438  do_config ();
2439}
2440
2441//----------------------------------------------------------
2442void Cmt::do_create_project (const CmtSystem::cmt_string_vector& arguments)
2443{
2444  if (arguments.size () < 1) return;
2445
2446  const cmt_string& project = arguments[0];
2447
2448  Project::create (project);
2449}
2450
2451//----------------------------------------------------------
2452void Cmt::do_cvsbranches (const CmtSystem::cmt_string_vector& arguments)
2453{
2454  Cvs::branches (arguments[0]);
2455}
2456
2457//----------------------------------------------------------
2458void Cmt::do_cvssubpackages (const CmtSystem::cmt_string_vector& arguments)
2459{
2460  Cvs::subpackages (arguments[0]);
2461}
2462
2463//----------------------------------------------------------
2464void Cmt::do_cvstags (const CmtSystem::cmt_string_vector& arguments)
2465{
2466  Cvs::tags (arguments);
2467}
2468
2469//----------------------------------------------------------
2470void Cmt::do_do (const CmtSystem::cmt_string_vector& arguments)
2471{
2472  if (arguments.size () > 0) 
2473    {
2474      set_standard_macros ();
2475      Symbol::all_set ();
2476
2477      Symbol* symbol = Symbol::find (arguments[0]);
2478
2479      if (symbol == 0)
2480        {
2481          CmtError::set (CmtError::symbol_not_found, arguments[0]);
2482          return;
2483        }
2484
2485      /*
2486        We then look for all <name>=<value> pairs
2487      */
2488      for (int i = 1; i < arguments.size (); i++)
2489        {
2490          cmt_string s = arguments[i];
2491          int pos = s.find ("=");
2492          if (pos == cmt_string::npos) break;
2493          if (pos == 0) break;
2494
2495          cmt_string name;
2496          cmt_string value;
2497
2498          s.substr (0, pos, name);
2499          s.substr (pos + 1, value);
2500
2501          int size = value.size ();
2502
2503          if (size >= 2)
2504            {
2505              if (((value[0] == '"') && (value[size - 1] == '"')) ||
2506                  ((value[0] == '\'') && (value[size - 1] == '\'')))
2507                {
2508                  value.erase (size - 1);
2509                  value.erase (0, 1);
2510                }
2511            }
2512
2513          cmt_string r = "macro ";
2514          r += name;
2515          r += " \"";
2516          r += value;
2517          r += "\"";
2518
2519          Use* current_use = &(Use::current ());
2520
2521          SyntaxParser::parse_requirements_line (r, current_use);
2522        }
2523
2524      cmt_string cmd = symbol->build_macro_value ();
2525      Symbol::expand (cmd);
2526
2527      cout << "Execute action " << arguments[0] << " => " << cmd << endl;
2528
2529      CmtSystem::execute (cmd);
2530    }
2531}
2532
2533//----------------------------------------------------------
2534void Cmt::do_expand_model (const CmtSystem::cmt_string_vector& arguments)
2535{
2536  set_standard_macros ();
2537
2538  if ((arguments[0] == "-strict") && (arguments.size () > 1))
2539    {
2540      CmtModel::strict_expand (arguments[1]);
2541    }
2542  else if ((arguments[0] == "-test") && (arguments.size () > 2))
2543    {
2544      CmtModel::test_regexp (arguments[1], arguments[2]);
2545    }
2546  else if (arguments.size () > 0)
2547    {
2548      CmtModel::expand (arguments[0]);
2549    }
2550}
2551
2552/**
2553 *  Handle free filtering of text files containing $(xxx) or ${xxx} patterns
2554 *
2555 *  Substitution is performed against CMT macros and environment variables.
2556 *
2557 *  Arguments:
2558 *
2559 *    cmt filter input-file-name output-file-name
2560 *
2561 */
2562void Cmt::do_filter (const CmtSystem::cmt_string_vector& arguments)
2563{
2564  if (arguments.size () < 2) return;
2565
2566  cmt_string& input = arguments[0];
2567  cmt_string& output = arguments[1];
2568
2569  if (!CmtSystem::test_file (input))
2570    {
2571      cerr << "#CMT> File " << input << " not found" << endl;
2572      return;
2573    }
2574
2575  cmt_string text;
2576
2577  text.read (input);
2578
2579  set_standard_macros ();
2580
2581  Symbol::expand (text);
2582
2583  FILE* file = fopen (output, "wb");
2584  if (file == NULL)
2585    {
2586      cerr << "#CMT> Cannot write filtered file " << output << endl;
2587    }
2588  else
2589    {
2590      text.write (file);
2591      fclose (file);
2592    }
2593}
2594
2595//----------------------------------------------------------
2596void Cmt::do_help (ActionType help_action)
2597{
2598  if (help_action == action_none)
2599    {
2600      CommandParser::show_all ();
2601    }
2602  else
2603    {
2604      CommandParser::show (help_action);
2605    }
2606}
2607
2608//----------------------------------------------------------
2609void Cmt::do_lock (const cmt_string& package,
2610                   const cmt_string& version,
2611                   const cmt_string& path)
2612{
2613  //(unsused) Use& use = Use::current();
2614
2615  cout << "try to lock package " << package << " in " << CmtSystem::pwd () << endl;
2616
2617  set_standard_macros ();
2618
2619  CmtLock::status status = CmtLock::lock ();
2620}
2621
2622//----------------------------------------------------------
2623void Cmt::do_remove (const cmt_string& package,
2624                     const cmt_string& version,
2625                     const cmt_string& path)
2626{
2627    //Use::UsePtrVector& Uses = Use::get_ordered_uses ();
2628
2629  if (m_current_package == "CMT") return;
2630  if (m_current_package == "methods") return;
2631
2632  cmt_string the_path;
2633
2634  //the_path = m_default_path;
2635  the_path = CmtSystem::pwd ();
2636
2637  if (path != "")
2638    {
2639      if (!CmtSystem::absolute_path (path))
2640        {
2641          // path is just a suffix
2642          the_path += CmtSystem::file_separator ();
2643          the_path += path;
2644        }
2645      else // absolute path
2646        {
2647          the_path = path;
2648        }
2649    }
2650
2651  CmtSystem::compress_path (the_path);
2652
2653  cout << "------------------------------------------" << endl;
2654  cout << "Removing package " << package <<
2655    " version " << version << "." << endl;
2656  cout << "CMT version " << m_cmt_version << "." << endl;
2657  cout << "Root set to " << the_path << "." << endl;
2658  cout << "System is " << m_cmt_config << endl;
2659  cout << "------------------------------------------" << endl;
2660
2661  the_path += CmtSystem::file_separator ();
2662  the_path += package;
2663
2664  if (!CmtSystem::cd (the_path))
2665    {
2666      cout << "Path " << the_path << " not reachable" << endl;
2667      return;
2668    }
2669
2670  if (CmtSystem::test_directory (version))
2671    {
2672      if (CmtSystem::remove_directory (version))
2673        {
2674          cout << "Version " << version << " has been removed from " << the_path << endl;
2675          CmtSystem::cmt_string_vector contents;
2676          CmtSystem::scan_dir (".", contents);
2677          if (contents.size () == 0)
2678            {
2679              CmtSystem::cd ("..");
2680              if (CmtSystem::remove_directory (package))
2681                {
2682                  cout << "Package " << package << " has no more versions. Thus it has been removed."<< endl;
2683                }
2684            }
2685        }
2686      else
2687        {
2688          cout << "Impossible to remove version " << version << " from " << the_path << endl;
2689        }
2690    }
2691  else if (CmtSystem::test_directory ("cmt"))
2692    {
2693      CmtSystem::cd ("cmt");
2694
2695      cmt_string v;
2696
2697      v.read ("version.cmt");
2698      if (v == version)
2699        {
2700          CmtSystem::cd ("..");
2701          if (!CmtSystem::remove_directory ("cmt"))
2702            {
2703              cout << "Unstructured version " << version
2704                   << " has been removed from " << the_path << endl;
2705            }
2706          else
2707            {
2708              cout << "Impossible to remove unstructured version " << version
2709                   << " from " << the_path << endl;
2710            }
2711        }
2712      else
2713        {
2714          cout << "Version " << version << " not found" << endl;
2715        }
2716    }
2717  else
2718    {
2719      cout << "Version " << version << " not found" << endl;
2720    }
2721}
2722
2723//----------------------------------------------------------
2724void Cmt::do_remove_library_links ()
2725{
2726  if (CmtLock::check () == CmtLock::locked_by_another_user)
2727    {
2728      CmtError::set (CmtError::conflicting_lock, "remove_library_links>");
2729      return;
2730    }
2731
2732  set_standard_macros ();
2733
2734  Use::UsePtrVector& Uses = Use::get_ordered_uses ();
2735  Use& current_use = Use::current ();
2736  int i;
2737  cmt_string shlibsuffix;
2738  cmt_string symunlink;
2739
2740  {
2741    Symbol* macro = Symbol::find ("shlibsuffix");
2742    if (macro == 0) return;
2743    shlibsuffix = macro->build_macro_value ();
2744    Symbol::expand (shlibsuffix);
2745  }
2746
2747  {
2748    Symbol* macro = Symbol::find ("symunlink");
2749    if (macro == 0) return;
2750    symunlink = macro->build_macro_value ();
2751    Symbol::expand (symunlink);
2752  }
2753
2754  for (i = 0; i < Uses.size (); i++)
2755    {
2756      Use* use = Uses[i];
2757
2758      if (use->discarded) continue;
2759
2760      if (!use->located ())
2761        {
2762          if (!m_quiet)
2763            {
2764              cerr << "#CMT> package " << use->get_package_name () <<
2765                  " " << use->version << " " << use->path << 
2766                  " not found" <<
2767                  endl;
2768            }
2769        }
2770      else
2771        {
2772          if (use->get_package_name () == "CMT") continue;
2773          if (use->get_package_name () == current_use.get_package_name ()) continue;
2774
2775          cmt_string s;
2776
2777          s = use->get_package_name ();
2778          s += "_libraries";
2779
2780          Symbol* libraries_macro = Symbol::find (s);
2781
2782          if (libraries_macro == 0) continue;
2783
2784          cmt_string libraries = libraries_macro->build_macro_value ();
2785          Symbol::expand (libraries);
2786
2787          static CmtSystem::cmt_string_vector values;
2788
2789          CmtSystem::split (libraries, " \t", values);
2790
2791          for (int j = 0; j < values.size (); j++)
2792            {
2793              const cmt_string& library = values[j];
2794
2795              static cmt_string libname;
2796              static cmt_string name;
2797
2798              // Is it a simple name or a complete path?
2799
2800              libname = library;
2801              Symbol::expand (libname);
2802
2803              if (CmtSystem::absolute_path (libname))
2804                {
2805                  /**
2806                   *   We assume here that "library" contains a complete path.
2807                   *   (including the complete syntax libxxx.so)
2808                   */
2809
2810                  cmt_string suffix;
2811                  CmtSystem::basename (library, name);
2812                }
2813              else
2814                {
2815                  /**
2816                   *   Here we expect that only the base name of the library
2817                   *   is given : ie it should not contain the "lib" prefix,
2818                   *   nor the suffix .so, nor any path prefix.
2819                   *    This of course should generally correspond to a constituent name.
2820                   */
2821
2822                  name = "lib";
2823                  name += libname;
2824                  name += ".";
2825                  name += shlibsuffix;
2826                }
2827
2828              Symbol::expand (libname);
2829
2830              if ((get_build_strategy () & InstallAreaMask) == WithInstallArea)
2831                {
2832                  const CmtInstallAreaMgr& ia_mgr = CmtInstallAreaMgr::instance ();
2833
2834                  //cout << "#IA4>" << endl;
2835
2836                  cmt_string s1 = ia_mgr.get_installarea ();
2837
2838                  {
2839                    Symbol* symbol = Symbol::find ("CMTINSTALLAREA");
2840                    if (symbol != 0)
2841                      {
2842                        s1 = symbol->build_macro_value ();
2843                        Symbol::expand (s1);
2844                      }
2845                  }
2846                 
2847                  cmt_string s2;
2848
2849                  {
2850                    Symbol* macro = Symbol::find ("tag");
2851                    if (macro != 0)
2852                      {
2853                        s2 = macro->build_macro_value ();
2854                        Symbol::expand (s2);
2855                      }
2856                  }
2857
2858                    // Now deleting the reference file
2859
2860                  s = symunlink;
2861                  s += " ";
2862                  s += s1;
2863                  s += CmtSystem::file_separator ();
2864                  s += s2;
2865                  s += CmtSystem::file_separator ();
2866                  s += "lib";
2867                  s += CmtSystem::file_separator ();
2868                  s += name;
2869                  s += ".cmtref";
2870                  s += " ";
2871                  s += s1;
2872                  s += CmtSystem::file_separator ();
2873                  s += s2;
2874                  s += CmtSystem::file_separator ();
2875                  s += "lib";
2876                  s += CmtSystem::file_separator ();
2877                  s += name;
2878                }
2879              else
2880                {
2881                  s = symunlink;
2882                  s += " ../$(";
2883                  s += current_use.get_package_name ();
2884                  s += "_tag)/";
2885                  s += name;
2886                }
2887
2888              Symbol::expand (s);
2889
2890              if (!m_quiet) cout << s << endl;
2891              int status = CmtSystem::execute (s);
2892
2893              if (status != 0)
2894                {
2895                  if (status != 2) CmtError::set (CmtError::execution_error, s);
2896
2897                  cerr << "#CMT> Cannot remove the symbolic link " << s << endl;
2898
2899                  break;
2900                }
2901            }
2902        }
2903    }
2904}
2905
2906//----------------------------------------------------------
2907void Cmt::do_run (const CmtSystem::cmt_string_vector& arguments)
2908{
2909  if (arguments.size () > 0) 
2910    {
2911      set_standard_macros ();
2912      Symbol::all_set ();
2913
2914      cmt_string cmd;
2915
2916      for (int i = 0; i < arguments.size (); i++)
2917        {
2918          cmd += arguments[i];
2919          cmd += " ";
2920        }
2921
2922      CmtSystem::execute (cmd);
2923    }
2924}
2925
2926//----------------------------------------------------------
2927void Cmt::do_run_sequence (const CmtSystem::cmt_string_vector& arguments)
2928{
2929  if (arguments.size () == 0) cerr << "#CMT> run_sequence: no sequence specified" << endl;
2930
2931  SequenceRunner runner;
2932
2933  cout << "# cmt run_sequence: sequence " << arguments[0] << endl;
2934
2935  runner.run (arguments[0]);
2936}
2937
2938//----------------------------------------------------------
2939void Cmt::do_set_version (const CmtSystem::cmt_string_vector& arguments)
2940{
2941  if (arguments.size () == 0) cerr << "#CMT> set version: no version specified" << endl;
2942
2943  const cmt_string& version = arguments[0];
2944
2945  int v, r, p;
2946
2947  if (!CmtSystem::is_version_directory (version, v, r, p))
2948    {
2949      cerr << "#CMT> set version " << version << " is not a correct version syntax" << endl;
2950      return;
2951    }
2952
2953  if ((v == -1) || (r == -1) || (p == -1))
2954    {
2955      cerr << "#CMT> set version " << version
2956           << " You cannot use wild card to set a version" << endl;
2957      return;
2958    }
2959
2960  // We want to install the version.cmt file
2961
2962  // We first check we are in a cmt branch
2963  cmt_string h = CmtSystem::pwd ();
2964  cmt_string branch;
2965  CmtSystem::basename (h, branch);
2966
2967  if (branch != "cmt")
2968    {
2969      cerr << "#CMT> set version " << version << " must be applied in a cmt directory" 
2970           << endl;
2971      return;
2972    }
2973
2974  CmtSystem::dirname (h, h);
2975  CmtSystem::basename (h, branch);
2976
2977  if (branch == version)
2978    {
2979      cerr << "#CMT> set version " << version << " is already available as a version directory" 
2980           << endl;
2981      return;
2982    }
2983
2984  cout << "Writing version file : " << version << endl;
2985
2986  version.write ("version.cmt");
2987}
2988
2989//----------------------------------------------------------
2990void Cmt::do_set_versions (const CmtSystem::cmt_string_vector& arguments)
2991{
2992  CmtSystem::cmt_string_vector args;
2993
2994  args = arguments;
2995  {
2996    cmt_string& s = args.add ();
2997    s = "cmt";
2998  }
2999  {
3000    cmt_string& s = args.add ();
3001    s = "set";
3002  }
3003  {
3004    cmt_string& s = args.add ();
3005    s = "version";
3006  }
3007  {
3008    cmt_string& s = args.add ();
3009    s = "<version>";
3010  }
3011
3012  m_action = action_broadcast;
3013
3014  do_broadcast (args, 0, 0);
3015}
3016
3017//----------------------------------------------------------
3018void Cmt::do_setup (PrintMode& mode)
3019{
3020  print (mode);
3021
3022    //
3023    //  Try a cleanup of the installation area
3024    //
3025  if ((get_build_strategy () & InstallAreaMask) == WithInstallArea)
3026    {
3027      CmtInstallAreaMgr& ia_mgr = CmtInstallAreaMgr::instance ();
3028
3029      //cout << "#IA5>" << endl;
3030
3031      ia_mgr.setup ();
3032
3033      /*
3034      if ((get_setup_strategy () & SetupCleanupMask) == SetupCleanup)
3035        {
3036          const cmt_string& installarea = ia_mgr.get_installarea ();
3037
3038          if (installarea != "")
3039            {
3040              cmt_string q;
3041             
3042              switch (mode)
3043                {
3044                case Sh :
3045                case Csh :
3046                  q = "\'";
3047                  break;
3048                default :
3049                  break;
3050                }
3051             
3052              if (!m_quiet)
3053                {
3054                  cout << "echo "  << q
3055                       << "# Doing cleanup in the installation area " << installarea
3056                       << q << endl;
3057                }
3058            }
3059
3060          ia_mgr.config ();
3061        }
3062      */
3063    }
3064}
3065
3066//----------------------------------------------------------
3067void Cmt::do_show_action (const CmtSystem::cmt_string_vector& arguments,
3068                          PrintMode& mode)
3069{
3070  cmt_string target;
3071
3072  if (arguments.size () > 0) target = arguments[0];
3073
3074  Symbol* symbol;
3075
3076  set_standard_macros ();
3077
3078  symbol = Symbol::find (target);
3079
3080  if (symbol == 0) 
3081    {
3082      cmt_string t = " ";
3083      t += target;
3084      t += " is not defined ";
3085
3086      CmtError::set (CmtError::symbol_not_found, t);
3087
3088      return;
3089    }
3090  else
3091    {
3092      cmt_string t = target;
3093      t += " is a ";
3094
3095      if ((m_action == action_show_action) ||
3096          (m_action == action_show_action_value))
3097        {
3098          if (symbol->type != Symbol::SymbolAction)
3099            {
3100              if (symbol->type == Symbol::SymbolMacro)
3101                {
3102                  t += "macro";
3103                }
3104              else if (symbol->type == Symbol::SymbolSet)
3105                {
3106                  t += "set";
3107                }
3108              else if (symbol->type == Symbol::SymbolPath)
3109                {
3110                  t += "path";
3111                }
3112              else if (symbol->type == Symbol::SymbolAlias)
3113                {
3114                  t += "alias";
3115                }
3116
3117              CmtError::set (CmtError::warning, t);
3118            }
3119        }
3120    }
3121
3122  if (symbol->value_lists.size () < 1) return;
3123
3124  symbol->show_macro (mode);
3125}
3126
3127//----------------------------------------------------------
3128void Cmt::do_show_action_names (const CmtSystem::cmt_string_vector& arguments,
3129                                PrintMode& mode)
3130{
3131  if (arguments.size () > 0)
3132    {
3133      const cmt_string& pattern = arguments[0];
3134      print_symbol_names (mode, pattern);
3135    }
3136  else
3137    {
3138      print_symbol_names (mode);
3139    }
3140}
3141
3142//----------------------------------------------------------
3143void Cmt::do_show_action_value (const CmtSystem::cmt_string_vector& arguments,
3144                                PrintMode& mode)
3145{
3146  do_show_macro (arguments, mode);
3147}
3148
3149//----------------------------------------------------------
3150void Cmt::do_show_actions (const CmtSystem::cmt_string_vector& arguments,
3151                           PrintMode& mode)
3152{
3153  if (arguments.size () > 0)
3154    {
3155      const cmt_string& pattern = arguments[0];
3156      print_macros (mode, pattern);
3157    }
3158  else
3159    {
3160      print_macros (mode);
3161    }
3162}
3163
3164//----------------------------------------------------------
3165void Cmt::do_show_all_tags ()
3166{
3167  Tag::TagPtrVector tags = Tag::tags ();
3168  int index;
3169
3170  set_standard_macros ();
3171
3172  for (index = 0; index < tags.size (); index++)
3173    {
3174      const Tag* tag = tags[index];
3175      if (tag != 0)
3176        {
3177          tag->show_definition (true);
3178        }
3179    }
3180}
3181
3182//----------------------------------------------------------
3183void Cmt::do_show_applied_patterns ()
3184{
3185  Pattern::show_all_applied_patterns ();
3186}
3187
3188//----------------------------------------------------------
3189void Cmt::do_show_author ()
3190{
3191  Use& use = Use::current();
3192
3193  cout << use.author << endl;
3194}
3195
3196//----------------------------------------------------------
3197void Cmt::do_show_branches (PrintMode& mode)
3198{
3199  Branch::print_all (mode);
3200}
3201
3202//----------------------------------------------------------
3203void Cmt::do_show_clients (const CmtSystem::cmt_string_vector& arguments)
3204{
3205  cmt_string package;
3206  cmt_string version;
3207  cmt_string path_name;
3208
3209  if (arguments.size () >= 1) package = arguments[0];
3210  if (arguments.size () >= 2) version = arguments[1];
3211  if (arguments.size () >= 3) path_name = arguments[2];
3212
3213  PathScanner scanner;
3214  ClientCollector collector (package, version);
3215
3216  clear ();
3217  configure ();
3218
3219  cout << "# ----------- Clients of " << package <<
3220    " " << version <<
3221    " " << path_name <<
3222    endl;
3223
3224  if (path_name == "")
3225    {
3226      Project::scan_paths (scanner, collector);
3227    }
3228  else
3229    {
3230      scanner.scan_path (path_name, collector);
3231    }
3232  cout << "# ----------- " << collector.count () << " clients found." << endl;
3233}
3234
3235//----------------------------------------------------------
3236void Cmt::do_show_cmtpath_patterns ()
3237{
3238  set_standard_macros ();
3239  CmtPathPattern::show_all ();
3240}
3241
3242//----------------------------------------------------------
3243void Cmt::do_show_constituent (const CmtSystem::cmt_string_vector& arguments)
3244{
3245  if (arguments.size () > 0) 
3246    {
3247      set_standard_macros ();
3248
3249      Constituent* c = Constituent::find (arguments[0]);
3250      if (c != 0)
3251        {
3252          c->show ();
3253        }
3254    }
3255}
3256
3257//----------------------------------------------------------
3258void Cmt::do_show_constituent_names ()
3259{
3260  set_standard_macros ();
3261  Constituent::show_names ();
3262}
3263
3264//----------------------------------------------------------
3265void Cmt::do_show_constituents ()
3266{
3267  set_standard_macros ();
3268  Constituent::show_all ();
3269}
3270
3271//----------------------------------------------------------
3272void Cmt::do_show_cycles ()
3273{
3274  set_standard_macros ();
3275  Use& use = Use::current();
3276
3277  use.show_cycles ();
3278}
3279
3280//----------------------------------------------------------
3281void Cmt::do_show_fragment (const CmtSystem::cmt_string_vector& arguments)
3282{
3283  if (arguments.size () > 0) Fragment::show (arguments[0]);
3284}
3285
3286//----------------------------------------------------------
3287void Cmt::do_show_fragments ()
3288{
3289  Fragment::show_all ();
3290}
3291
3292//----------------------------------------------------------
3293void Cmt::do_show_groups ()
3294{
3295  Group::show_all ();
3296}
3297
3298//----------------------------------------------------------
3299void Cmt::do_show_include_dirs ()
3300{
3301  cmt_string temp;
3302
3303  Use& use = Use::current();
3304
3305  set_standard_macros ();
3306
3307  if (use.include_path == "")
3308    {
3309      temp += "$(src) ";
3310    }
3311  else if (use.include_path != "none")
3312    {
3313      temp += use.include_path;
3314      temp += " ";
3315    }
3316
3317  for (int include_number = 0;
3318       include_number < use.includes.size ();
3319       include_number++)
3320    {
3321      Include& incl = use.includes[include_number];
3322     
3323      temp += incl.name;
3324      temp += " ";
3325    }
3326
3327  cout << temp << endl;
3328}
3329
3330//----------------------------------------------------------
3331void Cmt::do_show_language (const CmtSystem::cmt_string_vector& arguments)
3332{
3333  if (arguments.size () > 0) 
3334    {
3335      set_standard_macros ();
3336      Language::show (arguments[0]);
3337    }
3338}
3339
3340//----------------------------------------------------------
3341void Cmt::do_show_languages ()
3342{
3343  set_standard_macros ();
3344  Language::show_all ();
3345}
3346
3347//----------------------------------------------------------
3348void Cmt::do_show_macro (const CmtSystem::cmt_string_vector& arguments,
3349                         PrintMode& mode)
3350{
3351  cmt_string target;
3352
3353  if (arguments.size () > 0) target = arguments[0];
3354
3355  Symbol* symbol;
3356
3357  set_standard_macros ();
3358
3359  symbol = Symbol::find (target);
3360
3361  if (symbol == 0) 
3362    {
3363      cmt_string t = " ";
3364      t += target;
3365      t += " is not defined ";
3366
3367      CmtError::set (CmtError::symbol_not_found, t);
3368
3369      return;
3370    }
3371  else
3372    {
3373      cmt_string t = target;
3374      t += " is a ";
3375
3376      if ((m_action == action_show_macro) ||
3377          (m_action == action_show_macro_value))
3378        {
3379          if (symbol->type != Symbol::SymbolMacro)
3380            {
3381              if (symbol->type == Symbol::SymbolAction)
3382                {
3383                  t += "action";
3384                }
3385              else if (symbol->type == Symbol::SymbolSet)
3386                {
3387                  t += "set";
3388                }
3389              else if (symbol->type == Symbol::SymbolPath)
3390                {
3391                  t += "path";
3392                }
3393              else if (symbol->type == Symbol::SymbolAlias)
3394                {
3395                  t += "alias";
3396                }
3397
3398              CmtError::set (CmtError::warning, t);
3399            }
3400        }
3401      else if ((m_action == action_show_set) ||
3402               (m_action == action_show_set_value))
3403        {
3404          if ((symbol->type != Symbol::SymbolSet) &&
3405              (symbol->type != Symbol::SymbolPath) &&
3406              (symbol->type != Symbol::SymbolAction) &&
3407              (symbol->type != Symbol::SymbolAlias))
3408            {
3409              t += "macro";
3410
3411              CmtError::set (CmtError::warning, t);
3412            }
3413        }
3414    }
3415
3416  if (symbol->value_lists.size () < 1) return;
3417
3418  symbol->show_macro (mode);
3419}
3420
3421//----------------------------------------------------------
3422void Cmt::do_show_macro_names (const CmtSystem::cmt_string_vector& arguments,
3423                               PrintMode& mode)
3424{
3425  if (arguments.size () > 0)
3426    {
3427      const cmt_string& pattern = arguments[0];
3428      print_symbol_names (mode, pattern);
3429    }
3430  else
3431    {
3432      print_symbol_names (mode);
3433    }
3434}
3435
3436//----------------------------------------------------------
3437void Cmt::do_show_macro_value (const CmtSystem::cmt_string_vector& arguments,
3438                               PrintMode& mode)
3439{
3440  do_show_macro (arguments, mode);
3441}
3442
3443//----------------------------------------------------------
3444void Cmt::do_show_macros (const CmtSystem::cmt_string_vector& arguments,
3445                          PrintMode& mode)
3446{
3447  if (arguments.size () > 0)
3448    {
3449      const cmt_string& pattern = arguments[0];
3450      print_macros (mode, pattern);
3451    }
3452  else
3453    {
3454      print_macros (mode);
3455    }
3456}
3457
3458//----------------------------------------------------------
3459void Cmt::do_show_manager ()
3460{
3461  Use& use = Use::current();
3462
3463  cout << use.manager << endl;
3464}
3465
3466//----------------------------------------------------------
3467void Cmt::do_show_packages (const CmtSystem::cmt_string_vector& arguments)
3468{
3469  cmt_string path_name;
3470
3471  if (arguments.size () > 0) path_name = arguments[0];
3472
3473  PathScanner scanner;
3474  PackageViewer viewer;
3475
3476  if (path_name == "")
3477    {
3478      Project::scan_paths (scanner, viewer);
3479    }
3480  else
3481    {
3482      scanner.scan_path (path_name, viewer);
3483    }
3484}
3485
3486//----------------------------------------------------------
3487void Cmt::do_show_path ()
3488{
3489  Project::show_paths ();
3490}
3491
3492//----------------------------------------------------------
3493void Cmt::do_show_pattern (const CmtSystem::cmt_string_vector& arguments)
3494{
3495  cmt_string name;
3496  if (arguments.size () > 0) name = arguments[0];
3497  Pattern::show (name);
3498}
3499
3500//----------------------------------------------------------
3501void Cmt::do_show_pattern_names ()
3502{
3503  Pattern::show_all_names ();
3504}
3505
3506//----------------------------------------------------------
3507void Cmt::do_show_patterns ()
3508{
3509  Pattern::show_all ();
3510}
3511
3512//----------------------------------------------------------
3513void Cmt::do_show_projects ()
3514{
3515  Project::show_all ();
3516}
3517
3518//----------------------------------------------------------
3519void Cmt::do_show_pwd ()
3520{
3521  cout << m_current_dir << endl;
3522}
3523
3524//----------------------------------------------------------
3525void Cmt::do_show_setup ()
3526{
3527  cout << "----------> uses" << endl;
3528  do_show_uses ();
3529
3530  cout << "----------> tags" << endl;
3531  do_show_tags ();
3532
3533  cout << "----------> CMTPATH" << endl;
3534  do_show_path ();
3535}
3536
3537//----------------------------------------------------------
3538void Cmt::do_show_set (const CmtSystem::cmt_string_vector& arguments,
3539                       PrintMode& mode)
3540{
3541  do_show_macro (arguments, mode);
3542}
3543
3544//----------------------------------------------------------
3545void Cmt::do_show_set_names (const CmtSystem::cmt_string_vector& arguments,
3546                             PrintMode& mode)
3547{
3548  if (arguments.size () > 0)
3549    {
3550      const cmt_string& pattern = arguments[0];
3551      print_symbol_names (mode, pattern);
3552    }
3553  else
3554    {
3555      print_symbol_names (mode);
3556    }
3557}
3558
3559//----------------------------------------------------------
3560void Cmt::do_show_set_value (const CmtSystem::cmt_string_vector& arguments,
3561                             PrintMode& mode)
3562{
3563  do_show_macro (arguments, mode);
3564}
3565
3566//----------------------------------------------------------
3567void Cmt::do_show_sets (const CmtSystem::cmt_string_vector& arguments,
3568                        PrintMode& mode)
3569{
3570  if (arguments.size () > 0)
3571    {
3572      const cmt_string& pattern = arguments[0];
3573      print_macros (mode, pattern);
3574    }
3575  else
3576    {
3577      print_macros (mode);
3578    }
3579}
3580
3581//----------------------------------------------------------
3582void Cmt::do_show_strategies ()
3583{
3584  Project* p = Project::get_current ();
3585
3586  if (p != 0) p->show ();
3587  else cout << "No current project" << endl;
3588
3589  cout << "Structuring style : ";
3590
3591  int strategy = 0;
3592
3593  switch (m_current_structuring_style)
3594    {
3595    case without_version_directory:
3596      cout << "without_version_directory";
3597      break;
3598    case with_version_directory:
3599      cout << "with_version_directory";
3600      break;
3601    }
3602
3603  cout << endl;
3604
3605  cout << "Build strategy    : ";
3606
3607  if (p == 0) strategy = m_current_build_strategy;
3608  else strategy = p->get_build_strategy ();
3609 
3610  if ((strategy & PrototypesMask) == Prototypes)
3611    {
3612      cout << "prototypes";
3613    }
3614  else
3615    {
3616      cout << "no_prototypes";
3617    }
3618 
3619  if ((strategy & KeepMakefilesMask) == KeepMakefiles)
3620    {
3621      cout << " keep_makefiles";
3622    }
3623  else
3624    {
3625      cout << " rebuild_makefiles";
3626    }
3627 
3628  if ((strategy & InstallAreaMask) == WithInstallArea)
3629    {
3630      cout << " with_installarea";
3631    }
3632  else
3633    {
3634      cout << " without_installarea";
3635    }
3636 
3637  cout << endl;
3638
3639  cout << "Setup strategy    : ";
3640 
3641  strategy = get_setup_strategy ();
3642
3643  if ((strategy & SetupConfigMask) == SetupConfig)
3644    {
3645      cout << "config";
3646    }
3647  else
3648    {
3649      cout << "no_config";
3650    }
3651 
3652  if ((strategy & SetupRootMask) == SetupRoot)
3653    {
3654      cout << " root";
3655    }
3656  else
3657    {
3658      cout << " no_root";
3659    }
3660 
3661  if ((strategy & SetupCleanupMask) == SetupCleanup)
3662    {
3663      cout << " cleanup";
3664    }
3665  else
3666    {
3667      cout << " no_cleanup";
3668    }
3669 
3670  cout << endl;
3671}
3672
3673//----------------------------------------------------------
3674void Cmt::do_show_tags ()
3675{
3676  Tag::TagPtrVector tags = Tag::tags ();
3677  int index;
3678
3679  set_standard_macros ();
3680
3681  for (index = 0; index < tags.size (); index++)
3682    {
3683      const Tag* tag = tags[index];
3684      if (tag != 0)
3685        {
3686          tag->show (m_quiet);
3687        }
3688    }
3689}
3690
3691//----------------------------------------------------------
3692void Cmt::do_show_use_paths (const CmtSystem::cmt_string_vector& arguments)
3693{
3694  const cmt_string& to_name = arguments[0];
3695
3696  Use* current = &(Use::current());
3697
3698  current->get_all_clients (to_name);
3699}
3700
3701//----------------------------------------------------------
3702void Cmt::do_show_uses ()
3703{
3704  Use::show_all ();
3705}
3706
3707//----------------------------------------------------------
3708void Cmt::do_show_version ()
3709{
3710  cout << m_current_version << endl;
3711}
3712
3713//----------------------------------------------------------
3714void Cmt::do_show_versions (const CmtSystem::cmt_string_vector& arguments)
3715{
3716  cmt_string package_name;
3717
3718  if (arguments.size () > 0) package_name = arguments[0];
3719
3720  PathScanner scanner;
3721
3722  Project::scan_paths_for_package (scanner, package_name);
3723}
3724
3725//----------------------------------------------------------
3726void Cmt::do_show_system ()
3727{
3728  cout << CmtSystem::get_cmt_config () << endl;
3729}
3730
3731//----------------------------------------------------------
3732void Cmt::do_unlock (const cmt_string& package,
3733                     const cmt_string& version,
3734                     const cmt_string& path)
3735{
3736  // (unused??) Use& use = Use::current();
3737
3738  cout << "try to unlock package " << package << " in " << CmtSystem::pwd () << endl;
3739
3740  set_standard_macros ();
3741
3742  CmtLock::status status = CmtLock::unlock ();
3743}
3744
3745//----------------------------------------------------------
3746void Cmt::do_version ()
3747{
3748  cout << CMTVERSION << endl;
3749}
3750
3751
3752
3753//----------------------------------------------------------
3754ActionType Cmt::get_action ()
3755{
3756  return (m_action);
3757}
3758
3759/*
3760const CmtSystem::cmt_string_vector& Cmt::get_cmt_path ()
3761{
3762  return (m_cmt_path);
3763}
3764
3765const CmtSystem::cmt_string_vector& Cmt::get_cmt_path_pwds ()
3766{
3767  return (m_cmt_path_pwds);
3768}
3769
3770const CmtSystem::cmt_string_vector& Cmt::get_cmt_path_sources ()
3771{
3772  return (m_cmt_path_sources);
3773}
3774*/
3775
3776const cmt_string& Cmt::get_cmt_home ()
3777{
3778  return (m_cmt_home);
3779}
3780
3781const cmt_string& Cmt::get_cmt_user_context ()
3782{
3783  return (m_cmt_user_context);
3784}
3785
3786const cmt_string& Cmt::get_cmt_version ()
3787{
3788  return (m_cmt_version);
3789}
3790
3791const cmt_string& Cmt::get_current_dir ()
3792{
3793  return (m_current_dir);
3794}
3795
3796const cmt_string& Cmt::get_current_package ()
3797{
3798  return (m_current_package);
3799}
3800
3801const cmt_string& Cmt::get_current_cmtpath ()
3802{
3803  return (m_current_cmtpath);
3804}
3805
3806const cmt_string& Cmt::get_current_offset ()
3807{
3808  return (m_current_offset);
3809}
3810
3811AccessMode Cmt::get_current_access ()
3812{
3813  return (m_current_access);
3814}
3815
3816int Cmt::get_current_build_strategy ()
3817{
3818  return (m_current_build_strategy);
3819}
3820
3821int Cmt::get_current_setup_strategy ()
3822{
3823  return (m_current_setup_strategy);
3824}
3825
3826CmtStructuringStyle Cmt::get_current_structuring_style ()
3827{
3828  return (m_current_structuring_style);
3829}
3830
3831CmtDirStyle Cmt::get_current_style ()
3832{
3833  return (m_current_style);
3834}
3835
3836const cmt_string& Cmt::get_current_version ()
3837{
3838  return (m_current_version);
3839}
3840
3841const cmt_string& Cmt::get_current_target ()
3842{
3843  return (m_current_target);
3844}
3845
3846bool Cmt::get_debug ()
3847{
3848  return (m_debug);
3849}
3850
3851bool Cmt::get_quiet ()
3852{
3853  return (m_quiet);
3854}
3855
3856bool Cmt::get_recursive ()
3857{
3858  return (m_recursive);
3859}
3860
3861CmtScopeFilteringMode Cmt::get_scope_filtering_mode ()
3862{
3863  if (m_scope_filtering_mode == default_filtering_mode)
3864    {
3865      return (block_private_uses);
3866    }
3867  else
3868    {
3869      return (m_scope_filtering_mode);
3870    }
3871}
3872
3873//----------------------------------------------------------
3874const cmt_string& Cmt::filter_dir (const cmt_string& dir)
3875{
3876  static cmt_string newdir;
3877
3878  CmtSystem::compress_path (dir, newdir);
3879
3880  return (newdir);
3881}
3882
3883//----------------------------------------------------------
3884static void dos_script_prefix (FILE* f, 
3885                               const cmt_string& cmt_root, 
3886                               const cmt_string& package, 
3887                               const cmt_string& version, 
3888                               const cmt_string& path, 
3889                               const cmt_string& action, 
3890                               const cmt_string& option = "")
3891{
3892  cmt_string no_device = path;
3893
3894  if (CmtSystem::absolute_path (path)) 
3895    {
3896      if (path[1] == ':')
3897        {
3898          no_device = path.substr (2);
3899        }
3900    }
3901
3902  if (package == "cmt_standalone")
3903    {
3904      no_device = "";
3905    }
3906  else
3907    {
3908      no_device = "..\\..\\..";
3909      if (Cmt::get_current_style () == no_version_style)
3910        {
3911          no_device = "..\\..";
3912        }
3913    }
3914
3915
3916  fprintf (f, "@echo off\n");
3917  fprintf (f, "if NOT DEFINED CMTROOT set CMTROOT=%s& set PATH=%%CMTROOT%%\\%%CMTBIN%%;%%PATH%%& set CMTBIN=VisualC& if not defined CMTCONFIG set CMTCONFIG=%%CMTBIN%%\n", cmt_root.c_str ());
3918  fprintf (f, "\n");
3919  fprintf (f, "set cmttempfile=\"%%TEMP%%\\tmpsetup.bat\"\n");
3920  fprintf (f, "%%CMTROOT%%\\%%CMTBIN%%\\cmt.exe %s -bat "
3921           " -pack=%s -version=%s -path=%%~d0%%~p0%s "
3922           " %s "
3923           "%%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9 >%%cmttempfile%%\n",
3924           action.c_str (),
3925           package.c_str (),
3926           version.c_str (),
3927           no_device.c_str (),
3928           option.c_str ());
3929  fprintf (f, "if exist %%cmttempfile%% call %%cmttempfile%%\n");
3930  fprintf (f, "if exist %%cmttempfile%% del %%cmttempfile%%\n");
3931  fprintf (f, "set cmttempfile=\n");
3932}
3933
3934//----------------------------------------------------------
3935void Cmt::install_cleanup_scripts ()
3936{
3937#ifdef WIN32
3938  static const int modes = 1;
3939  static const cmt_string suffix[1]   = {"bat"};
3940  static const PrintMode  mode[1]     = {Bat};
3941#else
3942  static const int modes = 2;
3943  static const cmt_string suffix[2]   = {"csh", "sh"};
3944  static const PrintMode  mode[2]     = {Csh, Sh};
3945#endif
3946
3947  cout << "Creating cleanup scripts." << endl;
3948
3949  cmt_string temp;
3950  int i;
3951
3952  cmt_string version = m_current_version;
3953  if (version == "v*") version = "";
3954
3955  for (i = 0; i < modes; i++)
3956    {
3957      cmt_string file_name = "cleanup";
3958      file_name += ".";
3959      file_name += suffix[i];
3960      file_name += ".";
3961      file_name += "new";
3962
3963      FILE* f = fopen (file_name.c_str (), "wb");
3964      if (f != NULL)
3965        {
3966          if (mode[i] == Csh)
3967            {
3968              fprintf (f, "if ( $?CMTROOT == 0 ) then\n");
3969              fprintf (f, "  setenv CMTROOT %s\n", m_cmt_root.c_str ());
3970              fprintf (f, "endif\n");
3971              fprintf (f, "source ${CMTROOT}/mgr/setup.csh\n");
3972              fprintf (f, "set tempfile=`${CMTROOT}/mgr/cmt -quiet build temporary_name`\n");
3973              fprintf (f, "if $status != 0 then\n  set tempfile=/tmp/cmt.$$\nendif\n");
3974              fprintf (f, "${CMTROOT}/mgr/cmt cleanup -%s "
3975                       "-pack=%s -version=%s -path=%s $* >${tempfile}; "
3976                       "source ${tempfile}\n",
3977                       suffix[i].c_str (),
3978                       m_current_package.c_str (),
3979                       version.c_str (),
3980                       m_current_path.c_str ());
3981              fprintf (f, "/bin/rm -f ${tempfile}\n");
3982            }
3983          else if (mode[i] == Sh)
3984            {
3985              fprintf (f, "if test \"${CMTROOT}\" = \"\"; then\n");
3986              fprintf (f, "  CMTROOT=%s; export CMTROOT\n", m_cmt_root.c_str ());
3987              fprintf (f, "fi\n");
3988              fprintf (f, ". ${CMTROOT}/mgr/setup.sh\n");
3989              fprintf (f, "tempfile=`${CMTROOT}/mgr/cmt -quiet build temporary_name`\n");
3990              fprintf (f, "if test ! $? = 0 ; then tempfile=/tmp/cmt.$$; fi\n");
3991              fprintf (f, "${CMTROOT}/mgr/cmt cleanup -%s "
3992                       "-pack=%s -version=%s -path=%s $* >${tempfile}; "
3993                       ". ${tempfile}\n",
3994                       suffix[i].c_str (),
3995                       m_current_package.c_str (),
3996                       version.c_str (),
3997                       m_current_path.c_str ());
3998              fprintf (f, "/bin/rm -f ${tempfile}\n");
3999            }
4000          else if (mode[i] == Bat)
4001            {
4002              dos_script_prefix (f, m_cmt_root, 
4003                                 m_current_package, version, m_current_path,
4004                                 "cleanup");
4005            }
4006
4007          fprintf (f, "\n");
4008
4009          fclose (f);
4010
4011          cmt_string old_file_name = "cleanup";
4012          old_file_name += ".";
4013          old_file_name += suffix[i];
4014
4015          CmtSystem::compare_and_update_files (file_name, old_file_name);
4016        }
4017    }
4018}
4019
4020//----------------------------------------------------------
4021void Cmt::install_setup_scripts ()
4022{
4023#ifdef WIN32
4024  static const int modes = 1;
4025  static const cmt_string suffix[1]   = {"bat"};
4026  static const PrintMode  mode[1]     = {Bat};
4027#else
4028  static const int modes = 2;
4029  static const cmt_string suffix[2]   = {"csh", "sh"};
4030  static const PrintMode  mode[2]     = {Csh, Sh};
4031#endif
4032
4033  cout << "Creating setup scripts." << endl;
4034
4035 
4036  cmt_string no_cleanup_opt;
4037
4038  if ((get_setup_strategy () & SetupCleanupMask) != SetupCleanup)
4039    {
4040      no_cleanup_opt = " -no_cleanup";
4041    }
4042
4043  cmt_string temp;
4044  int i;
4045
4046  cmt_string version = m_current_version;
4047  if (version == "v*") version = "";
4048
4049  for (i = 0; i < modes; i++)
4050    {
4051      cmt_string file_name = "setup";
4052      file_name += ".";
4053      file_name += suffix[i];
4054      file_name += ".";
4055      file_name += "new";
4056
4057      FILE* f = fopen (file_name.c_str (), "wb");
4058      if (f != NULL)
4059        {
4060          if (mode[i] == Csh)
4061            {
4062              fprintf (f, "# echo \"Setting %s %s in %s\"\n",
4063                       m_current_package.c_str (),
4064                       version.c_str (),
4065                       m_current_path.c_str ());
4066              fprintf (f, "\n");
4067
4068              fprintf (f, "if ( $?CMTROOT == 0 ) then\n");
4069              fprintf (f, "  setenv CMTROOT %s\n", m_cmt_root.c_str ());
4070              fprintf (f, "endif\n");
4071              fprintf (f, "source ${CMTROOT}/mgr/setup.csh\n");
4072              fprintf (f, "\n");
4073              fprintf (f, "set tempfile=`${CMTROOT}/mgr/cmt -quiet build temporary_name`\n");
4074              fprintf (f, "if $status != 0 then\n  set tempfile=/tmp/cmt.$$\nendif\n");
4075              fprintf (f, "${CMTROOT}/mgr/cmt setup -%s "
4076                       "-pack=%s -version=%s -path=%s %s $* >${tempfile}; "
4077                       "source ${tempfile}\n",
4078                       suffix[i].c_str (),
4079                       m_current_package.c_str (),
4080                       version.c_str (),
4081                       m_current_path.c_str (),
4082                       no_cleanup_opt.c_str ());
4083              fprintf (f, "/bin/rm -f ${tempfile}\n");
4084            }
4085          else if (mode[i] == Sh)
4086            {
4087              fprintf (f, "# echo \"Setting %s %s in %s\"\n",
4088                       m_current_package.c_str (),
4089                       version.c_str (),
4090                       m_current_path.c_str ());
4091              fprintf (f, "\n");
4092
4093              fprintf (f, "if test \"${CMTROOT}\" = \"\"; then\n");
4094              fprintf (f, "  CMTROOT=%s; export CMTROOT\n", m_cmt_root.c_str ());
4095              fprintf (f, "fi\n");
4096              fprintf (f, ". ${CMTROOT}/mgr/setup.sh\n");
4097              fprintf (f, "\n");
4098              fprintf (f, "tempfile=`${CMTROOT}/mgr/cmt -quiet build temporary_name`\n");
4099              fprintf (f, "if test ! $? = 0 ; then tempfile=/tmp/cmt.$$; fi\n");
4100              fprintf (f, "${CMTROOT}/mgr/cmt setup -%s "
4101                       "-pack=%s -version=%s -path=%s %s $* >${tempfile}; "
4102                       ". ${tempfile}\n",
4103                       suffix[i].c_str (),
4104                       m_current_package.c_str (),
4105                       version.c_str (),
4106                       m_current_path.c_str (),
4107                       no_cleanup_opt.c_str ());
4108              fprintf (f, "/bin/rm -f ${tempfile}\n");
4109            }
4110          else if (mode[i] == Bat)
4111            {
4112              fprintf (f, "rem Setting %s %s in %%~d0%%~p0\n",
4113                       m_current_package.c_str (),
4114                       version.c_str ());
4115              dos_script_prefix (f, m_cmt_root, 
4116                                 m_current_package, version, m_current_path,
4117                                 "setup", no_cleanup_opt);
4118            }
4119
4120          fprintf (f, "\n");
4121
4122          fclose (f);
4123
4124          cmt_string old_file_name = "setup";
4125          old_file_name += ".";
4126          old_file_name += suffix[i];
4127
4128          CmtSystem::compare_and_update_files (file_name, old_file_name);
4129        }
4130    }
4131}
4132
4133//----------------------------------------------------------
4134void Cmt::install_test_cleanup_scripts ()
4135{
4136#ifdef WIN32
4137  static const int modes = 1;
4138  static const cmt_string suffix[1]   = {"bat"};
4139  static const PrintMode  mode[1]     = {Bat};
4140#else
4141  static const int modes = 2;
4142  static const cmt_string suffix[2]   = {"csh", "sh"};
4143  static const PrintMode  mode[2]     = {Csh, Sh};
4144#endif
4145
4146  cout << "Creating cleanup scripts." << endl;
4147
4148  cmt_string temp;
4149  int i;
4150
4151  cmt_string version = m_current_version;
4152  if (version == "v*") version = "";
4153
4154  for (i = 0; i < modes; i++)
4155    {
4156      cmt_string file_name = "cleanup";
4157      file_name += ".";
4158      file_name += suffix[i];
4159      file_name += ".";
4160      file_name += "new";
4161
4162      FILE* f = fopen (file_name.c_str (), "wb");
4163      if (f != NULL)
4164        {
4165          if (mode[i] == Csh)
4166            {
4167              fprintf (f, "if ( $?CMTROOT == 0 ) then\n");
4168              fprintf (f, "  setenv CMTROOT %s\n", m_cmt_root.c_str ());
4169              fprintf (f, "endif\n");
4170              fprintf (f, "source ${CMTROOT}/mgr/setup.csh\n");
4171              fprintf (f, "set tempfile=`${CMTROOT}/mgr/cmt -quiet build temporary_name`\n");
4172              fprintf (f, "if $status != 0 then\n  set tempfile=/tmp/cmt.$$\nendif\n");
4173              fprintf (f, "${CMTROOT}/mgr/cmt cleanup -%s -pack=cmt_standalone -path=%s $* >${tempfile}; "
4174                       "source ${tempfile}\n",
4175                       suffix[i].c_str (),
4176                       m_current_path.c_str ());
4177              fprintf (f, "/bin/rm -f ${tempfile}\n");
4178            }
4179          else if (mode[i] == Sh)
4180            {
4181              fprintf (f, "if test \"${CMTROOT}\" = \"\"; then\n");
4182              fprintf (f, "  CMTROOT=%s; export CMTROOT\n", m_cmt_root.c_str ());
4183              fprintf (f, "fi\n");
4184              fprintf (f, ". ${CMTROOT}/mgr/setup.sh\n");
4185              fprintf (f, "tempfile=`${CMTROOT}/mgr/cmt -quiet build temporary_name`\n");
4186              fprintf (f, "if test ! $? = 0 ; then tempfile=/tmp/cmt.$$; fi\n");
4187              fprintf (f, "${CMTROOT}/mgr/cmt cleanup -%s -pack=cmt_standalone -path=%s $* >${tempfile}; "
4188                       ". ${tempfile}\n",
4189                       suffix[i].c_str (),
4190                       m_current_path.c_str ());
4191              fprintf (f, "/bin/rm -f ${tempfile}\n");
4192            }
4193          else
4194            {
4195              dos_script_prefix (f, m_cmt_root, 
4196                                 "cmt_standalone", "", m_current_path, 
4197                                 "cleanup");
4198            }
4199
4200          fprintf (f, "\n");
4201
4202          fclose (f);
4203
4204          cmt_string old_file_name = "cleanup";
4205          old_file_name += ".";
4206          old_file_name += suffix[i];
4207
4208          CmtSystem::compare_and_update_files (file_name, old_file_name);
4209        }
4210    }
4211}
4212
4213//----------------------------------------------------------
4214void Cmt::install_test_setup_scripts ()
4215{
4216#ifdef WIN32
4217  static const int modes = 1;
4218  static const cmt_string suffix[1]   = {"bat"};
4219  static const PrintMode  mode[1]     = {Bat};
4220#else
4221  static const int modes = 2;
4222  static const cmt_string suffix[2]   = {"csh", "sh"};
4223  static const PrintMode  mode[2]     = {Csh, Sh};
4224#endif
4225
4226  cout << "Creating setup scripts." << endl;
4227
4228  cmt_string no_cleanup_opt;
4229
4230  if ((get_setup_strategy () & SetupCleanupMask) != SetupCleanup)
4231    {
4232      no_cleanup_opt = " -no_cleanup";
4233    }
4234
4235  cmt_string temp;
4236  int i;
4237
4238  for (i = 0; i < modes; i++)
4239    {
4240      cmt_string file_name = "setup";
4241      file_name += ".";
4242      file_name += suffix[i];
4243      file_name += ".";
4244      file_name += "new";
4245
4246      FILE* f = fopen (file_name.c_str (), "wb");
4247      if (f != NULL)
4248        {
4249          if (mode[i] == Csh)
4250            {
4251              fprintf (f, "# echo \"Setting standalone package\"\n");
4252              fprintf (f, "\n");
4253
4254              fprintf (f, "if ( $?CMTROOT == 0 ) then\n");
4255              fprintf (f, "  setenv CMTROOT %s\n", m_cmt_root.c_str ());
4256              fprintf (f, "endif\n");
4257              fprintf (f, "source ${CMTROOT}/mgr/setup.csh\n");
4258              fprintf (f, "set tempfile=`${CMTROOT}/mgr/cmt -quiet build temporary_name`\n");
4259              fprintf (f, "if $status != 0 then\n  set tempfile=/tmp/cmt.$$\nendif\n");
4260              fprintf (f, "${CMTROOT}/mgr/cmt setup -%s -pack=cmt_standalone -path=%s %s $* >${tempfile}; "
4261                       "source ${tempfile}\n",
4262                       suffix[i].c_str (),
4263                       m_current_path.c_str (),
4264                       no_cleanup_opt.c_str ());
4265              fprintf (f, "/bin/rm -f ${tempfile}\n");
4266            }
4267          else if (mode[i] == Sh)
4268            {
4269              fprintf (f, "# echo \"Setting standalone package\"\n");
4270              fprintf (f, "\n");
4271
4272              fprintf (f, "if test \"${CMTROOT}\" = \"\"; then\n");
4273              fprintf (f, "  CMTROOT=%s; export CMTROOT\n", m_cmt_root.c_str ());
4274              fprintf (f, "fi\n");
4275              fprintf (f, ". ${CMTROOT}/mgr/setup.sh\n");
4276              fprintf (f, "\n");
4277              fprintf (f, "tempfile=`${CMTROOT}/mgr/cmt -quiet build temporary_name`\n");
4278              fprintf (f, "if test ! $? = 0 ; then tempfile=/tmp/cmt.$$; fi\n");
4279              fprintf (f, "${CMTROOT}/mgr/cmt setup -%s -pack=cmt_standalone -path=%s %s $* >${tempfile}; "
4280                       ". ${tempfile}\n",
4281                       suffix[i].c_str (),
4282                       m_current_path.c_str (),
4283                       no_cleanup_opt.c_str ());
4284              fprintf (f, "/bin/rm -f ${tempfile}\n");
4285            }
4286          else
4287            {
4288              fprintf (f, "rem Setting standalone package\n");
4289              dos_script_prefix (f, m_cmt_root, 
4290                                 "cmt_standalone", "", m_current_path, 
4291                                 "setup", no_cleanup_opt);
4292            }
4293
4294          fprintf (f, "\n");
4295
4296          fclose (f);
4297
4298          cmt_string old_file_name = "setup";
4299          old_file_name += ".";
4300          old_file_name += suffix[i];
4301
4302          CmtSystem::compare_and_update_files (file_name, old_file_name);
4303        }
4304    }
4305}
4306
4307/**
4308 *    load is only called from the Windows GUI which pretends to access directly
4309 *   the internal data model.
4310 *    This is considered to be rather unsafe, and should be replaced by query functions.
4311 */
4312bool Cmt::load (const cmt_string& path,
4313                const cmt_string& package,
4314                const cmt_string& version,
4315                const cmt_string& tag_name)
4316{
4317  clear ();
4318  configure ();
4319
4320  m_action  = action_load;
4321  m_recursive = true;
4322
4323  if (((package != "") && (version != "")) || (m_current_package == ""))
4324    {
4325      //
4326      //  Here we want to connect to a new package, or to the current package
4327      //  but with another tag.
4328      //
4329      //   the 'package' argument may include a directory offset. Thus 'path'
4330      //  is only expected to hold the base directory.
4331      //
4332      cmt_string offset;
4333      cmt_string package_name;
4334     
4335      CmtSystem::dirname (package, offset);
4336      CmtSystem::basename (package, package_name);
4337     
4338      if (offset != "")
4339        {
4340          m_current_path = path;
4341          m_current_path += CmtSystem::file_separator ();
4342          m_current_path += offset;
4343        }
4344      else
4345        {
4346          m_current_path = path;
4347        }
4348     
4349      m_current_package = package_name;
4350      m_current_version = version;
4351    }
4352
4353  if (tag_name != "")
4354    {
4355      Tag* tag;
4356
4357      Tag::unmark_all ();
4358      configure_version_tag ();
4359      configure_site_tag (0);
4360      configure_uname_tag ();
4361      configure_hosttype_tag ();
4362
4363      m_current_tag = tag_name;
4364
4365      //if (!m_quiet) cerr << "load1> current_tag=" << m_current_tag << endl;
4366
4367      tag = Tag::add (tag_name, PriorityTag, "load", 0);
4368      tag->mark ();
4369    }
4370
4371  /*
4372    Set to developer mode if positioned into the package
4373    (which is detected since we were able to retreive the
4374    Version, Package and Path)
4375  */
4376
4377  if ((m_current_path == "") ||
4378      (m_current_package == "") ||
4379      (m_current_version == ""))
4380    {
4381      m_current_access = UserMode;
4382    }
4383  else
4384    {
4385      m_current_access = DeveloperMode;
4386    }
4387
4388  use_cmt ();
4389
4390  cmt_string dir;
4391
4392  /*
4393    Try to access the package.
4394  */
4395
4396  if (m_current_path != "")
4397    {
4398      dir = m_current_path;
4399    }
4400  else
4401    {
4402      dir = m_default_path;
4403    }
4404
4405  if (!CmtSystem::cd (m_current_path))
4406    {
4407      if (!m_quiet)
4408        {
4409          cerr << "#CMT> Cannot reach the directory " <<
4410            m_current_path << endl;
4411        }
4412      CmtError::set (CmtError::package_not_found, "Load> Cannot reach the path directory");
4413      CmtSystem::cd (m_current_dir);
4414
4415      return (false);
4416    }
4417
4418  dir += CmtSystem::file_separator ();
4419  dir += m_current_package;
4420
4421  if (!CmtSystem::cd (m_current_package))
4422    {
4423      if (!m_quiet)
4424        {
4425          cerr << "#CMT::load> Cannot reach the package " <<
4426            m_current_package << endl;
4427        }
4428      CmtError::set (CmtError::package_not_found, "Load> Cannot reach the package directory");
4429      CmtSystem::cd (m_current_dir);
4430
4431      return (false);
4432    }
4433
4434  dir += CmtSystem::file_separator ();
4435  dir += m_current_version;
4436
4437  m_current_style = none_style;
4438
4439  if (!CmtSystem::cd (m_current_version))
4440    {
4441      if (!CmtSystem::test_directory ("cmt"))
4442        {
4443          if (!m_quiet)
4444            {
4445              cerr << "#CMT> Cannot reach the version " <<
4446                m_current_version << endl;
4447            }
4448          CmtError::set (CmtError::package_not_found, "Load> Cannot reach the version directory");
4449          CmtSystem::cd (m_current_dir);
4450
4451          return (false);
4452        }
4453      else
4454        {
4455          m_current_style = no_version_style;
4456        }
4457    }
4458
4459  if (CmtSystem::cd ("cmt"))
4460    {
4461      dir += CmtSystem::file_separator ();
4462      dir += "cmt";
4463      if (m_current_style == none_style) m_current_style = cmt_style;
4464    }
4465  else
4466    {
4467      /*
4468        if (!m_quiet)
4469        {
4470        cerr << "Cannot reach the cmt branch" << endl;
4471        }
4472      */
4473
4474      if (CmtSystem::cd ("mgr"))
4475        {
4476          dir += CmtSystem::file_separator ();
4477          dir += "mgr";
4478          if (m_current_style == none_style) m_current_style = mgr_style;
4479        }
4480      else
4481        {
4482          if (!m_quiet)
4483            {
4484              cerr << "#CMT> Cannot reach the mgr branch" << endl;
4485            }
4486
4487          CmtError::set (CmtError::package_not_found,
4488                         "Load> Cannot reach the mgr/cmt directory");
4489          CmtSystem::cd (m_current_dir);
4490
4491          return (false);
4492        }
4493    }
4494
4495  /*
4496    Check Tag is always set up
4497  */
4498
4499  if (m_current_tag == "")
4500    {
4501      char* env;
4502
4503      env = getenv (m_current_config.c_str ());
4504      if (env != 0)
4505        {
4506          Tag* tag;
4507
4508          tag = Tag::add (env, PriorityConfig, "load", 0);
4509          tag->mark ();
4510          m_current_tag = env;
4511
4512          //if (!m_quiet) cerr << "load2> current_tag=" << m_current_tag << endl;
4513
4514        }
4515      else
4516        {
4517          m_current_tag = m_cmt_config;
4518
4519          //if (!m_quiet) cerr << "load3> current_tag=" << m_current_tag << endl;
4520
4521        }
4522    }
4523
4524  if (m_debug)
4525    {
4526      cout << "pwd = " << CmtSystem::pwd () << endl;
4527    }
4528
4529  configure_current_dir ();
4530  build_prefix (m_current_package, m_current_prefix);
4531  build_config (m_current_prefix, m_current_config);
4532
4533  Use* use = &(Use::current());
4534  use->path    = m_current_path;
4535  use->set_package_name (m_current_package);
4536  use->version = m_current_version;
4537  use->prefix  = m_current_prefix;
4538  use->done    = false;
4539  use->style   = m_current_style;
4540
4541  /*
4542    Work on the requirements file.
4543  */
4544
4545  dir += CmtSystem::file_separator ();
4546  dir += "requirements";
4547  SyntaxParser::parse_requirements (dir, use);
4548
4549  if (CmtError::has_pending_error ()) return (false);
4550
4551    /**
4552     * See reach_current_package for an explanation of this call
4553     */
4554  Pattern::apply_all_globals ();
4555
4556  /*
4557    Select all possible tags
4558  */
4559
4560  Tag::restore_tree ();
4561
4562  return (true);
4563}
4564
4565//----------------------------------------------------------
4566bool Cmt::need_prototypes ()
4567{
4568  if ((get_build_strategy () & PrototypesMask) == Prototypes) return (true);
4569  else return (false);
4570}
4571
4572//----------------------------------------------------------
4573void Cmt::parse_arguments (int argc, char* argv[],
4574                           CmtSystem::cmt_string_vector& arguments,
4575                           cmt_string& extra_line,
4576                           cmt_string& extra_file,
4577                           PrintMode& mode)
4578{
4579  /*
4580    Decoding arguments.
4581
4582    While decoding all arguments, no requirements analysis should
4583    occur. Every new option, or parameter should be saved and
4584    used later at actual analysis time.
4585  */
4586
4587  cmt_string arg;
4588
4589  m_action = action_none;
4590  m_help_action = action_none;
4591
4592  arguments.clear ();
4593  extra_line.erase (0);
4594  extra_file.erase (0);
4595  mode = Csh;
4596
4597    /*
4598      Tag management.
4599      ---------------
4600
4601      Tag settings may come from :
4602
4603      - existing environment variables:
4604
4605          1) CMTCONFIG
4606
4607          2) CMTEXTRATAGS for addons
4608
4609      - arguments:
4610
4611          -tag=<tag-list>
4612          -tag_add=<tag-list>
4613          -tag_remove=<tag-list>
4614
4615       o Arguments should take precedence over environment variables.
4616       o when nothing is specified:
4617
4618          - primary tag = CMTCONFIG
4619          - tag set is empty
4620
4621
4622     */
4623
4624
4625  restore_all_tags (0);
4626
4627#ifdef WIN32
4628  m_build_nmake = true;
4629#endif
4630
4631  while (argc > 1)
4632    {
4633      int lf;
4634
4635      arg = argv[1];
4636      lf = arg.find ('\r');
4637      if (lf != cmt_string::npos) arg.erase (lf);
4638
4639      if ((arg[0] == '\"') && (arg[arg.size () - 1] == '\"'))
4640        {
4641          arg.erase (0, 1);
4642          arg.erase (arg.size () - 1, 1);
4643        }
4644
4645      //fprintf (stderr, "arg=[%s]\n", arg.c_str ());
4646
4647      switch (arg[0])
4648        {
4649        case 'a' :
4650          if (arg == "awk")
4651            {
4652              argc--;
4653              argv++;
4654              while (argc > 1)
4655                {
4656                  cmt_string& s = arguments.add ();
4657                  s = argv[1];
4658                  argc--;
4659                  argv++;
4660                }
4661
4662              m_action = action_awk;
4663            }
4664          break;
4665        case 'b' :
4666          if ((arg == "b") ||
4667              (arg == "br") ||
4668              (arg == "bro") ||
4669              (arg == "broa") ||
4670              (arg == "broad") ||
4671              (arg == "broadc") ||
4672              (arg == "broadca") ||
4673              (arg == "broadcas") ||
4674              (arg == "broadcast"))
4675            {
4676              argc--;
4677              argv++;
4678              while (argc > 1)
4679                {
4680                  cmt_string& s = arguments.add ();
4681                  s = argv[1];
4682                  argc--;
4683                  argv++;
4684                }
4685
4686              m_action = action_broadcast;
4687
4688              if (m_scope_filtering_mode == default_filtering_mode)
4689                {
4690                  set_scope_filtering_mode (reach_private_uses);
4691                }
4692            }
4693          else if (arg == "build")
4694            {
4695              argc--;
4696              argv++;
4697
4698              if (argc > 1)
4699                {
4700                  arg = argv[1];
4701
4702                  if (arg == "-nmake")
4703                    {
4704                      m_build_nmake = true;
4705                      argc--;
4706                      argv++;
4707                    }
4708                }
4709
4710              if (argc > 1)
4711                {
4712                  arg = argv[1];
4713
4714                  if (arg == "-nmake")
4715                    {
4716                      argc--;
4717                      argv++;
4718                    }
4719
4720                  if (arg == "constituent_makefile")
4721                    {
4722                      argc--;
4723                      argv++;
4724                      if (argc > 1)
4725                        {
4726                          cmt_string& s = arguments.add ();
4727                          s = argv[1];
4728
4729                          m_action = action_build_constituent_makefile;
4730                        }
4731                      else
4732                        {
4733                          if (!m_quiet) cerr << "#CMT> syntax error : constituent name missing" << endl;
4734                          m_action = action_build_constituent_makefile;
4735                          m_help_action = action_help;
4736                        }
4737                    }
4738                  else if (arg == "constituents_makefile")
4739                    {
4740                      argc--;
4741                      argv++;
4742                      while (argc > 1)
4743                        {
4744                          cmt_string& s = arguments.add ();
4745                          s = argv[1];
4746                          argc--;
4747                          argv++;
4748                        }
4749
4750                      m_action = action_build_constituents_makefile;
4751                    }
4752                  else if (arg == "dependencies")
4753                    {
4754                      argc--;
4755                      argv++;
4756                      if (argc > 1)
4757                        {
4758                          cmt_string& s = arguments.add ();
4759                          s = argv[1];
4760
4761                          m_action = action_build_dependencies;
4762                        }
4763                      else
4764                        {
4765                          if (!m_quiet) cerr << "#CMT> syntax error : arguments missing " << endl;
4766                          m_help_action = action_help;
4767                          m_action = action_build_dependencies;
4768                        }
4769
4770                      argc = 0;
4771                    }
4772                  else if (arg == "library_links")
4773                    {
4774                      m_action = action_build_library_links;
4775                    }
4776                  else if (arg == "make_setup")
4777                    {
4778                      m_action = action_build_make_setup;
4779                    }
4780                  else if (arg == "msdev")
4781                    {
4782                      argc--;
4783                      argv++;
4784
4785                      if (argc > 1)
4786                        {
4787                          cmt_string& s = arguments.add ();
4788                          s = argv[1];
4789                          if (s[0] == '-')
4790                            {
4791                              s = "";
4792                              argc++;
4793                              argv--;
4794                            }
4795                        }
4796
4797                      m_action = action_build_msdev;
4798                    }
4799                  else if (arg == "CMT_pacman")
4800                    {
4801                      m_action = action_build_CMT_pacman;
4802                    }
4803                  else if (arg == "vsnet") 
4804                    {                                             
4805                       argc--;                                     
4806                       argv++;                                     
4807                                                                   
4808                       if (argc > 1)                               
4809                         {                                         
4810                           cmt_string& s = arguments.add ();       
4811                           s = argv[1];                             
4812                           if (s[0] == '-')                         
4813                             {                                     
4814                               s = "";                             
4815                               argc++;                             
4816                               argv--;                             
4817                             }                                     
4818                         }                                         
4819                                                                   
4820                       m_action = action_build_vsnet;                 
4821                     }                                             
4822                  else if (arg == "os9_makefile")
4823                    {
4824                      argc--;
4825                      argv++;
4826                      if (argc > 1)
4827                        {
4828                          cmt_string& s = arguments.add ();
4829                          s = argv[1];
4830
4831                          m_action = action_build_os9_makefile;
4832                        }
4833                      else
4834                        {
4835                          if (!m_quiet) cerr << "#CMT> syntax error : arguments missing " << endl;
4836                          m_help_action = action_help;
4837                          m_action = action_build_os9_makefile;
4838                        }
4839                    }
4840                  else if (arg == "prototype")
4841                    {
4842                      argc--;
4843                      argv++;
4844                      if (argc > 1)
4845                        {
4846                          cmt_string& s = arguments.add ();
4847                          s = argv[1];
4848
4849                          m_action = action_build_prototype;
4850                        }
4851                      else
4852                        {
4853                          if (!m_quiet) cerr << "#CMT> syntax error : arguments missing" << endl;
4854                          m_help_action = action_help;
4855                          m_action = action_build_prototype;
4856                        }
4857                    }
4858                  else if (arg == "readme")
4859                    {
4860                      m_action = action_build_readme;
4861
4862                      argc--;
4863                      argv++;
4864                      while (argc > 1)
4865                        {
4866                          cmt_string& s = arguments.add ();
4867                          s = argv[1];
4868                          argc--;
4869                          argv++;
4870                        }
4871                    }
4872                  else if (arg == "tag_makefile")
4873                    {
4874                      m_action = action_build_tag_makefile;
4875                    }
4876                  else if (arg == "temporary_name")
4877                    {
4878                      m_action = action_build_temporary_name;
4879                    }
4880                  else if (arg == "triggers")
4881                    {
4882                      argc--;
4883                      argv++;
4884                      if (argc > 1)
4885                        {
4886                          cmt_string& s = arguments.add ();
4887                          s = argv[1];
4888
4889                          m_action = action_build_triggers;
4890                        }
4891                      else
4892                        {
4893                          if (!m_quiet) cerr << "#CMT> syntax error : arguments missing" << endl;
4894                          m_help_action = action_help;
4895                          m_action = action_build_triggers;
4896                        }
4897                    }
4898                  else if (arg == "windefs")
4899                    {
4900                      argc--;
4901                      argv++;
4902                      if (argc > 1)
4903                        {
4904                          cmt_string& s = arguments.add ();
4905                          s = argv[1];
4906
4907                          m_action = action_build_windefs;
4908                        }
4909                      else
4910                        {
4911                          if (!m_quiet) cerr << "#CMT> syntax error : arguments missing" << endl;
4912                          m_help_action = action_help;
4913                          m_action = action_build_windefs;
4914                        }
4915                    }
4916                  else
4917                    {
4918                      if (!m_quiet) cerr << "#CMT> syntax error : wrong argument" << endl;
4919                      m_help_action = action_help;
4920                      m_action = action_build;
4921                    }
4922                }
4923              else
4924                {
4925                  if (!m_quiet) cerr << "#CMT> syntax error : don't know what to build" << endl;
4926                  m_help_action = action_help;
4927                  m_action = action_build;
4928                }
4929            }
4930          else
4931            {
4932              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
4933              m_help_action = action_help;
4934            }
4935          break;
4936        case 'c' :
4937          if (arg == "check")
4938            {
4939              argc--;
4940              argv++;
4941
4942              if (argc > 1)
4943                {
4944                  arg = argv[1];
4945
4946                  if (arg == "configuration")
4947                    {
4948                      m_action = action_check_configuration;
4949                    }
4950                  else if (arg == "files")
4951                    {
4952                      argc--;
4953                      argv++;
4954                      if (argc > 1)
4955                        {
4956                          cmt_string& s = arguments.add ();
4957                          s = argv[1];
4958                          argc--;
4959                          argv++;
4960                          if (argc > 1)
4961                            {
4962                              cmt_string& s = arguments.add ();
4963                              s = argv[1];
4964
4965                              m_action = action_check_files;
4966                            }
4967                          else
4968                            {
4969                              if (!m_quiet) cerr << "#CMT> syntax error : reference file name missing" 
4970                                                 << endl;
4971                              m_help_action = action_help;
4972                              m_action = action_check_files;
4973                            }
4974                        }
4975                      else
4976                        {
4977                          if (!m_quiet) cerr << "#CMT> syntax error : file name missing" << endl;
4978                          m_help_action = action_help;
4979                          m_action = action_check_files;
4980                        }
4981                    }
4982                  else if (arg == "version")
4983                    {
4984                      argc--;
4985                      argv++;
4986                      if (argc > 1)
4987                        {
4988                          cmt_string& s = arguments.add ();
4989                          s = argv[1];
4990
4991                          m_action = action_check_version;
4992                        }
4993                      else
4994                        {
4995                          if (!m_quiet) cerr << "#CMT> syntax error : package name missing" << endl;
4996                          m_help_action = action_help;
4997                          m_action = action_check_version;
4998                        }
4999                    }
5000                  else
5001                    {
5002                      if (!m_quiet) cerr << "#CMT> syntax error : bad check option" << endl;
5003                      m_help_action = action_help;
5004                      m_action = action_check;
5005                    }
5006                }
5007              else
5008                {
5009                  if (!m_quiet) cerr << "#CMT> syntax error : don't know what to check" << endl;
5010                  m_help_action = action_help;
5011                  m_action = action_check;
5012                }
5013            }
5014          else if (arg == "check_files")
5015            {
5016              argc--;
5017              argv++;
5018              if (argc > 1)
5019                {
5020                  cmt_string& s = arguments.add ();
5021                  s = argv[1];
5022                  argc--;
5023                  argv++;
5024                  if (argc > 1)
5025                    {
5026                      cmt_string& s = arguments.add ();
5027                      s = argv[1];
5028
5029                      m_action = action_check_files;
5030                    }
5031                  else
5032                    {
5033                      if (!m_quiet) cerr << "#CMT> syntax error : reference file missing" << endl;
5034                      m_help_action = action_help;
5035                      m_action = action_check_files;
5036                    }
5037                }
5038              else
5039                {
5040                  if (!m_quiet) cerr << "#CMT> syntax error : file name missing" << endl;
5041                  m_help_action = action_help;
5042                  m_action = action_check_files;
5043                }
5044            }
5045          else if ((arg == "co") ||
5046                   (arg == "checkout"))
5047            {
5048              // handle all of the command line arguments in a vector
5049              argc--;
5050              argv++;
5051              if (argc > 1)
5052                {
5053                  m_action = action_checkout;
5054
5055                  while (argc > 1)
5056                    {
5057                      cmt_string& s = arguments.add ();
5058                      s = argv[1];
5059                      argc--;
5060                      argv++;
5061                    }
5062                }
5063              else
5064                {
5065                  if (!m_quiet) cerr << "#CMT> syntax error : checkout arguments missing" << endl;
5066                  m_help_action = action_help;
5067                  m_action = action_checkout;
5068                }
5069            }
5070          else if (arg == "cleanup")
5071            {
5072              m_action = action_cleanup;
5073            }
5074          else if (arg == "config")
5075            {
5076              argc--;
5077              argv++;
5078              if (argc > 1)
5079                {
5080                  cerr << "#---------------------------------------------------------" << endl;
5081                  cerr << "# Warning: using 'cmt config ...' to create a package is "
5082                    "becoming obsolete" << endl;
5083                  cerr << "# Please use 'cmt create ...' instead" << endl;
5084                  cerr << "#---------------------------------------------------------" << endl;
5085
5086                  m_current_package = argv[1];
5087                  m_current_version.erase (0);
5088                  m_current_path.erase (0);
5089
5090                  argc--;
5091                  argv++;
5092                  if (argc > 1)
5093                    {
5094                      m_current_version = argv[1];
5095
5096                      {
5097                        cmt_string& s = arguments.add ();
5098                        s = m_current_package;
5099                      }
5100                      {
5101                        cmt_string& s = arguments.add ();
5102                        s = m_current_version;
5103                      }
5104
5105                      argc--;
5106                      argv++;
5107                      if (argc > 1)
5108                        {
5109                          m_current_path = argv[1];
5110                          if (m_current_path[0] == '-')
5111                            {
5112                              m_current_path.erase (0);
5113                            }
5114                        }
5115
5116                      m_action = action_create;
5117                    }
5118                  else
5119                    {
5120                      if (!m_quiet) cerr << "#CMT> syntax error : create arguments missing" << endl;
5121                      m_help_action = action_help;
5122                      m_action = action_create;
5123                    }
5124                }
5125              else
5126                {
5127                  m_action = action_config;
5128                }
5129            }
5130          else if (arg == "create")
5131            {
5132              argc--;
5133              argv++;
5134
5135              if (argc > 1)
5136                {
5137                  while (argc > 1)
5138                    {
5139                      cmt_string& s = arguments.add ();
5140                      s = argv[1];
5141                      argc--;
5142                      argv++;
5143                    }
5144
5145                  m_action = action_create;
5146                }
5147              else
5148                {
5149                  if (!m_quiet) cerr << "#CMT> syntax error : create arguments missing" << endl;
5150                  m_help_action = action_help;
5151                  m_action = action_create;
5152                }
5153            }
5154          else if (arg == "create_project")
5155            {
5156              argc--;
5157              argv++;
5158
5159              if (argc > 1)
5160                {
5161                  while (argc > 1)
5162                    {
5163                      cmt_string& s = arguments.add ();
5164                      s = argv[1];
5165                      argc--;
5166                      argv++;
5167                    }
5168
5169                  m_action = action_create_project;
5170                }
5171              else
5172                {
5173                  if (!m_quiet) cerr << "#CMT> syntax error : create_project arguments missing" << endl;
5174                  m_help_action = action_help;
5175                  m_action = action_create_project;
5176                }
5177            }
5178          else if (arg == "cvsbranches")
5179            {
5180              argc--;
5181              argv++;
5182              if (argc > 1)
5183                {
5184                  cmt_string& s = arguments.add ();
5185                  s = argv[1];
5186                  argc--;
5187                  argv++;
5188
5189                  m_action = action_cvsbranches;
5190                }
5191              else
5192                {
5193                  if (!m_quiet) cerr << "#CMT> syntax error : cvsbranches arguments missing" << endl;
5194                  m_help_action = action_help;
5195                  m_action = action_cvsbranches;
5196                }
5197            }
5198          else if (arg == "cvssubpackages")
5199            {
5200              argc--;
5201              argv++;
5202              if (argc > 1)
5203                {
5204                  cmt_string& s = arguments.add ();
5205                  s = argv[1];
5206                  argc--;
5207                  argv++;
5208
5209                  m_action = action_cvssubpackages;
5210                }
5211              else
5212                {
5213                  if (!m_quiet) cerr << "#CMT> syntax error : cvssubpackages arguments missing" << endl;
5214                  m_help_action = action_help;
5215                  m_action = action_cvssubpackages;
5216                }
5217            }
5218          else if (arg == "cvstags")
5219            {
5220              argc--;
5221              argv++;
5222              if (argc > 1)
5223                {
5224                  while (argc > 1)
5225                    {
5226                      cmt_string& s = arguments.add ();
5227                      s = argv[1];
5228                      argc--;
5229                      argv++;
5230                    }
5231
5232                  m_action = action_cvstags;
5233                }
5234              else
5235                {
5236                  if (!m_quiet) cerr << "#CMT> syntax error : package name missing" << endl;
5237                  m_help_action = action_help;
5238                  m_action = action_cvstags;
5239                }
5240            }
5241          else
5242            {
5243              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
5244              m_help_action = action_help;
5245            }
5246          break;
5247        case 'd' :
5248          if (arg == "do")
5249            {
5250              argc--;
5251              argv++;
5252
5253              if (argc > 1)
5254                {
5255                  while (argc > 1)
5256                    {
5257                      cmt_string& s = arguments.add ();
5258                      s = argv[1];
5259                      argc--;
5260                      argv++;
5261                    }
5262                 
5263                  {
5264                    cmt_string tag_name = "target_";
5265                    tag_name += arguments[0];
5266
5267                    Tag* tag;
5268                    tag = Tag::add (tag_name, PriorityUserTag, "action", 0);                     
5269                    tag->mark ();
5270                  }
5271
5272                  m_action = action_do;
5273                }
5274              else
5275                {
5276                  if (!m_quiet) cerr << "#CMT> syntax error : action not specified" << endl;
5277                  m_help_action = action_help;
5278                  m_action = action_do;
5279                }
5280            }
5281          else
5282            {
5283              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
5284              m_help_action = action_help;
5285            }
5286          break;
5287        case 'e' :
5288          if (arg == "expand")
5289            {
5290              argc--;
5291              argv++;
5292
5293              if (argc > 1)
5294                {
5295                  arg = argv[1];
5296
5297                  if (arg == "model")
5298                    {
5299                      argc--;
5300                      argv++;
5301
5302                      if (argc > 1)
5303                        {
5304                          while (argc > 1)
5305                            {
5306                              cmt_string& s = arguments.add ();
5307                              s = argv[1];
5308                              argc--;
5309                              argv++;
5310                            }
5311
5312                          m_action = action_expand_model;
5313                        }
5314                      else
5315                        {
5316                          if (!m_quiet) cerr << "#CMT> syntax error : model not specified" << endl;
5317                          m_help_action = action_help;
5318                          m_action = action_expand_model;
5319                        }
5320                    }
5321                  else
5322                    {
5323                      if (!m_quiet) cerr << "#CMT> syntax error : bad expand option" << endl;
5324                      m_help_action = action_help;
5325                      m_action = action_expand_model;
5326                    }
5327                }
5328              else
5329                {
5330                  if (!m_quiet) cerr << "#CMT> syntax error : don't know what to expand" << endl;
5331                  m_help_action = action_help;
5332                  m_action = action_expand_model;
5333                }
5334            }
5335          else
5336            {
5337              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
5338              m_help_action = action_help;
5339            }
5340          break;
5341        case 'f' :
5342          if ((arg == "f") ||
5343              (arg == "fi") ||
5344              (arg == "fil") ||
5345              (arg == "filt") ||
5346              (arg == "filte") ||
5347              (arg == "filter"))
5348            {
5349              // handle all of the command line arguments in a vector
5350              argc--;
5351              argv++;
5352              while (argc > 1)
5353                {
5354                  cmt_string& s = arguments.add ();
5355                  s = argv[1];
5356                  argc--;
5357                  argv++;
5358                }
5359
5360              m_action = action_filter;
5361            }
5362          else
5363            {
5364              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
5365              m_help_action = action_help;
5366            }
5367          break;
5368        case 'h' :
5369          if ((arg == "h") ||
5370              (arg == "he") ||
5371              (arg == "hel") ||
5372              (arg == "help"))
5373            {
5374              m_help_action = action_help;
5375            }
5376          else
5377            {
5378              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
5379              m_help_action = action_help;
5380            }
5381          break;
5382        case 'l' :
5383          if (arg == "lock")
5384            {
5385              argc--;
5386              argv++;
5387              if (argc > 1)
5388                {
5389                  m_current_package = argv[1];
5390                  {
5391                    cmt_string& s = arguments.add ();
5392                    s = m_current_package;
5393                  }
5394
5395                  m_current_version.erase (0);
5396                  m_current_path.erase (0);
5397
5398                  argc--;
5399                  argv++;
5400                  if (argc > 1)
5401                    {
5402                      m_current_version = argv[1];
5403
5404                      {
5405                        cmt_string& s = arguments.add ();
5406                        s = m_current_version;
5407                      }
5408                   
5409                      m_action = action_lock;
5410
5411                      argc--;
5412                      argv++;
5413                      if (argc > 1)
5414                        {
5415                          m_current_path = argv[1];
5416                          if (m_current_path[0] == '-')
5417                            {
5418                              m_current_path.erase (0);
5419                            }
5420                        }
5421
5422                      m_current_access = UserMode;
5423                      (Use::current()).set (m_current_package, 
5424                                            m_current_version, 
5425                                            m_current_path);
5426
5427                    }
5428                  else
5429                    {
5430                      if (!m_quiet) cerr << "#CMT> syntax error : version missing" << endl;
5431                      m_help_action = action_help;
5432                      m_action = action_lock;
5433                    }
5434                }
5435              else
5436                {
5437                  m_action = action_lock;
5438                }
5439            }
5440          else
5441            {
5442              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
5443              m_help_action = action_help;
5444            }
5445          break;
5446        case 'r' :
5447          if (arg == "remove")
5448            {
5449              argc--;
5450              argv++;
5451
5452              if (argc > 1)
5453                {
5454                  arg = argv[1];
5455
5456                  if (arg == "library_links")
5457                    {
5458                      m_action = action_remove_library_links;
5459                    }
5460                  else
5461                    {
5462                      m_current_package = argv[1];
5463                      {
5464                        cmt_string& s = arguments.add ();
5465                        s = m_current_package;
5466                      }
5467                     
5468                      m_current_version.erase (0);
5469                      m_current_path.erase (0);
5470                     
5471                      argc--;
5472                      argv++;
5473                      if (argc > 1)
5474                        {
5475                          m_current_version = argv[1];
5476                         
5477                          {
5478                            cmt_string& s = arguments.add ();
5479                            s = m_current_version;
5480                          }
5481                         
5482                          argc--;
5483                          argv++;
5484                          if (argc > 1)
5485                            {
5486                              m_current_path = argv[1];
5487                              if (m_current_path[0] == '-')
5488                                {
5489                                  m_current_path.erase (0);
5490                                }
5491                            }
5492                           
5493                          m_action = action_remove;
5494                        }
5495                      else
5496                        {
5497                          if (!m_quiet) cerr << "#CMT> syntax error : version missing" << endl;
5498                          m_help_action = action_help;
5499                          m_action = action_remove;
5500                        }
5501                    }
5502                }
5503              else
5504                {
5505                  if (!m_quiet) cerr << "#CMT> syntax error : don't know what to remove" << endl;
5506                  m_help_action = action_help;
5507                  m_action = action_remove;
5508                }
5509            }
5510          else if (arg == "run")
5511            {
5512              argc--;
5513              argv++;
5514              if (argc > 1)
5515                {
5516                  cmt_string& s = arguments.add ();
5517                  s = argv[1];
5518
5519                  m_action = action_run;
5520                }
5521              else
5522                {
5523                  if (!m_quiet) cerr << "#CMT> syntax error : run arguments missing" << endl;
5524                  m_help_action = action_help;
5525                  m_action = action_run;
5526                }
5527            }
5528          else if (arg == "run_sequence")
5529            {
5530              argc--;
5531              argv++;
5532              if (argc > 1)
5533                {
5534                  cmt_string& s = arguments.add ();
5535                  s = argv[1];
5536
5537                  m_action = action_run_sequence;
5538                }
5539              else
5540                {
5541                  if (!m_quiet) cerr << "#CMT> syntax error : run_sequence arguments missing" << endl;
5542                  m_help_action = action_help;
5543                  m_action = action_run_sequence;
5544                }
5545            }
5546          else
5547            {
5548              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
5549              m_help_action = action_help;
5550            }
5551          break;
5552        case 's' :
5553          if (arg == "set")
5554            {
5555              argc--;
5556              argv++;
5557              if (argc > 1)
5558                {
5559                  arg = argv[1];
5560
5561                  if (arg == "version")
5562                    {
5563                      argc--;
5564                      argv++;
5565
5566                      while (argc > 1)
5567                        {
5568                          cmt_string& s = arguments.add ();
5569                          s = argv[1];
5570                          argc--;
5571                          argv++;
5572                        }
5573
5574                      m_action = action_set_version;
5575                    }
5576                  else if (arg == "versions")
5577                    {
5578                      argc--;
5579                      argv++;
5580
5581                      while (argc > 1)
5582                        {
5583                          cmt_string& s = arguments.add ();
5584                          s = argv[1];
5585                          argc--;
5586                          argv++;
5587                        }
5588
5589                      m_action = action_set_versions;
5590
5591                      if (m_scope_filtering_mode == default_filtering_mode)
5592                        {
5593                          set_scope_filtering_mode (reach_private_uses);
5594                        }
5595                    }
5596                  else
5597                    {
5598                      if (!m_quiet) cerr << "#CMT> syntax error : bad set argument" << endl;
5599                      m_help_action = action_help;
5600                      //m_action = action_set;
5601                    }
5602                }
5603              else
5604                {
5605                  if (!m_quiet) cerr << "#CMT> syntax error : don't know what to set" << endl;
5606                  m_help_action = action_help;
5607                  //m_action = action_set;
5608                }
5609            }
5610          else if (arg == "setup")
5611            {
5612              m_action = action_setup;
5613            }
5614          else if ((arg == "s") ||
5615                   (arg == "sh") ||
5616                   (arg == "sho") ||
5617                   (arg == "show"))
5618            {
5619              argc--;
5620              argv++;
5621              if (argc > 1)
5622                {
5623                  arg = argv[1];
5624
5625                  if (arg == "action")
5626                    {
5627                      argc--;
5628                      argv++;
5629                      if (argc > 1)
5630                        {
5631                          cmt_string& s = arguments.add ();
5632                          s = argv[1];
5633                          m_current_target = argv[1];
5634
5635                          m_action = action_show_action;
5636                        }
5637                      else
5638                        {
5639                          if (!m_quiet) cerr << "#CMT> syntax error : action name missing" << endl;
5640                          m_help_action = action_help;
5641                          m_action = action_show_action;
5642                        }
5643                    }
5644                  else if (arg == "action_names")
5645                    {
5646                      argc--;
5647                      argv++;
5648                      if (argc > 1)
5649                        {
5650                          cmt_string& s = arguments.add ();
5651                          s = argv[1];
5652                        }
5653
5654                      m_action = action_show_action_names;
5655                    }
5656                  else if (arg == "action_value")
5657                    {
5658                      m_quiet = true;
5659                      argc--;
5660                      argv++;
5661                      if (argc > 1)
5662                        {
5663                          cmt_string& s = arguments.add ();
5664                          s = argv[1];
5665                          m_current_target = argv[1];
5666
5667                          m_action = action_show_action_value;
5668                        }
5669                      else
5670                        {
5671                          if (!m_quiet) cerr << "#CMT> syntax error : action name missing" << endl;
5672                          m_help_action = action_help;
5673                          m_action = action_show_action_value;
5674                        }
5675                    }
5676                  else if (arg == "actions")
5677                    {
5678                      argc--;
5679                      argv++;
5680                      if (argc > 1)
5681                        {
5682                          cmt_string& s = arguments.add ();
5683                          s = argv[1];
5684                        }
5685
5686                      m_action = action_show_actions;
5687                    }
5688                  else if (arg == "all_tags")
5689                    {
5690                      m_action = action_show_all_tags;
5691                    }
5692                  else if (arg == "applied_patterns")
5693                    {
5694                      m_action = action_show_applied_patterns;
5695                    }
5696                  else if (arg == "author")
5697                    {
5698                      m_action = action_show_author;
5699                    }
5700                  else if (arg == "branches")
5701                    {
5702                      m_action = action_show_branches;
5703                    }
5704                  else if (arg == "clients")
5705                    {
5706                      argc--;
5707                      argv++;
5708                      if (argc > 1)
5709                        {
5710                          cmt_string& s = arguments.add ();
5711                          s = argv[1];
5712                          m_current_target = argv[1];
5713
5714                          m_action = action_show_clients;
5715
5716                          argc--;
5717                          argv++;
5718                          if (argc > 1)
5719                            {
5720                              cmt_string& s = arguments.add ();
5721                              s = argv[1];
5722
5723                              argc--;
5724                              argv++;
5725                              if (argc > 1)
5726                                {
5727                                  cmt_string& s = arguments.add ();
5728                                  s = argv[1];
5729                                }
5730                            }
5731                        }
5732                      else
5733                        {
5734                          if (!m_quiet) cerr << "#CMT> syntax error : package name missing" << endl;
5735                          m_help_action = action_help;
5736                          m_action = action_show_clients;
5737                        }
5738                    }
5739                  else if (arg == "cmtpath_patterns")
5740                    {
5741                      m_action = action_show_cmtpath_patterns;
5742                    }
5743                  else if (arg == "constituent")
5744                    {
5745                      argc--;
5746                      argv++;
5747                      if (argc > 1)
5748                        {
5749                          cmt_string& s = arguments.add ();
5750                          s = argv[1];
5751                          m_current_target = argv[1];
5752
5753                          m_action = action_show_constituent;
5754                        }
5755                      else
5756                        {
5757                          if (!m_quiet) cerr << "#CMT> syntax error : constituent name missing" << endl;
5758                          m_help_action = action_help;
5759                          m_action = action_show_constituent;
5760                        }
5761                    }
5762                  else if (arg == "constituent_names")
5763                    {
5764                      m_action = action_show_constituent_names;
5765                    }
5766                  else if (arg == "constituents")
5767                    {
5768                      m_action = action_show_constituents;
5769                    }
5770                  else if (arg == "cycles")
5771                    {
5772                      m_action = action_show_cycles;
5773                    }
5774                  else if (arg == "fragment")
5775                    {
5776                      argc--;
5777                      argv++;
5778                      if (argc > 1)
5779                        {
5780                          cmt_string& s = arguments.add ();
5781                          s = argv[1];
5782                          m_current_target = argv[1];
5783
5784                          m_action = action_show_fragment;
5785                        }
5786                      else
5787                        {
5788                          if (!m_quiet) cerr << "#CMT> syntax error : fragment name missing" << endl;
5789                          m_help_action = action_help;
5790                          m_action = action_show_fragment;
5791                        }
5792                    }
5793                  else if (arg == "fragments")
5794                    {
5795                      m_action = action_show_fragments;
5796                    }
5797                  else if (arg == "groups")
5798                    {
5799                      m_action = action_show_groups;
5800                    }
5801                  else if (arg == "include_dirs")
5802                    {
5803                      m_action = action_show_include_dirs;
5804                    }
5805                  else if (arg == "language")
5806                    {
5807                      argc--;
5808                      argv++;
5809                      if (argc > 1)
5810                        {
5811                          cmt_string& s = arguments.add ();
5812                          s = argv[1];
5813                          m_current_target = argv[1];
5814
5815                          m_action = action_show_language;
5816                        }
5817                      else
5818                        {
5819                          if (!m_quiet) cerr << "#CMT> syntax error : language name missing" << endl;
5820                          m_help_action = action_help;
5821                          m_action = action_show_language;
5822                        }
5823                    }
5824                  else if (arg == "languages")
5825                    {
5826                      m_action = action_show_languages;
5827                    }
5828                  else if (arg == "macro")
5829                    {
5830                      argc--;
5831                      argv++;
5832                      if (argc > 1)
5833                        {
5834                          cmt_string& s = arguments.add ();
5835                          s = argv[1];
5836                          m_current_target = argv[1];
5837
5838                          m_action = action_show_macro;
5839                        }
5840                      else
5841                        {
5842                          if (!m_quiet) cerr << "#CMT> syntax error : macro name missing" << endl;
5843                          m_help_action = action_help;
5844                          m_action = action_show_macro;
5845                        }
5846                    }
5847                  else if (arg == "macro_names")
5848                    {
5849                      argc--;
5850                      argv++;
5851                      if (argc > 1)
5852                        {
5853                          cmt_string& s = arguments.add ();
5854                          s = argv[1];
5855                        }
5856
5857                      m_action = action_show_macro_names;
5858                    }
5859                  else if (arg == "macro_value")
5860                    {
5861                      m_quiet = true;
5862                      argc--;
5863                      argv++;
5864                      if (argc > 1)
5865                        {
5866                          cmt_string& s = arguments.add ();
5867                          s = argv[1];
5868                          m_current_target = argv[1];
5869
5870                          m_action = action_show_macro_value;
5871                        }
5872                      else
5873                        {
5874                          if (!m_quiet) cerr << "#CMT> syntax error : macro name missing" << endl;
5875                          m_help_action = action_help;
5876                          m_action = action_show_macro_value;
5877                        }
5878                    }
5879                  else if (arg == "macros")
5880                    {
5881                      argc--;
5882                      argv++;
5883                      if (argc > 1)
5884                        {
5885                          cmt_string& s = arguments.add ();
5886                          s = argv[1];
5887                        }
5888
5889                      m_action = action_show_macros;
5890                    }
5891                  else if (arg == "manager")
5892                    {
5893                      m_action = action_show_manager;
5894                    }
5895                  else if (arg == "packages")
5896                    {
5897                      argc--;
5898                      argv++;
5899                      if (argc > 1)
5900                        {
5901                          cmt_string& s = arguments.add ();
5902                          s = argv[1];
5903                          m_current_target = argv[1];
5904                        }
5905
5906                      m_action = action_show_packages;
5907                    }
5908                  else if (arg == "path")
5909                    {
5910                      m_action = action_show_path;
5911                    }
5912                  else if (arg == "pattern")
5913                    {
5914                      argc--;
5915                      argv++;
5916                      if (argc > 1)
5917                        {
5918                          cmt_string& s = arguments.add ();
5919                          s = argv[1];
5920                          m_current_target = argv[1];
5921
5922                          m_action = action_show_pattern;
5923                        }
5924                      else
5925                        {
5926                          if (!m_quiet) cerr << "#CMT> syntax error : pattern name missing" << endl;
5927                          m_help_action = action_help;
5928                          m_action = action_show_pattern;
5929                        }
5930                    }
5931                  else if (arg == "pattern_names")
5932                    {
5933                      m_action = action_show_pattern_names;
5934                    }
5935                  else if (arg == "patterns")
5936                    {
5937                      m_action = action_show_patterns;
5938                    }
5939                  else if (arg == "projects")
5940                    {
5941                      m_action = action_show_projects;
5942                    }
5943                  else if (arg == "pwd")
5944                    {
5945                      m_action = action_show_pwd;
5946                    }
5947                  else if (arg == "setup")
5948                    {
5949                      m_action = action_show_setup;
5950
5951                      if (m_scope_filtering_mode == default_filtering_mode)
5952                        {
5953                          set_scope_filtering_mode (reach_private_uses);
5954                        }
5955                    }
5956                  else if (arg == "set_names")
5957                    {
5958                      argc--;
5959                      argv++;
5960                      if (argc > 1)
5961                        {
5962                          cmt_string& s = arguments.add ();
5963                          s = argv[1];
5964                        }
5965
5966                      m_action = action_show_set_names;
5967                    }
5968                  else if (arg == "set_value")
5969                    {
5970                      m_quiet = true;
5971                      argc--;
5972                      argv++;
5973                      if (argc > 1)
5974                        {
5975                          cmt_string& s = arguments.add ();
5976                          s = argv[1];
5977                          m_current_target = argv[1];
5978
5979                          m_action = action_show_set_value;
5980                        }
5981                      else
5982                        {
5983                          if (!m_quiet) cerr << "#CMT> syntax error : set name missing" << endl;
5984                          m_help_action = action_help;
5985                          m_action = action_show_set_value;
5986                        }
5987                    }
5988                  else if (arg == "set")
5989                    {
5990                      argc--;
5991                      argv++;
5992                      if (argc > 1)
5993                        {
5994                          cmt_string& s = arguments.add ();
5995                          s = argv[1];
5996                          m_current_target = argv[1];
5997
5998                          m_action = action_show_set;
5999                        }
6000                      else
6001                        {
6002                          if (!m_quiet) cerr << "#CMT> syntax error : set name missing" << endl;
6003                          m_help_action = action_help;
6004                          m_action = action_show_set;
6005                        }
6006                    }
6007                  else if (arg == "sets")
6008                    {
6009                      argc--;
6010                      argv++;
6011                      if (argc > 1)
6012                        {
6013                          cmt_string& s = arguments.add ();
6014                          s = argv[1];
6015                        }
6016
6017                      m_action = action_show_sets;
6018                    }
6019                  else if (arg == "strategies")
6020                    {
6021                      m_action = action_show_strategies;
6022                    }
6023                  else if (arg == "tags")
6024                    {
6025                      m_action = action_show_tags;
6026                    }
6027                  else if (arg == "use_paths")
6028                    {
6029                      argc--;
6030                      argv++;
6031                      if (argc > 1)
6032                        {
6033                          while (argc > 1)
6034                            {
6035                              if (strcmp (argv[1], "-private") == 0)
6036                                {
6037                                  set_scope_filtering_mode (reach_private_uses);
6038                                }
6039                              else if (strcmp (argv[1], "--private") == 0)
6040                                {
6041                                  set_scope_filtering_mode (reach_private_uses);
6042                                }
6043                              else
6044                                {
6045                                  cmt_string& s = arguments.add ();
6046                                  s = argv[1];
6047                                }
6048
6049                              argc--;
6050                              argv++;
6051                            }
6052
6053                          m_action = action_show_use_paths;
6054                        }
6055                      else
6056                        {
6057                          if (!m_quiet) cerr << "#CMT> syntax error : package name missing" << endl;
6058                          m_help_action = action_help;
6059                          m_action = action_show_use_paths;
6060                        }
6061                    }
6062                  else if ((arg == "u") ||
6063                           (arg == "us") ||
6064                           (arg == "use") ||
6065                           (arg == "uses"))
6066                    {
6067                      m_action = action_show_uses;
6068
6069                      if (m_scope_filtering_mode == default_filtering_mode)
6070                        {
6071                          set_scope_filtering_mode (reach_private_uses);
6072                        }
6073                    }
6074                  else if (arg == "version")
6075                    {
6076                      m_action = action_show_version;
6077                    }
6078                  else if (arg == "versions")
6079                    {
6080                      argc--;
6081                      argv++;
6082                      if (argc > 1)
6083                        {
6084                          cmt_string& s = arguments.add ();
6085                          s = argv[1];
6086                          m_current_target = argv[1];
6087
6088                          m_action = action_show_versions;
6089                        }
6090                      else
6091                        {
6092                          if (!m_quiet) cerr << "#CMT> syntax error : package name missing" << endl;
6093                          m_help_action = action_help;
6094                          m_action = action_show_versions;
6095                        }
6096                    }
6097                  else
6098                    {
6099                      if (!m_quiet) cerr << "#CMT> syntax error : bad show argument" << endl;
6100                      m_help_action = action_help;
6101                      m_action = action_show;
6102                    }
6103                }
6104              else
6105                {
6106                  if (!m_quiet) cerr << "#CMT> syntax error : don't know what to show" << endl;
6107                  m_help_action = action_help;
6108                  m_action = action_show;
6109                }
6110            }
6111          else if (arg == "system")
6112            {
6113              m_action = action_system;
6114            }
6115          else
6116            {
6117              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
6118              m_help_action = action_help;
6119            }
6120
6121          break;
6122        case 'u' :
6123          if (arg == "unlock")
6124            {
6125              argc--;
6126              argv++;
6127              if (argc > 1)
6128                {
6129                  m_current_package = argv[1];
6130                  {
6131                    cmt_string& s = arguments.add ();
6132                    s = m_current_package;
6133                  }
6134
6135                  m_current_version.erase (0);
6136                  m_current_path.erase (0);
6137                                       
6138                  argc--;
6139                  argv++;
6140                  if (argc > 1)
6141                    {
6142                      m_current_version = argv[1];
6143
6144                      {
6145                        cmt_string& s = arguments.add ();
6146                        s = m_current_version;
6147                      }
6148                                               
6149                      m_action = action_unlock;
6150
6151                      argc--;
6152                      argv++;
6153                      if (argc > 1)
6154                        {
6155                          m_current_path = argv[1];
6156                          if (m_current_path[0] == '-')
6157                            {
6158                              m_current_path.erase (0);
6159                            }
6160                        }
6161                                               
6162                      m_current_access = UserMode;
6163                      (Use::current()).set (m_current_package, 
6164                                            m_current_version, 
6165                                            m_current_path);
6166
6167                    }
6168                  else
6169                    {
6170                      if (!m_quiet) cerr << "#CMT> syntax error : version missing" << endl;
6171                      m_help_action = action_help;
6172                      m_action = action_unlock;
6173                    }
6174                }
6175              else
6176                {
6177                  m_action = action_unlock;
6178                }
6179            }
6180          else
6181            {
6182              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
6183              m_help_action = action_help;
6184            }
6185
6186          break;
6187        case 'v' :
6188          if ((arg == "v") ||
6189              (arg == "ve") ||
6190              (arg == "ver") ||
6191              (arg == "vers") ||
6192              (arg == "versi") ||
6193              (arg == "versio") ||
6194              (arg == "version"))
6195            {
6196              m_action = action_version;
6197            }
6198          else
6199            {
6200              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
6201              m_help_action = action_help;
6202            }
6203          break;
6204        case '+' :
6205          if (arg.substr (0, 6) == "+path=")
6206            {
6207              arg.erase (0, 6);
6208
6209              IProjectFactory& factory = ProjectFactory::instance ();
6210
6211              CmtSystem::add_cmt_path (arg, "argument", factory);
6212            }
6213          else
6214            {
6215              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " 
6216                               << arg << endl;
6217              m_help_action = action_help;
6218            }
6219
6220          break;
6221        case '-' :
6222          if ((arg == "-help") ||
6223              (arg == "--help"))
6224            {
6225              m_help_action = action_help;
6226            }
6227          else if (arg == "-n")
6228            {
6229              m_simulation = true;
6230            }
6231          else if ((arg == "-q") ||
6232                   (arg == "-qu") ||
6233                   (arg == "-qui") ||
6234                   (arg == "-quie") ||
6235                   (arg == "-quiet"))
6236            {
6237              m_quiet = true;
6238            }
6239          else if (arg == "-csh")
6240            {
6241              mode = Csh;
6242            }
6243          else if (arg == "-sh")
6244            {
6245              mode = Sh;
6246            }
6247          else if (arg == "-bat")
6248            {
6249              mode = Bat;
6250            }
6251          else if (arg.substr (0, 5) == "-use=")
6252            {
6253              arg.erase (0, 5);
6254
6255              if (m_action != action_create)
6256                {
6257                  CmtSystem::cmt_string_vector words;
6258
6259                  CmtSystem::split (arg, ":", words);
6260
6261                  m_current_access = UserMode;
6262
6263                  if (words.size () > 0) m_current_package = words[0];
6264                  if (words.size () > 1) m_current_version = words[1];
6265                  if (words.size () > 2) m_current_path    = words[2];
6266                  (Use::current()).set (m_current_package, 
6267                                        m_current_version, 
6268                                        m_current_path);
6269                }
6270            }
6271          else if (arg.substr (0, 6) == "-pack=")
6272            {
6273              arg.erase (0, 6);
6274              if ((m_action != action_create) && (m_current_package != arg))
6275                {
6276                  //CmtSystem::cd (m_default_path);
6277
6278                  m_current_access = UserMode;
6279
6280                  m_current_package = arg;
6281                  m_current_version = "";
6282                  m_current_path    = m_default_path;
6283
6284                  (Use::current()).set (m_current_package, 
6285                                        m_current_version, 
6286                                        m_current_path);
6287                }
6288            }
6289          else if (arg.substr (0, 9) == "-version=")
6290            {
6291              arg.erase (0, 9);
6292              if ((m_action != action_create) && (m_current_version != arg))
6293                {
6294                  m_current_access = UserMode;
6295                  m_current_version = arg;
6296                  (Use::current()).set (m_current_package, 
6297                                        m_current_version, 
6298                                        m_current_path);
6299                }
6300            }
6301          else if (arg.substr (0, 6) == "-path=")
6302            {
6303              arg.erase (0, 6);
6304
6305              /*
6306              cerr << "-path=" << arg <<
6307                " cp=" << m_current_package <<
6308                " cv=" << m_current_version <<
6309                " cp=" << m_current_path << endl;
6310              */
6311
6312              if ((m_action != action_create) && (m_current_path != arg))
6313                {
6314                  m_current_access = UserMode;
6315                  m_current_path = arg;
6316                  (Use::current()).set (m_current_package, 
6317                                        m_current_version, 
6318                                        m_current_path);
6319
6320                  IProjectFactory& factory = ProjectFactory::instance ();
6321
6322                  //CmtSystem::add_cmt_path (m_current_path, "argument", factory);
6323                }
6324            }
6325          else if (arg.substr (0, 3) == "-f=")
6326            {
6327              arg.substr (3, extra_file);
6328            }
6329          else if (arg.substr (0, 3) == "-e=")
6330            {
6331              cerr << "#CMT> Warning: extra statement = " << arg << endl;
6332              arg.substr (3, extra_line);
6333            }
6334          else if (arg.substr (0, 6) == "-home=")
6335            {
6336              arg.erase (0, 6);
6337              if (CmtSystem::test_directory (arg))
6338                {
6339                  m_cmt_home = arg;
6340                }
6341            }
6342          else if (arg.substr (0, 5) == "-tag=")
6343            {
6344              /*
6345                Here we are going to change the complete tag set
6346              */
6347             
6348              arg.erase (0, 5);
6349             
6350              if (arg != "")
6351                {
6352                  Tag* tag;
6353                  CmtSystem::cmt_string_vector words;
6354                 
6355                  // First forget about all existing tags
6356                  Tag::clear_all ();
6357                  Cmt::m_extra_tags = ",";
6358                   
6359                  // Then restore CMTSITE
6360                  configure_version_tag ();
6361                  configure_site_tag (0);
6362                  configure_uname_tag ();
6363                  configure_hosttype_tag ();
6364                  configure_config_tag ();
6365                  configure_home (0);
6366                 
6367                  CmtSystem::split (arg, " \t,", words);
6368                 
6369                  for (int i = 0; i < words.size (); i++)
6370                    {
6371                      const cmt_string& a = words[i];
6372                     
6373                      cmt_string s = ",";
6374                      s += a;
6375                      s += ",";
6376                     
6377                      if (i == 0)
6378                        {
6379                          m_current_tag = a;
6380                         
6381                          if (CmtSystem::testenv ("TAGDEBUG")) cerr
6382                            << "parse_argument(tag_add)> current_tag=" << m_current_tag << endl;
6383                        }
6384                     
6385                      if (Cmt::m_extra_tags.find (s) == cmt_string::npos)
6386                        {
6387                          //if (!m_quiet) cerr << "  a=[" << a << "]" << endl;
6388                         
6389                          // Then restore uname if the specified tag is CMTCONFIG
6390                          if (a == CmtSystem::get_cmt_config ())
6391                            {
6392                              configure_uname_tag ();
6393                            }
6394                         
6395                          tag = Tag::add (a, PriorityArgument, "arguments", 0);
6396                         
6397                          tag->mark ();
6398                         
6399                          Cmt::m_extra_tags += a;
6400                          Cmt::m_extra_tags += ",";
6401                        }
6402                    }
6403                }
6404            }
6405          else if (arg.substr (0, 9) == "-tag_add=")
6406            {
6407              Tag* tag;
6408              CmtSystem::cmt_string_vector words;
6409             
6410              arg.erase (0, 9);
6411
6412              //if (!m_quiet) cerr << "-tag_add=" << arg << endl;
6413
6414              CmtSystem::split (arg, " \t,", words);
6415
6416              for (int i = 0; i < words.size (); i++)
6417                {
6418                  const cmt_string& a = words[i];
6419
6420                  cmt_string s = ",";
6421                  s += a;
6422                  s += ",";
6423
6424                  if (Cmt::m_extra_tags.find (s) == cmt_string::npos)
6425                    {
6426                        //if (!m_quiet) cerr << "  a=[" << a << "]" << endl;
6427
6428                        /// Then restore uname if the specified tag is CMTCONFIG
6429                      if (a == CmtSystem::get_cmt_config ())
6430                        {
6431                          configure_uname_tag ();
6432                        }
6433                     
6434                      tag = Tag::add (a, PriorityUserTag, "arguments", 0);
6435                     
6436                      tag->mark ();
6437
6438                      Cmt::m_extra_tags += a;
6439                      Cmt::m_extra_tags += ",";
6440                    }
6441                }
6442            }
6443          else if (arg.substr (0, 12) == "-tag_remove=")
6444            {
6445              Tag::TagPtrVector tags = Tag::tags ();
6446              int i;
6447              Tag* tag;
6448
6449              /*
6450              for (i = 0; i < tags.size (); i++)
6451                {
6452                  tag = tags[i];
6453                  if ((tag != 0) &&
6454                      (tag->selected))
6455                    {
6456                        if (!m_quiet) cerr << "  original tag_list=" << tag->name << tag->priority << endl;
6457                    }
6458                }
6459              */
6460
6461              CmtSystem::cmt_string_vector words;
6462
6463              arg.erase (0, 12);
6464
6465              //if (!m_quiet) cerr << "-arg_remove=" << arg << endl;
6466
6467              CmtSystem::split (arg, " \t,", words);
6468
6469                //
6470                // Now erase all entries in the old list that match
6471                // the specified tags
6472                //
6473
6474              for (i = 0; i < words.size (); i++)
6475                {
6476                  const cmt_string& a = words[i];
6477
6478                  cmt_string s = ",";
6479                  s += a;
6480                  s += ",";
6481
6482                  int pos;
6483
6484                  pos = Cmt::m_extra_tags.find (s);
6485
6486                  if (pos != cmt_string::npos)
6487                    {
6488                      Cmt::m_extra_tags.erase (pos, s.size () - 1);
6489                    }
6490
6491                  //if (!m_quiet) cerr << "  tag_list=[" << tag_list << "]" << endl;
6492                }
6493
6494                //
6495                // Now reinject the purged list of tags into the database
6496                // exactly as when using -tag=<tag-list>
6497                //
6498
6499                /// First forget about all existing tags
6500              Tag::unmark_all ();
6501
6502                /// Then restore CMTSITE
6503              configure_version_tag ();
6504              configure_site_tag (0);
6505              configure_uname_tag ();
6506              configure_hosttype_tag ();
6507             
6508              CmtSystem::split (Cmt::m_extra_tags, " \t,", words);
6509
6510              for (i = 0; i < words.size (); i++)
6511                {
6512                  const cmt_string& a = words[i];
6513
6514                  //fprintf (stderr, "  a=[%s]\n", a.c_str ());
6515
6516                  /// Then restore uname if the specified tag is CMTCONFIG
6517                  if (a == CmtSystem::get_cmt_config ())
6518                    {
6519                      configure_uname_tag ();
6520                    }
6521
6522                  if (i == 0)
6523                    {
6524                      m_current_tag = a;
6525
6526                      //if (!m_quiet) cerr << "parse_argument(tag_remove)> current_tag="
6527                        //<< m_current_tag << endl;
6528
6529                      tag = Tag::add (a, PriorityTag, "restore configuration", 0);
6530                    }
6531                  else
6532                    {
6533                      tag = Tag::add (a, PriorityUserTag, "restore configuration", 0);
6534                    }
6535
6536                  tag->mark ();
6537                }
6538            }
6539          else if (arg.substr (0, 14) == "-user_context=")
6540            {
6541              arg.erase (0, 14);
6542              if (CmtSystem::test_directory (arg))
6543                {
6544                  m_cmt_user_context = arg;
6545                }
6546            }
6547          else if (arg == "--version")
6548            {
6549              m_action = action_version;
6550            }
6551          else if (arg.substr (0, 23) == "-with_version_directory")
6552            {
6553              m_current_structuring_style = with_version_directory;
6554            }
6555          else if (arg.substr (0, 26) == "-without_version_directory")
6556            {
6557              m_current_structuring_style = without_version_directory;
6558            }
6559          else if (arg.substr (0, 11) == "-no_cleanup")
6560            {
6561              m_current_setup_strategy |= SetupNoCleanup;
6562            }
6563          else if ((arg == "-private") ||
6564                   (arg == "--private"))
6565            {
6566              set_scope_filtering_mode (reach_private_uses);
6567            }
6568          else if ((arg == "-public") ||
6569                   (arg == "--public"))
6570            {
6571              set_scope_filtering_mode (block_private_uses);
6572            }
6573          else
6574            {
6575              if (!m_quiet) cerr << "#CMT> syntax error : bad verb " << arg << endl;
6576              m_help_action = action_help;
6577            }
6578
6579          break;
6580        default:
6581          if (!m_quiet) cerr << "#CMT> syntax error : bad command parameter " << arg << endl;
6582          m_help_action = action_help;
6583          break;
6584        }
6585
6586      argc--;
6587      argv++;
6588    }
6589}
6590
6591//----------------------------------------------------------
6592int Cmt::parser (const cmt_string& command_line)
6593{
6594  CmtSystem::cmt_string_vector v;
6595
6596  CmtSystem::split (command_line, " \t", v);
6597
6598  int argc = v.size ();
6599
6600  char** argv = (char**) malloc ((argc + 1) * sizeof (char*));
6601
6602  int i;
6603  for (i = 0; i < argc; i++)
6604    {
6605      argv[i] = (char*) v[i].c_str ();
6606    }
6607  argv[argc] = 0;
6608
6609  int status = parser (argc, argv);
6610
6611  free (argv);
6612
6613  return (status);
6614}
6615
6616//----------------------------------------------------------
6617int Cmt::parser (int argc, char* argv[])
6618{
6619  PrintMode mode = Csh;
6620  CmtSystem::cmt_string_vector arguments;
6621  cmt_string extra_line;
6622  cmt_string extra_file;
6623
6624  if (argc <= 1)
6625    {
6626      do_help ();
6627      exit (0);
6628    }
6629
6630  clear ();
6631  configure ();
6632
6633  CmtError::clear ();
6634
6635  /*
6636    Set private if positioned inside the package
6637    (which is detected since we were able to retreive the
6638    Version, Package and Path)
6639  */
6640
6641  if ((m_current_path.size () == 0) ||
6642      (m_current_package.size () == 0) ||
6643      (m_current_version.size () == 0))
6644    {
6645      m_current_access = UserMode;
6646    }
6647  else
6648    {
6649      m_current_access = DeveloperMode;
6650    }
6651
6652  parse_arguments (argc, argv, arguments,
6653                   extra_line, extra_file, mode);
6654
6655  if (m_configure_error != "")
6656    {
6657      if (!m_quiet) cerr << "#CMT> Error: " << m_configure_error << endl;
6658      return (CmtError::execution_error);
6659    }
6660
6661  if (CmtError::has_pending_error ())
6662    {
6663      int code = CmtError::get_last_error_code ();
6664      if (!m_quiet) CmtError::print ();
6665      clear ();
6666
6667      return (code);
6668    }
6669
6670  if (m_debug)
6671    {
6672      cout << "After parse_argument> pack=" << m_current_package
6673           << " m_current_tag=" << m_current_tag
6674           << " cwd=" << CmtSystem::pwd () 
6675           << endl;
6676    }
6677
6678  /*
6679    Now actual requirements analysis can take place.
6680
6681    Extra lines or files are analysed first.
6682  */
6683
6684  if (strlen (extra_file.c_str ()) > 0) SyntaxParser::parse_requirements (extra_file, (Use*) 0);
6685  if (strlen (extra_line.c_str ()) > 0) SyntaxParser::parse_requirements_line (extra_line, (Use*) 0);
6686
6687  //
6688  //  For some of the actions, the CMT package must be automatically
6689  //  included
6690  //
6691
6692  if (m_debug) cout << "parser1> current_tag=" << m_current_tag << endl;
6693
6694  if (m_help_action == action_help)
6695    {
6696      do_help (m_action);
6697      return (0);
6698    }
6699
6700  switch (m_action)
6701    {
6702      // case action_none :
6703    case action_awk :
6704    case action_broadcast :
6705    case action_build_constituent_makefile :
6706    case action_build_constituents_makefile :
6707    case action_build_dependencies :
6708    case action_build_library_links :
6709    case action_build_make_setup :
6710    case action_build_msdev :
6711    case action_build_CMT_pacman :
6712    case action_build_vsnet :     
6713    case action_build_os9_makefile :
6714      // case action_build_prototype :
6715    case action_build_readme :
6716    case action_build_tag_makefile :
6717      // case action_build_temporary_name :
6718    case action_build_triggers :
6719    case action_build_windefs :
6720    case action_check_configuration :
6721      // case action_check_files :
6722      // case action_check_version :
6723    case action_checkout :
6724    case action_cleanup :
6725    case action_config :
6726    case action_create :
6727      // case action_create_project :
6728      // case action_cvsbranches :
6729      // case action_cvssubpackages :
6730      // case action_cvstags :
6731    case action_do :
6732    case action_expand_model :
6733    case action_filter :
6734      // case action_help :
6735    case action_load :
6736    case action_lock :
6737    case action_remove :
6738    case action_remove_library_links :
6739    case action_run :
6740    case action_run_sequence :
6741    case action_set_version :
6742    case action_set_versions :
6743    case action_setup :
6744    case action_show_action :
6745    case action_show_action_names :
6746    case action_show_action_value :
6747    case action_show_actions :
6748    case action_show_all_tags :
6749    case action_show_applied_patterns :
6750      // case action_show_author :
6751      // case action_show_branches :
6752      // case action_show_clients :
6753    case action_show_cmtpath_patterns :
6754      // case action_show_constituent :
6755      // case action_show_constituent_names :
6756      // case action_show_constituents :
6757    case action_show_cycles :
6758    case action_show_fragment :
6759    case action_show_fragments :
6760    case action_show_groups :
6761    case action_show_include_dirs :
6762    case action_show_language :
6763    case action_show_languages :
6764    case action_show_macro :
6765    case action_show_macro_names :
6766    case action_show_macro_value :
6767    case action_show_macros :
6768      // case action_show_manager :
6769      // case action_show_packages :
6770    case action_show_path :
6771    case action_show_pattern :
6772    case action_show_pattern_names :
6773    case action_show_patterns :
6774    case action_show_projects :
6775      // case action_show_pwd :
6776    case action_show_setup :
6777    case action_show_set :
6778    case action_show_set_names :
6779    case action_show_set_value :
6780    case action_show_sets :
6781    case action_show_strategies :
6782    case action_show_tags :
6783    case action_show_use_paths :
6784    case action_show_uses :
6785    case action_show_version :
6786      // case action_show_versions :
6787      // case action_system :
6788    case action_unlock :
6789    case action_version :
6790      use_cmt ();
6791        //
6792        // Now parse the requirements file stored in ${CMTHOME}
6793        //
6794     
6795      use_home_requirements ();
6796
6797      break;
6798    default:
6799      break;
6800    }
6801
6802  if (m_debug) cout << "parser2> current_tag=" << m_current_tag << endl;
6803
6804  //
6805  // Setting up recursive actions
6806  //
6807
6808  switch (m_action)
6809    {
6810      // case action_none :
6811    case action_awk :
6812    case action_broadcast :
6813    case action_build_constituent_makefile :
6814    case action_build_constituents_makefile :
6815    case action_build_dependencies :
6816    case action_build_library_links :
6817    case action_build_make_setup :
6818    case action_build_msdev :
6819    case action_build_CMT_pacman :
6820    case action_build_vsnet :     
6821    case action_build_os9_makefile :
6822      // case action_build_prototype :
6823    case action_build_readme :
6824    case action_build_tag_makefile :
6825      // case action_build_temporary_name :
6826    case action_build_triggers :
6827    case action_build_windefs :
6828    case action_check_configuration :
6829      // case action_check_files :
6830      // case action_check_version :
6831      // case action_checkout :
6832    case action_cleanup :
6833    case action_config :
6834      // case action_create :
6835      // case action_create_project :
6836      // case action_cvsbranches :
6837      // case action_cvssubpackages :
6838      // case action_cvstags :
6839    case action_do :
6840    case action_expand_model :
6841    case action_filter :
6842      // case action_help :
6843    case action_load :
6844      // case action_lock :
6845      // case action_remove :
6846    case action_remove_library_links :
6847    case action_run :
6848    case action_run_sequence :
6849      // case action_set_version :
6850    case action_set_versions :
6851    case action_setup :
6852    case action_show_action :
6853    case action_show_action_names :
6854    case action_show_action_value :
6855    case action_show_actions :
6856    case action_show_all_tags :
6857    case action_show_applied_patterns :
6858      // case action_show_author :
6859      // case action_show_branches :
6860      // case action_show_clients :
6861    case action_show_cmtpath_patterns :
6862    case action_show_constituent :
6863    case action_show_constituent_names :
6864    case action_show_constituents :
6865    case action_show_cycles :
6866    case action_show_fragment :
6867    case action_show_fragments :
6868    case action_show_groups :
6869    case action_show_include_dirs :
6870    case action_show_language :
6871    case action_show_languages :
6872    case action_show_macro :
6873    case action_show_macro_names :
6874    case action_show_macro_value :
6875    case action_show_macros :
6876      // case action_show_manager :
6877      // case action_show_packages :
6878    case action_show_path :
6879    case action_show_pattern :
6880    case action_show_pattern_names :
6881    case action_show_patterns :
6882    case action_show_projects :
6883      // case action_show_pwd :
6884    case action_show_setup :
6885    case action_show_set :
6886    case action_show_set_names :
6887    case action_show_set_value :
6888    case action_show_sets :
6889    case action_show_strategies :
6890    case action_show_tags :
6891    case action_show_use_paths :
6892    case action_show_uses :
6893      // case action_show_version :
6894      // case action_show_versions :
6895      // case action_system :
6896      // case action_unlock :
6897      // case action_version :
6898      m_recursive = true;
6899      break;
6900    default:
6901      m_recursive = false;
6902      break;
6903    }
6904
6905  //
6906  //  Actions for which the context of the package is checked,
6907  //  and the requirements file is analysed.
6908  //
6909
6910  switch (m_action)
6911    {
6912    case action_none :
6913    case action_awk :
6914    case action_broadcast :
6915    case action_build_constituent_makefile :
6916    case action_build_constituents_makefile :
6917    case action_build_dependencies :
6918    case action_build_library_links :
6919    case action_build_make_setup :
6920    case action_build_msdev :
6921    case action_build_CMT_pacman :
6922    case action_build_vsnet :     
6923    case action_build_os9_makefile :
6924      // case action_build_prototype :
6925    case action_build_readme :
6926    case action_build_tag_makefile :
6927      // case action_build_temporary_name :
6928    case action_build_triggers :
6929    case action_build_windefs :
6930    case action_check_configuration :
6931      // case action_check_files :
6932      // case action_check_version :
6933      // case action_checkout :
6934    case action_cleanup :
6935    case action_config :
6936      // case action_create :
6937      // case action_create_project :
6938      // case action_cvsbranches :
6939      // case action_cvssubpackages :
6940      // case action_cvstags :
6941    case action_do :
6942    case action_expand_model :
6943    case action_filter :
6944      // case action_help :
6945    case action_load :
6946    case action_lock :
6947      // case action_remove :
6948    case action_remove_library_links :
6949    case action_run :
6950      // case action_run_sequence :
6951      // case action_set_version :
6952    case action_set_versions :
6953    case action_setup :
6954    case action_show_action :
6955    case action_show_action_names :
6956    case action_show_action_value :
6957    case action_show_actions :
6958    case action_show_all_tags :
6959    case action_show_applied_patterns :
6960    case action_show_author :
6961    case action_show_branches :
6962      // case action_show_clients :
6963    case action_show_cmtpath_patterns :
6964    case action_show_constituent :
6965    case action_show_constituent_names :
6966    case action_show_constituents :
6967    case action_show_cycles :
6968    case action_show_fragment :
6969    case action_show_fragments :
6970    case action_show_groups :
6971    case action_show_include_dirs :
6972    case action_show_language :
6973    case action_show_languages :
6974    case action_show_macro :
6975    case action_show_macro_names :
6976    case action_show_macro_value :
6977    case action_show_macros :
6978    case action_show_manager :
6979      // case action_show_packages :
6980    case action_show_path :
6981    case action_show_pattern :
6982    case action_show_pattern_names :
6983    case action_show_patterns :
6984    case action_show_projects :
6985    case action_show_pwd :
6986    case action_show_setup :
6987    case action_show_set :
6988    case action_show_set_names :
6989    case action_show_set_value :
6990    case action_show_sets :
6991    case action_show_strategies :
6992    case action_show_tags :
6993    case action_show_use_paths :
6994    case action_show_uses :
6995    case action_show_version :
6996      // case action_show_versions :
6997      // case action_system :
6998    case action_unlock :
6999      // case action_version :
7000      reach_current_package ();
7001      use_user_context_requirements ();
7002      break;
7003    default:
7004      break;
7005    }
7006
7007  if (m_debug) cout << "parser3> current_tag=" << m_current_tag << endl;
7008
7009  //
7010  // Perform some actions even if there is an error
7011  //
7012
7013  if (CmtError::has_pending_error ())
7014    {
7015      int code = CmtError::get_last_error_code ();
7016      if (!m_quiet) CmtError::print ();
7017
7018      switch (m_action)
7019        {
7020          // case action_none :
7021          // case action_awk :
7022          // case action_broadcast :
7023        case action_build_constituent_makefile :
7024        case action_build_constituents_makefile :
7025        case action_build_dependencies :
7026        case action_build_library_links :
7027        case action_build_make_setup :
7028        case action_build_msdev :
7029        case action_build_CMT_pacman :
7030        case action_build_vsnet :     
7031        case action_build_os9_makefile :
7032        case action_build_prototype :
7033        case action_build_readme :
7034        case action_build_tag_makefile :
7035          // case action_build_temporary_name :
7036        case action_build_triggers :
7037        case action_build_windefs :
7038        case action_check_configuration :
7039          // case action_check_files :
7040          // case action_check_version :
7041          // case action_checkout :
7042        case action_cleanup :
7043          // case action_config :
7044          // case action_create :
7045          // case action_create_project :
7046          // case action_cvsbranches :
7047          // case action_cvssubpackages :
7048          // case action_cvstags :
7049          // case action_do :
7050          // case action_expand_model :
7051          // case action_filter :
7052          // case action_help :
7053        case action_load :
7054        case action_lock :
7055        case action_remove :
7056        case action_remove_library_links :
7057          // case action_run :
7058        case action_run_sequence :
7059          // case action_set_version :
7060          // case action_set_versions :
7061        case action_setup :
7062          // case action_show_action :
7063          // case action_show_action_names :
7064          // case action_show_action_value :
7065          // case action_show_actions :
7066          // case action_show_all_tags :
7067          // case action_show_applied_patterns :
7068          // case action_show_author :
7069          // case action_show_branches :
7070          // case action_show_clients :
7071          // case action_show_cmtpath_patterns :
7072          // case action_show_constituent :
7073          // case action_show_constituent_names :
7074          // case action_show_constituents :
7075          // case action_show_cycles :
7076          // case action_show_fragment :
7077          // case action_show_fragments :
7078          // case action_show_groups :
7079          // case action_show_include_dirs :
7080          // case action_show_language :
7081          // case action_show_languages :
7082          // case action_show_macro :
7083          // case action_show_macro_names :
7084          // case action_show_macro_value :
7085          // case action_show_macros :
7086          // case action_show_manager :
7087          // case action_show_packages :
7088          // case action_show_path :
7089          // case action_show_pattern :
7090          // case action_show_pattern_names :
7091          // case action_show_patterns :
7092          // case action_show_projects :
7093          // case action_show_pwd :
7094          // case action_show_setup :
7095          // case action_show_set :
7096          // case action_show_set_names :
7097          // case action_show_set_value :
7098          // case action_show_sets :
7099          // case action_show_strategies :
7100          // case action_show_tags :
7101          // case action_show_use_paths :
7102          // case action_show_uses :
7103          // case action_show_version :
7104          // case action_show_versions :
7105          // case action_system :
7106        case action_unlock :
7107          // case action_version :
7108          clear ();
7109          return (code);
7110        default:
7111          CmtError::clear ();
7112          break;
7113        }
7114    }
7115
7116  //
7117  // Perform actions
7118  //
7119
7120  switch (m_action)
7121    {
7122    case action_none :
7123      //CmtError::set (CmtError::syntax_error, "ParseArguments> ");
7124      break;
7125    case action_awk :
7126      do_awk (arguments);
7127      break;
7128    case action_broadcast :
7129      do_broadcast (arguments, argc, argv);
7130      break;
7131    case action_build_constituent_makefile :
7132      do_build_constituent_makefile (arguments, argc, argv);
7133      break;
7134    case action_build_constituents_makefile :
7135      do_build_constituents_makefile (arguments, argc, argv);
7136      break;
7137    case action_build_dependencies :
7138      do_build_dependencies (arguments, argc, argv);
7139      break;
7140    case action_build_library_links :
7141      do_build_library_links ();
7142      break;
7143    case action_build_make_setup :
7144      do_build_make_setup ();
7145      break;
7146    case action_build_msdev :
7147      do_build_msdev (arguments);
7148      break;
7149    case action_build_CMT_pacman :
7150      do_build_CMT_pacman ();
7151      break;
7152    case action_build_vsnet :     
7153      do_build_vsnet (arguments);
7154      break;
7155    case action_build_os9_makefile :
7156      do_build_os9_makefile (arguments);
7157      break;
7158    case action_build_prototype :
7159      do_build_prototype (arguments);
7160      break;
7161    case action_build_readme :
7162      do_build_readme (arguments);
7163      break;
7164    case action_build_tag_makefile :
7165      do_build_tag_makefile ();
7166      break;
7167    case action_build_temporary_name :
7168      do_build_temporary_name ();
7169      break;
7170    case action_build_triggers :
7171      do_build_triggers (arguments);
7172      break;
7173    case action_build_windefs :
7174      do_build_windefs (arguments);
7175      break;
7176    case action_check_configuration :
7177      do_check_configuration ();
7178      break;
7179    case action_check_files :
7180      do_check_files (arguments);
7181      break;
7182    case action_check_version :
7183      do_check_version (arguments);
7184      break;
7185    case action_checkout :
7186      do_checkout (arguments);
7187      break;
7188    case action_cleanup :
7189      do_cleanup (mode);
7190      break;
7191    case action_config :
7192      do_config ();
7193      break;
7194    case action_create :
7195      do_create (arguments);
7196      break;
7197    case action_create_project :
7198      do_create_project (arguments);
7199      break;
7200    case action_cvsbranches :
7201      do_cvsbranches (arguments);
7202      break;
7203    case action_cvssubpackages :
7204      do_cvssubpackages (arguments);
7205      break;
7206    case action_cvstags :
7207      do_cvstags (arguments);
7208      break;
7209    case action_do :
7210      do_do (arguments);
7211      break;
7212    case action_expand_model :
7213      do_expand_model (arguments);
7214      break;
7215    case action_filter :
7216      do_filter (arguments);
7217      break;
7218    case action_help :
7219      do_help (m_help_action);
7220      break;
7221    case action_load :
7222      cerr << "#CMT> action not implemented" << endl;
7223      break;
7224    case action_lock :
7225      do_lock (m_current_package, m_current_version, m_current_path);
7226      break;
7227    case action_remove :
7228      do_remove (m_current_package, m_current_version, m_current_path);
7229      break;
7230    case action_remove_library_links :
7231      do_remove_library_links ();
7232      break;
7233    case action_run :
7234      do_run (arguments);
7235      break;
7236    case action_run_sequence :
7237      do_run_sequence (arguments);
7238      break;
7239    case action_set_version :
7240      do_set_version (arguments);
7241      break;
7242    case action_set_versions :
7243      do_set_versions (arguments);
7244      break;
7245    case action_setup :
7246      do_setup (mode);
7247      break;
7248    case action_show_action :
7249      do_show_action (arguments, mode);
7250      break;
7251    case action_show_action_names :
7252      do_show_action_names (arguments, mode);
7253      break;
7254    case action_show_action_value :
7255      do_show_action_value (arguments, mode);
7256      break;
7257    case action_show_actions :
7258      do_show_actions (arguments, mode);
7259      break;
7260    case action_show_all_tags :
7261      do_show_all_tags ();
7262      break;
7263    case action_show_applied_patterns :
7264      do_show_applied_patterns ();
7265      break;
7266    case action_show_author :
7267      do_show_author ();
7268      break;
7269    case action_show_branches :
7270      do_show_branches (mode);
7271      break;
7272    case action_show_clients :
7273      do_show_clients (arguments);
7274      break;
7275    case action_show_cmtpath_patterns :
7276      do_show_cmtpath_patterns ();
7277      break;
7278    case action_show_constituent :
7279      do_show_constituent (arguments);
7280      break;
7281    case action_show_constituent_names :
7282      do_show_constituent_names ();
7283      break;
7284    case action_show_constituents :
7285      do_show_constituents ();
7286      break;
7287    case action_show_cycles :
7288      do_show_cycles ();
7289      break;
7290    case action_show_fragment :
7291      do_show_fragment (arguments);
7292      break;
7293    case action_show_fragments :
7294      do_show_fragments ();
7295      break;
7296    case action_show_groups :
7297      do_show_groups ();
7298      break;
7299    case action_show_include_dirs :
7300      do_show_include_dirs ();
7301      break;
7302    case action_show_language :
7303      do_show_language (arguments);
7304      break;
7305    case action_show_languages :
7306      do_show_languages ();
7307      break;
7308    case action_show_macro :
7309      do_show_macro (arguments, mode);
7310      break;
7311    case action_show_macro_names :
7312      do_show_macro_names (arguments, mode);
7313      break;
7314    case action_show_macro_value :
7315      do_show_macro_value (arguments, mode);
7316      break;
7317    case action_show_macros :
7318      do_show_macros (arguments, mode);
7319      break;
7320    case action_show_manager :
7321      do_show_manager ();
7322      break;
7323    case action_show_packages :
7324      do_show_packages (arguments);
7325      break;
7326    case action_show_path :
7327      do_show_path ();
7328      break;
7329    case action_show_pattern :
7330      do_show_pattern (arguments);
7331      break;
7332    case action_show_pattern_names :
7333      do_show_pattern_names ();
7334      break;
7335    case action_show_patterns :
7336      do_show_patterns ();
7337      break;
7338    case action_show_projects :
7339      do_show_projects ();
7340      break;
7341    case action_show_pwd :
7342      do_show_pwd ();
7343      break;
7344    case action_show_setup :
7345      do_show_setup ();
7346      break;
7347    case action_show_set :
7348      do_show_set (arguments, mode);
7349      break;
7350    case action_show_set_names :
7351      do_show_set_names (arguments, mode);
7352      break;
7353    case action_show_set_value :
7354      do_show_set_value (arguments, mode);
7355      break;
7356    case action_show_sets :
7357      do_show_sets (arguments, mode);
7358      break;
7359    case action_show_strategies :
7360      do_show_strategies ();
7361      break;
7362    case action_show_tags :
7363      do_show_tags ();
7364      break;
7365    case action_show_use_paths :
7366      do_show_use_paths (arguments);
7367      break;
7368    case action_show_uses :
7369      do_show_uses ();
7370      break;
7371    case action_show_version :
7372      do_show_version ();
7373      break;
7374    case action_show_versions :
7375      do_show_versions (arguments);
7376      break;
7377    case action_system :
7378      do_show_system ();
7379      break;
7380    case action_unlock :
7381      do_unlock (m_current_package, m_current_version, m_current_path);
7382      break;
7383    case action_version :
7384      do_version ();
7385      break;
7386    default:
7387      CmtError::set (CmtError::syntax_error, "ParseArguments>");
7388      break;
7389    }
7390
7391  if (CmtError::has_pending_error ())
7392    {
7393      int code = CmtError::get_last_error_code ();
7394      if (!m_quiet) CmtError::print ();
7395      clear ();
7396      return (code);
7397    }
7398  else
7399    {
7400      clear ();
7401      return (0);
7402    }
7403}
7404
7405
7406/**
7407 * Format as one single line a set of 'setenv' statements
7408 * joined with semi-colons to form one shell command.
7409 */
7410void Cmt::print (PrintMode mode)
7411{
7412  Use::UsePtrVector& Uses = Use::get_ordered_uses ();
7413  Use& current_use = Use::current ();
7414
7415  cmt_string tag;
7416
7417  set_standard_macros ();
7418
7419    //cerr << "# current_tag=" << m_current_tag << endl;
7420    //cerr << "# current_config=" << m_current_config << endl;
7421
7422  if (m_current_tag == "")
7423    {
7424      if (mode == Bat) tag = "%CMTCONFIG%";
7425      else tag = "${CMTCONFIG}";
7426    }
7427  else
7428    {
7429      tag = m_current_tag;
7430    }
7431
7432    //
7433    //  Now check if all extra tags are still valid. Some of them
7434    //  may be discarded du to some conflict with highest priority
7435    //  tags, or with exclude statements
7436    //
7437
7438  {
7439    CmtSystem::cmt_string_vector words;
7440     
7441    cmt_string tags;
7442
7443    tags = Cmt::m_extra_tags;
7444     
7445    CmtSystem::split (tags, " \t,", words);
7446
7447    Cmt::m_extra_tags = ",";
7448     
7449    for (int i = 0; i < words.size (); i++)
7450      {
7451        Tag* tag;
7452        const cmt_string& a = words[i];
7453
7454        tag = Tag::find (a);
7455
7456        if ((tag != 0) && (tag->is_selected ()))
7457          {
7458            Cmt::m_extra_tags += a;
7459            Cmt::m_extra_tags += ",";
7460          }
7461      }
7462  }
7463
7464  if (m_debug)
7465    {
7466      cout << "Before all print contexts" << endl;
7467    }
7468
7469  if (Uses.size () > 0)
7470    {
7471      int number;
7472
7473      for (number = 0; number < Uses.size (); number++)
7474        {
7475          Use& use = *(Uses[number]);
7476
7477          if (use.discarded) continue;
7478
7479          print_context (use, mode, tag);
7480        }
7481    }
7482
7483  print_context (Use::current (), mode, tag);
7484
7485  if (m_debug)
7486    {
7487      cout << "After all print contexts" << endl;
7488    }
7489
7490  Symbol::all_print (mode);
7491  // Script::all_print (mode);
7492
7493  if (m_debug)
7494    {
7495      cout << "After all print" << endl;
7496    }
7497
7498  cout << endl;
7499}
7500
7501
7502/**
7503 * Format as one single line a set of 'unsetenv' statements
7504 * joined with semi-colons to form one shell command.
7505 */
7506void Cmt::print_clean (PrintMode mode)
7507{
7508  Use::UsePtrVector& Uses = Use::get_ordered_uses ();
7509
7510  set_standard_macros ();
7511
7512  Script::all_print_clean (mode);
7513  Symbol::all_print_clean (mode);
7514
7515  switch (mode)
7516    {
7517    case Csh :
7518      if (m_current_package != "CMT")
7519        {
7520          cout << "unsetenv " << m_current_prefix << "ROOT" << endl;
7521          cout << "unsetenv " << m_current_prefix << "CONFIG" << endl;
7522        }
7523      break;
7524    case Sh :
7525      if (m_current_package != "CMT")
7526        {
7527          cout << "unset " << m_current_prefix << "ROOT" << endl;
7528          cout << "unset " << m_current_prefix << "CONFIG" << endl;
7529        }
7530      break;
7531    case Bat :
7532      if (m_current_package != "CMT")
7533        {
7534          cout << "set " << m_current_prefix << "ROOT=" << endl;
7535          cout << "set " << m_current_prefix << "CONFIG=" << endl;
7536        }
7537      break;
7538    }
7539
7540  if (Uses.size () > 0)
7541    {
7542      int number;
7543
7544      for (number = 0; number < Uses.size (); number++)
7545        {
7546          Use* use = Uses[number];
7547
7548          if (use->discarded) continue;
7549
7550          Package* p = use->get_package ();
7551          if (p->is_cmt ()) continue;
7552
7553          switch (mode)
7554            {
7555            case Csh :
7556              cout << "unsetenv " << use->prefix << "ROOT" << endl;
7557              cout << "unsetenv " << use->prefix << "CONFIG" << endl;
7558              break;
7559            case Sh :
7560              cout << "unset " << use->prefix << "ROOT" << endl;
7561              cout << "unset " << use->prefix << "CONFIG" << endl;
7562              break;
7563            case Bat :
7564              cout << "set " << use->prefix << "ROOT=" << endl;
7565              cout << "set " << use->prefix << "CONFIG" << endl;
7566              break;
7567            }
7568        }
7569    }
7570
7571  switch (mode)
7572    {
7573    case Csh :
7574      cout << "unsetenv CMTEXTRATAGS" << endl;
7575      break;
7576    case Sh :
7577      cout << "unset CMTEXTRATAGS" << endl;
7578      break;
7579    case Bat :
7580      cout << "set CMTEXTRATAGS=" << endl;
7581      break;
7582    }
7583
7584  cout << endl;
7585}
7586
7587//----------------------------------------------------------
7588void Cmt::print_context (Use& use, PrintMode mode, const cmt_string& tag)
7589{
7590  if (use.get_package_name () == "cmt_standalone") return;
7591
7592  cmt_string fs = CmtSystem::file_separator ();
7593
7594  use.real_path.replace_all (CmtSystem::file_separator (), fs);
7595
7596  cmt_string system = CmtSystem::get_cmt_config ();
7597
7598  Project* p = Project::get_current ();
7599  int strategy = 0;
7600
7601  strategy = get_setup_strategy ();
7602
7603  bool do_config = ((strategy & SetupConfigMask) == SetupConfig);
7604  bool do_root = ((strategy & SetupRootMask) == SetupRoot);
7605
7606  switch (mode)
7607    {
7608    case Csh :
7609      if (do_root)
7610        {
7611          cout << "setenv " << use.prefix << "ROOT \"" <<
7612            use.get_full_path () << "\"" << endl;
7613        }
7614
7615      if (use.get_package_name () == "CMT")
7616        {
7617          cout << "setenv CMTCONFIG " << system << endl;
7618        }
7619      else
7620        {
7621          if (do_config)
7622            {
7623              cout << "setenv " << use.prefix << "CONFIG \"" << tag << "\"" << endl;
7624            }
7625        }
7626       
7627      break;
7628    case Sh :
7629      if (do_root)
7630        {
7631          cout << use.prefix << "ROOT=\"" <<
7632            use.get_full_path () << "\"; export " <<
7633            use.prefix << "ROOT" << endl;
7634        }
7635
7636      if (use.get_package_name () == "CMT")
7637        {
7638          cout << "CMTCONFIG=" << system << "; export CMTCONFIG" << endl;
7639        }
7640      else
7641        {
7642          if (do_config)
7643            {
7644              cout << use.prefix << "CONFIG=\"" <<
7645                tag << "\"; export " <<
7646                use.prefix << "CONFIG" << endl;
7647            }
7648        }
7649       
7650      break;
7651    case Bat :
7652      if (do_root)
7653        {
7654          cout << "set " << use.prefix << "ROOT=" <<
7655            use.get_full_path () << endl;
7656        }
7657
7658      if (use.get_package_name () == "CMT")
7659        {
7660          cout << "set CMTCONFIG=" << system << endl;
7661        }
7662      else
7663        {
7664          if (do_config)
7665            {
7666              cout << "set " << use.prefix << "CONFIG=" << tag << endl;
7667            }
7668        }
7669       
7670      break;
7671    }
7672}
7673
7674/**
7675 *  Format a set of make macro definitions (one per line)
7676 * Each macro value is provided enclosed in single quotes
7677 *
7678 *  Take the macro values from the macro statements found
7679 * in recursively read requirements files.
7680 */
7681void Cmt::print_symbol_names (PrintMode mode, const cmt_string& pattern)
7682{
7683  int number;
7684
7685  set_standard_macros ();
7686
7687  cmt_regexp expression (pattern);
7688
7689  bool has_pattern = (pattern != "");
7690
7691  for (number = 0; number < Symbol::symbol_number (); number++)
7692    {
7693      Symbol& symbol = Symbol::symbol (number);
7694
7695      if (has_pattern)
7696       {
7697         if (!expression.match (symbol.name)) continue;
7698       }
7699
7700      if (m_action == action_show_macro_names)
7701        {
7702          // Only keep macros.
7703          if ((symbol.type == Symbol::SymbolSet) ||
7704              (symbol.type == Symbol::SymbolAlias) ||
7705              (symbol.type == Symbol::SymbolPath) ||
7706              (symbol.type == Symbol::SymbolAction)) continue;
7707        }
7708      else if (m_action == action_show_set_names)
7709        {
7710          // Exclude macros.
7711          if ((symbol.type == Symbol::SymbolMacro) ||
7712              (symbol.type == Symbol::SymbolAction)) continue;
7713        }
7714      else if (m_action == action_show_action_names)
7715        {
7716          // Exclude macros.
7717          if (symbol.type != Symbol::SymbolAction) continue;
7718        }
7719
7720      cout << symbol.name << endl;
7721    }
7722}
7723
7724/**
7725 *  Format a set of make macro definitions (one per line)
7726 * Each macro value is provided enclosed in single quotes
7727 *
7728 *  Take the macro values from the macro statements found
7729 * in recursively read requirements files.
7730 */
7731void Cmt::print_macros (PrintMode mode, const cmt_string& pattern)
7732{
7733  int number;
7734
7735  set_standard_macros ();
7736
7737  cmt_regexp expression (pattern);
7738
7739  bool has_pattern = (pattern != "");
7740
7741  for (number = 0; number < Symbol::symbol_number (); number++)
7742    {
7743      Symbol& symbol = Symbol::symbol (number);
7744
7745      if (has_pattern)
7746        {
7747          if (!expression.match (symbol.name)) continue;
7748        }
7749
7750      if (m_action == action_show_macros)
7751        {
7752          // Only keep macros.
7753          if ((symbol.type == Symbol::SymbolSet) ||
7754              (symbol.type == Symbol::SymbolAlias) ||
7755              (symbol.type == Symbol::SymbolPath) ||
7756              (symbol.type == Symbol::SymbolAction)) continue;
7757        }
7758      else if (m_action == action_show_sets)
7759        {
7760          // Exclude macros.
7761          if ((symbol.type == Symbol::SymbolMacro) ||
7762              (symbol.type == Symbol::SymbolAction)) continue;
7763        }
7764      else if (m_action == action_build_tag_makefile)
7765        {
7766          // Exclude scripts and actions
7767          if ((symbol.type == Symbol::SymbolSetupScript) ||
7768              (symbol.type == Symbol::SymbolCleanupScript) ||
7769              (symbol.type == Symbol::SymbolAction)) continue;
7770        }
7771      else if (m_action == action_show_actions)
7772        {
7773          if (symbol.type != Symbol::SymbolAction) continue;
7774        }
7775
7776      if (symbol.value_lists.size () < 1) continue;
7777
7778      symbol.show_macro (mode);
7779    }
7780}
7781
7782//----------------------------------------------------------
7783void Cmt::print_tabs (int tabs)
7784{
7785  while (tabs > 0)
7786    {
7787      cout << "  ";
7788      tabs--;
7789    }
7790}
7791
7792//----------------------------------------------------------
7793int Cmt::reach_current_package ()
7794{
7795  Use& use = Use::current ();
7796  cmt_string dir;
7797
7798  if (m_debug)
7799    {
7800      cout << "Cmt::reach_current_package> pwd = " 
7801           << CmtSystem::pwd () 
7802           << " path=" << m_current_path
7803           << " package=" << m_current_package
7804           << endl;
7805    }
7806
7807  /*
7808    Try to access the package.
7809  */
7810
7811  if (m_current_package == "cmt_standalone")
7812    {
7813      if ((m_current_path != "") && (m_current_path != CmtSystem::pwd ()))
7814        {
7815          if (!CmtSystem::cd (m_current_path))
7816            {
7817              CmtError::set (CmtError::package_not_found,
7818                             "ReachCurrentPackage> Cannot reach the path directory");
7819              return (0);
7820            }
7821        }
7822
7823      if (!CmtSystem::test_file ("requirements"))
7824        {
7825            /*
7826          if (!m_quiet)
7827            {
7828              cout << "#CMT> Cannot reach the requirements file" << endl;
7829            }
7830             
7831          CmtError::set (CmtError::package_not_found,
7832                         "ReachCurrentPackage> Cannot reach the requirements file");
7833            */
7834          return (0);
7835        }
7836    }
7837  else if (m_current_package != "")
7838    {
7839      if (!use.move_to ())
7840        {
7841          CmtError::set (CmtError::package_not_found,
7842                         "ReachCurrentPackage> Cannot reach the path directory");
7843          return (0);
7844        }
7845
7846      m_current_path = use.real_path;
7847    }
7848  else
7849    {
7850      //
7851      // The cmt command has been given without explicit search for
7852      // a package. Thus it is expected that we are in the context of a
7853      // true package.
7854      //
7855      //  This means that there should be a requirements file visible.
7856      //
7857      //  If this is not true, we'll make a try into ../cmt and then
7858      // a last try into ../mgr
7859      //
7860
7861      if (!CmtSystem::test_file ("requirements"))
7862        {
7863          if (CmtSystem::cd ("../cmt") && 
7864              CmtSystem::test_file ("requirements"))
7865            {
7866              m_current_style = cmt_style;
7867            }
7868          else if (CmtSystem::cd ("../mgr") && 
7869                   CmtSystem::test_file ("requirements"))
7870            {
7871              m_current_style = mgr_style;
7872            }
7873          else
7874            {
7875              if (!m_quiet)
7876                {
7877                  cerr << "#CMT> Cannot reach the mgr branch" << endl;
7878                }
7879             
7880              CmtError::set (CmtError::package_not_found,
7881                             "ReachCurrentPackage> Cannot reach the mgr/cmt directory");
7882              return (0);
7883            }
7884        }
7885
7886      dir = CmtSystem::pwd ();
7887
7888      CmtSystem::dirname (dir, m_current_path);
7889      CmtSystem::basename (m_current_path, m_current_version);
7890
7891      if (CmtSystem::is_version_directory (m_current_version))
7892        {
7893          CmtSystem::dirname (m_current_path, m_current_path);
7894          CmtSystem::basename (m_current_path, m_current_package);
7895          CmtSystem::dirname (m_current_path, m_current_path);
7896        }
7897      else
7898        {
7899          m_current_package = m_current_version;
7900          m_current_version = "";
7901          CmtSystem::dirname (m_current_path, m_current_path);
7902
7903          m_current_style = no_version_style;
7904        }
7905
7906      use.set_package_name (m_current_package);
7907      use.version = m_current_version;
7908      use.path    = m_current_path;
7909      use.style   = m_current_style;
7910    }
7911
7912  configure_current_dir ();
7913  build_prefix (m_current_package, m_current_prefix);
7914  build_config (m_current_prefix, m_current_config);
7915
7916  /*
7917    Check Tag is always set up
7918  */
7919
7920  if (m_debug) cout << "reach_current_package0> current_tag=" << m_current_tag << endl;
7921
7922  if (m_current_tag == "")
7923    {
7924      cmt_string env;
7925
7926      env = CmtSystem::getenv (m_current_config);
7927      if (env != "")
7928        {
7929          Tag* tag;
7930
7931          tag = Tag::add (env, PriorityConfig, "reach current package", 0);
7932          tag->mark ();
7933            //m_current_tag = env;
7934
7935          //if (!m_quiet) cerr << "reach_current_package1> current_tag=" << m_current_tag << endl;
7936
7937        }
7938    }
7939
7940  if (m_debug)
7941    {
7942      cout << "pwd = " << CmtSystem::pwd () << endl;
7943    }
7944
7945  /*
7946    Work on the requirements file.
7947  */
7948
7949  if (dir != "") dir += CmtSystem::file_separator ();
7950  dir += "requirements";
7951  SyntaxParser::parse_requirements (dir, &use);
7952
7953  if (m_debug) cout << "reach_current_package2> current_tag=" << m_current_tag << endl;
7954
7955    /**
7956     *   It would be useful to change this mechanism. Instead of
7957     *  applying all global patterns at once to all use contexts, it
7958     *  would be much better to apply it at the end of each
7959     *  requirements file parsing, and only in the context the
7960     *  appropriate Use.
7961     *
7962     *   This would avoid the current flaw which is that when a global
7963     *  pattern specifies a "private" definition, it is actually
7964     *  applied in the scope context of the Current Use and not in
7965     *  each individual Use. Therefore the private is lost.
7966     *
7967     *   However, this induces problems since some pattern definitions
7968     *  are done AFTER the use statements, which will NOT receive the
7969     *  pattern aplications.
7970     *
7971     *   Therefore it is decided to leave this "bad" mechanism until
7972     *  everybody is aware of this constraint.
7973     *
7974     *
7975     */
7976  Pattern::apply_all_globals ();
7977
7978  /*
7979    Select all possible tags
7980  */
7981
7982  Tag::restore_tree ();
7983
7984  return (1);
7985}
7986
7987static cmt_string get_best_form (const CmtSystem::cmt_string_vector& pwd,
7988                                 const cmt_string& path)
7989{
7990  static cmt_string fs = CmtSystem::file_separator ();
7991  cmt_string result;
7992
7993    /*
7994    //if (CmtSystem::getenv ("CMTTESTPREFIX") != "")
7995    {
7996    */
7997
7998    //
7999    //  If there is a common prefix between
8000    //  use->real_path and pwd
8001    //  we have
8002    //  use->real_path = /<prefix>/aaa
8003    //  pwd            = /<prefix>/bbb
8004    //
8005    //  Then use->real_path may be expressed as:
8006    //  ../..../../aaa
8007    //   where ../..../../ moves up to /<prefix>
8008    //
8009    //   Then we try to find the shortest between
8010    //
8011    //     /<prefix> and ../..../..
8012    //
8013  cmt_string a = path;
8014 
8015  CmtSystem::cmt_string_vector va;
8016 
8017  va.clear ();
8018 
8019  CmtSystem::split (a, fs, va);
8020 
8021  int m = va.size ();
8022  if (pwd.size () < m) m = pwd.size ();
8023 
8024  int i;
8025 
8026    //cout << "Package " << use->get_package_name () << endl;
8027 
8028  for (i = 0; i < m; i++)
8029    {
8030      const cmt_string& fa = va[i];
8031      const cmt_string& fb = pwd[i];
8032     
8033        //cout << "  fa=" << fa << " fb=" << fb << endl;
8034     
8035      if (fa != fb) break;
8036    }
8037 
8038  cmt_string ups = "";
8039 
8040  if (i > 0)
8041    {
8042        // We have the prefix.
8043        // if we count what remains from pwd, then
8044        // we have the number of ../ required to
8045        // move to /<prefix>
8046      int j;
8047     
8048      for (j = i; j < pwd.size (); j++)
8049        {
8050          if (j > i) ups += fs;
8051          ups += "..";
8052        }
8053
8054      for (j = i; j < va.size (); j++)
8055        {
8056          ups += fs;
8057          ups += va[j];
8058        }
8059    }
8060 
8061    //
8062    // Here ups contains the ../..../../aaa form
8063    // for the use->real_path or is empty when there
8064    // were no common prefix.
8065    //
8066 
8067    //if (ups != "")
8068  if ((ups != "") &&
8069      (ups.size () < path.size ()))
8070    {
8071      result = ups;
8072    }
8073  else
8074    {
8075      result = path;
8076    }
8077
8078  return (result);
8079}
8080
8081/**
8082 *   This completely local class holds primitive actions for building
8083 *   standard macros.
8084 */
8085class StandardMacroBuilder
8086{
8087public:
8088
8089  /**
8090   *  CMTVERSION
8091   */
8092  void fill_for_CMTVERSION ()
8093  {
8094    buffer = "macro CMTVERSION \"";
8095    buffer += CMTVERSION;
8096    buffer += "\"";
8097    apply ();
8098  }
8099
8100  StandardMacroBuilder (const cmt_string& tag,
8101                        const cmt_string& package,
8102                        const cmt_string& version,
8103                        const cmt_string& prefix,
8104                        CmtDirStyle style)
8105  {
8106    fs = CmtSystem::file_separator ();
8107    buffer = "";
8108    pwd = CmtSystem::pwd ();
8109    CmtSystem::split (pwd, fs, vb);
8110    current_use = &(Use::current ());
8111    current_tag = tag;
8112    current_package = package;
8113    current_version = version;
8114    current_prefix = prefix;
8115    current_style = style;
8116  }
8117
8118  void apply ()
8119  {
8120    SyntaxParser::parse_requirements_line (buffer, current_use);
8121    buffer = "";
8122  }
8123
8124  /**
8125   *   tag
8126   */
8127  void fill_for_tag ()
8128  {
8129    static bool tag_debug = CmtSystem::testenv ("TAGDEBUG");
8130
8131    if (!Symbol::is_selected ("tag"))
8132      {
8133        if (tag_debug) cerr << "set_standard_macro2.1> current_tag=" << current_tag << endl;
8134
8135        if (current_tag == "")
8136          {
8137            buffer = "macro tag \"$(CMTCONFIG)\"";
8138          }
8139        else
8140          {
8141            buffer = "macro tag \"";
8142            buffer += current_tag;
8143            buffer += "\"";
8144          }
8145       
8146        if (tag_debug) cerr << " define tag: " << buffer << endl;
8147       
8148        apply ();
8149      }
8150  }
8151
8152  /**
8153   *   PACKAGE_ROOT
8154   */
8155  void fill_for_package (const cmt_string& current_dir)
8156  {
8157    buffer = "macro package \"";
8158    buffer += current_package;
8159    buffer += "\"";
8160    apply ();
8161
8162    buffer = "macro version \"";
8163    buffer += current_version;
8164    buffer += "\"";
8165    apply ();
8166
8167    if (!Symbol::is_selected ("PACKAGE_ROOT"))
8168      {
8169        buffer = "macro PACKAGE_ROOT \"$(";
8170        buffer += current_prefix;
8171        buffer += "ROOT";
8172        buffer += ")\"";
8173
8174        apply ();
8175      }
8176  }
8177
8178  /**
8179   *   srcdir
8180   *   src       =$(srcdir)/
8181   *   inc
8182   *   mgrdir
8183   *   mgr       =../$(mgrdir)/
8184   *   bin
8185   *   javabin
8186   *   doc
8187   *   version
8188   *   package
8189   *
8190   *   <package>_project
8191   *   <package>_cmtpath
8192   *   <package>_offset
8193   *   package_cmtpath
8194   *   package_offset
8195   *   project
8196   *
8197   */
8198  void fill_for_branches ()
8199  {
8200    /**
8201     *    Basic macros  (src, mgr, ...)
8202     */
8203   
8204    if (current_style == none_style)
8205      {
8206        buffer = "macro srcdir \".";
8207        buffer += "\"";
8208        apply ();
8209
8210        buffer = "macro src \".";
8211        buffer += fs;
8212        buffer += "\"";
8213        apply ();
8214
8215        buffer = "macro inc \".";
8216        buffer += fs;
8217        buffer += "\"";
8218        apply ();
8219
8220        buffer = "macro mgr \".";
8221        buffer += fs;
8222        buffer += "\"";
8223        apply ();
8224
8225        buffer = "macro bin \".";
8226        buffer += fs;
8227        buffer += "\"";
8228        apply ();
8229
8230        buffer = "macro javabin \".";
8231        buffer += fs;
8232        buffer += "\"";
8233        apply ();
8234
8235        buffer = "macro doc \".";
8236        buffer += fs;
8237        buffer += "\"";
8238        apply ();
8239      }
8240    else
8241      {
8242        if (!Symbol::is_selected ("srcdir"))
8243          {
8244            buffer = "macro srcdir \"..";
8245            buffer += fs;
8246            buffer += "src";
8247            buffer += "\"";
8248            apply ();
8249          }
8250       
8251        if (!Symbol::is_selected ("src"))
8252          {
8253            buffer = "macro src \"..";
8254            buffer += fs;
8255            buffer += "src";
8256            buffer += fs;
8257            buffer += "\"";
8258            apply ();
8259          }
8260       
8261        if (!Symbol::is_selected ("inc"))
8262          {
8263            buffer = "macro inc \"..";
8264            buffer += fs;
8265            buffer += "src";
8266            buffer += fs;
8267            buffer += "\"";
8268            apply ();
8269          }
8270       
8271        if (!Symbol::is_selected ("doc"))
8272          {
8273            buffer = "macro doc \"..";
8274            buffer += fs;
8275            buffer += "doc";
8276            buffer += fs;
8277            buffer += "\"";
8278            apply ();
8279          }
8280       
8281        if (!Symbol::is_selected ("bin"))
8282          {
8283            cmt_string package_tag = current_package;
8284            package_tag += "_tag";
8285
8286            buffer = "macro bin \"..";
8287            buffer += fs;
8288            buffer += "$(";
8289            buffer += package_tag;
8290            buffer += ")";
8291            buffer += fs;
8292            buffer += "\"";
8293            apply ();
8294          }
8295
8296        if (!Symbol::is_selected ("javabin"))
8297          {
8298            buffer = "macro javabin \"..";
8299            buffer += fs;
8300            buffer += "classes";
8301            buffer += fs;
8302            buffer += "\"";
8303            apply ();
8304          }
8305       
8306        if (current_style == mgr_style)
8307          {
8308            buffer = "macro mgrdir \"mgr\"";
8309            apply ();
8310
8311            buffer = "macro mgr \"..";
8312            buffer += fs;
8313            buffer += "mgr";
8314            buffer += fs;
8315            buffer += "\"";
8316            apply ();
8317          }
8318        else
8319          {
8320            buffer = "macro mgrdir \"cmt\"";
8321            apply ();
8322
8323            buffer = "macro mgr \"..";
8324            buffer += fs;
8325            buffer += "cmt";
8326            buffer += fs;
8327            buffer += "\"";
8328            apply ();
8329          }
8330
8331        Cmt::configure_current_cmtpath ();
8332      }
8333  }
8334
8335  /**
8336   *   project
8337   */
8338  void fill_for_project ()
8339  {
8340    if (current_style == none_style) return;
8341
8342    cmt_string project_name;
8343    Project* project = Project::get_current ();
8344    if (project != 0)
8345      {
8346        project_name = project->get_name ();
8347      }
8348
8349    buffer = "macro project \"";
8350    buffer += project_name;
8351    buffer += "\"";
8352    apply ();
8353  }
8354
8355  /**
8356   *   use_requirements
8357   */
8358  void fill_for_use_requirements ()
8359  {
8360    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8361
8362    if (Uses.size () == 0) return;
8363
8364    if (!Symbol::is_selected ("use_requirements"))
8365      {
8366        buffer  = "macro use_requirements \"";
8367        buffer += "requirements ";
8368       
8369        for (int number = 0; number < Uses.size (); number++)
8370          {
8371            Use* use = Uses[number];
8372           
8373            if (use->discarded) continue;
8374           
8375            if (use->located ())
8376              {
8377                buffer += "$(";
8378                buffer += use->prefix;
8379                buffer += "ROOT)";
8380                buffer += fs;
8381               
8382                if (use->style == mgr_style) buffer += "mgr";
8383                else buffer += "cmt";
8384               
8385                buffer += fs;
8386                buffer += "requirements ";
8387              }
8388          }
8389       
8390        buffer += "\"";
8391       
8392        apply ();
8393      }
8394  }
8395
8396  /**
8397   *   use_includes
8398   */
8399  void fill_for_use_includes ()
8400  {
8401    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8402
8403    if (Uses.size () == 0) return;
8404
8405    if (!Symbol::is_selected ("use_includes"))
8406      {
8407        buffer = "macro_append use_includes \' ";
8408       
8409        for (int number = 0; number < Uses.size (); number++)
8410          {
8411            Use* use = Uses[number];
8412           
8413            if (use->discarded) continue;
8414
8415            Package* p = use->get_package ();
8416            if (p->is_cmt ()) continue;
8417
8418            if (Cmt::get_debug ())
8419              {
8420                cout << "fill use_includes for " << use->get_package_name () 
8421                     << " discarded=" << use->discarded
8422                     << " auto_imports=" << use->auto_imports << endl;
8423              }
8424           
8425            if (use->auto_imports == Off) continue;
8426           
8427            use->fill_includes_macro (buffer);
8428          }
8429       
8430        buffer += "\'";
8431       
8432        apply ();
8433      }
8434  }
8435
8436  /**
8437   *   use_fincludes
8438   */
8439  void fill_for_use_fincludes ()
8440  {
8441    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8442
8443    if (Uses.size () == 0) return;
8444
8445    if (!Symbol::is_selected ("use_fincludes"))
8446      {
8447        buffer = "macro_append use_fincludes \" $(use_includes)\"";
8448        apply ();
8449      }
8450  }
8451
8452  /**
8453   *   use_stamps
8454   */
8455  void fill_for_use_stamps ()
8456  {
8457    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8458
8459    if (Uses.size () == 0) return;
8460
8461    if (!Symbol::is_selected ("use_stamps"))
8462      {
8463        buffer = "macro use_stamps \"";
8464        (Use::current()).fill_macro (buffer, "stamps");
8465       
8466        for (int number = 0; number < Uses.size (); number++)
8467          {
8468            Use* use = Uses[number];
8469           
8470            if (use->discarded) continue;
8471
8472            Package* p = use->get_package ();
8473            if (p->is_cmt ()) continue;
8474           
8475            use->fill_macro (buffer, "stamps");
8476          }
8477       
8478        buffer += "\"";
8479       
8480        apply ();
8481      }
8482  }
8483
8484  /**
8485   *   use_cflags
8486   */
8487  void fill_for_use_cflags ()
8488  {
8489    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8490
8491    if (Uses.size () == 0) return;
8492
8493    if (!Symbol::is_selected ("use_cflags"))
8494      {
8495        Use::fill_macro_all (buffer, "cflags");
8496        apply ();
8497      }
8498  }
8499
8500  /**
8501   *   use_pp_cflags
8502   */
8503  void fill_for_use_pp_cflags ()
8504  {
8505    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8506
8507    if (Uses.size () == 0) return;
8508
8509    if (!Symbol::is_selected ("use_pp_cflags"))
8510      {
8511        Use::fill_macro_all (buffer, "pp_cflags");
8512        apply ();
8513      }
8514  }
8515
8516  /**
8517   *   use_cppflags
8518   */
8519  void fill_for_use_cppflags ()
8520  {
8521    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8522
8523    if (Uses.size () == 0) return;
8524
8525    if (!Symbol::is_selected ("use_cppflags"))
8526      {
8527        Use::fill_macro_all (buffer, "cppflags");
8528        apply ();
8529      }
8530  }
8531
8532  /**
8533   *   use_pp_cppflags
8534   */
8535  void fill_for_use_pp_cppflags ()
8536  {
8537    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8538
8539    if (Uses.size () == 0) return;
8540
8541    if (!Symbol::is_selected ("use_pp_cppflags"))
8542      {
8543        Use::fill_macro_all (buffer, "pp_cppflags");
8544        apply ();
8545      }
8546  }
8547
8548  /**
8549   *   use_fflags
8550   */
8551  void fill_for_use_fflags ()
8552  {
8553    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8554
8555    if (Uses.size () == 0) return;
8556
8557    if (!Symbol::is_selected ("use_fflags"))
8558      {
8559        Use::fill_macro_all (buffer, "fflags");
8560        apply ();
8561      }
8562  }
8563
8564  /**
8565   *   use_pp_fflags
8566   */
8567  void fill_for_use_pp_fflags ()
8568  {
8569    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8570
8571    if (Uses.size () == 0) return;
8572
8573    if (!Symbol::is_selected ("use_pp_fflags"))
8574      {
8575        Use::fill_macro_all (buffer, "pp_fflags");
8576        apply ();
8577      }
8578  }
8579
8580  /**
8581   *   use_linkopts
8582   */
8583  void fill_for_use_linkopts ()
8584  {
8585    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8586
8587    if (Uses.size () == 0) return;
8588
8589    if (!Symbol::is_selected ("use_linkopts"))
8590      {
8591        Use::fill_macro_all (buffer, "linkopts");
8592        apply ();
8593      }
8594  }
8595
8596  /**
8597   *   use_libraries
8598   */
8599  void fill_for_use_libraries ()
8600  {
8601    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8602
8603    if (Uses.size () == 0) return;
8604
8605    if (!Symbol::is_selected ("use_libraries"))
8606      {
8607        buffer  = "macro use_libraries \"";
8608
8609        for (int number = 0; number < Uses.size (); number++)
8610          {
8611            Use* use = Uses[number];
8612           
8613            if (use->discarded) continue;
8614           
8615            Package* p = use->get_package ();
8616            if (p->is_cmt ()) continue;
8617
8618            use->fill_macro (buffer, "libraries");
8619          }
8620       
8621        buffer += "\"";
8622       
8623        apply ();
8624      }
8625  }
8626
8627  /**
8628   *   includes
8629   */
8630  void fill_for_includes ()
8631  {
8632    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8633
8634    if (Uses.size () == 0) return;
8635
8636    if (!Symbol::is_selected ("includes"))
8637      {
8638        buffer = "macro_append includes \' ";
8639
8640        Use& use = Use::current();
8641
8642        if (use.include_path == "")
8643          {
8644            buffer += "$(ppcmd)\"$(srcdir)\" ";
8645          }
8646        else if (use.include_path != "none")
8647          {
8648            buffer += "$(ppcmd)\"";
8649            buffer += use.include_path;
8650            buffer += "\" ";
8651          }
8652       
8653        for (int include_number = 0;
8654             include_number < use.includes.size ();
8655             include_number++)
8656          {
8657            Include& incl = use.includes[include_number];
8658           
8659            buffer += "$(ppcmd)\"";
8660            buffer += incl.name;
8661            buffer += "\" ";
8662          }
8663       
8664        buffer += "$(use_includes)\'";
8665       
8666        apply ();
8667      }
8668  }
8669
8670  /**
8671   *   fincludes
8672   */
8673  void fill_for_fincludes ()
8674  {
8675    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8676
8677    if (Uses.size () == 0) return;
8678
8679    if (!Symbol::is_selected ("fincludes"))
8680      {
8681        buffer = "macro_append fincludes \" $(includes)\"";
8682        apply ();
8683      }
8684  }
8685
8686  /**
8687   *  Macros specific to constituents.
8688   *  This includes the compiler flags
8689   *  and fills in these macros from uses packages. This takes care
8690   *  of -no_auto_imports and -import= directives
8691   *
8692   *    <constituent>_use_linkopts
8693   *    <prefix>_<constituent>_cflags
8694   *    <prefix>_<constituent>_pp_cflags
8695   *    <prefix>_<constituent>_cppflags
8696   *    <prefix>_<constituent>_pp_cppflags
8697   *    <prefix>_<constituent>_fflags
8698   *    <prefix>_<constituent>_pp_fflags
8699   *    <constituent>linkopts
8700   *    <constituent>_GUID
8701   *
8702   */
8703  void fill_for_all_constituents ()
8704  {
8705    /// First, finish the parsing of constituent parameters.
8706    Constituent::parse_all ();
8707
8708    Use::UsePtrVector& Uses = Use::get_ordered_uses ();
8709
8710    const Constituent::ConstituentVector& constituents =
8711      Constituent::constituents ();
8712
8713 
8714    /// Prepare the auto_imports states in a vector
8715
8716    cmt_vector<bool> base_auto_imports_states;
8717
8718    base_auto_imports_states.resize (Uses.size ());
8719
8720    int number;
8721
8722    for (number = 0; number < Uses.size (); number++)
8723      {
8724        Use* use = Uses[number];
8725        base_auto_imports_states[number] = (use->auto_imports != Off);
8726      }
8727
8728    /// Now scan all constituents
8729
8730    for (number = 0; number < constituents.size (); number++)
8731      {
8732        const Constituent& constituent = constituents[number];
8733
8734        Use::UsePtrVector imports;
8735        int i;
8736
8737        /**
8738         *  Problem for imports in constituents.
8739         *
8740         *     1) use_xxx has holes due to the corresponding
8741         *         -no_auto_imports options attached to some
8742         *        use statements (including the transitive ones)
8743         *
8744         *     2) the -import=yyy options provided to a given constituent
8745         *        should restore the appropriate holes as well as
8746         *        all transitive ones.
8747         *
8748         *     3) for use_linkopts, missing pieces must be filled at
8749         *        the right position. (for others, order is not relevant
8750         *        while transitive access is required for all)
8751         *
8752         */
8753
8754        if (constituent.type == Document) continue;
8755        if (constituent.imports.size () == 0) 
8756          {
8757            buffer = "macro_append ";
8758            buffer += constituent.name;
8759            buffer += "_use_linkopts ";
8760            buffer += " \" ";
8761       
8762            current_use->fill_macro (buffer, "linkopts");
8763       
8764            for (i = 0; i < Uses.size (); i++)
8765              {
8766                if (base_auto_imports_states[i])
8767                  {
8768                    Use* u = Uses[i];
8769               
8770                    if (u->discarded) continue;
8771
8772                    Package* p = u->get_package ();
8773                    if (p->is_cmt ()) continue;
8774                   
8775                    u->fill_macro (buffer, "linkopts");
8776                  }
8777              }
8778            buffer += "\"";
8779            apply ();
8780
8781          /*
8782            buffer = "macro_append ";
8783            buffer += constituent.name;
8784            buffer += "_use_linkopts ";
8785
8786            buffer += " \" $(use_linkopts)\"";
8787            apply ();
8788            */
8789
8790            continue;
8791          }
8792
8793        /**
8794         * Create a private copy of the state vector. This private copy
8795         * will be updated according to -import=xxx modifiers for the
8796         * current constituent.
8797         */
8798        cmt_vector<bool> auto_imports_states (base_auto_imports_states);
8799
8800        for (i = 0; i < constituent.imports.size (); i++)
8801          {
8802            const cmt_string& import = constituent.imports[i];
8803           
8804            //
8805            // Resolve the imported uses
8806            //
8807
8808            int use_index = Use::find_index (import, "", "");
8809
8810            if (use_index >= 0)
8811              {
8812                Use* u = Uses[use_index];
8813           
8814                if (u->discarded) continue;
8815
8816                if (Cmt::get_debug ())
8817                  {
8818                    cout << constituent.name  << " needs imports " << import << " "
8819                         << use_index << " " 
8820                         << u->get_package()->get_name() << endl;
8821                  }
8822
8823                Package* p = u->get_package ();
8824                if (p->is_cmt ()) continue;
8825
8826                if (u->auto_imports != Off) continue;
8827
8828                Use::set_auto_imports_state (use_index, auto_imports_states);
8829              }
8830          }
8831
8832        if (Cmt::get_debug ())
8833          {
8834            cout << constituent.name  << " has imports " << endl;
8835          }
8836
8837
8838        /**
8839         *   Find all newly exposed packages and precompute this list inside
8840         *   a vector.
8841         */
8842        for (i = 0; i < base_auto_imports_states.size (); i++)
8843          {
8844            if (auto_imports_states[i] != base_auto_imports_states[i])
8845              {
8846                Use* u = Uses[i];
8847
8848                if (u->discarded) continue;
8849
8850                Package* p = u->get_package ();
8851                if (p->is_cmt ()) continue;
8852
8853                if (Cmt::get_debug ())
8854                  {
8855                    cout << constituent.name  << " has import " << p->get_name () << endl;
8856                  }
8857
8858                if (u->auto_imports != Off) continue;
8859
8860                imports.push_back (u);
8861              }
8862          }
8863       
8864        if (imports.size () == 0) return;
8865
8866        cmt_string prefix;
8867           
8868        //
8869        // Documents are not considered
8870        //
8871        switch (constituent.type)
8872          {
8873          case Application:
8874            prefix = "app_";
8875            break;
8876          case Library:
8877            prefix = "lib_";
8878            break;
8879          }
8880           
8881        buffer = "macro_append ";
8882        buffer += prefix;
8883        buffer += constituent.name;
8884        buffer += "_cflags ";
8885        buffer += " \' ";
8886        for (i = 0; i < imports.size (); i++)
8887          {
8888            Use* u = imports[i];
8889           
8890            u->fill_includes_macro (buffer);
8891            u->fill_macro (buffer, "cflags");
8892          }
8893        buffer += "\'";
8894        apply ();
8895       
8896        buffer = "macro_append ";
8897        buffer += prefix;
8898        buffer += constituent.name;
8899        buffer += "_pp_cflags ";
8900        buffer += " \" ";
8901        for (i = 0; i < imports.size (); i++)
8902          {
8903            Use* u = imports[i];
8904           
8905            u->fill_macro (buffer, "pp_cflags");
8906          }
8907        buffer += "\"";
8908        apply ();
8909       
8910        buffer = "macro_append ";
8911        buffer += prefix;
8912        buffer += constituent.name;
8913        buffer += "_cppflags ";
8914        buffer += " \' ";
8915        for (i = 0; i < imports.size (); i++)
8916          {
8917            Use* u = imports[i];
8918           
8919            u->fill_includes_macro (buffer);
8920            u->fill_macro (buffer, "cppflags");
8921          }
8922        buffer += "\'";
8923        apply ();
8924       
8925        buffer = "macro_append ";
8926        buffer += prefix;
8927        buffer += constituent.name;
8928        buffer += "_pp_cppflags ";
8929        buffer += " \" ";
8930        for (i = 0; i < imports.size (); i++)
8931          {
8932            Use* u = imports[i];
8933           
8934            u->fill_macro (buffer, "pp_cppflags");
8935          }
8936        buffer += "\"";
8937        apply ();
8938       
8939        buffer = "macro_append ";
8940        buffer += prefix;
8941        buffer += constituent.name;
8942        buffer += "_fflags ";
8943        buffer += " \' ";
8944        for (i = 0; i < imports.size (); i++)
8945          {
8946            Use* u = imports[i];
8947           
8948            u->fill_includes_macro (buffer);
8949            u->fill_macro (buffer, "fflags");
8950          }
8951        buffer += "\'";
8952        apply ();
8953       
8954        buffer = "macro_append ";
8955        buffer += prefix;
8956        buffer += constituent.name;
8957        buffer += "_pp_fflags ";
8958        buffer += " \" ";
8959        for (i = 0; i < imports.size (); i++)
8960          {
8961            Use* u = imports[i];
8962           
8963            u->fill_macro (buffer, "pp_fflags");
8964          }
8965        buffer += "\"";
8966        apply ();
8967       
8968        /**
8969           *  Setting ${CONSTITUENT}linkopts is a temporary solution
8970           *  until the backward compatibility solution for a proper
8971           *  replacement of use_linkopts by ${CONSTITUENT}_use_linkopts
8972           *  is acheived.
8973           *
8974           */
8975       buffer = "macro_append ";
8976       buffer += constituent.name;
8977       buffer += "linkopts ";
8978       buffer += " \" ";
8979       for (i = 0; i < imports.size (); i++)
8980         {
8981           Use* u = imports[i];
8982           
8983           u->fill_macro (buffer, "linkopts");
8984         }
8985       buffer += "\"";
8986       apply ();
8987       
8988       /**
8989         *  Only for linkopts we take care of the order. This means
8990        *  that ${CONSTITUENT}_use_linkopts should be used in place of use_linkopts.
8991         *
8992         *  (see the application fragments)
8993         *  that ${CONSTITUENT}_use_linkopts will be used in place of use_linkopts.
8994         */
8995        buffer = "macro_append ";
8996        buffer += constituent.name;
8997        buffer += "_use_linkopts ";
8998        buffer += " \" ";
8999       
9000        current_use->fill_macro (buffer, "linkopts");
9001       
9002        for (i = 0; i < Uses.size (); i++)
9003          {
9004            if (auto_imports_states[i])
9005              {
9006                Use* u = Uses[i];
9007               
9008                if (u->discarded) continue;
9009               
9010                Package* p = u->get_package ();
9011                if (p->is_cmt ()) continue;
9012
9013                u->fill_macro (buffer, "linkopts");
9014              }
9015          }
9016        buffer += "\"";
9017        apply ();
9018
9019        //==== GLAST addition for vs.net ==========
9020        buffer = "macro ";
9021        buffer += constituent.name;
9022        buffer += "_GUID \"{88BF15AB-5A2D-4bea-B64F-02752C2A1F4F}\" ";
9023        apply ();
9024      }
9025  }
9026
9027  /**
9028   * Macros to be defined once current_package is known
9029   * and even before reading its requirements file.
9030   */
9031  void fill_for_current_package (const cmt_string& current_dir)
9032  {
9033    fill_for_tag ();
9034    fill_for_package (current_dir);
9035  }
9036
9037private:
9038  cmt_string fs;
9039  cmt_string buffer;
9040  CmtSystem::cmt_string_vector vb;
9041  cmt_string pwd;
9042  Use* current_use;
9043  cmt_string current_tag; 
9044  cmt_string current_package; 
9045  cmt_string current_version; 
9046  cmt_string current_prefix; 
9047  CmtDirStyle current_style;
9048};
9049
9050//----------------------------------------------------------
9051void Cmt::set_current_access (AccessMode mode)
9052{
9053  m_current_access = mode;
9054}
9055
9056//----------------------------------------------------------
9057void Cmt::set_current_build_strategy (int strategy)
9058{
9059  m_current_build_strategy = strategy;
9060}
9061
9062//----------------------------------------------------------
9063void Cmt::set_current_setup_strategy (int strategy)
9064{
9065  m_current_setup_strategy = strategy;
9066}
9067
9068//----------------------------------------------------------
9069void Cmt::set_scope_filtering_mode (CmtScopeFilteringMode mode)
9070{
9071  m_scope_filtering_mode = mode;
9072}
9073
9074//----------------------------------------------------------
9075void Cmt::set_standard_macros ()
9076{
9077  if (m_standard_macros_done) return;
9078
9079  m_standard_macros_done = true;
9080
9081  int number;
9082  cmt_string temp;
9083  Use::UsePtrVector& Uses = Use::get_ordered_uses ();
9084  Use& current_use = Use::current ();
9085
9086  cmt_string fs = CmtSystem::file_separator ();
9087
9088  cmt_string pwd = CmtSystem::pwd ();
9089
9090  if (CmtSystem::test_file ("../cmt/requirements")) m_current_style = cmt_style;
9091  else if (CmtSystem::test_file ("../mgr/requirements")) m_current_style = mgr_style;
9092  else m_current_style = none_style;
9093
9094  {
9095    cmt_string v;
9096    CmtSystem::dirname (pwd, v);
9097    CmtSystem::basename (v, v);
9098    if (!CmtSystem::is_version_directory (v))
9099      {
9100        m_current_style = no_version_style;
9101      }
9102  }
9103
9104  // Prepare computation of the best form for relative path from current directory
9105  // to package directories.
9106  CmtSystem::cmt_string_vector vb;
9107  CmtSystem::split (pwd, fs, vb);
9108
9109
9110    /**
9111     *    TAG management
9112     */
9113
9114  bool tag_debug = CmtSystem::testenv ("TAGDEBUG");
9115
9116  if (tag_debug) cerr << "set_standard_macro0> current_tag=" << m_current_tag << endl;
9117
9118  if (m_current_tag != "")
9119    {
9120        // this is when some -tag= argument was used.
9121      if (tag_debug) cerr << "set_standard_macro0.1> current_tag=" << m_current_tag << endl;
9122    }
9123  else if (Symbol::is_selected ("CMTCONFIG"))
9124    {
9125        // This is when CMTCONFIG has been set from some requirements file
9126      Symbol* macro = Symbol::find ("CMTCONFIG");
9127      if (macro != 0)
9128        {
9129          m_current_tag = macro->build_macro_value ();
9130          if (tag_debug) cerr << "set_standard_macro1> current_tag=" << m_current_tag << endl;
9131        }
9132    }
9133  else
9134    {
9135        // this is when no -tag= argument was used.
9136      if (tag_debug) cerr << "set_standard_macro(before2)> current_tag=" << m_current_tag << endl;
9137      if (current_use.get_package_name () == "CMT")
9138        {
9139          m_current_tag = CmtSystem::getenv ("CMTBIN");
9140        }
9141      else
9142        {
9143          m_current_tag = CmtSystem::getenv ("CMTCONFIG");
9144        }
9145
9146      if (tag_debug) cerr << "set_standard_macro2> current_tag=" << m_current_tag << endl;
9147    }
9148
9149  if (m_debug)
9150    {
9151      cout << "set_standard_macro3>" << endl;
9152    }
9153
9154  StandardMacroBuilder builder (m_current_tag,
9155                                m_current_package,
9156                                m_current_version,
9157                                m_current_prefix,
9158                                m_current_style);
9159
9160
9161    //
9162    //  Definitions for installation area mechanisms
9163    //
9164  if ((get_build_strategy () & InstallAreaMask) == WithInstallArea)
9165    {
9166      CmtInstallAreaMgr& ia_mgr = CmtInstallAreaMgr::instance ();
9167
9168      //cout << "#IA6>" << endl;
9169
9170      ia_mgr.setup_current_installarea ();
9171    }
9172
9173  builder.fill_for_current_package (m_current_dir);
9174
9175  builder.fill_for_branches ();
9176  builder.fill_for_project ();
9177  builder.fill_for_use_requirements ();
9178  builder.fill_for_use_includes ();
9179  builder.fill_for_use_fincludes ();
9180  builder.fill_for_use_stamps ();
9181  builder.fill_for_use_cflags ();
9182  builder.fill_for_use_pp_cflags ();
9183  builder.fill_for_use_cppflags ();
9184  builder.fill_for_use_pp_cppflags ();
9185  builder.fill_for_use_fflags ();
9186  builder.fill_for_use_pp_fflags ();
9187  builder.fill_for_use_linkopts ();
9188  builder.fill_for_use_libraries ();
9189  builder.fill_for_includes ();
9190  builder.fill_for_fincludes ();
9191  builder.fill_for_all_constituents ();
9192
9193    /**
9194     *   Macros implied or required to manage constituents.
9195     */
9196
9197  const Constituent::ConstituentVector& constituents =
9198    Constituent::constituents ();
9199 
9200  if (!Symbol::is_selected ("constituents"))
9201    {
9202      temp = "macro_append constituents \" ";
9203     
9204      for (number = 0; number < constituents.size (); number++)
9205        {
9206          const Constituent& constituent = constituents[number];
9207
9208          if (constituent.group == 0)
9209            {
9210              temp += constituent.name;
9211              temp += " ";
9212            }
9213        }
9214     
9215      temp += "\"";
9216     
9217      SyntaxParser::parse_requirements_line (temp, &current_use);
9218    }
9219
9220  SyntaxParser::parse_requirements_line ("macro_append all_constituents \" $(constituents)\"", 
9221                                      &current_use);
9222
9223  if (!Symbol::is_selected ("constituentsclean"))
9224    {
9225      temp = "macro_append constituentsclean \" ";
9226     
9227      for (number = constituents.size () - 1; number >= 0 ; number--)
9228        {
9229          const Constituent& constituent = constituents[number];
9230
9231          if (constituent.group == 0)
9232            {
9233              temp += constituent.name;
9234              temp += "clean ";
9235            }
9236        }
9237     
9238      temp += "\"";
9239     
9240      SyntaxParser::parse_requirements_line (temp, &current_use);
9241    }
9242
9243  SyntaxParser::parse_requirements_line ("macro_append all_constituentsclean \" $(constituentsclean)\"", 
9244                                      &current_use);
9245
9246  const Group::GroupVector& groups = Group::groups ();
9247 
9248  for (number = 0; number < groups.size (); number++)
9249    {
9250      const Group& group = groups[number];
9251
9252      temp = "macro_append ";
9253      temp += group.name ();
9254      temp += "_constituents \" ";
9255
9256      int i;
9257
9258      for (i = 0; i < constituents.size (); i++)
9259        {
9260          const Constituent& constituent = constituents[i];
9261
9262          if ((constituent.group != 0) && 
9263              (group.name () == constituent.group->name ()))
9264            {
9265              temp += constituent.name;
9266              temp += " ";
9267            }
9268        }
9269     
9270      temp += "\"";
9271     
9272      SyntaxParser::parse_requirements_line (temp, &current_use);
9273
9274      temp = "macro_append ";
9275      temp += group.name ();
9276      temp += "_constituentsclean \" ";
9277     
9278      for (i = constituents.size () - 1; i >= 0 ; i--)
9279        {
9280          const Constituent& constituent = constituents[i];
9281
9282          if ((constituent.group != 0) && 
9283              (group.name () == constituent.group->name ()))
9284            {
9285              temp += constituent.name;
9286              temp += "clean ";
9287            }
9288        }
9289     
9290      temp += "\"";
9291     
9292      SyntaxParser::parse_requirements_line (temp, &current_use);
9293    }
9294
9295    //
9296    //  Definitions for installation area mechanisms. Apply all cmtpath patterns
9297    //
9298  if ((get_build_strategy () & InstallAreaMask) == WithInstallArea)
9299    {
9300      CmtInstallAreaMgr& ia_mgr = CmtInstallAreaMgr::instance ();
9301
9302      //cout << "#IA7>" << endl;
9303
9304      ia_mgr.setup ();
9305    }
9306
9307  CmtPathPattern::apply_all ();
9308}
9309
9310//----------------------------------------------------------
9311void Cmt::use_cmt ()
9312{
9313  UseRef use;
9314  bool recursive_copy = m_recursive;
9315  bool debug_copy = m_debug;
9316
9317  if (m_default_path.size () <= 0) return;
9318  if (m_current_package == "CMT") return;
9319
9320  m_recursive = true;
9321  m_debug = false;
9322  use = Use::add (m_default_path, "CMT", m_cmt_version, "", "", 0);
9323  m_recursive = recursive_copy;
9324  m_debug = debug_copy;
9325}
9326
9327//----------------------------------------------------------
9328void Cmt::use_home_requirements ()
9329{
9330  use_special_requirements (m_cmt_home, 
9331                            CmtSystem::get_home_package (), 
9332                            "requirements");
9333}
9334
9335//----------------------------------------------------------
9336void Cmt::use_user_context_requirements ()
9337{
9338  use_special_requirements (m_cmt_user_context, 
9339                            CmtSystem::get_user_context_package (), 
9340                            "requirements");
9341}
9342
9343//----------------------------------------------------------
9344void Cmt::use_special_requirements (const cmt_string& path, 
9345                                    const cmt_string& name, 
9346                                    const cmt_string& file_name)
9347{
9348  if (path == "") 
9349    {
9350      return;
9351    }
9352
9353  UseRef use;
9354  bool recursive_copy = m_recursive;
9355
9356  if (m_default_path.size () <= 0) return;
9357  if (m_current_package == "CMT") return;
9358
9359  m_recursive = true;
9360
9361  use = Use::add (path, name, "v0", "", "", 0);
9362
9363  cmt_string f = m_cmt_user_context;
9364  f += CmtSystem::file_separator ();
9365  f += file_name;
9366  SyntaxParser::parse_requirements (f, use);
9367
9368  m_recursive = recursive_copy;
9369}
9370
9371//-------------------------------------------------
9372void Cmt::vector_to_string (const CmtSystem::cmt_string_vector& v,
9373                            const cmt_string& separator,
9374                            cmt_string& result)
9375{
9376  result.erase (0);
9377
9378  for (int i = 0; i < v.size (); i++)
9379    {
9380      const cmt_string& s = v[i];
9381      if (s == "") continue;
9382
9383      if (i > 0) result += separator;
9384      result += v[i];
9385    }
9386}
9387
9388//-------------------------------------------------
9389cmt_string Cmt::vector_to_string (const CmtSystem::cmt_string_vector& v)
9390{
9391  cmt_string result;
9392
9393  vector_to_string (v, " ", result);
9394
9395  return (result);
9396}
Note: See TracBrowser for help on using the repository browser.