David Rose 24 år sedan
förälder
incheckning
dc559af065
1 ändrade filer med 191 tillägg och 0 borttagningar
  1. 191 0
      panda/src/doc/ppremake-philosophy.txt

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

@@ -0,0 +1,191 @@
+The name 'ppremake' stands for Panda Pre-make; ppremake is a
+preprocessor that reads a series of source description files and
+generates a series of makefiles (or, potentially, other kinds of
+package build description files, like VC++ project files).
+
+
+WHY PPREMAKE?
+  
+  We needed something like ppremake to meet our complex multi-platform
+  build requirements.  Panda should be built in different ways
+  according to platform:
+  
+    * On Unix systems that support shared libraries (.so files), each
+      subdirectory becomes a different .so file.  This provides the
+      maximum convenience while developing; local changes remain local
+      to a particular .so file and don't require relinking of the
+      whole thing.
+  
+    * On Windows systems, the number of shared libraries (.dll files)
+      must be reduced to minimize overhead, as well as to allow STL to
+      work properly between different subdirectories within a package.
+      (In VC6, STL constructs other than vectors do not work between
+      different DLL's.)  Thus, we must define a number of 'metalib'
+      objects that each represents a set of subdirectories that are to
+      be linked into one DLL.
+  
+    * On systems that do not support shared libraries at all, or for
+      developers who do not wish to use them, each subdirectory
+      becomes a static library.
+  
+  Also, it should be possible to build Panda natively on each
+  platform, without having to install Unix tools (e.g. Cygwin).  This
+  means that we cannot depend on common Unix tools and commands (like
+  install, cp, mv) being present, and makes it difficult to define one
+  set of makefiles for all platforms.  Furthermore, the use of
+  makefiles themselves is not universal; Windows developers are used
+  to using VC++ project files to define the build relationships, and
+  may resist a command-line based build system using makefiles.
+  
+  Finally, the relationships between source files should be recorded
+  only once; it won't do to have to maintain a set of makefiles for
+  Unix systems and a separate set of VC++ project files for Windows
+  systems.  This invites error and accidental omissions on one side or
+  the other.
+
+
+SOURCE TREE AND INSTALL TREE HIERARCHY 
+
+  The layout of the source tree and of the install tree for Panda are
+  strongly influenced by the Unix convention for open source projects,
+  particularly as standardized by GNU.  This convention has a long
+  history and is widely understood by open source developers.
+
+  The complete source hierarchy available on SourceForge consists of a
+  collection of packages, with names like dtool, panda, pandatool, and
+  direct; each package is the root of a separate buildable hierarchy
+  that includes a src and a metalibs directory; within these
+  directories, the source files themselves are distributed logically
+  among a number of further subdirectories.  The structure looks
+  something like this:
+
+    panda3d/README
+    panda3d/dtool/
+    panda3d/dtool/Package.pp
+    panda3d/dtool/Sources.pp
+    panda3d/dtool/src/
+    ...
+    panda3d/panda/
+    panda3d/panda/Package.pp
+    panda3d/panda/Sources.pp
+    panda3d/panda/src/
+    panda3d/panda/src/Sources.pp
+    panda3d/panda/src/express/
+    panda3d/panda/src/express/Sources.pp
+    panda3d/panda/src/express/typedObject.cxx
+    panda3d/panda/src/express/typedObject.h
+    ...
+    panda3d/panda/metalibs/
+    panda3d/panda/metalibs/Sources.pp
+    panda3d/panda/metalibs/pandaexpress/
+    panda3d/panda/metalibs/pandaexpress/Sources.pp
+    panda3d/panda/metalibs/pandaexpress/pandaexpress.cxx
+    ...
+
+  Note that there is a file called Sources.pp in each subdirectory
+  within the hierarchy, and there is a Package.pp at the root of each
+  package.  These files define the build relationships among all the
+  source files in the hierarchy, and are the input files read by
+  ppremake to generate makefiles.
+
+  Once the source tree is unpacked, the user's first step (after
+  customizing the local configuration requirements by setting up a
+  local Config.pp file) will be to cd into the root of one of the
+  packages--typically dtool, which must be built before any of the
+  others--and run ppremake to generate all of the makefiles for that
+  package.  (This is akin to running ./configure within the root of a
+  package for most GNU software.  Unfortunately, Panda cannot easily
+  take advantage of GNU's autoconf scripts, because of its difficult
+  multiplatform requirements.)
+
+  Once the package has been configured, the user can build the entire
+  package with the command 'make' (or 'nmake' in a non-Cygwin Windows
+  environment).  The source files within the tree are compiled in
+  place.  At this point, nothing has yet been installed publicly.  In
+  most Unix/GNU packages, the user may at this point run any
+  applications built within the tree prior to installation, but Panda
+  relies too heavily on shared libraries to make this work reliably.
+  You must 'make install' before you can execute any of the
+  applications within the Panda package.
+
+  Installing the package with 'make install' (or 'nmake install')
+  copies to a public location all of the files that are necessary to
+  make use of the package, either for running applications or building
+  new applications.  This includes all the executables (.exe files) as
+  well as shared libraries (.dll or .so files) for runtime, as well as
+  header files (.h files) and static libraries (.lib or .a files) for
+  building new applications.
+
+  The location to which these files are installed is specified by the
+  user in the local Config.pp file; the common Unix convention is to
+  install these in the directory /usr/local/panda.  The executables
+  will go into /usr/local/panda/bin, the static and dynamic libraries
+  into /usr/local/panda/lib, and the header files into
+  /usr/local/panda/include.  Note that all packages within the source
+  hierarchy, including dtool, panda, pandatool, and direct, will be
+  installed into the *same* public install tree, whether it is called
+  /usr/local/panda or something else.  (On a Windows environment the
+  directory name /usr/local/panda may be inappropriate.  It is up to
+  the user to specify a suitable directory name.  We suggest
+  C:\panda.)
+
+  Once dtool has been built and installed, the next step is to cd to
+  the panda package, ppremake, and 'make' followed by 'make install',
+  and so on with the direct and/or pandatool packages.  All of these
+  packages will be installed into /usr/local/panda (or whichever
+  directory the user specified as the install tree).
+
+
+AN ALTERNATIVE INSTALL TREE PHILOSOPHY
+
+  Installing all the packages to the same install tree works well for
+  the outside developer who is primarily interested in taking the
+  whole body of code as a complete piece, but we have different needs
+  for our own in-house development.  It is convenient to be able to
+  treat the individual packages separately; our in-house 'attach'
+  scripts (not included with the distribution) allow us to use one of
+  several automatically-built trees for development, or upon need, to
+  switch on-the-fly to using our own personally built tree.
+
+  In order to make this work, the source tree and the install tree
+  must become the same thing.  When we are developing in-house, 'make
+  install' copies all the relevant files to the bin, lib, and include
+  subdirectories of the root of the source package, instead of to a
+  common public install directory.  This allows us to easily
+  mix-and-match the files from packages built at various times.
+
+
+PPREMAKE VARIABLES TO SUPPORT EITHER PHILOSOPHY
+
+  Variables are defined in ppremake either with the appropriate
+  #define or #defer command in the local Config.pp, or in the absence of
+  this, they are taken from environment variables.
+
+  In the normal, install-in-one-place philosophy, the user should
+  define only INSTALL_DIR, which indicates the root directory name all
+  packages will be installed to.  In the alternative philosophy, used
+  in-house, the environment variables DTOOL, PANDA, DIRECT,
+  etc. should be defined, which indicate the location of the source
+  directories for each of the various trees.
+
+  In either case, the various Package.pp scripts will define the
+  following ppremake variables appropriately:
+
+    DTOOL_INSTALL
+    PANDA_INSTALL
+    DIRECT_INSTALL
+    (etc).
+
+  The above indicate the directories in which files from each tree
+  should be installed.  In the normal philosophy, these will all
+  contain the same string, the same thing specified by INSTALL_DIR.
+
+    DTOOL_INSTALL_OTHER
+    PANDA_INSTALL_OTHER
+    DIRECT_INSTALL_OTHER
+    (etc).
+
+  These variables have the same meaning as the above, except that they
+  are intended to be used from a different package.  That is, if code
+  in the Panda source tree needs to reference an installed file from
+  Dtool, it should expect to find it in $[DTOOL_INSTALL_OTHER].