The Makefile, Project and Workspace Creator.
Designed by Justin Michel (michel_j@ociweb.com) and Chad Elliott.
Implemented by Chad Elliott (elliott_c@ociweb.com).


A single tool (mpc.pl) can be used to generate tool specific input (i.e.
Makefile, dsp, vcproj, etc).  The generator takes platform and building
tool generic files (mpc files) as input which describe basic information
needed to generate a "project" file for various build tools.  These tools
include GNU Make, NMake, Visual C++ 6, Visual C++ 7, etc.

One of the many unique and useful features of the Makefile, Project and
Workspace Creator is that the project definition files can employ the idea
of inheritance.  This feature allows a user to set up a basic base project
(mpb file) that can contain information that is applicable to all
sub-projects.  Things such as include paths, library paths and inter-project
dependencies could be described in this base project and any project that
inherits from it would contain this information as well.

Another set of files, known as template input files (mpd files), provides
the generator with the necessary information to fill platform and build
tool specific information for dynamic and static library and binary
executable projects.

Together, the generic input files and the template input files are applied
toward a platform and build specific template (mpt file) to create the final
product (a build tool specific input file).  These templates contain
"variables" that are filled in by the project creator with information
gathered through the mpc and mpd files and possibly by default values set
within the template itself.

Workspaces are defined by providing a list of mpc files in a single (mwc)
file.  For each mpc file specified, the workspace creator (mwc.pl) calls
upon the project creator to generate the project.  After all of the projects
are successfully generated, the tool specific workspace is generated
containing the projects and any defined inter-project dependency information
(if supported by the build tool).  If no workspace files are provided to the
workspace creator, then the current directory is traversed and any mpc files
located will be part of the workspace that is generated.


Workspace Declarations
----------------------

workspace(workspace_name) {
  file.mpc
  directory
}

Workspaces can contain individual mpc files or directories.  In the case of
a directory, the workspace creator will traverse it and use any mpc files
that are found.  The workspace files should have an 'mwc' extension.


Project Declarations
--------------------

project(project_name) : baseproject, anotherbaseproject {
  exename   = foo
  includes += "."
  libpaths  = directory
  idlflags -= -Sc

  Source_Files {
    file1.cpp
    file2.cpp
    .
    .
    fileN.cpp
  }

  Header_Files {
    file1.h
    file2.h
    .
    .
    fileN.h
  }
}


The (project_name) part of the project declaration is optional.  If it is
left off, the project name will default to the directory name.  Inheritance
is optional.


Project Keywords
----------------
exename		Specifies the name of the executable that will be created
sharedname	Specifies the name of the shared library that will be created
staticname	Specifies the name of the static library that will be created
dllout		(Windows Only) Specifies where the dll will be placed
libout		(Windows Only) Specifies where the lib will be placed
install		Specifies where the executable (or library non-Windows) will go
idlflags	Specifies the idl flags to be used when processing idl files
idlgendir       Specifies the output directory for idl generated files.
                If a listed idl file has a directory as part of the name,
                the generated files will go in that directory unless
                idlgendir specifies otherwise.
idlpreprocessor	Simple assignment used in the gnu template only
pch_header	Specifies the precompiled header file name
pch_source	Specifies the precompiled source file name
ssl             Specifies that the project will use ssl
tao		Specifies that the project will use TAO
version         Specifies the version number for the library or executable

libpaths	Specifies 1 or more locations to find libraries
includes	Specifies 1 or more locations to find include files
libs		Specifies 1 or more libraries to link into the exe or library
defaultlibs	Specifies 1 or more default libraries to link in
depends         Specifies 1 or more project names upon which this project depends
dllflags	(Windows Only) Specifies preprocessor flags needed for dll's
libflags	(Windows Only) Specifies preprocessor flags needed for lib's

verbatim        This allows arbitrary information to be place in a generated
                project file.  The syntax is as follows:

                verbatim(<project type>, <location>) {
                  ..
                  ..
                }

                When MPC is generating a project of type <project type> and
                comes upon a marker that matches the <location> name, it
                will place the text found inside the construct directly into
                the generated project.  If you need to preserve whitespace,
                the line or lines should be placed inside double quotes.

The Following are GNU only:
requires        Specifies which tao macros should be set to build the target
avoids          Specifies which tao macros should not be set to build the target
compname        Specifies the argument to pass to the ace_components script
comps           Specifies which components are required to build the target
tagname         Specifies the make macro to check before building the target
tagchecks       Specifies the values for tagname to check


Special Keywords Available to Templates
---------------------------------------
project_name	This contains the name of the project.
project_file	This contains the name of the output file.
guid		This is used by the VC7 project and workspace creator.
configurations	When used within a foreach context, this info (each
		configuration) is gathered for use with the VC7 workspace
		creator.
flag_overrides  Used to determine flags that have been overriden on a per
                file basis.


Defaulting Behavior
-------------------
1) If a project name is not specified

   it will be defaulted to the name of the current directory

2) If a particular list is not specified (Source_Files, Header_Files, etc.)

   all of the files in the directory will be added to the corresponding list
   by extension

3) If idl files exist in the directory and
   the IDL_Files components are left defaulted (i.e. not listed) and
   none of the idl generated files are listed in the corresponding lists

   the project is assumed to be a TAO project, the idl files are added to
   the IDL_Files list  and all of the (would be) generated files will be
   added to the front of the corresponding lists (source, inline and
   header lists)

4) If files are listed in the Source_Files list and
   a corresponding header or inline file exists

   the corresponding file will be added to the corresponding list (if it
   isn't already there)

5) If a sharedname is specified and staticname is not

   staticname is assigned the sharedname value (the same applies if
   staticname is specified and sharedname is not)

6) If a target name is not listed (exename, sharedname or staticname)

   it is assumed that the target is a library and the name chosen matches
   the name of the current directory

7) If pch_header is not specified and a header file matches *_pch.h

   it is assumed to be the precompiled header file (the same applies to
   pch_source)

8) If -relative is not used to set ACE_ROOT and the ACE_ROOT environment
   variable is set

   it will be used to set the relative value for ACE_ROOT.  If -relative is
   not used to set TAO_ROOT, it will be set from the TAO_ROOT environment
   variable.  If that is not set, the relative value of ACE_ROOT plus /TAO.

Processing Order
----------------
1) Project file is read
2) Template input file is read
3) Template file is read
4) Output project is written
