[PATCH 01/36] tools build: Add new build support

2015-01-26 Thread Jiri Olsa
Adding new build framework into 'tools/build' to be used
by tools.

There's no change for actual building at this point, it comes
in the next patches.

The idea and more details are explained in the
'tools/build/Documentation/Build.txt' file.

I stole everything from the kernel build system, with some
changes to allow for multiple binaries build definitions.

While the kernel's build output is single image (forget modules)
we need to be able to build several binaries/libraries.

The basic idea is that sser provides 'Build' files with objects
definitions like:
  perf-y += a.o
  perf-y += b.o
  libperf-y += c.o
  libperf-y += d.o

and the build framework outputs files:
  perf-in.o# a.o, b.o compiled in
  libperf-in.o # c.o, d.o compiled in

Signed-off-by: Jiri Olsa 
Tested-by: Sukadev Bhattiprolu 
Tested-by: Will Deacon 
Cc: Alexis Berlemont 
Cc: Arnaldo Carvalho de Melo 
Cc: Borislav Petkov 
Cc: Corey Ashford 
Cc: David Ahern 
Cc: Frederic Weisbecker 
Cc: Ingo Molnar 
Cc: Namhyung Kim 
Cc: Paul Mackerras 
Cc: Peter Zijlstra 
Cc: Stephane Eranian 
---
 tools/build/Build.include   |  81 ++
 tools/build/Documentation/Build.txt | 132 
 tools/build/Makefile.build  |  97 ++
 tools/build/tests/ex/Build  |   8 +++
 tools/build/tests/ex/Makefile   |  23 +++
 tools/build/tests/ex/a.c|   5 ++
 tools/build/tests/ex/arch/Build |   2 +
 tools/build/tests/ex/arch/e.c   |   5 ++
 tools/build/tests/ex/arch/f.c   |   5 ++
 tools/build/tests/ex/b.c|   5 ++
 tools/build/tests/ex/c.c|   5 ++
 tools/build/tests/ex/d.c|   5 ++
 tools/build/tests/ex/empty/Build|   0
 tools/build/tests/ex/ex.c   |  19 ++
 tools/build/tests/run.sh|  42 
 tools/perf/MANIFEST |   1 +
 16 files changed, 435 insertions(+)
 create mode 100644 tools/build/Build.include
 create mode 100644 tools/build/Documentation/Build.txt
 create mode 100644 tools/build/Makefile.build
 create mode 100644 tools/build/tests/ex/Build
 create mode 100644 tools/build/tests/ex/Makefile
 create mode 100644 tools/build/tests/ex/a.c
 create mode 100644 tools/build/tests/ex/arch/Build
 create mode 100644 tools/build/tests/ex/arch/e.c
 create mode 100644 tools/build/tests/ex/arch/f.c
 create mode 100644 tools/build/tests/ex/b.c
 create mode 100644 tools/build/tests/ex/c.c
 create mode 100644 tools/build/tests/ex/d.c
 create mode 100644 tools/build/tests/ex/empty/Build
 create mode 100644 tools/build/tests/ex/ex.c
 create mode 100755 tools/build/tests/run.sh

