David Rose 24 years ago
parent
commit
aa14222063

+ 19 - 0
panda/src/doc/ppremake-philosophy.txt

@@ -44,6 +44,25 @@ WHY PPREMAKE?
   the other.
   the other.
 
 
 
 
+WHAT IS PPREMAKE, EXACTLY?
+
+  By design, ppremake is more of a scripting language framework than a
+  specific application.  It is intended to contain as few assumptions
+  as possible about the structure of the source tree it is processing
+  or the precise nature of the makefiles (or other build scripts) it
+  is generating.
+
+  The ppremake executable is hardcoded to define a set of useful
+  predefined variables and functions, and to follow a particular
+  procedure to get started scanning a source directory when it is
+  invoked.  However, once it is started, the actual behavior of
+  ppremake, including the meaning of all the variables defined within
+  the various Sources.pp files (see below) and all of the generated
+  output, is almost entirely controlled by scripts written in its own
+  scripting language.  Most of these are control scripts are defined
+  in the directory $DTOOL/pptempl.
+
+
 SOURCE TREE AND INSTALL TREE HIERARCHY 
 SOURCE TREE AND INSTALL TREE HIERARCHY 
 
 
   The layout of the source tree and of the install tree for Panda are
   The layout of the source tree and of the install tree for Panda are

+ 142 - 0
panda/src/doc/ppremake-process.txt

