169 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
Build Framework
 | 
						|
===============
 | 
						|
 | 
						|
The perf build framework was adopted from the kernel build system, hence the
 | 
						|
idea and the way how objects are built is the same.
 | 
						|
 | 
						|
Basically the user provides set of 'Build' files that list objects and
 | 
						|
directories to nest for specific target to be build.
 | 
						|
 | 
						|
Unlike the kernel we don't have a single build object 'obj-y' list that where
 | 
						|
we setup source objects, but we support more. This allows one 'Build' file to
 | 
						|
carry a sources list for multiple build objects.
 | 
						|
 | 
						|
 | 
						|
Build framework makefiles
 | 
						|
-------------------------
 | 
						|
 | 
						|
The build framework consists of 2 Makefiles:
 | 
						|
 | 
						|
  Build.include
 | 
						|
  Makefile.build
 | 
						|
 | 
						|
While the 'Build.include' file contains just some generic definitions, the
 | 
						|
'Makefile.build' file is the makefile used from the outside. It's
 | 
						|
interface/usage is following:
 | 
						|
 | 
						|
  $ make -f tools/build/Makefile.build srctree=$(KSRC) dir=$(DIR) obj=$(OBJECT)
 | 
						|
 | 
						|
where:
 | 
						|
 | 
						|
  KSRC   - is the path to kernel sources
 | 
						|
  DIR    - is the path to the project to be built
 | 
						|
  OBJECT - is the name of the build object
 | 
						|
 | 
						|
When succefully finished the $(DIR) directory contains the final object file
 | 
						|
called $(OBJECT)-in.o:
 | 
						|
 | 
						|
  $ ls $(DIR)/$(OBJECT)-in.o
 | 
						|
 | 
						|
which includes all compiled sources described in 'Build' makefiles.
 | 
						|
 | 
						|
 | 
						|
Build makefiles
 | 
						|
---------------
 | 
						|
 | 
						|
The user supplies 'Build' makefiles that contains a objects list, and connects
 | 
						|
the build to nested directories.
 | 
						|
 | 
						|
Assume we have the following project structure:
 | 
						|
 | 
						|
  ex/a.c
 | 
						|
    /b.c
 | 
						|
    /c.c
 | 
						|
    /d.c
 | 
						|
    /arch/e.c
 | 
						|
    /arch/f.c
 | 
						|
 | 
						|
Out of which you build the 'ex' binary ' and the 'libex.a' library:
 | 
						|
 | 
						|
  'ex'      - consists of 'a.o', 'b.o' and libex.a
 | 
						|
  'libex.a' - consists of 'c.o', 'd.o', 'e.o' and 'f.o'
 | 
						|
 | 
						|
The build framework does not create the 'ex' and 'libex.a' binaries for you, it
 | 
						|
only prepares proper objects to be compiled and grouped together.
 | 
						|
 | 
						|
To follow the above example, the user provides following 'Build' files:
 | 
						|
 | 
						|
  ex/Build:
 | 
						|
    ex-y += a.o
 | 
						|
    ex-y += b.o
 | 
						|
    ex-y += b.o # duplicates in the lists are allowed
 | 
						|
 | 
						|
    libex-y += c.o
 | 
						|
    libex-y += d.o
 | 
						|
    libex-y += arch/
 | 
						|
 | 
						|
  ex/arch/Build:
 | 
						|
    libex-y += e.o
 | 
						|
    libex-y += f.o
 | 
						|
 | 
						|
and runs:
 | 
						|
 | 
						|
  $ make -f tools/build/Makefile.build dir=. obj=ex
 | 
						|
  $ make -f tools/build/Makefile.build dir=. obj=libex
 | 
						|
 | 
						|
which creates the following objects:
 | 
						|
 | 
						|
  ex/ex-in.o
 | 
						|
  ex/libex-in.o
 | 
						|
 | 
						|
that contain request objects names in Build files.
 | 
						|
 | 
						|
It's only a matter of 2 single commands to create the final binaries:
 | 
						|
 | 
						|
  $ ar  rcs libex.a libex-in.o
 | 
						|
  $ gcc -o ex ex-in.o libex.a
 | 
						|
 | 
						|
You can check the 'ex' example in 'tools/build/tests/ex' for more details.
 | 
						|
 | 
						|
 | 
						|
Makefile.include
 | 
						|
----------------
 | 
						|
 | 
						|
The tools/build/Makefile.include makefile could be included
 | 
						|
via user makefiles to get usefull definitions.
 | 
						|
 | 
						|
It defines following interface:
 | 
						|
 | 
						|
  - build macro definition:
 | 
						|
      build := -f $(srctree)/tools/build/Makefile.build dir=. obj
 | 
						|
 | 
						|
    to make it easier to invoke build like:
 | 
						|
      make $(build)=ex
 | 
						|
 | 
						|
 | 
						|
Fixdep
 | 
						|
------
 | 
						|
It is necessary to build the fixdep helper before invoking the build.
 | 
						|
The Makefile.include file adds the fixdep target, that could be
 | 
						|
invoked by the user.
 | 
						|
 | 
						|
 | 
						|
Rules
 | 
						|
-----
 | 
						|
 | 
						|
The build framework provides standard compilation rules to handle .S and .c
 | 
						|
compilation.
 | 
						|
 | 
						|
It's possible to include special rule if needed (like we do for flex or bison
 | 
						|
code generation).
 | 
						|
 | 
						|
 | 
						|
CFLAGS
 | 
						|
------
 | 
						|
 | 
						|
It's possible to alter the standard object C flags in the following way:
 | 
						|
 | 
						|
  CFLAGS_perf.o        += '...'  - adds CFLAGS for perf.o object
 | 
						|
  CFLAGS_gtk           += '...'  - adds CFLAGS for gtk build object
 | 
						|
  CFLAGS_REMOVE_perf.o += '...'  - removes CFLAGS for perf.o object
 | 
						|
  CFLAGS_REMOVE_gtk    += '...'  - removes CFLAGS for gtk build object
 | 
						|
 | 
						|
This C flags changes has the scope of the Build makefile they are defined in.
 | 
						|
 | 
						|
 | 
						|
Dependencies
 | 
						|
------------
 | 
						|
 | 
						|
For each built object file 'a.o' the '.a.cmd' is created and holds:
 | 
						|
 | 
						|
  - Command line used to built that object
 | 
						|
    (for each object)
 | 
						|
 | 
						|
  - Dependency rules generated by 'gcc -Wp,-MD,...'
 | 
						|
    (for compiled object)
 | 
						|
 | 
						|
All existing '.cmd' files are included in the Build process to follow properly
 | 
						|
the dependencies and trigger a rebuild when necessary.
 | 
						|
 | 
						|
 | 
						|
Single rules
 | 
						|
------------
 | 
						|
 | 
						|
It's possible to build single object file by choice, like:
 | 
						|
 | 
						|
  $ make util/map.o    # objects
 | 
						|
  $ make util/map.i    # preprocessor
 | 
						|
  $ make util/map.s    # assembly
 |