| 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. |
| |
| a) 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 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. |
| |
| a) 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 |
| |
| 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. |
| |
| b) 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). |
| |
| c) CFLAGS |
| --------- |
| |
| It's possible to alter the standard object C flags in the following way: |
| |
| CFLAGS_perf.o += '...' - alters CFLAGS for perf.o object |
| CFLAGS_gtk += '...' - alters CFLAGS for gtk build object |
| |
| This C flags changes has the scope of the Build makefile they are defined in. |
| |
| |
| d) 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. |
| |
| |
| e) 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 |