Skip to content

Latest commit

 

History

History
 
 

Master

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
The 'Master' invocation is the first time that 'make' is run on any
GNUmakefile in your project.

During the 'Master' invocation, gnustep-make determines exactly what
it needs to build.  For example, in the following GNUmakefile -

include $(GNUSTEP_MAKEFILES)/common.make

LIBRARY_NAME = libquantum
TOOL_NAME = create destroy

create_OBJC_FILES = create.m
destroy_OBJC_FILES = destroy.m
libquantum_OBJC_FILES = quantum.m

include $(GNUSTEP_MAKEFILES)/library.make
include $(GNUSTEP_MAKEFILES)/tool.make

the 'Master' invocation will determine that we need to perform the
following logically separated operations - 

type:library name:libquantum operation:all
type:tool    name:create     operation:all
type:tool    name:destroy    operation:all

It will then run an 'Instance' invocation for each of these tasks.
The 'Instance' invocation is a submake invocation, with some special
variables set telling it exactly what task it needs to perform out of
all the available ones.  The 'Instance' invocation will read the same
user GNUmakefile(s) as the 'Master' invocation, but will use different
system makefiles.  The 'Instance' invocation will actually include and
use all the code to perform the required tasks.

The role of the 'Master' invocation is very limited.  It needs to
determine which 'Instance' invocations to run, and then exit.

Please note that we have a 'Master' invocation per each GNUmakefile in
your project.  We have an 'Instance' invocation per each logically
separate thing to do in your project.

You might wonder why we use 'Instance' invocations at all, and why we
don't actually perform each instance task inside the 'Master'
invocation itself.  The explanation is very technical ... in a few
words, we can't because of limitations of make.  The problem is that
if you have multiple instances of the same type, say multiple
libraries or multiple tools or multiple yyys (or all of them), each
one might require an arbitrarily complex makefile code to be built,
which should change according to the value of xxx_ANY_VARIABLE_HERE,
where xxx is the library/tool/yyy name.  So we have the problem that
we need to execute the same makefile code with an arbitrary value of
xxx, for each xxx.  That is difficult to do in the same make
invocation, because the make grammar doesn't contain any looping
construct allowing us to include the same makefile multiple times, one
for each value of xxx.  What we do to work around this problem is, we
run a separate submake invocation per instance to be built.