chiark / gitweb /
README: Explain a wrinkle in &:include filename semantics
[subdirmk.git] / README
diff --git a/README b/README
index be1ece7c3d09e40d89170e7d0cb919e343f1369b..b812f2782b06557d43101f1a642ebdf65570a018 100644 (file)
--- a/README
+++ b/README
@@ -20,7 +20,7 @@ style is not very ergonomic.  The main difficulties are:
 
 `subdirmk' is an attempt to solve these problems (and it also slightly
 alleviates some of the boilerplate needed to support out-of-tree
-builds well).
+builds well, and helps a bit with metaprogramming and rule writing).
 
 Basic approach
 --------------
@@ -158,53 +158,13 @@ If you `include subdirmk/regen.mk', dependency management and
 automatic regeneration for all of this template substitution, and for
 config.status etc. is done for you.
 
-Tables of file reference syntaxes
----------------------------------
-
-In a nonrecursive makefile supporting out of tree builds there are
-three separate important distinctions between different file
-locations:
-
- (i) In the build tree, or in the source tree ?
-
- (ii) In (or relative to) the subdirectory to which this Dir.sd.mk
-     relates, or relative to the project's top level ?
-
- (iii) Absolute or relative pathname ?  Usually relative pathnames
-     suffice.  Where an absolute pathname is needed, it can be built
-     out of &/ and an appropriate make variable such as $(PWD).
-
-Path construction &-expansions are built from the following:
-
-                      Relative paths in...
-                      build     source
-                                                       
-  This directory      &         &^
-  Top level           .         &~
-
-In more detail, with all the various options laid out:
-
-      Recommended     Relative paths in...   Absolute paths in...
-             for      build     source       build         source
-                                                       
-  This       lc       &file     &^file       $(PWD)/&file  $(abs_src)/&file
-  directory  any      &/file    &^/file      $(PWD)/&/file $(abs_src)/&/file
-             several  & f g h   &^ f g h     $(addprefix...)
-                                             
-  Top        lc       file      &~file
-  level      any      file      &~/file      $(PWD)/file   $(abs_src)/file
-             .mk.in   file      $(src)/file  $(PWD)/file   $(abs_src)/file
-             several  f g h     &~ f g h     $(addprefix...)
-
-(This assumes you have appropriate make variables src, PWD and
-abs_src.)
-
 Substitution syntax
 -------------------
 
 In general & expands to the subdirectory name when used for a
 filename, and to the subdirectory name with / replaced with _ for
-variable names.
+variable names.  (If your variables start with capital letters and
+your filenames with lowercase.  Otherwise, use &/ or &_.)
 
 Note that & is processed *even in makefile comments*.  The substitutor
 does not understand make syntax, or shell syntax, at all.  However,
@@ -243,13 +203,13 @@ In general:
     ^   pathname of this subdirectory in source tree
     ~   pathname of top level of source tree
     /  terminates the path escape } needed if next is
-    _   terminates the var escape  } not lwsp or space)
+    _   terminates the var escape  } not letter or space)
     .   terminates path escape giving dir name (excluding /)
     =  terminates var escape giving only prefix part (rarely needed)
   lwsp  starts multi-word processing (see below)
 
 So pathname syntax is a subset of:
-    '&' [ '^' | '~' ] [ lc | '/' | '.' | '=' ]
+    '&' [ '^' | '~' ] [ lc | '/' | '.' ]
 
 &&             =>      &&              for convenience in shell runes
 
@@ -275,8 +235,11 @@ So pathname syntax is a subset of:
 
 &:include filename             filename should usually be [&]foo.sd.mk
 &:-include filename            tolerate nonexistent file
-       filenames are relative to $(top_srcdir)
-       RHS is &-expanded
+       RHS is &-expanded but filenames are relative to the top
+       srcdir.  This implies that unqualified names are like &~/
+       whereas &/ is like &^/.  &^ and &~ do not work here because
+       they expand to constructions involving literally
+       `$(top_srcdir)', but the RHS is not make-expanded.
 
 &!<lwsp>       disables & until EOL (and then disappears)
 
@@ -290,7 +253,8 @@ So pathname syntax is a subset of:
        discarded.
 
        After this, write NEWQUOTE instead of &, everywhere.
-       The effect is global and lasts until the next setting.
+       The effect is unscoped and lasts until the next setting,
+       or until the end of the current directory's Suffix.sd.mk.
        It takes effect on &:include'd files too, so maybe set
        it back before using &:include.
 
@@ -363,6 +327,51 @@ $  =>      $$      including $'s produced by other
 &$NN   =>      $(NN)   where N are digits
 &$(    =>      $(
 
+A few contexts do not support $-doubling, such as directive arguments
+or places where this might imply $-quadrupling.  (There is no way to
+get $-quadrupling.)
+
+
+Tables of file reference syntaxes
+---------------------------------
+
+In a nonrecursive makefile supporting out of tree builds there are
+three separate important distinctions between different file
+locations:
+
+ (i) In the build tree, or in the source tree ?
+
+ (ii) In (or relative to) the subdirectory to which this Dir.sd.mk
+     relates, or relative to the project's top level ?
+
+ (iii) Absolute or relative pathname ?  Usually relative pathnames
+     suffice.  Where an absolute pathname is needed, it can be built
+     out of &/ and an appropriate make variable such as $(PWD).
+
+Path construction &-expansions are built from the following:
+
+                      Relative paths in...
+                      build     source
+                                                       
+  This directory      &         &^
+  Top level           .         &~
+
+In more detail, with all the various options laid out:
+
+      Recommended     Relative paths in...   Absolute paths in...
+             for      build     source       build         source
+                                                       
+  This       lc       &file     &^file       $(PWD)/&file  $(abs_src)/&file
+  directory  any      &/file    &^/file      $(PWD)/&/file $(abs_src)/&/file
+             several  & f g h   &^ f g h     $(addprefix...)
+                                             
+  Top        lc       file      &~file
+  level      any      file      &~/file      $(PWD)/file   $(abs_src)/file
+             .mk.in   file      $(src)/file  $(PWD)/file   $(abs_src)/file
+             several  f g h     &~ f g h     $(addprefix...)
+
+(This assumes you have appropriate make variables src, PWD and
+abs_src.)
 
 Subdirectory and variable naming
 --------------------------------
@@ -385,7 +394,7 @@ Incorporating this into your project
 Use `git-subtree' to merge the subdirmk/ directory.  You may find it
 useful to symlink the DEVELOPER-CERTIFICATE file (git can store
 symlinks as symlinks - just `git add' the link).  And you probably
-want to mention the situation in your top-level COPYING.
+want to mention the situation in your top-level COPYING and HACKING.
 
 Symlink autogen.sh into your project toplevel.
 
@@ -414,9 +423,10 @@ Makefile.in and rename it to Dir.sd.mk, and add the appropriate
 stuff to configure.ac, and fix everything up.  Leave the existing
 $(MAKE) -C for your existing subdirectories alone.  Then you can
 convert individual subdirectories, or classes of subdirectories, at
-your leisure.  (You must be /sure/ that each subdirectory will be
-entered only once at a time, but your existing recursive make descent
-system should already do that or you already have concurrency bugs.)
+your leisure.  (You must be /sure/ that each recursive (non-subdirmk)
+subdirectory will be entered only once at a time, but your existing
+recursive make descent system should already do that or you already
+have concurrency bugs.)
 
 Aside from this, be very wary of any invocation of $(MAKE) anywhere.
 This is a frequent source of concurrency bugs in recursive make build