linux/tools: make it a real, separate package
authorYann E. MORIN <yann.morin.1998@free.fr>
Tue, 6 Sep 2016 14:29:14 +0000 (16:29 +0200)
committerThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Thu, 22 Sep 2016 10:32:34 +0000 (12:32 +0200)
The kernel source tree also contains the sources for various userland
tools, of which cpupower, perf or selftests.

Currently, we have support for building those tools as part of the
kernel build procedure. This looked the correct thing to do so far,
because, well, they *are* part of the kernel source tree and some
really have to be the same version as the kernel that will run.

However, this is causing quite a non-trivial-to-break circular
dependency in some configurations. For example, this defconfig fails to
build (similar to the one reported by Paul):

    BR2_arm=y
    BR2_cortex_a7=y
    BR2_ARM_FPU_NEON_VFPV4=y
    BR2_TOOLCHAIN_EXTERNAL=y
    BR2_INIT_SYSTEMD=y
    BR2_LINUX_KERNEL=y
    BR2_LINUX_KERNEL_CUSTOM_GIT=y
    BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/raspberrypi/linux.git"
    BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="26f3b72a9c049be10e6af196252283e1f6ab9d1f"
    BR2_LINUX_KERNEL_DEFCONFIG="bcm2709"
    BR2_PACKAGE_LINUX_TOOLS_CPUPOWER=y
    BR2_PACKAGE_CRYPTODEV=y
    BR2_PACKAGE_OPENSSL=y
    BR2_PACKAGE_LIBCURL=y

This causes a circular dependency, as explained by Thomas:

 - When libcurl is enabled, systemd depends on it

 - When OpenSSL is enabled, obviously, will use it for SSL support

 - When cryptodev-linux is enabled, OpenSSL will depend on it to use
   crypto accelerators supported in the kernel via cryptodev-linux.

 - cryptodev-linux being a kernel module, it depends on linux

 - linux by itself (the kernel) does not depend on pciutils, but the
   linux tool "cpupower" (managed in linux-tool-cpupower) depends on
   pciutils

 - pciutils depends on udev when available

 - udev is provided by systemd.

And indeed, during the build, we can see that make warns (it's only
reported as a *warning*, not as an actual error):

    [...]
    make[1]: Circular /home/ymorin/dev/buildroot/O/build/openssl-1.0.2h/.stamp_configured
    <- cryptodev-linux dependency dropped.
    >>> openssl 1.0.2h Downloading
    [...]

So the build fails later on, when openssl is actually built:

    eng_cryptodev.c:57:31: fatal error: crypto/cryptodev.h: No such file or directory
    compilation terminated.
    <builtin>: recipe for target 'eng_cryptodev.o' failed

Furthermore, graph-depends also detects the circular dependency, but
treats it as a hard-error:

    Recursion detected for  : cryptodev-linux
    which is a dependency of: openssl
    which is a dependency of: libcurl
    which is a dependency of: systemd
    which is a dependency of: udev
    which is a dependency of: pciutils
    which is a dependency of: linux
    which is a dependency of: cryptodev-linux
    Makefile:738: recipe for target 'graph-depends' failed

Of course, there is no way to break the loop without losing
functionality in either one of the involved packages *and* keep
our infrastructure and packages as-is.

The only solution is to break the loop at the linux-tools level, by
moving them away into their own package, so that the linux package will
no longer have the opportunity to depend on another package via a
dependency of one the tools.

All three linux tools are thus moved away to their own package.

The package infrastructure only knows of three types of packages: those
in package/ , in boot/ , in toolchain/ and the one in linux/ . So we
create that new linux-tools package in package/ so that we don't have to
fiddle with yet another special case in the infra. Still, we want its
configure options to appear in the kernel's sub-menu.

So, we make it a prompt-less package, with only the tools visible as
options of that package, but without the usual dependency on their
master symbol; they only depend on the Linux kernel.

Furthermore, because the kernel is such a huge pile of code, we would
not be very happy to extract it a second time just for the sake of a few
tools. We can't extract only the tools/ sub-directory from the kernel
source either, because some tools have hard-coded path to includes from
the kernel (arch and stuff).

Instead, we just use the linux source tree as our own build tree, and
ensure the linux tree is extracted and patched before linux-tools is
configured and built.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Paul Ashford <paul.ashford@zurria.co.uk>
[Thomas:
 - fix typo #(@D) -> $(@D)
 - fix the inclusion of the per-tool .mk files.]
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
12 files changed:
Config.in.legacy
linux/Config.in
linux/Config.tools.in [deleted file]
linux/linux-tool-cpupower.mk [deleted file]
linux/linux-tool-perf.mk [deleted file]
linux/linux-tool-selftests.mk [deleted file]
linux/linux.mk
package/linux-tools/Config.in [new file with mode: 0644]
package/linux-tools/linux-tool-cpupower.mk [new file with mode: 0644]
package/linux-tools/linux-tool-perf.mk [new file with mode: 0644]
package/linux-tools/linux-tool-selftests.mk [new file with mode: 0644]
package/linux-tools/linux-tools.mk [new file with mode: 0644]

