Skip to content

roman-neuhauser/motoconf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NAME
   motoconf — Simple build configuration tool

SYNOPSIS
   motoconf -h | --help
   motoconf -c INPUT
   motoconf INPUT [project-options] [NAME=VALUE...]
   configure [project-options] [NAME=VALUE...]

DESCRIPTION
   motoconf is a simple build configuration tool influenced by autoconf(1).
   motoconf creates output files from user-supplied templates, substituting
   all occurrences of user-declared placeholders with their corresponding
   values.  The input script-provided defaults can be selectively overriden
   on the command line.  This interface deliberately mimics autoconf(1)
   -generated configure scripts.  The input script deliberately deviates
   from autoconf(1) being a POSIX sh(1) script using motoconf-provided
   functions.  It should open with a call to mtc_register, and close
   with mtc_populate Makefile or equivalent.

 Motoconf Options
   -c INPUT
         Create a file named configure in current working directory.

   -h  Display usage string.

   --help
         Display manual page.

 Project Options
   These options, if provided, must come after the INPUT argument.

   --prefix=DIR, --exec-prefix=DIR, --bindir=DIR, --sbindir=DIR,
   --libexecdir=DIR, --datarootdir=DIR, --datadir=DIR,
   --sysconfdir=DIR, --sharedstatedir=DIR, --localstatedir=DIR,
   --includedir=DIR, --docdir=DIR, --infodir=DIR, --htmldir=DIR,
   --dvidir=DIR, --pdfdir=DIR, --psdir=DIR, --libdir=DIR,
   --localedir=DIR, --mandir=DIR
       These options specify values of placeholders which define various
       installation paths for the configured package.  The placeholder names
       are constructed by stripping the leading dashes and replacing any
       inner dashes with underscores.  For example, --exec-prefix=/snafu
       sets the exec_prefix placeholder to /snafu.

       As in Autoconf, most of these directories are defined, by default,
       in terms of $prefix, $exec_prefix, and their subdirectories.

       As opposed to Autoconf , the default values are expanded eagerly,
       eg. when prefix='/snafu' then includedir='/snafu/include'
       rather than '${prefix}/include'.

       Default value of $prefix is /usr/local.

       --sysconfdir defaults to $prefix/etc; when $prefix is /usr,
       the default is /etc.

       --localstatedir defaults to $prefix/var; when $prefix is
       /usr, the default is /var.

       --docdir defaults to $datarootdir/doc.

 Placeholders
   Placeholders are @-delimited words (shell parameter names) occurring in
   output file templates.

   Builtin placeholders are PATH, srcdir, plus those defined by
   --prefix and related options.  @PATH@ is substituted with the value
   of $PATH, @srcdir@ is substituted with the result of

     $(dirname "$mtc_input")

   where $mtc_input is the path to INPUT,
   @prefix@ is substituted with the value given with --prefix,
   @bindir@ is substituted with the value given with --bindir,
   and so on.

   Custom placeholder names are registered in the input script with
   mtc_register.  Input script containing

     mtc_register -- string NAME VALUE

   instructs motoconf to replace, when copying output file templates into
   their destinations, all occurrences of @NAME@ with VALUE.

 Functions
   mtc_register -- KIND NAME VALUE [VALUE...] [-- KIND NAME VALUE [VALUE...]]...
       Takes a list of tuples, each introduced by two dashes (hyphens) and
       specifying rules for handling the value, the placeholder to replace
       in templates, and the value replacing it.

       KIND
         program
           NAME will be associated with the first VALUE which names
           an executable file.  If VALUE contains no slash, it is looked up
           in $PATH.  If none of the VALUEs match, motoconf aborts.
         string
           NAME will be associated with a string of given VALUEs
           separated by spaces.
       NAME
         Placeholder name.
       VALUE
         Any string.

   mtc_first_in_path FILE...
       Takes a list of filenames, and returns the first that could be found
       in $PATH.

   mtc_create_script DEST [SOURCE]
       Clobbers DEST with the result of placeholder substitutions applied
       to the contents of SOURCE or the standard input if omitted,
       and makes DEST executable.  SOURCE is understood to be relative
       to input script's parent directory, unless it is - in which case
       the standard input is used, or the pathname as given starts with ./,
       in which case it is relative to $PWD.

   mtc_populate DEST [SOURCE]
       Clobbers DEST with the result of placeholder substitutions applied
       to the contents of SOURCE or $srcdir/DEST.in if omitted.
       SOURCE is understood to be relative to input script's parent
       directory, unless it is - in whch case the standard input is used,
       or the pathname as given starts with ./, in which case it is
       relative to $PWD.

EXIT STATUS
   The motoconf utility exits 0 on success, and >0 if an error occurs.

EXAMPLES
   The entire input script (moto.conf):

     mtc_register \
       -- program CC gcc clang \
       -- string CFLAGS "-std=c99 -fPIC -Wall -Wextra -Wfatal-errors" \
       -- string CPPFLAGS "-D_POSIX_C_SOURCE=200809L" \
       -- program LD "$CC" \
       -- string LDFLAGS "" \
       -- string LIBS "" \
       -- program CRAMCMD cram cram3 cram2 \
       -- program RST2HTMLCMD rst2html rst2html.py \
       -- string RST2HTML --strict

     mtc_create_script mk-obj <<-'EOF'
             #!/bin/sh
             target="$1"; shift
             exec @CC@ @CPPFLAGS@ @CFLAGS@ -c -o"$target" "$@"
     EOF
     mtc_create_script mk-exe <<-'EOF'
             #!/bin/sh
             target="$1"; shift
             exec @LD@ @LDFLAGS@ -L"$PWD" -o"$target" "$@" @LIBS@
     EOF
     mtc_create_script mk-so <<-'EOF'
             #!/bin/sh
             target="$1"; shift
             exec @LD@ --shared -Wl,--soname="$target" @LDFLAGS@ -o"$target" "$@" @LIBS@
     EOF
     mtc_create_script mk-html <<-'EOF'
             #!/bin/sh
             exec @RST2HTMLCMD@ @RST2HTML@ "$@"
     EOF
     mtc_create_script mk-runtests <<-'EOF'
             #!/bin/sh
             exec env -i CRAM="$CRAM" PATH="@PATH@:@srcdir@/tests:$PWD" @CRAMCMD@ @srcdir@/tests
     EOF

     mtc_populate GNUmakefile

   GNUmakefile.in, used by the mtc_populate call at the end of moto.conf would
   include the following rules:

     VPATH = @srcdir@

     check:
             ./mk-runtests
     %.html: %.rest
             ./mk-html $< $@
     %.o: %.c
             ./mk-obj $@ $^
     $(name): $(objects_exe) $(canonical)
             ./mk-exe $@ $(objects_exe) -l$(name)
     $(soname): $(objects_lib)
             ./mk-so $@ $(objects_lib)
     $(canonical): $(soname)
             ln -sf $< $@

   The above inputs would be used in

     % motoconf moto.conf

   to generate GNUmakefile as well as the auxiliary tools (mk-runtests,
   mk-html, mk-obj, mk-exe, mk-so).

SEE ALSO
   autoconf(1), make(1), sh(1).

AUTHORS
   Roman Neuhauser <neuhauser+motoconf@sigpipe.cz>
         https://github.com/roman-neuhauser/motoconf/

BUGS
   No doubt plentiful.  Please report them at
         https://github.com/roman-neuhauser/motoconf/issues

About

Simple build configuration tool

Resources

License

Stars

Watchers

Forks

Packages

No packages published