0bdede8a3e
It's sometimes useful to specify the object affiliation to multiple config options like: libperf-$(CONFIG_X86) += tsc.o libperf-$(CONFIG_AUXTRACE) += tsc.o while the object itself is linked only once. Adding the support for this and ignoring duplicate objects in the object list. Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org> Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Link: http://lkml.kernel.org/r/20150826130103.GF22670@krava.redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
140 lines
3.5 KiB
Text
140 lines
3.5 KiB
Text
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
|
|
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.
|
|
|
|
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
|