index 59147180c4ede377650cb9f030579d9e533813fe..d1056015c8d47961831c780cd1337d35d5a774d6 100644 (file)
@@ -145,6 +145,30 @@ endif
 ###############################################################################
 comment "Legacy options removed in 2016.11"
 
+config BR2_LINUX_KERNEL_TOOL_CPUPOWER
+       bool "linux-tool cpupower"
+       depends on BR2_LINUX_KERNEL
+       select BR2_LEGACY
+       select BR2_PACKAGE_LINUX_TOOLS_CPUPOWER
+       help
+         Linux tool cpupower option was renamed.
+
+config BR2_LINUX_KERNEL_TOOL_PERF
+       bool "linux-tool perf"
+       depends on BR2_LINUX_KERNEL
+       select BR2_LEGACY
+       select BR2_PACKAGE_LINUX_TOOLS_PERF
+       help
+         Linux tool perf option was renamed.
+
+config BR2_LINUX_KERNEL_TOOL_SELFTESTS
+       bool "linux-tool selftests"
+       depends on BR2_LINUX_KERNEL
+       select BR2_LEGACY
+       select BR2_PACKAGE_LINUX_TOOLS_SELFTESTS
+       help
+         Linux tool selftests option was renamed.
+
 config BR2_GCC_VERSION_4_8_ARC
        bool "gcc arc option renamed"
        select BR2_LEGACY
index ab4e138b8a822998d4699aa5280e3aa03d09fcd1..45d9d5ba1913a04be2dea328f538bdad528f5eb8 100644 (file)
@@ -400,7 +400,7 @@ config BR2_LINUX_KERNEL_INSTALL_TARGET
 source "linux/Config.ext.in"
 
 # Linux tools
-source "linux/Config.tools.in"
+source "package/linux-tools/Config.in"
 
 endif # BR2_LINUX_KERNEL
 
