Provided by: mymake_2.2.1-1_amd64 bug

NAME

       mymake - simple build system for C/C++

SYNOPSIS

       mymake  [-?] [-f] [-c] [-e] [-ne] [-p path] [-j processes] [-o output] [-d level] [--default-input input]
       [files]... [options]... [-a args...]
       mymake --config
       mymake --target
       mymake --project

DESCRIPTION

       The mymake program builds C/C++ programs. It aims to be able to build simple  programs  (referred  to  as
       targets)  with  close  to  zero  configuration,  yet  be powerful enough to handle larger programs as the
       initially simple project grows.

       Once installed, run

              mymake --config

       to generate the global configuration file for the current user. This file specifies how to compile  C/C++
       programs  on  the  current  system, and defines the default parameters that can be used in other files as
       described below. The default contents are typically sufficient.

       After the initial configuration, a simple program can be compiled by  navigating  to  the  directory  the
       source code of the program and typing

              mymake myprogram.cpp

       This  will  compile  and  link  the  program  using the configuration in the global configuration, and if
       compilation is successful also execute the program. Command-line parameters may be passed to the  program
       using the -a parameter

              mymake myprogram.cpp -a param1 param2...

       The  default  behavior also works with programs consisting of multiple files. mm examines which files are
       included in the source file specified on the command-line and compiles those files as well. This is based
       on the assumption that if the file utils.h is included, then the file utils.cpp should also  be  compiled
       (if  it  exists).  Of  course, different extensions than .cpp are also examined. As is typically the case
       with other build systems, only files changed since the last build are rebuilt.

       If the program being compiled does not follow the assumption that header files and  implementation  files
       appear  pairwise,  it  is  possible  to create a file called .mymake in the project directory and add the
       following to it

              []
              input=*

       This instructs mymake to include all implementation files in the compilation, regardless  of  whether  or
       not  they are considered to be needed by the program or not. It is also possible to add a particular file
       to the input statement (e.g. myprogram.cpp). In both cases, it will no longer be necessary to  specify  a
       file on the command line.

       As  the  project  grows,  it  is  also possible to divide the project into separate sub-projects and have
       mymake manage dependencies automatically. This is  done  by  creating  a  .myproject  file  in  the  root
       directory  of  the  project.  This  tells mymake to treat all directories as sub-projects, each which may
       contain their own .mymake file. See CONFIGURATION for details.

