chiark / gitweb /
docs: Improve docs.
[subdirmk.git] / README
diff --git a/README b/README
index de97486ea09174f267830bc171a4751a8c740a58..ef839d56d9e7669abf3143e172ab0efbcb334f3a 100644 (file)
--- a/README
+++ b/README
@@ -28,15 +28,17 @@ Basic approach
 The developer is expected to write a makefile fragment, in each
 relevant subdirectory, called `Subdir.sd.mk'.
 
 The developer is expected to write a makefile fragment, in each
 relevant subdirectory, called `Subdir.sd.mk'.
 
-These fragments may contain ordinary make language.
+These fragments may contain ordinary make language.  Unqualified
+filenames are relative to the build toplevel, and all commands all run
+there.
 
 However, the sigil & is treated specially.  By and large, it refers to
 
 However, the sigil & is treated specially.  By and large, it refers to
-`the current directory'.  There are a variety of convenient
-constructions.
+`the build directory corresponding to this .sd.mk file', etc.
+There are a variety of convenient constructions.
 
 The result is that to a large extent, the Subdir.sd.mk has an easy way
 to namespace its "local" make variables, and an easy way to refer to
 
 The result is that to a large extent, the Subdir.sd.mk has an easy way
 to namespace its "local" make variables, and an easy way to refer to
-its "local" filenames.
+its "local" filenames (and filenames in general).
 
 The Subdir.sd.mk's are filtered, fed through autoconf in the usual way
 (for @..@-substitutions) and included by one autogenerated toplevel
 
 The Subdir.sd.mk's are filtered, fed through autoconf in the usual way
 (for @..@-substitutions) and included by one autogenerated toplevel
@@ -138,32 +140,42 @@ 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.
 
 automatic regeneration for all of this template substitution, and for
 config.status etc. is done for you.
 
-Summary of recommended directory reference syntaxes
----------------------------------------------------
+Tables of file reference syntaxes
+---------------------------------
 
 
-Path construction &-expansions, meanings summary:
+In a nonrecursive makefile supporting out of tree builds there are
+three separate important distinctions between different file
+locations:
 
 
-                      In build tree            In source tree
-  This directory      just &                   &,
-  Top level           &.  implies absolute     &;
+ (i) In the build tree, or in the source tree ?
 
 
-Adding `@' means "absolute path".  This is not needed with &. because
-there is never any need to use &. since it would expand to nothing.
-`/' terminates the escape (needed if the next thing is not a lowercase
-character, or space).  `=' means "just the value, no /".  Space starts
-multi-word processing.
+ (ii) In (or relative to) the subdirectory to which this Subdir.sd.mk
+     relates, or relative to the project's top level ?
 
 
-      Recommended     In build tree             In source tree
-             when     Relative  Absolute        Relative     Absolute
-                                          
-  This       lc       &file     &@file          &,file       &@,file
-  directory  any      &/file    &@/file         &,/file      &@,/file
-             several  & f g h   &@ f g h        &, f g h     &@, f g h
+ (iii) Absolute or relative pathname ?
+     (Usually relative pathnames suffice.)
 
 
-  Top        lc                 &.file          &;file       &@;file
-  level      any      file      &./file         &;/file      &@;/file
-             several  f g h     &. f g h        &; f g h     &@; f g h
-             .mk.in   file      $(abs)/file     $(src)/file  $(abs_src)/file
+Path construction &-expansions are built from the following:
+
+                      Relative paths in...   Absolute paths in...
+                      build     source       build           source
+                                                       
+  This directory      &         &,           &@              &@,
+  Top level           .         &;           &@.             &@;
+
+In more detail, with the various options for what comes next:
+
+      Recommended     Relative paths in...   Absolute paths in...
+             for      build     source       build           source
+                                                       
+  This       lc       &file     &,file       &@file          &@,file
+  directory  any      &/file    &,/file      &@/file         &@,/file
+             several  & f g h   &, f g h     &@ f g h        &@, f g h
+                                             
+  Top        lc       file      &;file       &@.file         &@;file
+  level      any      file      &;/file      &@./file        &@;/file
+             several  f g h     &; f g h     &@. f g h       &@; f g h
+             .mk.in   file      $(src)/file  $(abs)/file     $(abs_src)/file
 
 Substitution syntax
 -------------------
 
 Substitution syntax
 -------------------
@@ -194,24 +206,43 @@ empty string).
 
 &/             =>      sub/dir/                        or nothing
 &=/            =>      sub/dir                         or .
 
 &/             =>      sub/dir/                        or nothing
 &=/            =>      sub/dir                         or .
-&^             =>      $(top_srcdir)/sub/dir           or $(top_srcdir)
-&~             =>      $(abs_top_srcdir)/sub/dir       or $(abs_top_srcdir)
+
+&,lc   => $(top_srcdir)/sub/dir/lc       &,/   => $(top_srcdir)/sub/dir/
+&;lc   => $(top_srcdir)/lc               &;/   => $(top_srcdir)/
+
+&@lc   => $(PWD)/sub/dir/lc              &@/   => $(PWD)/sub/dir/
+&@.lc  => $(PWD)/lc                      &@./  => $(PWD)/
+&@,lc  => $(abs_top_srcdir)/sub/dir/lc   &@,/  => $(abs_top_srcdir)/sub/dir/
+&@;lc  => $(abs_top_srcdir)/lc           &@;/  => $(abs_top_srcdir)/
 
 In general:
 
 In general:
-        ^       filenames in source tree rather than build tree
-        ~       filenames are absolute rather than relative
-        @       filenames do not contain subdir (useful with the above)
+    =  return subdir without delimiter (not allowed with `,' `;' `@')
+    ,   pathname of this subdirectory in source tree
+    ;   pathname of top level of source tree
+    .   pathname of this directory in build tree, `@' must be specified
+    @   absolute pathnames
+    /  terminates the escape (needed if next is not lwsp or space)
+  lwsp  starts multi-word processing (see below)
+
+So pathname syntax is a subset of:
+    '&' [ '@' ] [ ',' | ';' | '.' ] [ lc | '/' ]
+
+    To avoid incomprehensible .sd.mk files, some combinations are not
+    allowed.  For example `&=./' would mean `.' and `&./' would be the
+    empty string.  Variations with `=' and one of `@' `,' `;' are
+    uncommon and must be written using make variables instead.
 
 &&             =>      &&              for convenience in shell runes
 \&             =>      &               general escaping mechanism
 
 
 &&             =>      &&              for convenience in shell runes
 \&             =>      &               general escaping mechanism
 
-& thing thing... &
-& ^ thing thing... &
-& ~ thing thing... &
+& thing thing... &     &@ thing thing... &
+                       &. thing thing... &
+&, thing thing... &     &@, thing thing... &
+&; thing thing... &     &@; thing thing... &
        Convenience syntax for prefixing multiple filenames.
        Convenience syntax for prefixing multiple filenames.
-       Introduced by & followed by lwsp (space or tab).
-       Each lwsp-separated non-ws word is prefixed by &/ &^/ &~/
-       respectively.  No other & escapes are recognised.
+       Introduced by & followed by lwsp where lc could go.
+       Each lwsp-separated non-ws word is prefixed by &/ etc.
+        etc. respectively.  No other & escapes are recognised.
        This processing continues until & preceded by lwsp,
        or until EOL (the end of the line), or \ then EOL.
 
        This processing continues until & preceded by lwsp,
        or until EOL (the end of the line), or \ then EOL.