2ec8107d8e
Adding support to remove options from final CFLAGS for both object file and build target. It's now possible to remove CFLAGS options like: CFLAGS_REMOVE_krava.o += -Wstrict-prototypes Committer notes: This comes from the kernel's kbuild infrastructure, the subset that is supported in tools/ is being documented at tools/build/Documentation/Build.txt. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Tested-by: Stephane Eranian <eranian@google.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: David Ahern <dsahern@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: William Cohen <wcohen@redhat.com> Link: http://lkml.kernel.org/r/1478093749-5602-2-git-send-email-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
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
|