diff --git a/linux/Config.tools.in b/linux/Config.tools.in
deleted file mode 100644 (file)
index 5ada98d..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-menu "Linux Kernel Tools"
-
-config BR2_LINUX_KERNEL_TOOL_CPUPOWER
-       bool "cpupower"
-       depends on !BR2_bfin # pciutils
-       depends on BR2_USE_WCHAR || !BR2_NEEDS_GETTEXT # gettext
-       select BR2_PACKAGE_PCIUTILS
-       select BR2_PACKAGE_GETTEXT if BR2_NEEDS_GETTEXT
-       help
-         cpupower is a collection of tools to examine and tune power
-         saving related features of your processor.
-
-comment "cpupower needs a toolchain w/ wchar"
-       depends on !BR2_bfin
-       depends on !BR2_USE_WCHAR && BR2_NEEDS_GETTEXT
-
-config BR2_LINUX_KERNEL_TOOL_PERF
-       bool "perf"
-       help
-         perf (sometimes "Perf Events" or perf tools, originally
-         "Performance Counters for Linux") - is a performance
-         analyzing tool in Linux, available from kernel version
-         2.6.31. User-space controlling utility, called 'perf' has
-         git-like interface with subcommands. It is capable of
-         statistical profiling of entire system (both kernel and user
-         code), single CPU or severals threads.
-
-         This will build and install the userspace 'perf'
-         command. It is up to the user to ensure that the kernel
-         configuration has all the suitable options enabled to allow a
-         proper operation of 'perf'.
-
-         https://perf.wiki.kernel.org/
-
-config BR2_LINUX_KERNEL_TOOL_SELFTESTS
-       bool"selftests"
-       depends on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS # bash
-       depends on BR2_USE_MMU  # bash
-       select BR2_PACKAGE_BASH # runtime
-       select BR2_PACKAGE_POPT
-       select BR2_PACKAGE_LIBCAP_NG
-       help
-         Build and install (to /usr/lib/kselftests) kernel selftests.
-
-         Use of this option implies you know the process of using and
-         compiling the kernel selftests. The Makefile to build and
-         install these is very noisy and may appear to cause your
-         build to fail for strange reasons.
-
-         This is very much a use at your risk option and may not work
-         for every setup or every architecture.
-
-comment "selftests needs BR2_PACKAGE_BUSYBOX_SHOW_OTHERS"
-       depends on BR2_USE_MMU
-       depends on !BR2_PACKAGE_BUSYBOX_SHOW_OTHERS
-
-endmenu
diff --git a/linux/linux-tool-cpupower.mk b/linux/linux-tool-cpupower.mk
deleted file mode 100644 (file)
index 095a5ef..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-################################################################################
-#
-# cpupower
-#
-################################################################################
-
-LINUX_TOOLS += cpupower
-
-CPUPOWER_DEPENDENCIES = pciutils $(if $(BR2_NEEDS_GETTEXT),gettext)
-
-CPUPOWER_MAKE_OPTS = CROSS=$(TARGET_CROSS) \
-       CPUFREQ_BENCH=false \
-       NLS=false \
-       $(if $(BR2_NEEDS_GETTEXT),LDFLAGS=-lintl) \
-       DEBUG=false
-
-define CPUPOWER_BUILD_CMDS
-       $(Q)if test ! -f $(@D)/tools/power/cpupower/Makefile ; then \
-               echo "Your kernel version is too old and does not have the cpupower tool." ; \
-               echo "At least kernel 3.4 must be used." ; \
-               exit 1 ; \
-       fi
-
-       $(TARGET_MAKE_ENV) $(MAKE) -C $(@D)/tools \
-               $(CPUPOWER_MAKE_OPTS) \
-               cpupower
-endef
-
-define CPUPOWER_INSTALL_STAGING_CMDS
-       $(TARGET_MAKE_ENV) $(MAKE) -C $(@D)/tools \
-               $(CPUPOWER_MAKE_OPTS) \
-               DESTDIR=$(STAGING_DIR) \
-               cpupower_install
-endef
-
-define CPUPOWER_INSTALL_TARGET_CMDS
-       $(TARGET_MAKE_ENV) $(MAKE) -C $(@D)/tools \
-               $(CPUPOWER_MAKE_OPTS) \
-               DESTDIR=$(TARGET_DIR) \
-               cpupower_install
-endef
diff --git a/linux/linux-tool-perf.mk b/linux/linux-tool-perf.mk
deleted file mode 100644 (file)
index 8143474..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-################################################################################
-#
-# perf
-#
-################################################################################
-
-LINUX_TOOLS += perf
-
-PERF_DEPENDENCIES = host-flex host-bison
-
-ifeq ($(KERNEL_ARCH),x86_64)
-PERF_ARCH=x86
-else
-PERF_ARCH=$(KERNEL_ARCH)
-endif
-
-PERF_MAKE_FLAGS = \
-       $(LINUX_MAKE_FLAGS) \
-       JOBS=$(PARALLEL_JOBS) \
-       ARCH=$(PERF_ARCH) \
-       DESTDIR=$(TARGET_DIR) \
-       prefix=/usr \
-       WERROR=0 \
-       NO_LIBAUDIT=1 \
-       NO_NEWT=1 \
-       NO_GTK2=1 \
-       NO_LIBPERL=1 \
-       NO_LIBPYTHON=1 \
-       NO_LIBBIONIC=1
-
-# We need to pass an argument to ld for setting the endianness when
-# building it for MIPS architecture, otherwise the default one will
-# always be used (which is big endian) and the compilation for little
-# endian will always fail showing an error like this one:
-#  LD    foo.o
-# mips-linux-gnu-ld: foo.o: compiled for a little endian system and
-# target is big endian
-ifeq ($(BR2_mips)$(BR2_mips64),y)
-PERF_MAKE_FLAGS += LD="$(TARGET_LD) -EB"
-else ifeq ($(BR2_mipsel)$(BR2_mips64el),y)
-PERF_MAKE_FLAGS += LD="$(TARGET_LD) -EL"
-endif
-
-# The call to backtrace() function fails for ARC, because for some
-# reason the unwinder from libgcc returns early. Thus the usage of
-# backtrace() should be disabled in perf explicitly: at build time
-# backtrace() appears to be available, but it fails at runtime: the
-# backtrace will contain only several functions from the top of stack,
-# instead of the complete backtrace.
-ifeq ($(BR2_arc),y)
-PERF_MAKE_FLAGS += NO_BACKTRACE=1
-endif
-
-ifeq ($(BR2_PACKAGE_SLANG),y)
-PERF_DEPENDENCIES += slang
-else
-PERF_MAKE_FLAGS += NO_SLANG=1
-endif
-
-ifeq ($(BR2_PACKAGE_LIBUNWIND),y)
-PERF_DEPENDENCIES += libunwind
-else
-PERF_MAKE_FLAGS += NO_LIBUNWIND=1
-endif
-
-ifeq ($(BR2_PACKAGE_NUMACTL),y)
-PERF_DEPENDENCIES += numactl
-else
-PERF_MAKE_FLAGS += NO_LIBNUMA=1
-endif
-
-ifeq ($(BR2_PACKAGE_ELFUTILS),y)
-PERF_DEPENDENCIES += elfutils
-else
-PERF_MAKE_FLAGS += NO_LIBELF=1 NO_DWARF=1
-endif
-
-ifeq ($(BR2_PACKAGE_ZLIB),y)
-PERF_DEPENDENCIES += zlib
-else
-PERF_MAKE_FLAGS += NO_ZLIB=1
-endif
-
-# lzma is provided by xz
-ifeq ($(BR2_PACKAGE_XZ),y)
-PERF_DEPENDENCIES += xz
-else
-PERF_MAKE_FLAGS += NO_LZMA=1
-endif
-
-# We really do not want to build the perf documentation, because it
-# has stringent requirement on the documentation generation tools,
-# like xmlto and asciidoc), which may be lagging behind on some
-# distributions.
-# We name it 'GNUmakefile' so that GNU make will use it instead of
-# the existing 'Makefile'.
-define PERF_DISABLE_DOCUMENTATION
-       if [ -f $(@D)/tools/perf/Documentation/Makefile ]; then \
-               printf "%%:\n\t@:\n" >$(@D)/tools/perf/Documentation/GNUmakefile; \
-       fi
-endef
-LINUX_POST_PATCH_HOOKS += PERF_DISABLE_DOCUMENTATION
-
-# O must be redefined here to overwrite the one used by Buildroot for
-# out of tree build. We build perf in $(@D)/tools/perf/ and not just
-# $(@D) so that it isn't built in the root directory of the kernel
-# sources.
-define PERF_BUILD_CMDS
-       $(Q)if test ! -f $(@D)/tools/perf/Makefile ; then \
-               echo "Your kernel version is too old and does not have the perf tool." ; \
-               echo "At least kernel 2.6.31 must be used." ; \
-               exit 1 ; \
-       fi
-       $(Q)if test "$(BR2_PACKAGE_ELFUTILS)" = "" ; then \
-               if ! grep -q NO_LIBELF $(@D)/tools/perf/Makefile* ; then \
-                       if ! test -r $(@D)/tools/perf/config/Makefile ; then \
-                               echo "The perf tool in your kernel cannot be built without libelf." ; \
-                               echo "Either upgrade your kernel to >= 3.7, or enable the elfutils package." ; \
-                               exit 1 ; \
-                       fi \
-               fi \
-       fi
-       $(TARGET_MAKE_ENV) $(MAKE1) $(PERF_MAKE_FLAGS) \
-               -C $(@D)/tools/perf O=$(@D)/tools/perf/
-endef
-
-# After installation, we remove the Perl and Python scripts from the
-# target.
-define PERF_INSTALL_TARGET_CMDS
-       $(TARGET_MAKE_ENV) $(MAKE1) $(PERF_MAKE_FLAGS) \
-               -C $(@D)/tools/perf O=$(@D)/tools/perf/ install
-       $(RM) -rf $(TARGET_DIR)/usr/libexec/perf-core/scripts/
-       $(RM) -rf $(TARGET_DIR)/usr/libexec/perf-core/tests/
-endef
diff --git a/linux/linux-tool-selftests.mk b/linux/linux-tool-selftests.mk
deleted file mode 100644 (file)
index 3cbfed2..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-################################################################################
-#
-# selftests
-#
-################################################################################
-
-LINUX_TOOLS += selftests
-
-ifeq ($(KERNEL_ARCH),x86_64)
-SELFTESTS_ARCH=x86
-else
-ifeq ($(KERNEL_ARCH),i386)
-SELFTESTS_ARCH=x86
-else
-SELFTESTS_ARCH=$(KERNEL_ARCH)
-endif
-endif
-
-SELFTESTS_DEPENDENCIES = libcap-ng popt
-
-SELFTESTS_MAKE_FLAGS = \
-       $(LINUX_MAKE_FLAGS) \
-       ARCH=$(SELFTESTS_ARCH)
-
-# O must be redefined here to overwrite the one used by Buildroot for
-# out of tree build. We build the selftests in $(@D)/tools/selftests and
-# not just $(@D) so that it isn't built in the root directory of the kernel
-# sources.
-#
-# The headers_install step here is important as some kernel selftests use a
-# hardcoded CFLAGS to find kernel headers e.g:
-# CFLAGS += -I../../../../usr/include/
-# The headers_install target will install the kernel headers locally inside
-# the Linux build dir
-define SELFTESTS_BUILD_CMDS
-       $(TARGET_MAKE_ENV) $(MAKE1) -C $(@D) $(SELFTESTS_MAKE_FLAGS) \
-               headers_install
-       $(TARGET_MAKE_ENV) $(MAKE1) -C $(@D)/tools/testing/selftests \
-               $(SELFTESTS_MAKE_FLAGS) O=$(@D)/tools/testing/selftests
-endef
-
-define SELFTESTS_INSTALL_TARGET_CMDS
-       $(TARGET_MAKE_ENV) $(MAKE1) -C $(@D)/tools/testing/selftests \
-               $(SELFTESTS_MAKE_FLAGS) O=$(@D)/tools/testing/selftests \
-               INSTALL_PATH=$(TARGET_DIR)/usr/lib/kselftests install
-endef
index 5cbb5e5f19a2122af38a69e685643cb8558e98a5..988427ca7cce8e4b0c77864b3ba3e3c41f42c530 100644 (file)
@@ -400,7 +400,7 @@ define LINUX_INSTALL_TARGET_CMDS
        $(LINUX_INSTALL_HOST_TOOLS)
 endef
 
