| 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 += '...' - 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. | |
| 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 |