@@ -0,0 +1,142 @@
+The following steps are executed when ppremake is invoked:
+
+  1. Look in the current directory for a file called Package.pp.  If
+     it is not found, but Sources.pp is present in the current
+     directory, then look for Package.pp in the parent directory.
+     Repeat until Package.pp is located; this is the root of the
+     source directory hierarchy.
+
+  2. Read and interpret the Package.pp file.  This should, in turn,
+     read in (via the #include directive; see below) whatever other
+     configuration scripts are relevant to the current package.  The
+     exact behavior of Package.pp is not hardcoded into ppremake, but
+     the Package.pp scripts for each of the Panda directories will
+     ultimately include the following files in order:
+
+       Any Package.pp for a dependent tree (e.g. $PANDA/Package.pp, etc.)
+       $DTOOL/Package.pp
+       $DTOOL/Config.pp
+       $DTOOL/Config.Platform.pp
+       The user's Config.pp file, as specified by $PPREMAKE_CONFIG.
+       $DTOOL/pptempl/System.pp
+
+     The various Package.pp files are designed to cascade down, such
+     that when you invoke ppremake from a high-level tree, such as
+     Direct (for instance), ppremake invokes $DIRECT/Package.pp, which
+     in turn invokes $PANDA/Package.pp, which in turn invokes
+     $DTOOL/Package.pp.  At the bottom level, $DTOOL/Package.pp does
+     most of the remaining setup work, in particular including the
+     various Config.pp files, and System.pp.
+
+     The Config.pp files are intended to define the variables the user
+     might customize for a particular build environment; the user's
+     personal Config.pp file is included last, and may override any of
+     the default values defined in the system Config.pp files.
+
+     One particularly critical variable that is defined by Config.pp
+     is $[BUILD_TYPE].  This represents the type of makefile rules
+     that are to be generated, e.g. "unix" to generate standard
+     Unix-style makefile syntax, or "msvc" to generate syntax specific
+     to Microsoft's nmake.  The particular string specified here
+     controls the selection of which Template files are to be loaded
+     in a later step to actually generate output files in each source
+     directory.
+
+     The System.pp file is also essential and defines a few more
+     variables that ppremake will be looking for during its execution.
+     This tells ppremake the names of certain critical files that it
+     needs to include.  The use of System.pp to define these
+     filenames, instead of hardcoding them into ppremake, is
+     consistent with the ppremake philosophy of letting as much of its
+     behavior as possible to be controlled from within the scripting
+     language itself.
+        
+  3. Once Package.pp has been read, traverse the entire source
+     hierarchy, and read each Sources.pp file.  A separate named scope
+     is defined for each Sources.pp file; the name of the scope is
+     taken from the name of the directory containing the file.
+
+  4. Read in the global variable declarations.  This is loaded from a
+     particular file specified by System.pp; this file defines global
+     declarations that will be useful when processing each Template
+     file later.  To save time, this file is read once and stored in a
+     global scope, rather than re-read with each Template file.  The
+     particular filename is specified by the ppremake variable
+     $[GLOBAL_FILE], which was set by System.pp; normally this is
+     $DTOOL/pptempl/Global.pp.
+
+     $DTOOL/pptempl/Global.pp will, in turn, also read in the file
+     $DTOOL/pptempl/Global.$[BUILD_TYPE].pp if it exists, which may
+     specify further global declarations that are specific to the
+     particular build type in effect.  Remember, $[BUILD_TYPE] was
+     specified when Config.pp was read, and controls the particular
+     type of makefiles or build scripts that are to be generated.
+
+  5. Build the inter-directory dependency chain.  This is the chain of
+     relationships between different directories within the source
+     hierarchy.  Each directory may depend on code from zero or more
+     other directories within the same package.  (That is, a directory
+     may include header files define within another directory, and/or
+     require linking with a library built in that directory.)
+
+     This inter-directory dependency is critical to determine things
+     such as build order.  If one directory must be built before
+     another directory, the makefiles must be constructed with this
+     relationship explicit.
+
+     This relationship is determined for each directory by executing
+     the script named by $[DEPENDS_FILE] (this variable was set by
+     System.pp) within each source directory scope.  Remember, each
+     Sources.pp file has already been read in, and assigned its own
+     unique named scope.  The DEPENDS_FILE script is responsible for
+     defining the variable $[DEPEND_DIRS] to contain the
+     space-separated list of directories (that is, named scopes) that
+     the files in this current directory depend on.
+
+     Normally, System.pp sets $[DEPENDS_FILE] to
+     $DTOOL/pptempl/Depends.pp.  This script builds up $[DEPEND_DIRS]
+     based on the $[get_depend_libs] function which is defined in
+     Global.pp, which is in turn based on variables like $[LOCAL_LIBS]
+     defined within the Sources.pp file.
+
+     The inter-directory dependency information can be accessed from
+     within ppremake scripts simply by examining the $[DEPEND_DIRS]
+     variable within the appropriate scope.  In addition, the
+     directory relationships are automatically used to sort the
+     variables $[SUBDIR] and $[SUBTREE] in order, such that each
+     directory is listed after the directories it depends on.
+
+     There is one other variable which should be defined by the
+     DEPENDS_FILE script: $[DEPENDABLE_HEADERS] should list the source
+     files within the current directory that may be named as #include
+     files in other files.  This is used to build file-level
+     dependencies to support the $[dependencies] built-in function,
+     and is not related to inter-directory dependencies.
+
+  6. Finally, generate the actual output files in each source
+     directory.  This is done by executing the script named by
+     $[TEMPLATE_FILE] (set by System.pp) within each source directory
+     scope.
+
+     Normally, System.pp sets $[TEMPLATE_FILE] to
+     $DTOOL/pptempl/Template.$[BUILD_TYPE].pp.  Recall again that
+     $[BUILD_TYPE] was specified when Config.pp was read, and controls
+     the particular type of makefiles or build scripts that are to be
+     generated, so there is a different Template script file for each
+     supported build type.
+
+     The Template file is responsible for generating the actual
+     makefile (or whatever build script is required) as appropriate to
+     each source directory.  It now has all the information required:
+     all source directories have been read, so the relationships
+     between different source directories can control the output;
+     also, the inter-directory and inter-file dependencies are
+     available.
+
+     Generally, a Template file will include at least one #output
+     directive to generate the appropriate makefile for this
+     directory.  Since there may be different kinds of source
+     directories, each with very different makefile requirements, the
+     Template files usually have one large #if condition based on the
+     value of $[DIR_TYPE], which is set within in each Sources.pp (and
+     is set in System.pp to default to "src").

+ 38 - 2
panda/src/doc/ppremake-variables.txt

@@ -77,11 +77,14 @@ scanned:
   $[SUBDIRS] - A space-delimited list of source subdirectories within
   $[SUBDIRS] - A space-delimited list of source subdirectories within
     this source directory.  These are simply directory names, without
     this source directory.  These are simply directory names, without
     slashes; prefix each name with $[DIRPREFIX] to make them relative
     slashes; prefix each name with $[DIRPREFIX] to make them relative
-    to $[TOPDIR].
+    to $[TOPDIR].  These are automatically sorted in dependency order,
+    such that a particular directory always appears following all the
+    directories it depends on.
 
 
   $[SUBTREE] - A space-delimited list of names of all source
   $[SUBTREE] - A space-delimited list of names of all source
     subdirectories, including this one, at this level and below.  The
     subdirectories, including this one, at this level and below.  The
-    subdirectory names are relative to $[TOPDIR].
+    subdirectory names are relative to $[TOPDIR].  As above, these are
+    sorted into dependency order.
 
 
 The following variables are built into the ppremake executable, and
 The following variables are built into the ppremake executable, and
 are updated with the current values as *each* different file is read
 are updated with the current values as *each* different file is read
@@ -104,6 +107,39 @@ filled in after all Sources.pp files have been read:
     until after all the Sources.pp files have been read, so it cannot
     until after all the Sources.pp files have been read, so it cannot
     itself be referenced within a Sources.pp file.
     itself be referenced within a Sources.pp file.
 
 
+The following variables are not set by the ppremake executable, but
+are required to be set by one of the startup scripts, typically
+$DTOOL/pptempl/System.pp:
+
+  $[GLOBAL_FILE] - the full pathname to the file that should be read
+    within the global scope after reading each Sources.pp file and
+    before reading each Template file.
+
+  $[TEMPLATE_FILE] - the full pathname to the file that should be read
+    once for each Sources.pp file to generate the actual output
+    makefiles appropriate to each directory.
+
+  $[DEPENDS_FILE] - the full pathname to the file that should be read
+    once for each Sources.pp file to determine the inter-directory
+    dependencies and inter-file dependencies.
+
+  $[DEPENDENCY_CACHE_FILENAME] - the name of the file (with no
+    directory part of the filename) that is used to cache the
+    inter-file dependencies for each source file in a given directory
+    between sessions.  A file by this name is automatically created in
+    each source directory.
+
+  $[DEPEND_DIRS] - the list of directories that the current directory
+    depends on.  This is set by the script named by $[DEPENDS_FILE],
+    and has a different value within each source directory.
+
+  $[DEPENDABLE_HEADERS] - the list of source filenames within the
+    current directory that are considered source header files and that
+    might be listed with the #include directory in some other file.
+    This is used to determine the set of inter-file dependencies.
+    Like $[DEPEND_DIRS], this is set by the $[DEPENDS_FILE] script,
+    and has a different value within each source directory.
+
 
 
 The following functions are built into the ppremake executable.  In
 The following functions are built into the ppremake executable.  In
 general, these operate on one word or a group of words separated by
 general, these operate on one word or a group of words separated by