-# Include all our extensions and tools definitions.
+# Include all our extensions.
 #
 # Note: our package infrastructure uses the full-path of the last-scanned
 # Makefile to determine what package we're currently defining, using the
@@ -411,7 +411,6 @@ endef
 # the current Makefile, we are OK. But this is a hard requirement: files
 # included here *must* be in the same directory!
 include $(sort $(wildcard linux/linux-ext-*.mk))
-include $(sort $(wildcard linux/linux-tool-*.mk))
 
 LINUX_PATCH_DEPENDENCIES += $(foreach ext,$(LINUX_EXTENSIONS),\
        $(if $(BR2_LINUX_KERNEL_EXT_$(call UPPERCASE,$(ext))),$(ext)))
@@ -420,27 +419,6 @@ LINUX_PRE_PATCH_HOOKS += $(foreach ext,$(LINUX_EXTENSIONS),\
        $(if $(BR2_LINUX_KERNEL_EXT_$(call UPPERCASE,$(ext))),\
                $(call UPPERCASE,$(ext))_PREPARE_KERNEL))
 
-# Install Linux kernel tools in the staging directory since some tools
-# may install shared libraries and headers (e.g. cpupower). The kernel
-# image is NOT installed in the staging directory.
-LINUX_INSTALL_STAGING = YES
-
-LINUX_DEPENDENCIES += $(foreach tool,$(LINUX_TOOLS),\
-       $(if $(BR2_LINUX_KERNEL_TOOL_$(call UPPERCASE,$(tool))),\
-               $($(call UPPERCASE,$(tool))_DEPENDENCIES)))
-
-LINUX_POST_BUILD_HOOKS += $(foreach tool,$(LINUX_TOOLS),\
-       $(if $(BR2_LINUX_KERNEL_TOOL_$(call UPPERCASE,$(tool))),\
-               $(call UPPERCASE,$(tool))_BUILD_CMDS))
-
-LINUX_POST_INSTALL_STAGING_HOOKS += $(foreach tool,$(LINUX_TOOLS),\
-       $(if $(BR2_LINUX_KERNEL_TOOL_$(call UPPERCASE,$(tool))),\
-               $(call UPPERCASE,$(tool))_INSTALL_STAGING_CMDS))
-
-LINUX_POST_INSTALL_TARGET_HOOKS += $(foreach tool,$(LINUX_TOOLS),\
-       $(if $(BR2_LINUX_KERNEL_TOOL_$(call UPPERCASE,$(tool))),\
-               $(call UPPERCASE,$(tool))_INSTALL_TARGET_CMDS))
-
 # Checks to give errors that the user can understand
 ifeq ($(BR_BUILDING),y)
 