OPTIONS

       The usual GNU command line syntax is respected, with long options starting with two  dashes  (`-').  Long
       options are equivalent to short options.

       -?, --help
              Print a message outlining basic usage and command-line options.

       -f, --force
              Force  re-compilation  of  all required files, even files that would otherwise be considered to be
              up-to-date. This is useful if the configuration files were changed, for example.

       -c, --clean
              Clean build files by removing the execDir and buildDir indicated by the configuration based on any
              options specified.

       -e, --execute
              Execute the executable after successfully building a target. The  default  configuration  executes
              the  program,  but  this  behavior  may be overridden by project-specific configuration files. The
              command-line parameters overrides all configuration files.

       -ne, --not --execute
              Do not execute the executable after a successful build. The inverse of -f.

       -p, --exec-path
              Specify the working directory when running the compiled executable. The default value is the  path
              of the project to which the executable belongs.

       -j processes, --threads processes
              Spawn up to the specified number of processes in parallel during compilation. This typically means
              that  compilation  may  use  up to the specified number of hardware threads. This is typically not
              needed, as the user's preference is specified in the global configuration file.

       -o output, --output output
              Specify the name of the output file (note: not the location). This can be  used  to  override  the
              default behavior, but this is better done in one of the configuration files.

       -d level, --debug level
              Specify  the  debug level, either as a number or as the associated label. The following levels are
              available:

              0: QUIET
                     No output except for fatal errors.

              1: NORMAL
                     The default value. Outputs progress information.

              2: PEDANTIC
                     Warns about configuration issues that might be errors. Useful as a first step in  debugging
                     configurations.

              3: INFO
                     Prints information about decisions during the build. Good for debugging configurations.

              4: VERBOSE
                     All information you will typically need when debugging configuration issues.

              5: DEBUG
                     Information typically only needed when debugging mymake itself.

       --default-input input
              Add  input as an input file if no other inputs were specified either on the command line or in any
              configuration files. This option is intended to be used when integrating mymake in an editor.  The
              editor  may  then  always  supply  the  name of the current open file as a --default-input to make
              mymake do the right thing based on configurations: compiling the current file if nothing  else  is
              specified, otherwise follow the other, more precise instructions in the configuration files.

       [options]
              Zero  or  more  options may also be specified on the command line. These options may correspond to
              sections in one of the configuration files to enable (or disable). See the  CONFIGURATION  section
              below for details.

       [files]
              Files  may  also  be  specified  on the command line. Mymake will add all names that correspond to
              existing files (possibly first appending known file extensions) to the  list  of  input  files  to
              process.

       --config
              Create  the  global  configuration  in  ~/.mymake.  This  can  also  be  used to revert the global
              configuration to the default state. Will ask for the preferred number of  threads  to  use  during
              compilation.

       --target
              Creates the file .mymake in the current directory. It fills the file with a template configuration
              that contains common options and settings.

       --project
              Creates  the file .myproject in the current directory. The file contains a template suitable for a
              project, i.e. a directory consisting of multiple targets.

CONFIGURATION

       The configuration in mymake consists of a set of named variables, each  of  which  contain  an  array  of
       strings.  The  value  of  these  variables may originate from one (or more) of four locations: the global
       configuration (~/.mymake), the project configuration (.myproject, if present), the  target  configuration
       (.mymake,  if  present),  or  the  command-line.  The project and target configurations may reside in the
       current directory, or any parent directories. If a project configuration is found, target  configurations
       are expected to be located in sub-directories to the project configuration. Options are always applied in
       the order specified above. This means that options in the global configuration may be overridden by other
       configurations,  and  that  the  command-line  parameters  are always applied last. The exception is when
       compiling a project.  Then,  command  line  parameters  are  only  applied  when  resolving  the  project
       configuration, not when resolving the configuration for individual targets.

       All  configuration  files  follow  the  same  format.  They  all  consist of a sequence of assignments to
       variables, optionally grouped into  zero  or  more  sections.  Lines  starting  with  `#'  are  comments.
       Assignments have one of the following two forms:

              name=value
              name+=value

       The  first form replaces the entire contents of the variable with the string value, while the second adds
       value as the last element of the array. As a special case, if the first form is used, and value is empty,
       the variable is assigned the empty array. Assignments may be grouped  into  sections  by  adding  section
       headers before them. A section header has the following form:

              [option1,option2,...]

       The  meaning of the section header is: only consider the following assignments if all options that appear
       in the header are present in the context in which the configuration is evaluated (e.g. specified  on  the
       command line). Thus, the header [] is always evaluated, [release] is only evaluated if the release option
       has  been  specified, and [release,unix] only if both release and unix have been specified. Additionally,
       an option may be prefixed with an `!' to mean that the particular option has to be absent,  for  example:
       [!release,unix].

       Each configuration file is then evaluated by mymake in turn to provide the set of variables to use during
       compilation.  This  is  done  by evaluating each assignment in each file in the order they are specified,
       ignoring any sections that should be skipped according to the available options. Typically, each file  is
       only  evaluated  once,  with  a  context  consisting  of  the  options specified on the command-line. The
       exception is .myproject-files, which are covered in the PROJECTS section below.

PRE-DEFINED OPTIONS

       The following options are pre-defined by mymake or the default configuration, and can be used by default:

       release
              Produce a release version of  the  program.  This  typically  means  turning  on  more  aggressive
              optimizations.

       lib    Produces  a static library. Typically used in projects when some targets are static libraries used
              by other targets in the project.

       sharedlibe
              Produces a dynamic library. Typically used in projects, like lib.

       unix   Defined by mymake when compiling for a UNIX-like system.

       windows
              Defined by mymake when compiling for a Windows-like system.

       project
              Defined automatically when evaluating the .myproject file in the project context.

       build  Defined automatically when evaluating the .myproject file to find options for  the  targets  in  a
              project.

       deps   Defined  automatically  when  evaluating the .myproject file to find explicit dependencies between
              projects.

VARIABLES

       The following variables are used by mymake to define what should be done. Some  of  these  variables  are
       treated  specially  by mymake itself, others are just defined by the global configuration. It is possible
       to define and use other variables in configuration files.

       ext    Array of the file extensions you want to compile. Whenever mymake realizes you have included  x.h,
              looks for all extensions in ext and tries them to find the corresponding implementation file.

       execExt
              File extension of executable files. Added to the output filename automatically.

       intermediateExt
              File extension of intermediate files. Typically .o on UNIX systems.

       buildDir
              String  containing  the  directory  used  to store all temporary files when building your program.
              Relative to the root directory of the target (i.e. where the .mymake file is).

       execDir
              String containing the directory used to store the final output (the executable)  of  all  targets.
              Relative to the root directory of the target.

       ignore Array  of  wildcard  patterns  (like  in  the  shell)  that determines if a certain file should be
              ignored. Useful when working with templates sometimes, or when parts of the source code should not
              be compiled.

       noIncludes
              Array of wildcard patterns (like in the shell) that determines if a certain  path  should  not  be
              scanned  for headers. Useful when you want to parts of the code that is not C/C++, where it is not
              meaningful to look for #include.

       input  Array of file names to use as roots when looking for files that needs  to  be  compiled.  Anything
              that  is  not  an  option  that is specified on the command line is appended to this variable. The
              special value * can be used to indicate that all files with  an  extension  in  the  ext  variable
              should be compiled. This is usually what you want when you are compiling a library of some kind.

       output String  specifying the name of the output file. If not specified, the name of the first input file
              is used instead.

       appendExt
              Append the original extension of the original source file to the intermediate file when compiling.
              This allows mymake to compile projects where there are multiple files with  the  same  name,  e.g.
              foo.cpp  and  foo.c  without  both trying to create foo.o and thereby causing compilation to fail.
              Mymake warns you if you might need to add use this option.

       include
              Array of paths that should be added to the include path of the compilation.

       includeCl
              Flag to prepend all elements in include.

       includes
              Generated automatically by mymake, equivalent to adding the  contents  of  includeCl  before  each
              element in include.

       library
              Array of system libraries that should be linked to your executable.

       libraryCl
              Flag to prepend all elements in library.

       localLibrary
              Array of local libraries that should be linked to your executable (usually used in a project).

       localLibraryCl
              Flag to prepend all elements in localLibrary.

       libs   Automatically  generated by mymake, equivalent to adding libraryCl before all elements of library,
              also including local libraries.

       define Preprocessor defines.

       defineCl
              Preprocessor define flag.

       exceute
              Yes or no, telling if mymake should execute the program after a successful compilation.  This  can
              be overridden on the command line using -e or -ne.

       pch    The  precompiled header file name that should be used. If you are using the default configuration,
              you only need to set this variable to use precompiled headers. If you are using  #pragma  once  in
              gcc,  you  will  sadly  get  a  warning that seems impossible to disable (it is not a problem when
              precompiling headers).

       pchFile
              The name of the compiled version of the file in pch.

       pchCompile
              Command line for compiling the precompiled header file.

       pchCompileCombined
              If set to yes, pchCompile is expected to generate both the pch-file and compile a .cpp-file.

       preBuild
              Array of command-lines that should be executed before the build is started. Expands variables.

       preBuildCreates
              Array of files created by the pre-build step which should also be  included  in  the  compilation.
              These  are expected not to introduce any additional dependencies into the project, as they are not
              available at the point where mymake resolves dependencies between files and targets.

       postBuild
              Array of command-lines that should be executed after the build is completed. Expands variables.

       compile
              Array of command lines to use when compiling files.  Each  command  line  starts  with  a  pattern
              (ending in :) that is matched against the file name to be compiled. The command line added last is
              checked  first,  and  the first matching command-line is used. Therefore it is useful to first add
              the general command-line (starting with *:), and then add more specific ones. Here,  you  can  use
              <file> for the input file and <output>.

       link   Command  line  used  when  linking  the  intermediate  files.  Use <files> for all input files and
              <output> for the output file-name.

       linkOutput
              Link the output of one target to any target that are dependent on that target.  See  projects  for
              more information.

       forwardDeps
              Forward any of this target's dependencies to any target that is dependent on this target.

       env    Set  environment  variables.  Each  of  the  elements  in  env  are  expected  to  be of the form:
              variable=value or variable<=value or variable=>value. The  first  form  replaces  the  environment
              variable  variable  with  value,  the  second  form  prepends value to variable using the system's
              separator (: on unix and ; on windows), the third form appends value to variable. The  second  and
              third forms are convenient when working with PATH for example.

       explicitTargets
              In projects: ignore any potential targets that do not have their own .mymake-file.

       parallel
              In  projects,  this  indicates  if  projects  that have all dependencies satisfied may be built in
              parallel. The default value is yes, so projects not tolerating parallel builds may set it  to  no.
              In  targets,  this indicates if files in targets may be built in parallel. If so, all input files,
              except precompiled headers, are built in parallel using up  to  maxThreads  threads  globally.  If
              specific  targets do not tolerate this, set parallel to no, and mymake will build those targets in
              serial.

       maxThreads
              Limits the global number  of  threads  (actually  processes)  used  to  build  the  project/target
              globally.

       usePrefix
              When building in parallel, add a prefix to the output corresponding to different targets. Defaults
              to  either  vc or gnu (depending on your system). If you set it to no, no prefix is added. vc adds
              n> before output, gnu adds pn: before output. This is so that Emacs recognizes the error  messages
              from the vc and the gnu compiler, respectively.

       absolutePath
              Send  absolute  paths  to the compiler, this helps emacs find proper source files in projects with
              multiple targets.

       implicitDeps
              (defaults to yes), if set, mymake tries to figure out dependencies between targets by  looking  at
              includes.  Sometimes, this results in unneeded circular dependencies, causing compilation to fail,
              so sometimes it is neccessary to set this to no.

VARIABLES IN STRINGS

       When  mymake  uses some variables (most notably, the compilation and link command lines) it looks at each
       string and recursively replaces any variables that appear there. Note that this  is  not  done  when  the
       configuration is evaluated, only when the variables are actually used.

       Any  occurrences of <variable> are replaced with the contents of variable. It is also possible to prepend
       a string to each element in another variable using the syntax <prefix*variable>,  which  means  that  the
       string in the variable prefix is prepended to each element in the variable variable.

       It  is also possible to perform an operation on each element in the array using the syntax <op|variable>.
       It is also possible to both perform an operation and prepend data using  <prefix*op|variable>.  Supported
       operations are:

       title  Treat  the  element  as  a  path  and  extract  the file or directory name (e.g. src/foo.txt gives
              foo.txt).

       titleNoExt
              Same as title, but the file extension is removed as well.

       noExt  Remove the file extension from a path.

       path   Format the element as a path for the current operating system. For example  src/foo.txt  evaluates
              to src\foo.txt on Windows.

       buildpath
              Make the element into a path inside the build path.

       execpath
              Make the element into a path inside the executable path.

       parent Evaluates  to the parent directory of the path. If no parent is given (e.g. only a file name), the
              element is removed from the array.

       if     Make all elements empty. This can be used to test if a variable contains a value and then  include
              some  other  text.  For  example  <usePch*if|pchFile>  to  add the flag inside usePch if a file is
              specified in pchFile.

PROJECTS

       A project is a collection of targets linked  together  by  a  .myproject-file.  The  .myproject  file  is
       evaluated multiple times with different options present to extract information about the project:

       build:  This  option  is specified during one evaluation to extract a list of options to apply to each of
       the sub-projects. Thus, a project file typically contains a section as follows:

              [build]
              main+=debug
              libfoo+=lib
              libfoo+=debug

       In this case, we instruct mymake to build the main target with the debug option present, and  the  target
       libfoo  with  the options debug and lib. There is also a special target, all, which options will apply to
       all targets in the project.

       deps: This option is specified during one evaluation to extract explicit dependencies  between  projects.
       By  default,  mymake  finds  dependences  between  projects  automatically  by  examining includes across
       projects. In certain cases it is, however, useful to introduce extra dependencies  to  ensure  that  some
       dynamically  loaded  parts  are  also  built.  This  section is very similar to the build section. Mymake
       expects to find variables corresponding to each target, and that these variables contains names of  other
       targets.

       If  one  target  results  in  a  library, it is convenient to set the variable linkOutput to yes for that
       target. Mymake will then add the output of the library target to the library variable of any targets that
       depend on it.

       After mymake has extracted the necessary project information, the .myproject-file is also evaluated  once
       for  each  target.  Thus,  it  is  possible  to specify additional variables or options that apply to all
       targets in the project in the .myproject file.

                                                  June 22 2021                                         MYMAKE(1)