X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=README;h=91b62d481de802a297f86cf7de5c3613ee215762;hb=refs%2Fheads%2Fwip.v2b;hp=6c9e76b626d1087ce23b8488b1b784ec2f67c06e;hpb=afecfed56c97d5870f82706e84db5473c5f383f4;p=subdirmk.git diff --git a/README b/README index 6c9e76b..91b62d4 100644 --- a/README +++ b/README @@ -183,7 +183,7 @@ In more detail, with all the various options laid out: for build source build source This lc &file &^file $(PWD)/&file $(abs_src)/&file - directory any &/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 @@ -197,9 +197,8 @@ 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. +In general & expands to the subdirectory name. (`/' is legal in make +variable names.) Note that & is processed *even in makefile comments*. The substitutor does not understand make syntax, or shell syntax, at all. However, @@ -209,45 +208,51 @@ are common in makefiles. In the notation below, we suppose that the substitution is being in done in a subdirectory sub/dir of the source tree. In the RH column we describe the expansion at the top level, which is often a special -case (in general in variable names we call that TOP rather than the -empty string). +case. (Even in variable names: top level's start `./'.) -&CAPS => sub_dir_CAPS or TOP_CAPS -&lc => sub/dir/lc or lc - Here CAPS is any ASCII letter A-Z and lc is a-z. - The assumption is that filenames are usually lowercase and - variables usually uppercase. Otherwise, use another syntax: - -&_ => sub_dir_ or TOP_ -&=_ => sub_dir or TOP +&alpha => sub/dir/alpha or ./alpha + Here alpha is any ASCII letter A-Za-z. + The assumption is that filenames and variables usually + start with a letter. Otherwise, use another syntax: &/ => sub/dir/ or nothing -&=/ => sub/dir or . +&. => sub/dir or . + (This implies that `&./' works much like `&/'. &./ is + suitable for variable name construction in a way &/ is not.) -&^lc => $(top_srcdir)/sub/dir/lc +&^alpha => $(top_srcdir)/sub/dir/alpha &^/ => $(top_srcdir)/sub/dir/ +&^. => $(top_srcdir)/sub/dir -&~lc => $(top_srcdir)/lc +&~alpha => $(top_srcdir)/alpha &~/ => $(top_srcdir)/ +&~. => $(top_srcdir) In general: - = return subdir without delimiter (not allowed with `,' `;') - , pathname of this subdirectory in source tree - ; pathname of top level of source tree - / terminates the escape (needed if next is not lwsp or space) + ^ pathname of this subdirectory in source tree + ~ pathname of top level of source tree + / terminates the escape (needed if next is not lwsp, alpha or `.') + . terminates the escape, gives subdir without / lwsp starts multi-word processing (see below) -So pathname syntax is a subset of: - '&' [ ',' | ';' ] [ lc | '/' ] +&_ => ERROR (for compat with v1) + +So pathname and variable syntax is a subset of: + '&' [ '^' | '~' ] [ alpha... | '/' | '.' ] && => && for convenience in shell runes -\& => & general escaping mechanism +&@ => & general escaping mechanism +&&@ => && @ after any number of & vanishes -& thing thing... & +&$VARIABLE $(sub/dir/VARIABLE) + VARIABLE is ASCII starting with a letter and matching \w+ + +& thing thing... & +&/ thing thing... & &^ thing thing... & &~ thing thing... & Convenience syntax for prefixing multiple filenames. - Introduced by & followed by lwsp where lc could go. + Introduced by &... followed by lwsp where alpha 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, @@ -261,16 +266,29 @@ So pathname syntax is a subset of: &:-include filename tolerate nonexistent file filenames are relative to $(top_srcdir) +&:section number [ident] + Sections will be read by make in order, first by number + and only then by input file (in order passed + to generate ie that specified in configure.ac). + Number is \d+; order is lexical. + Default section number is `5'. + Section numbers may not contain only `0'. + Section is local to &:include'd files (reset to `5' + on entry, restored on return). + Ident is [A-Za-z][A-Z0-9a-z/_-]+ and is currently unused, + other than appearing in output. When used, will default + to source-relative input file name excluding .sd.mk. + &! disables & until EOL (and then disappears) &# delete everything to end of line (useful if the RHS contains unrecognised & constructions) -&!STUFF +&:changequote STUFF changes the escape sequence from & to literally STUFF STUFF may be any series of of non-whitespace characters, - and is terminated by EOL or lwsp. &!STUFF and the lwsp - are discarded. + and is terminated by EOL or lwsp. The whole line is + discarded. After this, write STUFF instead of &, everywhere. The effect is global and lasts until the next setting. @@ -278,12 +296,13 @@ So pathname syntax is a subset of: it back before using &:include. Notably - STUFFSTUFF => STUFFSTUFF - \STUFF => STUFF - STUFF!& set escape back to & + STUFFSTUFF => STUFFSTUFF + STUFF@ => STUFF + STUFF:changequote & => set escape back to & &TARGETS_things - Handled specially. If mentioned, declares that this + Handled specially. If mentioned at the start of a line + (possibly following whitespace), declares that this subdir ought to have a target `things'. The rule will be &/things:: $(&TARGETS_things) @@ -296,14 +315,40 @@ So pathname syntax is a subset of: arranges that the *parent* will also have a `things' target which recursively implies this directory's `things'. - Must be spelled exactly &TARGETS_things. &_TARGETS_things, - for example, is not magic. But mentioning &TARGETS_things in - a #-comment *does* work because the & filter does not care - about comments. + Must be spelled exactly &TARGETS_things. &/TARGETS_things, + for example, is not magic. To make the target exist + without providing any prerequisites for it, write a line + containing just `&TARGETS_things +='. `all' is extra special: every directory has an `all' target, which corresponds to &TARGETS. +DRAFT - MACRO ASSISTANCE FACILITY +--------------------------------- + +Thanks to Mark Wooding. + + &:macro NAME + STUFF + &:endm + +expands to + + define %NAME + STUFF (with `$'s doubled except before a digit) + endef + NAME = $(eval $(call %NAME,$1,$2,$3,$4,$5,$6,$7,$8,$9)) + +and + + &(NAME ARG,ARG,...) + +expands to + + $(call NAME,ARG,ARG,...) + +with `$'s doubled. + Subdirectory and variable naming -------------------------------- @@ -312,13 +357,10 @@ namespace distinction between parts of variable names which come from subdirectory names, and parts that mean something else. So it is a good idea to be a bit careful with your directory naming. -`TOP', names that contain `_', and names that are similar to parts of +`.', names that contain `/', and names that are similar to parts of make variables (whether conventional ones, or ones used in your project) are best avoided. -If you name your variables in ALL CAPS and your subdirectories in -lower case with `-' rather than `_', there will be no confusion. - Incorporating this into your project ------------------------------------