diff --git a/package/linux-tools/Config.in b/package/linux-tools/Config.in
new file mode 100644 (file)
index 0000000..61c196f
--- /dev/null
@@ -0,0 +1,65 @@
+menu "Linux Kernel Tools"
+
+# No prompt, this is sourced by linux/Config.in as this
+# is no real package and really belongs to the kernel.
+config BR2_PACKAGE_LINUX_TOOLS
+       bool
+
+config BR2_PACKAGE_LINUX_TOOLS_CPUPOWER
+       bool "cpupower"
+       depends on !BR2_bfin # pciutils
+       depends on BR2_USE_WCHAR || !BR2_NEEDS_GETTEXT # gettext
+       select BR2_PACKAGE_LINUX_TOOLS
+       select BR2_PACKAGE_PCIUTILS
+       select BR2_PACKAGE_GETTEXT if BR2_NEEDS_GETTEXT
+       help
+         cpupower is a collection of tools to examine and tune power
+         saving related features of your processor.
+
+comment "cpupower needs a toolchain w/ wchar"
+       depends on !BR2_bfin
+       depends on !BR2_USE_WCHAR && BR2_NEEDS_GETTEXT
+
+config BR2_PACKAGE_LINUX_TOOLS_PERF
+       bool "perf"
+       select BR2_PACKAGE_LINUX_TOOLS
+       help
+         perf (sometimes "Perf Events" or perf tools, originally
+         "Performance Counters for Linux") - is a performance
+         analyzing tool in Linux, available from kernel version
+         2.6.31. User-space controlling utility, called 'perf' has
+         git-like interface with subcommands. It is capable of
+         statistical profiling of entire system (both kernel and user
+         code), single CPU or severals threads.
+
+         This will build and install the userspace 'perf'
+         command. It is up to the user to ensure that the kernel
+         configuration has all the suitable options enabled to allow a
+         proper operation of 'perf'.
+
+         https://perf.wiki.kernel.org/
+
+config BR2_PACKAGE_LINUX_TOOLS_SELFTESTS
+       bool"selftests"
+       depends on BR2_PACKAGE_BUSYBOX_SHOW_OTHERS # bash
+       depends on BR2_USE_MMU  # bash
+       select BR2_PACKAGE_LINUX_TOOLS
+       select BR2_PACKAGE_BASH # runtime
+       select BR2_PACKAGE_POPT
+       select BR2_PACKAGE_LIBCAP_NG
+       help
+         Build and install (to /usr/lib/kselftests) kernel selftests.
+
+         Use of this option implies you know the process of using and
+         compiling the kernel selftests. The Makefile to build and
+         install these is very noisy and may appear to cause your
+         build to fail for strange reasons.
+
+         This is very much a use at your risk option and may not work
+         for every setup or every architecture.
+
+comment "selftests needs BR2_PACKAGE_BUSYBOX_SHOW_OTHERS"
+       depends on BR2_USE_MMU
+       depends on !BR2_PACKAGE_BUSYBOX_SHOW_OTHERS
+
+endmenu
diff --git a/package/linux-tools/linux-tool-cpupower.mk b/package/linux-tools/linux-tool-cpupower.mk
new file mode 100644 (file)
index 0000000..9958cff
--- /dev/null
@@ -0,0 +1,41 @@
+################################################################################
+#
+# cpupower
+#
+################################################################################
+
+LINUX_TOOLS += cpupower
+
+CPUPOWER_DEPENDENCIES = pciutils $(if $(BR2_NEEDS_GETTEXT),gettext)
+
+CPUPOWER_MAKE_OPTS = CROSS=$(TARGET_CROSS) \
+       CPUFREQ_BENCH=false \
+       NLS=false \
+       $(if $(BR2_NEEDS_GETTEXT),LDFLAGS=-lintl) \
+       DEBUG=false
+
+define CPUPOWER_BUILD_CMDS
+       $(Q)if test ! -f $(LINUX_DIR)/tools/power/cpupower/Makefile ; then \
+               echo "Your kernel version is too old and does not have the cpupower tool." ; \
+               echo "At least kernel 3.4 must be used." ; \
+               exit 1 ; \
+       fi
+
+       $(TARGET_MAKE_ENV) $(MAKE) -C $(LINUX_DIR)/tools \
+               $(CPUPOWER_MAKE_OPTS) \
+               cpupower
+endef
+
+define CPUPOWER_INSTALL_STAGING_CMDS
+       $(TARGET_MAKE_ENV) $(MAKE) -C $(LINUX_DIR)/tools \
+               $(CPUPOWER_MAKE_OPTS) \
+               DESTDIR=$(STAGING_DIR) \
+               cpupower_install
+endef
+
+define CPUPOWER_INSTALL_TARGET_CMDS
+       $(TARGET_MAKE_ENV) $(MAKE) -C $(LINUX_DIR)/tools \
+               $(CPUPOWER_MAKE_OPTS) \
+               DESTDIR=$(TARGET_DIR) \
+               cpupower_install
+endef
diff --git a/package/linux-tools/linux-tool-perf.mk b/package/linux-tools/linux-tool-perf.mk
new file mode 100644 (file)
index 0000000..16f3a58
--- /dev/null
@@ -0,0 +1,134 @@
+################################################################################
+#
+# perf
+#
+################################################################################
+
+LINUX_TOOLS += perf
+
+PERF_DEPENDENCIES = host-flex host-bison
+
+ifeq ($(KERNEL_ARCH),x86_64)
+PERF_ARCH=x86
+else
+PERF_ARCH=$(KERNEL_ARCH)
+endif
+
+PERF_MAKE_FLAGS = \
+       $(LINUX_MAKE_FLAGS) \
+       JOBS=$(PARALLEL_JOBS) \
+       ARCH=$(PERF_ARCH) \
+       DESTDIR=$(TARGET_DIR) \
+       prefix=/usr \
+       WERROR=0 \
+       NO_LIBAUDIT=1 \
+       NO_NEWT=1 \
+       NO_GTK2=1 \
+       NO_LIBPERL=1 \
+       NO_LIBPYTHON=1 \
+       NO_LIBBIONIC=1
+
+# We need to pass an argument to ld for setting the endianness when
+# building it for MIPS architecture, otherwise the default one will
+# always be used (which is big endian) and the compilation for little
+# endian will always fail showing an error like this one:
+#  LD    foo.o
+# mips-linux-gnu-ld: foo.o: compiled for a little endian system and
+# target is big endian
+ifeq ($(BR2_mips)$(BR2_mips64),y)
+PERF_MAKE_FLAGS += LD="$(TARGET_LD) -EB"
+else ifeq ($(BR2_mipsel)$(BR2_mips64el),y)
+PERF_MAKE_FLAGS += LD="$(TARGET_LD) -EL"
+endif
+
+# The call to backtrace() function fails for ARC, because for some
+# reason the unwinder from libgcc returns early. Thus the usage of
+# backtrace() should be disabled in perf explicitly: at build time
+# backtrace() appears to be available, but it fails at runtime: the
+# backtrace will contain only several functions from the top of stack,
+# instead of the complete backtrace.
+ifeq ($(BR2_arc),y)
+PERF_MAKE_FLAGS += NO_BACKTRACE=1
+endif
+
+ifeq ($(BR2_PACKAGE_SLANG),y)
+PERF_DEPENDENCIES += slang
+else
+PERF_MAKE_FLAGS += NO_SLANG=1
+endif
+
+ifeq ($(BR2_PACKAGE_LIBUNWIND),y)
+PERF_DEPENDENCIES += libunwind
+else
+PERF_MAKE_FLAGS += NO_LIBUNWIND=1
+endif
+
+ifeq ($(BR2_PACKAGE_NUMACTL),y)
+PERF_DEPENDENCIES += numactl
+else
+PERF_MAKE_FLAGS += NO_LIBNUMA=1
+endif
+
+ifeq ($(BR2_PACKAGE_ELFUTILS),y)
+PERF_DEPENDENCIES += elfutils
+else
+PERF_MAKE_FLAGS += NO_LIBELF=1 NO_DWARF=1
+endif
+
+ifeq ($(BR2_PACKAGE_ZLIB),y)
+PERF_DEPENDENCIES += zlib
+else
+PERF_MAKE_FLAGS += NO_ZLIB=1
+endif
+
+# lzma is provided by xz
+ifeq ($(BR2_PACKAGE_XZ),y)
+PERF_DEPENDENCIES += xz
+else
+PERF_MAKE_FLAGS += NO_LZMA=1
+endif
+
+# We really do not want to build the perf documentation, because it
+# has stringent requirement on the documentation generation tools,
+# like xmlto and asciidoc), which may be lagging behind on some
+# distributions.
+# We name it 'GNUmakefile' so that GNU make will use it instead of
+# the existing 'Makefile'.
+define PERF_DISABLE_DOCUMENTATION
+       if [ -f $(LINUX_DIR)/tools/perf/Documentation/Makefile ]; then \
+               printf "%%:\n\t@:\n" >$(LINUX_DIR)/tools/perf/Documentation/GNUmakefile; \
+       fi
+endef
+LINUX_POST_PATCH_HOOKS += PERF_DISABLE_DOCUMENTATION
+
+# O must be redefined here to overwrite the one used by Buildroot for
+# out of tree build. We build perf in $(LINUX_DIR)/tools/perf/ and not just
+# $(LINUX_DIR) so that it isn't built in the root directory of the kernel
+# sources.
+define PERF_BUILD_CMDS
+       $(Q)if test ! -f $(LINUX_DIR)/tools/perf/Makefile ; then \
+               echo "Your kernel version is too old and does not have the perf tool." ; \
+               echo "At least kernel 2.6.31 must be used." ; \
+               exit 1 ; \
+       fi
+       $(Q)if test "$(BR2_PACKAGE_ELFUTILS)" = "" ; then \
+               if ! grep -q NO_LIBELF $(LINUX_DIR)/tools/perf/Makefile* ; then \
+                       if ! test -r $(LINUX_DIR)/tools/perf/config/Makefile ; then \
+                               echo "The perf tool in your kernel cannot be built without libelf." ; \
+                               echo "Either upgrade your kernel to >= 3.7, or enable the elfutils package." ; \
+                               exit 1 ; \
+                       fi \
+               fi \
+       fi
+       $(TARGET_MAKE_ENV) $(MAKE1) $(PERF_MAKE_FLAGS) \
+               -C $(LINUX_DIR)/tools/perf O=$(LINUX_DIR)/tools/perf/
+endef
+
+# After installation, we remove the Perl and Python scripts from the
+# target.
+define PERF_INSTALL_TARGET_CMDS
+       $(TARGET_MAKE_ENV) $(MAKE1) $(PERF_MAKE_FLAGS) \
+               -C $(LINUX_DIR)/tools/perf O=$(LINUX_DIR)/tools/perf/ install
+       $(RM) -rf $(TARGET_DIR)/usr/libexec/perf-core/scripts/
+       $(RM) -rf $(TARGET_DIR)/usr/libexec/perf-core/tests/
+endef
diff --git a/package/linux-tools/linux-tool-selftests.mk b/package/linux-tools/linux-tool-selftests.mk
new file mode 100644 (file)
index 0000000..c4e5bf0
--- /dev/null
@@ -0,0 +1,46 @@
+################################################################################
+#
+# selftests
+#
+################################################################################
+
+LINUX_TOOLS += selftests
+
+ifeq ($(KERNEL_ARCH),x86_64)
+SELFTESTS_ARCH=x86
+else
+ifeq ($(KERNEL_ARCH),i386)
+SELFTESTS_ARCH=x86
+else
+SELFTESTS_ARCH=$(KERNEL_ARCH)
+endif
+endif
+
+SELFTESTS_DEPENDENCIES = libcap-ng popt
+
+SELFTESTS_MAKE_FLAGS = \
+       $(LINUX_MAKE_FLAGS) \
+       ARCH=$(SELFTESTS_ARCH)
+
+# O must be redefined here to overwrite the one used by Buildroot for
+# out of tree build. We build the selftests in $(LINUX_DIR)/tools/selftests and
+# not just $(LINUX_DIR) so that it isn't built in the root directory of the kernel
+# sources.
+#
+# The headers_install step here is important as some kernel selftests use a
+# hardcoded CFLAGS to find kernel headers e.g:
+# CFLAGS += -I../../../../usr/include/
+# The headers_install target will install the kernel headers locally inside
+# the Linux build dir
+define SELFTESTS_BUILD_CMDS
+       $(TARGET_MAKE_ENV) $(MAKE1) -C $(LINUX_DIR) $(SELFTESTS_MAKE_FLAGS) \
+               headers_install
+       $(TARGET_MAKE_ENV) $(MAKE1) -C $(LINUX_DIR)/tools/testing/selftests \
+               $(SELFTESTS_MAKE_FLAGS) O=$(LINUX_DIR)/tools/testing/selftests
+endef
+
+define SELFTESTS_INSTALL_TARGET_CMDS
+       $(TARGET_MAKE_ENV) $(MAKE1) -C $(LINUX_DIR)/tools/testing/selftests \
+               $(SELFTESTS_MAKE_FLAGS) O=$(LINUX_DIR)/tools/testing/selftests \
+               INSTALL_PATH=$(TARGET_DIR)/usr/lib/kselftests install
+endef
diff --git a/package/linux-tools/linux-tools.mk b/package/linux-tools/linux-tools.mk
new file mode 100644 (file)
index 0000000..d45f950
--- /dev/null
@@ -0,0 +1,48 @@
+################################################################################
+#
+# linux-tools
+#
+################################################################################
+
+# Vampirising sources from the kernel tree, so no source nor site specified.
+# Instead, we directly build in the sources of the linux package. We can do
+# that, because we're not building in the same location and the same files.
+#
+# So, all tools refer to $(LINUX_DIR) instead of $(@D).
+
+# We only need the kernel to be extracted, not actually built
+LINUX_TOOLS_PATCH_DEPENDENCIES = linux
+
+# Install Linux kernel tools in the staging directory since some tools
+# may install shared libraries and headers (e.g. cpupower).
+LINUX_TOOLS_INSTALL_STAGING = YES
+
+# Include all our tools definitions.
+#
+# Note: our package infrastructure uses the full-path of the last-scanned
+# Makefile to determine what package we're currently defining, using the
+# last directory component in the path. As such, including other Makefile,
+# like below, before we call one of the *-package macro is usally not
+# working.
+# However, since the files we include here are in the same directory as
+# the current Makefile, we are OK. But this is a hard requirement: files
+# included here *must* be in the same directory!
+include $(sort $(wildcard package/linux-tools/linux-ext-*.mk))
+
+LINUX_TOOLS_DEPENDENCIES += $(foreach tool,$(LINUX_TOOLS),\
+       $(if $(BR2_PACKAGE_LINUX_TOOLS_$(call UPPERCASE,$(tool))),\
+               $($(call UPPERCASE,$(tool))_DEPENDENCIES)))
+
+LINUX_TOOLS_POST_BUILD_HOOKS += $(foreach tool,$(LINUX_TOOLS),\
+       $(if $(BR2_PACKAGE_LINUX_TOOLS_$(call UPPERCASE,$(tool))),\
+               $(call UPPERCASE,$(tool))_BUILD_CMDS))
+
+LINUX_TOOLS_POST_INSTALL_STAGING_HOOKS += $(foreach tool,$(LINUX_TOOLS),\
+       $(if $(BR2_PACKAGE_LINUX_TOOLS_$(call UPPERCASE,$(tool))),\
+               $(call UPPERCASE,$(tool))_INSTALL_STAGING_CMDS))
+
+LINUX_TOOLS_POST_INSTALL_TARGET_HOOKS += $(foreach tool,$(LINUX_TOOLS),\
+       $(if $(BR2_PACKAGE_LINUX_TOOLS_$(call UPPERCASE,$(tool))),\
+               $(call UPPERCASE,$(tool))_INSTALL_TARGET_CMDS))
+
+$(eval $(generic-package))