diff --git a/tools/build/Build.include b/tools/build/Build.include
new file mode 100644
index ..4c8daaccb82a
--- /dev/null
+++ b/tools/build/Build.include
@@ -0,0 +1,81 @@
+###
+# build: Generic definitions
+#
+#  Lots of this code have been borrowed or heavily inspired from parts
+#  of kbuild code, which is not credited, but mostly developed by:
+#
+#  Copyright (C) Sam Ravnborg , 2015
+#  Copyright (C) Linus Torvalds , 2015
+#
+
+###
+# Convenient variables
+comma   := ,
+squote  := '
+
+###
+# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
+dot-target = $(dir $@).$(notdir $@)
+
+###
+# filename of target with directory and extension stripped
+basetarget = $(basename $(notdir $@))
+
+###
+# The temporary file to save gcc -MD generated dependencies must not
+# contain a comma
+depfile = $(subst $(comma),_,$(dot-target).d)
+
+###
+# Check if both arguments has same arguments. Result is empty string if equal.
+arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
+$(filter-out $(cmd_$@),   $(cmd_$(1))) )
+
+###
+# Escape single quote for use in echo statements
+escsq = $(subst $(squote),'\$(squote)',$1)
+
+# Echo command
+# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
+echo-cmd = $(if $($(quiet)cmd_$(1)),\
+   echo '  $(call escsq,$($(quiet)cmd_$(1)))';)
+
+###
+# Replace >$< with >$$< to preserve $ when reloading the .cmd file
+# (needed for make)
+# Replace >#< with >\#< to avoid starting a comment in the .cmd file
+# (needed for make)
+# Replace >'< with >'\''< to be able to enclose the whole string in '...'
+# (needed for the shell)
+make-cmd = $(call escsq,$(subst \#,\\\#,$(subst $$,,$(cmd_$(1)
+
+###
+# Find any prerequisites that is newer than target or that does not exist.
+# PHONY targets skipped in both cases.
+any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
+
+###
+# if_changed_dep  - execute command if any prerequisite is newer than
+#   target, or command line has changed and update
+#   dependencies in the cmd file
+if_changed_dep = $(if $(strip $(any-prereq) $(arg-check)), \
+   @set -e;   \
+   $(echo-cmd) $(cmd_$(1));   \
+ 

[PATCH 01/36] tools build: Add new build support

2015-01-20 Thread Jiri Olsa
Adding new build framework into 'tools/build' to be used
by tools.

There's no change for actual building at this point, it comes
in the next patches.

The idea and more details are explained in the
'tools/build/Documentation/Build.txt' file.

I stole everything from the kernel build system, with some
changes to allow for multiple binaries build definitions.

While the kernel's build output is single image (forget modules)
we need to be able to build several binaries/libraries.

The basic idea is that sser provides 'Build' files with objects
definitions like:
  perf-y += a.o
  perf-y += b.o
  libperf-y += c.o
  libperf-y += d.o

and the build framework outputs files:
  perf-in.o# a.o, b.o compiled in
  libperf-in.o # c.o, d.o compiled in

Signed-off-by: Jiri Olsa 
Cc: Alexis Berlemont 
Cc: Arnaldo Carvalho de Melo 
Cc: Borislav Petkov 
Cc: Corey Ashford 
Cc: David Ahern 
Cc: Frederic Weisbecker 
Cc: Ingo Molnar 
Cc: Namhyung Kim 
Cc: Paul Mackerras 
Cc: Peter Zijlstra 
Cc: Stephane Eranian 
---
 tools/build/Build.include   |  74 
 tools/build/Documentation/Build.txt | 132 
 tools/build/Makefile.build  |  92 +
 tools/build/tests/ex/Build  |   8 +++
 tools/build/tests/ex/Makefile   |  23 +++
 tools/build/tests/ex/a.c|   5 ++
 tools/build/tests/ex/arch/Build |   2 +
 tools/build/tests/ex/arch/e.c   |   5 ++
 tools/build/tests/ex/arch/f.c   |   5 ++
 tools/build/tests/ex/b.c|   5 ++
 tools/build/tests/ex/c.c|   5 ++
 tools/build/tests/ex/d.c|   5 ++
 tools/build/tests/ex/empty/Build|   0
 tools/build/tests/ex/ex.c   |  19 ++
 tools/build/tests/run.sh|  42 
 tools/perf/MANIFEST |   1 +
 16 files changed, 423 insertions(+)
 create mode 100644 tools/build/Build.include
 create mode 100644 tools/build/Documentation/Build.txt
 create mode 100644 tools/build/Makefile.build
 create mode 100644 tools/build/tests/ex/Build
 create mode 100644 tools/build/tests/ex/Makefile
 create mode 100644 tools/build/tests/ex/a.c
 create mode 100644 tools/build/tests/ex/arch/Build
 create mode 100644 tools/build/tests/ex/arch/e.c
 create mode 100644 tools/build/tests/ex/arch/f.c
 create mode 100644 tools/build/tests/ex/b.c
 create mode 100644 tools/build/tests/ex/c.c
 create mode 100644 tools/build/tests/ex/d.c
 create mode 100644 tools/build/tests/ex/empty/Build
 create mode 100644 tools/build/tests/ex/ex.c
 create mode 100755 tools/build/tests/run.sh

diff --git a/tools/build/Build.include b/tools/build/Build.include
new file mode 100644
index ..976dd44f1074
--- /dev/null
+++ b/tools/build/Build.include
@@ -0,0 +1,74 @@
+###
+# build: Generic definitions
+
+###
+# Convenient variables
+comma   := ,
+squote  := '
+
+###
+# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
+dot-target = $(dir $@).$(notdir $@)
+
+###
+# filename of target with directory and extension stripped
+basetarget = $(basename $(notdir $@))
+
+###
+# The temporary file to save gcc -MD generated dependencies must not
+# contain a comma
+depfile = $(subst $(comma),_,$(dot-target).d)
+
+###
+# Check if both arguments has same arguments. Result is empty string if equal.
+arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
+$(filter-out $(cmd_$@),   $(cmd_$(1))) )
+
+###
+# Escape single quote for use in echo statements
+escsq = $(subst $(squote),'\$(squote)',$1)
+
+# Echo command
+# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
+echo-cmd = $(if $($(quiet)cmd_$(1)),\
+   echo '  $(call escsq,$($(quiet)cmd_$(1)))';)
+
+###
+# Replace >$< with >$$< to preserve $ when reloading the .cmd file
+# (needed for make)
+# Replace >#< with >\#< to avoid starting a comment in the .cmd file
+# (needed for make)
+# Replace >'< with >'\''< to be able to enclose the whole string in '...'
+# (needed for the shell)
+make-cmd = $(call escsq,$(subst \#,\\\#,$(subst $$,,$(cmd_$(1)
+
+###
+# Find any prerequisites that is newer than target or that does not exist.
+# PHONY targets skipped in both cases.
+any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
+
+###
+# if_changed_dep  - execute command if any prerequisite is newer than
+#   target, or command line has changed and update
+#   dependencies in the cmd file
+if_changed_dep = $(if $(strip $(any-prereq) $(arg-check)), \
+   @set -e;   \
+   $(echo-cmd) $(cmd_$(1));   \
+   cat $(depfile) > $(dot-target).cmd;\
+   printf '%s\n' 'cmd_$@ := $(make-cmd)' >> $(dot-target).cmd)
+
+# if_changed  - execute command if any prerequisite is newer than
+#   target, or command line has changed
+if_changed = $(if $(

[PATCH 01/36] tools build: Add new build support

2015-01-15 Thread Jiri Olsa
Adding new build framework into 'tools/build' to be used
by tools.

There's no change for actual building at this point, it comes
in the next patches.

The idea and more details are explained in the
'tools/build/Documentation/Build' file.

I stole everything from the kernel build system, with some
changes to allow for multiple binaries build definitions.

While the kernel's build output is single image (forget modules)
we need to be able to build several binaries/libraries.

The basic idea is that sser provides 'Build' files with objects
definitions like:
  perf-y += a.o
  perf-y += b.o
  libperf-y += c.o
  libperf-y += d.o

and the build framework outputs files:
  perf-in.o# a.o, b.o compiled in
  libperf-in.o # c.o, d.o compiled in

Signed-off-by: Jiri Olsa 
Cc: Alexis Berlemont 
Cc: Arnaldo Carvalho de Melo 
Cc: Borislav Petkov 
Cc: Corey Ashford 
Cc: David Ahern 
Cc: Frederic Weisbecker 
Cc: Ingo Molnar 
Cc: Namhyung Kim 
Cc: Paul Mackerras 
Cc: Peter Zijlstra 
Cc: Stephane Eranian 
---
 tools/build/Build.include   | 75 ++
 tools/build/Documentation/Build.txt | 75 ++
 tools/build/Makefile.build  | 91 +
 tools/perf/MANIFEST |  1 +
 4 files changed, 242 insertions(+)
 create mode 100644 tools/build/Build.include
 create mode 100644 tools/build/Documentation/Build.txt
 create mode 100644 tools/build/Makefile.build

diff --git a/tools/build/Build.include b/tools/build/Build.include
new file mode 100644
index ..6a990b018e6d
--- /dev/null
+++ b/tools/build/Build.include
@@ -0,0 +1,75 @@
+###
+# build: Generic definitions
+
+###
+# Convenient variables
+comma   := ,
+squote  := '
+
+###
+# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
+dot-target = $(dir $@).$(notdir $@)
+
+###
+# filename of target with directory and extension stripped
+basetarget = $(basename $(notdir $@))
+
+###
+# The temporary file to save gcc -MD generated dependencies must not
+# contain a comma
+depfile = $(subst $(comma),_,$(dot-target).d)
+
+###
+# Check if both arguments has same arguments. Result is empty string if equal.
+arg-check = $(strip $(filter-out $(cmd_$(1)), $(cmd_$@)) \
+$(filter-out $(cmd_$@),   $(cmd_$(1))) )
+
+###
+# Escape single quote for use in echo statements
+escsq = $(subst $(squote),'\$(squote)',$1)
+
+# Echo command
+# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
+echo-cmd = $(if $($(quiet)cmd_$(1)),\
+   echo '  $(call escsq,$($(quiet)cmd_$(1)))';)
+
+###
+# Replace >$< with >$$< to preserve $ when reloading the .cmd file
+# (needed for make)
+# Replace >#< with >\#< to avoid starting a comment in the .cmd file
+# (needed for make)
+# Replace >'< with >'\''< to be able to enclose the whole string in '...'
+# (needed for the shell)
+make-cmd = $(call escsq,$(subst \#,\\\#,$(subst $$,,$(cmd_$(1)
+
+###
+# Find any prerequisites that is newer than target or that does not exist.
+# PHONY targets skipped in both cases.
+any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
+
+###
+# if_changed_dep  - execute command if any prerequisite is newer than
+#   target, or command line has changed and update
+#   dependencies in the cmd file
+if_changed_dep = $(if $(strip $(any-prereq) $(arg-check)), \
+   @set -e;   \
+   $(echo-cmd) $(cmd_$(1));   \
+   cat $(depfile) > $(dot-target).cmd;\
+   printf '%s\n' 'cmd_$@ := $(make-cmd)' >> $(dot-target).cmd)
+
+###
+# if_changed  - execute command if any prerequisite is newer than
+#   target, or command line has changed
+if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
+   @set -e;   \
+   $(echo-cmd) $(cmd_$(1));   \
+   printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
+
+###
+# C flags to be used in rule definitions, includes:
+# - depfile generation
+# - global $(CFLAGS)
+# - per target C flags
+# - per object C flags
+# - BUILD_STR macro to allow '-D"$(variable)"' constructs
+c_flags = -Wp,-MD,$(depfile),-MT,$@ $(CFLAGS) -D"BUILD_STR(s)=\#s" 
$(CFLAGS_$(basetarget).o) $(CFLAGS_$(obj))
diff --git a/tools/build/Documentation/Build.txt 
b/tools/build/Documentation/Build.txt
new file mode 100644
index ..8a11facc1838
--- /dev/null
+++ b/tools/build/Documentation/Build.txt
@@ -0,0 +1,75 @@
+build framework
+==
+The perf build framework is stolen from kernel build system,
+so the idea and the way how objects are built is the same.
+
+
+a) Build makefiles
+--
+User supplies 'Build' makefiles that contains objects summary,
+like for example following 'krava/Build' file:
+
+  perf-y += a.o
+